Construire et calculer un modèle en Python
Sept objets couvrent presque tous les modèles : Node, Material, Section, Member, MemberSet, NodalSupport et NodalLoad. Vous les assemblez, appelez run_analysis() et lisez un jeu de résultats indexé par cas de charge.
Les objets principaux
Tout s’importe depuis fers_core. Un modèle est une instance FERS qui contient des groupes de barres ; les charges dépendent des cas de charge et non du modèle, si bien que la même géométrie peut porter plusieurs cas indépendants.
- Node — un point X, Y, Z. Y est la verticale ascendante. Les nœuds portent leur condition d’appui.
- Material — module d’élasticité, module de cisaillement, masse volumique, limite d’élasticité. Tout en SI : pascals et kg/m³.
- Section — aire et moments quadratiques, rattachés à un matériau.
- Member — un élément poutre à deux nœuds et six degrés de liberté par nœud, rattaché à une section.
- MemberSet — le groupe que vous ajoutez au modèle, et l’unité sur laquelle portent les vérifications.
- NodalSupport — la condition aux limites affectée à un nœud.
- NodalLoad — une force ou un moment appliqué à un nœud au sein d’un cas de charge.
from fers_core import (
FERS, Node, Member, Section, Material,
MemberSet, NodalSupport, NodalLoad
)Définir géométrie, matériau et section
Les coordonnées sont en mètres et les propriétés du matériau en pascals. La section ci-dessous est un IPE 180 issu de la bibliothèque de profilés FERS.
Notez la convention d’axes, car c’est de loin la cause la plus fréquente d’un résultat faux : i_z est l’axe fort et i_y l’axe faible. Une poutre qui fléchit dans son plan habituel est gouvernée par i_z.
# Nodes (x, y, z coordinates in metres)
node1 = Node(0, 0, 0)
node2 = Node(5, 0, 0)
# Material (Steel S235)
steel = Material(
name="Steel S235",
e_mod=210e9, # Pa
g_mod=80.769e9, # Pa
density=7850, # kg/m³
yield_stress=235e6 # Pa
)
# Cross-section (IPE 180), values from the FERS steel section library.
# Axis convention: i_z is the STRONG axis (bending in the local x-y plane),
# i_y the weak axis — see ferscloud.com/conventions
section = Section(
name="IPE 180",
material=steel,
i_y=1.009e-6, # m⁴ (weak axis)
i_z=13.17e-6, # m⁴ (strong axis)
j=0.0477e-6, # m⁴
area=0.00240 # m²
)Toutes les conventions d’axes, de signes et d’unités figurent sur la page des conventions. Le contrat JSON attend des angles en degrés, pas en radians.
Créer la barre, appliquer appui et charge
Un NodalSupport() sans argument est un encastrement complet. Pour une articulation ou un appui glissant, passez explicitement displacement_conditions et rotation_conditions — les exemples montrent les deux.
Les directions de charge sont des vecteurs unitaires globaux : (0, 1, 0) avec une intensité négative est donc une force vers le bas.
# Create beam element
beam = Member(start_node=node1, end_node=node2, section=section)
# Fixed support at node1
node1.nodal_support = NodalSupport()
# Organise members into a set and add to model
model = FERS()
model.add_member_set(MemberSet(members=[beam]))
# Load case with a −1 kN point load at node2
lc = model.create_load_case(name="Gravity")
NodalLoad(node=node2, load_case=lc, magnitude=-1000, direction=(0, 1, 0))Lancer le calcul et lire les résultats
run_analysis() résout tous les cas de charge. Les résultats se trouvent sur model.resultsbundle, indexés par nom de cas, avec déplacements et réactions indexés par identifiant de nœud sous forme de chaîne.
Les commentaires montrent la sortie réelle pour ces entrées exactes.
model.run_analysis()
results = model.resultsbundle.loadcases["Gravity"]
dy = results.displacement_nodes["2"].dy
Vy = results.reaction_nodes["1"].nodal_forces.fy
Mz = results.reaction_nodes["1"].nodal_forces.mz
print(f"Tip deflection : {dy*1000:.3f} mm") # -15.065 mm
print(f"Reaction Vy : {Vy:.1f} N") # 1000.0 N
print(f"Reaction Mz : {Mz:.1f} Nm") # 5000.0 NmVérification manuelle : une console de 5 m fléchissant autour de son axe fort donne δ = PL³ / 3EI_z = 1000·5³ / (3 · 210×10⁹ · 13,17×10⁻⁶) = 15,07 mm, avec une réaction de 1 kN et un moment d’encastrement de 5 kN·m par équilibre. Le solveur renvoie 15,065 mm.
Au-delà de la statique linéaire
Le même objet modèle porte les réglages des autres types d’analyse. L’analyse du second ordre (P-Delta), le flambement linéaire avec facteur de charge critique, l’analyse modale et l’analyse sismique par spectre de réponse se pilotent tous depuis les réglages d’analyse, et non depuis une autre API.
Les vérifications s’attachent aux groupes de barres et s’évaluent après le calcul ; elles renvoient des taux de travail clause par clause accompagnés des valeurs intermédiaires qui les ont produits — une vérification se lit donc comme un calcul manuel et non comme un nombre isolé.
- Contrôlez d’abord contre des solutions analytiques — voir les tests de précision et le jeu NAFEMS.
- Pour les vérifications EN 1993-1-1,
check_beamconstruit, calcule et vérifie une travée en un seul appel — voir les exemples.
Pages associées
Voir aussi
Questions fréquentes
Pourquoi mes déplacements sont-ils indexés par une chaîne ?
displacement_nodes["2"], pas [2].À quoi sert un MemberSet ?
Comment modéliser une articulation ou un appui glissant ?
NodalSupport. Une articulation bloque les trois translations et laisse libres les rotations de flexion ; bloquez en plus la rotation de torsion, sinon la barre présente un mode de corps rigide et le système devient singulier. L’exemple de poutre sur deux appuis montre les deux.Quel moment quadratique correspond à l’axe fort ?
i_z. FERS traite l’axe z local comme l’axe fort de flexion partout : solveur, vérifications et diagrammes sont cohérents. Intervertir i_y et i_z est l’erreur de modélisation la plus courante.Faut-il une connexion Internet pour calculer ?
run_analysis() exécute le solveur compilé dans votre propre processus. Le réseau n’est utilisé que si vous appelez un point de terminaison cloud.