Ein Modell in Python aufbauen und rechnen

Sieben Objekte decken fast jedes Modell ab: Node, Material, Section, Member, MemberSet, NodalSupport und NodalLoad. Sie setzen sie zusammen, rufen run_analysis() auf und lesen ein nach Lastfall geordnetes Ergebnispaket aus.

Die Kernobjekte

Alles wird aus fers_core importiert. Ein Modell ist eine FERS-Instanz, die Stabgruppen hält; Lasten hängen an Lastfällen und nicht direkt am Modell, dieselbe Geometrie kann also mehrere unabhängige Lastfälle tragen.

  • Node — ein X-, Y-, Z-Punkt. Y zeigt nach oben. Knoten tragen ihre Auflagerbedingung.
  • Material — E-Modul, Schubmodul, Dichte, Streckgrenze. Durchgängig SI: Pascal und kg/m³.
  • Section — Fläche und Flächenmomente zweiten Grades, mit Bezug auf ein Material.
  • Member — ein Balkenelement mit zwei Knoten und sechs Freiheitsgraden je Knoten, mit Bezug auf einen Querschnitt.
  • MemberSet — die Gruppe, die Sie dem Modell hinzufügen, und zugleich die Einheit, auf die Nachweise angewendet werden.
  • NodalSupport — die einem Knoten zugewiesene Randbedingung.
  • NodalLoad — eine Kraft oder ein Moment, das innerhalb eines Lastfalls auf einen Knoten wirkt.
from fers_core import (
    FERS, Node, Member, Section, Material,
    MemberSet, NodalSupport, NodalLoad
)

Geometrie, Material und Querschnitt definieren

Koordinaten in Metern, Materialkennwerte in Pascal. Der folgende Querschnitt ist ein IPE 180 aus der FERS-Profilbibliothek.

Beachten Sie die Achsenkonvention, denn sie ist mit Abstand die häufigste Ursache für ein falsches Ergebnis: i_z ist die starke Achse, i_y die schwache. Ein Träger, der sich in seiner üblichen Ebene biegt, wird von i_z bestimmt.

# 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 Achsen-, Vorzeichen- und Einheitenkonventionen stehen auf der Konventionsseite. Der JSON-Vertrag erwartet Winkel in Grad, nicht im Bogenmaß.

Stab erzeugen, Auflager und Last aufbringen

Ein bloßes NodalSupport() ist voll eingespannt. Für ein Gelenk- oder Rollenlager übergeben Sie displacement_conditions und rotation_conditions explizit — die Beispiele zeigen beides.

Lastrichtungen sind globale Einheitsvektoren, (0, 1, 0) mit negativem Betrag ist also eine nach unten gerichtete Kraft.

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

Berechnung starten und Ergebnisse lesen

run_analysis() rechnet jeden Lastfall. Die Ergebnisse liegen unter model.resultsbundle, geordnet nach Lastfallnamen, mit Verformungen und Auflagerkräften nach Knoten-ID als Zeichenkette.

Die Kommentare zeigen die tatsächliche Ausgabe für genau diese Eingaben.

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

Handrechnung: Ein 5 m langer Kragarm mit Biegung um die starke Achse liefert δ = PL³ / 3EI_z = 1000·5³ / (3 · 210×10⁹ · 13,17×10⁻⁶) = 15,07 mm, dazu aus dem Gleichgewicht eine Auflagerkraft von 1 kN und ein Einspannmoment von 5 kN·m. Der Solver gibt 15,065 mm zurück.

Über die lineare Statik hinaus

Dasselbe Modellobjekt trägt die Einstellungen der übrigen Berechnungsarten. Berechnung nach Theorie II. Ordnung (P-Delta), lineares Beulen mit kritischem Laststeigerungsfaktor, Modalanalyse und Antwortspektrum-Erdbebenberechnung werden alle über Analyseeinstellungen gesteuert, nicht über eine andere Schnittstelle.

Nachweise werden an Stabgruppen gehängt und nach der Berechnung ausgewertet. Sie liefern klauselweise Ausnutzungen samt der Zwischenwerte, aus denen sie entstanden sind — ein Nachweis liest sich also wie eine Handrechnung und nicht wie eine einzelne Zahl.

  • Prüfen Sie zuerst gegen geschlossene Lösungen — siehe Genauigkeits-Benchmarks und NAFEMS.
  • Für Nachweise nach EN 1993-1-1 baut, rechnet und prüft check_beam ein Einfeld in einem Aufruf — siehe die Beispiele.

Verwandte Seiten

Siehe auch

Häufige Fragen

Warum sind meine Verformungen über Zeichenketten indiziert?

Ergebnis-Dictionaries sind nach Knoten- und Stab-ID als Zeichenkette indiziert, weil das Ergebnispaket durch JSON läuft. Also displacement_nodes["2"], nicht [2].

Wofür ist ein MemberSet da?

Es ist die Einheit, die Sie dem Modell hinzufügen, und die Einheit, auf die Nachweise wirken. Fasst man Stäbe zusammen, die ein physisches Bauteil bilden — etwa eine aus zwei Stäben gestoßene Stütze —, kann eine Knicklänge oder ein Normnachweis das gesamte Bauteil umfassen.

Wie modelliere ich ein Gelenk- oder Rollenlager?

Übergeben Sie NodalSupport explizite Bedingungen. Ein Gelenklager hält die drei Verschiebungen und lässt die Biegeverdrehungen frei; halten Sie zusätzlich die Torsionsverdrehung, sonst hat der Stab eine Starrkörper-Drehung und die Berechnung wird singulär. Das Einfeldträger-Beispiel zeigt beides.

Welches Flächenmoment ist die starke Achse?

i_z. FERS behandelt die lokale z-Achse durchgängig als starke Biegeachse — Solver, Nachweise und Ergebnislinien sind sich darin einig. Vertauschte i_y und i_z sind der häufigste Modellierfehler.

Brauche ich für die Berechnung eine Internetverbindung?

Nein. run_analysis() führt den kompilierten Solver in Ihrem eigenen Prozess aus. Netzwerkzugriff entsteht nur, wenn Sie einen Cloud-Endpunkt aufrufen.

Bekomme ich die Biegelinie und nicht nur die Endwerte?

Ja, und sie ist lastexakt statt zwischen den Endverformungen interpoliert — ein beidseitig eingespannter Träger unter Gleichstreckenlast liefert die tatsächliche Durchbiegung wL⁴/384EI. Fordern Sie sie in den Analyseoptionen an.