Een model bouwen en rekenen in Python

Zeven objecten dekken vrijwel elk model: Node, Material, Section, Member, MemberSet, NodalSupport en NodalLoad. U stelt ze samen, roept run_analysis() aan en leest een resultatenbundel uit, geordend per belastinggeval.

De kernobjecten

Alles wordt geïmporteerd uit fers_core. Een model is een FERS-instantie met staafgroepen; belastingen hangen aan belastinggevallen en niet rechtstreeks aan het model, zodat dezelfde geometrie meerdere onafhankelijke gevallen kan dragen.

  • Node — een X-, Y-, Z-punt. Y wijst omhoog. Knopen dragen hun oplegvoorwaarde.
  • Material — elasticiteitsmodulus, glijdingsmodulus, dichtheid, vloeigrens. Alles in SI: pascal en kg/m³.
  • Section — oppervlakte en traagheidsmomenten, verwijzend naar een materiaal.
  • Member — een liggerelement met twee knopen en zes vrijheidsgraden per knoop, verwijzend naar een doorsnede.
  • MemberSet — de groep die u aan het model toevoegt, en tevens de eenheid waarop toetsingen werken.
  • NodalSupport — de randvoorwaarde die aan een knoop is toegekend.
  • NodalLoad — een kracht of moment op een knoop binnen een belastinggeval.
from fers_core import (
    FERS, Node, Member, Section, Material,
    MemberSet, NodalSupport, NodalLoad
)

Geometrie, materiaal en doorsnede definiëren

Coördinaten in meters en materiaaleigenschappen in pascal. De doorsnede hieronder is een IPE 180 uit de FERS-profielenbibliotheek.

Let op de assenafspraak, want die is verreweg de meest voorkomende oorzaak van een fout antwoord: i_z is de sterke as en i_y de zwakke. Een ligger die in zijn gebruikelijke vlak buigt wordt bepaald door 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²
)

Alle assen-, teken- en eenheidsafspraken staan op de conventiepagina. Het JSON-contract verwacht hoeken in graden, niet in radialen.

Staaf maken, oplegging en belasting aanbrengen

Een kale NodalSupport() is volledig ingeklemd. Voor een scharnier of een rol geeft u displacement_conditions en rotation_conditions expliciet mee — de voorbeelden laten beide zien.

Belastingrichtingen zijn globale eenheidsvectoren, dus (0, 1, 0) met een negatieve grootte is een neerwaartse kracht.

# 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))

De berekening starten en resultaten lezen

run_analysis() rekent elk belastinggeval. De resultaten staan op model.resultsbundle, geordend op naam van het belastinggeval, met vervormingen en reacties geïndexeerd op knoop-id als tekenreeks.

De opmerkingen tonen de werkelijke uitvoer voor precies deze invoer.

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 Nm

Handberekening: een uitkraging van 5 m die om zijn sterke as buigt geeft δ = PL³ / 3EI_z = 1000·5³ / (3 · 210×10⁹ · 13,17×10⁻⁶) = 15,07 mm, met uit evenwicht een reactie van 1 kN en een inklemmingsmoment van 5 kN·m. De solver geeft 15,065 mm.

Verder dan lineaire statica

Hetzelfde modelobject draagt de instellingen voor de andere berekeningssoorten. Tweede-orde (P-Delta), lineair knikken met kritieke belastingfactor, modale analyse en responsspectrum-aardbevingsberekening worden allemaal vanuit de analyse-instellingen aangestuurd, niet via een andere API.

Toetsingen hangen aan staafgroepen en worden na de berekening geëvalueerd. Ze geven per artikel de unity check met de tussenwaarden die eraan ten grondslag liggen — een toetsing leest dus als een handberekening en niet als één getal.

Gerelateerde pagina’s

Zie ook

Veelgestelde vragen

Waarom zijn mijn vervormingen op een tekenreeks geïndexeerd?

Resultaatwoordenboeken zijn geïndexeerd op knoop- en staaf-id als tekenreeks, omdat de resultatenbundel door JSON gaat. Dus displacement_nodes["2"], niet [2].

Waar dient een MemberSet voor?

Het is de eenheid die u aan het model toevoegt en de eenheid waarop toetsingen werken. Staven groeperen die één fysiek onderdeel vormen — bijvoorbeeld een kolom die uit twee staven is gelast — laat een kniklengte of een normtoetsing het geheel omvatten.

Hoe modelleer ik een scharnier of een rol?

Geef NodalSupport expliciete voorwaarden mee. Een scharnier houdt de drie verplaatsingen vast en laat de buigrotaties vrij; houd ook de torsierotatie vast, anders heeft de staaf een starre-lichaamsdraaiing en wordt de berekening singulier. Het voorbeeld met de ligger op twee steunpunten toont beide.

Welk traagheidsmoment hoort bij de sterke as?

i_z. FERS behandelt de lokale z-as overal als sterke buigas — solver, toetsingen en diagrammen zijn het daarover eens. Verwisselde i_y en i_z zijn de meest voorkomende modelleerfout.

Heb ik internet nodig om te rekenen?

Nee. run_analysis() draait de gecompileerde solver in uw eigen proces. Netwerktoegang komt alleen in beeld als u een cloudeindpunt aanroept.

Krijg ik de doorbuigingslijn en niet alleen de eindwaarden?

Ja, en die is belastingexact in plaats van geïnterpoleerd tussen de eindvervormingen — een aan beide zijden ingeklemde ligger onder gelijkmatige belasting geeft de werkelijke doorbuiging wL⁴/384EI. Vraag hem aan in de analyse-opties.