Erweitertes Postprocessing sowie ODB-Dateien und Python-Skripte in Abaqus

Veröffentlicht 30.03.2023

Modifizierte Felder zu Beschreibungsvariablen (Verschiebungen, Spannungen, etc.) können im Abaqus Viewer angelegt, aber nicht abgespeichert werden. Die im Abaqus Viewer angelegten Felder stehen dem Anwender nur temporär zur Verfügung. Im ersten Teil dieses Artikels wird gezeigt, wie man mit Python-Scripting ODB-Dateien benutzerspezifisch erweitern kann, so dass alle relevanten Ergebnisse jederzeit schnell einsehbar sind. Die Erweiterung wird an einem Modell mit zwei Körpern gezeigt. Im gemeinsamen Kontaktbereich soll die Relativverschiebung mit Pfeilen verdeutlicht werden. Der zweite Teil widmet sich der individualisierten Auswertung von Berechnungsergebnissen, dargestellt mit der kinetischen Energie von beliebig ausgewählten finiten Elementen.

Redaktionsleitung
Dipl.-Ing. Nicole Meyer
Dipl.-Ing. Nicole Meyer
Senior Consulting 3DS-PLM | Redakteurin 3DS-PLM Technisches Magazin
Autor*in
Sven Reinstädler, Dr.-Ing.
Dr.-Ing. Sven Reinstädler
Consultant FEM 3DS-PLM

Benutzerdefinierte Felder

Die Erweiterung der ODB-Ergebnisdatei ist am Beispiel eines elastischen, in Längsrichtung gestauchten Schlauchs gezeigt, der auf ein starres Rohr aufgezogen ist. Das in Abbildung 1 gezeigte Modell nutzt die Symmetrien der Struktur aus. Wie dem Ausschnitt des Modellbaums entnommen werden kann, setzt es sich aus zwei "Instances" mit den Namen "Rubber" und "Rigid" zusammen. Die Belastung des Schlauches erfolgt in zwei Schritten. Im Step Fit ist der Schlauch mit *CONTACT INTERFERENCE in Umfangsrichtung aufgedehnt, im Step Loading ist anschließend die Druckspannung am freien Rand des Schlauches kontinuierlich gesteigert.

In Abbildung 2 ist die Relativverschiebung zwischen dem Schlauch und dem Rohr mit Pfeilen dargestellt. Es ist deutlich zu sehen, dass der deformierte Schlauch im Bereich der Lasteinleitung mit du = uRohr – uSchlauch = 2,505e-03 am stärksten gegenüber dem Rohr abrutscht. Zum Längslager hin reduziert sich die Relativverschiebung entsprechend der gesetzten Wegrandbedingung auf Null (siehe Abbildung 1). Der besseren Übersicht halber sind Pfeile nicht an jedem Element-Knoten dargestellt, das Vektorfeld SlipVec ist sichtbar ausgedünnt. Es ist mit dem in Abbildung 3 gezeigten Python-Skript angelegt und abgespeichert, das im Folgenden näher diskutiert wird.

Mit dem Python-Skript wird zunächst das Abaqus-Modul odbAccess eingebunden. Dann wird die ODB-Datei MyJob geöffnet, aus der die abgespeicherten Felder CSLIP1, CTANDIR1, CSLIP2 und CTANDIR2 mit den Zeilen 4 bis 8 geladen werden. CSLIP1 und CSLIP2 enthalten Beträge von Relativverschiebungen, in CTANDIR1 und CTANDIR2 sind die jeweils zugehörigen Richtungsvektoren abgelegt, so dass das neue Vektorfeld SlipVec angelegt werden kann:

SlipVec = CSLIP1 CTANDIR1 + CSLIP2 CTANDIR2

Hinweis: Mit frames [-1] wird die Relativverschiebung zum zuletzt abgespeicherten Berechnungsinkrement ausgewertet.
Im Folgenden werden der Reihe nach ein neuer Step, Frame und Field Output angelegt. Die Methode addData (siehe Zeile 42) verlangt neben den Knotennummern und Komponenten der zugeordneten Vektoren unter anderem den Namen der "Instance", für die das neue Datenfeld anzulegen ist (siehe Zeile 21).

Hinweis: Eine "Instance" ist stets erforderlich, auch dann, wenn das FE-Modell mit einem flachen Input-Deck beschrieben ist. In diesem Fall empfiehlt es sich, den Aufbau von odb.rootAssembly über das Kernel Command Line Interface (siehe Abbildung 7) näher zu erschließen. Lassen Sie sich dazu die Inhalte eines Objektes mit dem Print-Befehl anzeigen (z.B. print odb.rootAssembly.instance['RUBBER']).

Python durchläuft nun alle Datensätze in CSLIP1 mit:

while i < len(Mag1.values) :

