Construirea și calculul unui model în Python
Șapte obiecte acoperă aproape orice model: Node, Material, Section, Member, MemberSet, NodalSupport și NodalLoad. Le asamblați, apelați run_analysis() și citiți un pachet de rezultate indexat după ipoteza de încărcare.
Obiectele principale
Totul se importă din fers_core. Un model este o instanță FERS care conține grupuri de bare; încărcările atârnă de ipotezele de încărcare, nu direct de model, astfel încât aceeași geometrie poate purta mai multe ipoteze independente.
- Node — un punct X, Y, Z. Y este verticala în sus. Nodurile poartă condiția lor de rezemare.
- Material — modul de elasticitate, modul de forfecare, densitate, limită de curgere. Totul în SI: pascali și kg/m³.
- Section — aria și momentele de inerție, raportate la un material.
- Member — un element de tip grindă cu două noduri și șase grade de libertate pe nod, raportat la o secțiune.
- MemberSet — grupul pe care îl adăugați modelului și, totodată, unitatea asupra căreia acționează verificările.
- NodalSupport — condiția de rezemare atribuită unui nod.
- NodalLoad — o forță sau un moment aplicat unui nod, în cadrul unei ipoteze de încărcare.
from fers_core import (
FERS, Node, Member, Section, Material,
MemberSet, NodalSupport, NodalLoad
)Definirea geometriei, materialului și secțiunii
Coordonatele sunt în metri, iar proprietățile materialului în pascali. Secțiunea de mai jos este un IPE 180 din biblioteca de profile FERS.
Atenție la convenția de axe, pentru că este de departe cea mai frecventă cauză a unui rezultat greșit: i_z este axa tare, iar i_y cea slabă. O grindă care se încovoaie în planul obișnuit este guvernată de 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²
)Toate convențiile de axe, semne și unități sunt pe pagina de convenții. Contractul JSON așteaptă unghiuri în grade, nu în radiani.
Crearea barei, aplicarea reazemului și a încărcării
Un NodalSupport() fără argumente este încastrare completă. Pentru o articulație sau un reazem mobil, transmiteți explicit displacement_conditions și rotation_conditions — exemplele le arată pe amândouă.
Direcțiile de încărcare sunt vectori unitari globali, deci (0, 1, 0) cu magnitudine negativă este o forță în jos.
# 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))Lansarea calculului și citirea rezultatelor
run_analysis() rezolvă fiecare ipoteză de încărcare. Rezultatele se află în model.resultsbundle, indexate după numele ipotezei, cu deplasările și reacțiunile indexate după identificatorul nodului ca șir de caractere.
Comentariile arată rezultatul real pentru exact aceste date de intrare.
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 NmVerificare manuală: o consolă de 5 m care se încovoaie după axa tare dă δ = PL³ / 3EI_z = 1000·5³ / (3 · 210×10⁹ · 13,17×10⁻⁶) = 15,07 mm, cu o reacțiune de 1 kN și un moment de încastrare de 5 kN·m din echilibru. Solverul returnează 15,065 mm.
Dincolo de statica liniară
Același obiect model poartă setările pentru celelalte tipuri de analiză. Analiza de ordinul al doilea (P-Delta), flambajul liniar cu factor de încărcare critică, analiza modală și analiza seismică cu spectru de răspuns se conduc din setările de analiză, nu printr-un API diferit.
Verificările se atașează grupurilor de bare și se evaluează după calcul, returnând gradele de utilizare clauză cu clauză împreună cu valorile intermediare care le-au produs — o verificare se citește astfel ca un calcul manual, nu ca un simplu număr.
- Verificați mai întâi față de soluții analitice — vedeți testele de precizie și setul NAFEMS.
- Pentru verificări conform EN 1993-1-1,
check_beamconstruiește, calculează și verifică o deschidere într-un singur apel — vedeți exemplele.
Pagini conexe
Vezi și
Întrebări frecvente
De ce deplasările mele sunt indexate cu un șir de caractere?
displacement_nodes["2"], nu [2].La ce folosește un MemberSet?
Cum modelez o articulație sau un reazem mobil?
NodalSupport. O articulație blochează cele trei translații și lasă libere rotirile de încovoiere; blocați și rotirea de torsiune, altfel bara are un mod de corp rigid, iar sistemul devine singular. Exemplul cu grindă simplu rezemată le arată pe amândouă.Care moment de inerție corespunde axei tari?
i_z. FERS tratează axa z locală drept axă tare de încovoiere peste tot — solverul, verificările și diagramele sunt de acord. Inversarea lui i_y cu i_z este cea mai frecventă greșeală de modelare.Am nevoie de conexiune la internet pentru calcul?
run_analysis() rulează solverul compilat în propriul dumneavoastră proces. Rețeaua este folosită doar dacă apelați un punct final din cloud.