Skip to content

Modellimport

qaumann edited this page May 5, 2017 · 3 revisions

Übersicht

Ein FEM-Model wird in der Klasse FemModel verwaltet. Neben der manuellen Erstellung, während der man Knoten und Elemente einzeln definiert und dann zusammenfügt (siehe z.B. bridge.m im Hauptverzeichnis), kann man auch eine externe Datei einlesen. Das Format dieser Inputdatei wird im Folgenden erklärt.

Input-File

Die Datei kann manuell erstellt werden und ist blockweise Strukturiert. Die Reihenfolge der Blöcke ist beliebig, es müssen aber alle Blöcke vorhanden sein. Jeder Block beginnt mit einer Überschrift $Block und endet mit $EndBlock, alles außerhalb dieser Anweisungen wird ignoriert. Der Aufbau der einzelnen Blöcke wird im folgenden beschrieben:

$PhysicalNames

  • Unterteilung des Modells in benannte Teilmodelle
  • Jedes Element kann nur in einem einzigen Teilmodell vorhanden sein
  • Über den Namen können die Elemente der Teilmodelle später angesprochen werden, um z.B. Randbedingungen zu definieren
  • Syntax: <part_id> <"name">

$Material <mat_id>

  • Definition eines Materials; verschiedene Materialien müssen in getrennten Materialblöcken definiert werden
  • Syntax: <parameter_name> <parameter_value>

$Properties <part_id>

  • Definition von Elementeigenschaften
  • Die Eigenschaft wird mit dem Teilmodell verknüpft, d.h. die Eigenschaften für alle Elemente eines Teilmodells sind gleich
  • Welche Eigenschaften benötigt werden, hängt vom Element ab
  • Syntax: <property> <property_value>
  • Das Material wird einem Element über seine Eigenschaften übergeben. Die Syntax ist hier material <mat_id>

$Nodes

  • Liste der Knoten im Modell
  • Syntax: <id> <x> <y> <z>

$Elements

  • Liste aller Elemente im Modell und Zuordnung des Teilmodells und der Eigenschaften
  • Syntax: <id> <element_type> x <part_id> <nodes...>
  • Bisher implementierte Elementtypen sind:
    • 1: lineares Element mit 2 Knoten
    • 15: punktförmiges Element mit 1 Knoten
  • Statt x kann ein beliebiger Buchstabe gewählt werden; er dient nur als Platzhalter, um die Kompatibilität zu Gmsh sicherzustellen

Beispiel eines Input-Files

$Bridge input

$PhysicalNames
1 "cross1"
2 "cross2"
3 "cross3"
4 "cross4"
5 "fixed_support"
6 "roller_support"
$EndPhysicalNames

$Material 1
YOUNGS_MODULUS 1000
$EndMaterial

$Properties 1
material 1
crossSectionArea 2
$EndProperties

$Properties 2
material 1
crossSectionArea 10
$EndProperties

$Properties 3
material 1
crossSectionArea 3
$EndProperties

$Properties 4
material 1
crossSectionArea 1
$EndProperties

$Nodes
1 0 0 0
2 10 5 0
3 10 0 0
4 20 8 0
5 20 0 0
6 30 9 0
7 30 0 0
8 40 8 0
9 40 0 0
10 50 5 0
11 50 0 0
12 60 0 0
$EndNodes

$Elements
99 15 x 5 1
98 15 x 6 12
1  1  x 1 1 3
2  1  x 1 3 5
3  1  x 1 5 7
4  1  x 1 7 9
5  1  x 1 9 11
6  1  x 1 11 12
7  1  x 2 1 2
8  1  x 2 2 4
9  1  x 2 4 6
10 1  x 2 6 8
11 1  x 2 8 10
12 1  x 2 10 12
13 1  x 3 2 3
14 1  x 3 4 5
15 1  x 3 6 7
16 1  x 3 8 9
17 1  x 3 10 11
18 1  x 4 2 5
19 1  x 4 4 7
20 1  x 4 7 8
21 1  x 4 9 10
$EndElements

Netzerstellung mit Gmsh

Das Open-Source Programm Gmsh kann auch dazu verwednet werden, ein kompatibles Inputfile zu generieren. Nachdem die Geometrie erstellt wurde, müssen nun alle Elemente einer "Physical Group" hinzugefügt werden. Dazu geht man im Menü auf Geometry -> Physical Groups -> Add und fügt dann die Punkte, Linien, Flächen oder Volumen einer Gruppe hinzu. Mit e wird die Gruppe gespeichert, mit q kann man die Eingabe abbrechen. Anschließend muss das Mesh erzeugt und gespeichert werden. Die von Gmsh erstellte msh-Datei muss nun noch um die Properties und Materials erweitert werden, ist sonst aber sofort kompatibel zu bm_fem.

Import des Modells in bm_fem

Um das Modell zu importieren, muss zuerst ein Objekt ModelIO mit dem Pfad der Inputdatei als Parameter erzeugt werden. Die Methode readModel gibt ein FemModel mit allen Knoten und Elementen, die im Inputfile definiert sind, zurück. Danach können die Knoten und Elemente im Modell mit den get und set Befehlen angesprochen werden.

io = ModelIO('validation_bridge_input.msh');
model = io.readModel;

Der Elementtyp, der bei der Erstellung gewählt wird, kann, z.B. für ein linienförmiges Element mit 2 Knoten, mit

io.setElementTypeLine2n(typeName)

angepasst werden. typeName ist hier der Name eines bereits implementierten Elements.