Welche Zeilen innerhalb der while-Bedingung wiederholt durchlaufen werden, legt deren Einrückung fest. Gleiches gilt für die Fallunterscheidung in den Zeilen 34 bis 39. So gehört Zeile 39 noch zur Fallunterscheidung, während Zeile 40 wieder der while-Bedingung zugeordnet ist.

Im Rechenteil (Zeile 26 bis 32) sieht man, wie die Richtungsvektoren mit den zugehörigen Werten von CSLIP1 und CSLIP2 multipliziert und dem jeweils resultierenden Vektor mit seinen Komponenten l1, l2 und l3 additiv zugewiesen werden.

Für eine schnellere Auswertung können die Arrays nodeLabelData und dispData für i = 0 auch außerhalb der while-Bedingung angelegt werden. Da in diesem Artikel nicht die Performance von Python-Skripten im Vordergrund steht, ist hier die Anlage der Felder in die while-Bedingung mit integriert. Abschließend ist darauf hingewiesen, dass die addData-Methode nach Datenfeldern vom Typ Tuple verlangt, so dass beim Ablegen der Knotennummern und der Vektor-Komponenten in den grün markierten Zeilen zuletzt ein Komma gesetzt ist.

Hinweis: Datenfelder vom Typ Tupel können, wenn einmal angelegt, nicht modifiziert werden.

Benutzerdefinierte Auswertungen

Eine Methodik für die Auswertung der kinetischen Energie von beliebig ausgewählten finiten Elementen ist an der Bewegung eines quadratischen Würfels dargestellt. Der 7850 kg schwere Würfel ist mit acht finiten Elementen modelliert (siehe Abbildung 4). Er bewegt sich mit der Anfangsgeschwindigkeit von 2 m/s.

Es soll die kinetische Energie vierer Elemente ausgewertet werden. Sie sind im Element-Set MYELE zusammengefasst, das nach der expliziten Berechnung im Abaqus Viewer angelegt ist (siehe Abbildung 5). Damit das Element-Set abgespeichert werden kann, muss die ODB-Datei im Schreibmodus geladen werden. Dazu ist der Read-Only-Modus zu deaktivieren, der mit den Voreinstellungen vom Abaqus Viewer standardmäßig gesetzt ist.

Nachdem das Element-Set abgespeichert und die ODB-Datei geschlossen ist, wird das eigens erstellte Python-Skript über das Hauptmenü > File > Run Script… aufgerufen. Wenn die ODB-Datei geschlossen ist, kann das Python-Skript alternativ auch über die Kommandozeile ausgeführt werden mit:

abaqus viewer database=MyJob.odb replay=Post.py

Für die Berechnung der kinetischen Energie lädt das in Abbildung 6 dargestellte Python-Skript mit den Zeilen 7 bis 9 das Geschwindigkeitsfeld, das Dichtefeld und mit EVOL das Feld der Elementvolumen in den Arbeitsspeicher. Während die Geschwindigkeiten an den FE-Knoten vorliegen, liegen Dichte und Volumen nach Zeile 9 elementweise vor. Nach den Feld-Variablen wird mit Zeile 11 das Element-Set MYELE geladen, für dessen Elemente die kinetische Energie anschließend sukzessive ausgewertet wird mit:

for E in Ele :

Das vorgestellte Skript ermittelt die kinetische Energie mit Zeile 20, auf Grundlage von elementweise gemittelten Geschwindigkeiten (Zeile 15 bis 18). Für jedes Element von MYELE wird dazu zunächst der Geschwindigkeitsvektor Vi zu Null gesetzt. Dann wird mit der Konnektivität des jeweiligen Elementes über dessen Knoten gelaufen und der Geschwindigkeitsvektor in Schritten aufgebaut. Alle Knotengeschwindigkeiten erhalten dabei dieselbe Wichtung. Sie ist mit

1. / len(E.connectivity) allgemeingültig bestimmt. Da die kinetische Energie schnell ausgewertet ist, wird sie mit Zeile 25 direkt ausgegeben, entweder im Abaqus Viewer (siehe Abbildung 7) oder alternativ auf der Kommandozeile. Dass die kinetische Energie nicht exakt zu 7850 J berechnet wird, liegt an der expliziten Berechnung mit einfacher Genauigkeit.

Weitere Beispiele zum Abaqus-Scripting finden Sie im "Abaqus Scripting Reference Guide" Kapitel 9.10 "Example scripts that access data from an output database". Dort ist neben Field Outputs auch der Zugriff auf History Outputs im Detail beschrieben.

Tipp: Für lineare Algebra wird das Python-Modul NumPy empfohlen, Datenmanagement ist einfach mit dem OS-Modul möglich. Mit os.system("abaqus viewer database=MyJob.odb replay=Post.py") können Sie zum Beispiel den Abaqus Viewer innerhalb eines Python-Skripts anstarten.

Weitere Artikel zum Thema

Technisches Magazin jetzt abonnieren