USER-SUBROUTINE
Im Folgenden werden der Aufbau und die Funktionsweise der User-Subroutine UAMP dargestellt, die wie in Abb. 7 gezeigt, über die Dialogbox Edit Job in die Berechnung mit eingebunden werden kann. Im Input-Deck ist allein definition=USER in
*Amplitude, name=AMP_USER, time=TOTAL TIME, definition=USER, variables=2
zu setzen (siehe Abb. 6 Zeile 1). Über die Kommandozeile wird die Berechnung alternativ mit
abaqus job= JobName user= MySubRoutine.f
gestartet. Soll die Fortran-Routine MySubRoutine.f nicht einsehbar sein, kann mit
abaqus make library= MySubRoutine.f
zunächst eine Library erstellt werden, die dann mit
abaqus job= JobName user= MySubRoutine-std
in die Berechnung miteingebunden wird.
Bevor die entwickelte User-Subroutine diskutiert wird, werden wichtige Regeln, die zur Interpretation der dargestellten FORTRAN-Routine bekannt sein müssen, in kompakter Form angegeben. In FORTRAN werden:
- nur die Spalten 7 bis 72 vom Compiler als Anweisung umgesetzt
- Zeilen als Fortsetzungszeile interpretiert, wenn in Spalte 6 ein Zeichen steht (das Leerzeichen und die Null sind ausgenommen)
- Zwischen Groß- und Kleinschreibung wird im Allgemeinen nicht unterschieden
- Variablen, die mit dem Zeichen i-n beginnen, automatisch als Integer-Variablen interpretiert. Steht zu Beginn ein Zeichen a-h oder o-z werden sie als Real-Variablen angelegt.
Die zuletzt aufgeführte Standard-Regelung darf bei Abaqus-Routinen mit implicit none nicht ausgeschaltet werden. Des Weiteren muss bei Abaqus/Standard nach subroutine name (Variablen) die Datei aba_para.inc mit include eingebunden sein (siehe Abb. 8 Zeile 7). Die Verwendung von Tabulatoren ist unbedingt zu vermeiden, da ein Tabulatorschritt als nur ein Zeichen gelesen wird, so dass die nachfolgende Anweisung vom Compiler häufig falsch oder gar nicht umgesetzt wird.
Hinweis: In vielen Editoren können Tabulatorschritte mit dem regulären Ausdruck \t gesucht und gefunden werden.
Die dargestellte User-Subroutine wurde aus der User-Subroutine uamp_rigmultimech.f abgeleitet, die im Abaqus Example Problems Guide 4.1.2 Crank mechanism enthalten ist. Für eine kompakte Darstellung wurden die Namen einiger Variablen verändert und nicht verwendete Variablen/Flags entfernt.
Nachdem die Datei aba_param.inc eingebunden ist (der Pfad zur Datei ist mit der Installation von Abaqus hinterlegt), werden die Längen der String-Variablen festgelegt, den Parametern konstante Werte zugewiesen und die Dimensionen und Größen der verwendeten Arrays gesetzt (siehe Zeile 9-17). Die Variablen charv, intv, realv und lop (Zeile 19) sind nicht primärer Bestandteil der Subroutine. Sie werden definiert, um die Anzahl der Pseudo-Kontakte in die MSG-Datei zu schreiben, die eine Kraft aktuell übertragen oder zurückliegend übertragen haben (Pseudo-Kontakte die unter Kraftwirkung stehen oder gestanden haben werden im Folgenden auch als aktive Kontakte bezeichnet). So wird auf die Zeilen 19-20 und 35-36 hier nicht näher eingegangen. Stattdessen ist auf den Abaqus User Subroutines Reference Guide Kapitel 2.1.14 verwiesen.
Mit dem Sachverhalt, dass jede Amplitude vom Typ User an ein und dieselbe Subroutine UAMP übergeben wird, folgt in Zeile 22 zunächst eine Fallunterscheidung bezüglich des Namens der übergebenen Amplituden. Da im vorgestellten Modell zur Klipp-Mechanik nur eine Amplitude definiert ist, könnten die Zeilen 22 und 48 auch auskommentiert werden.
Mit den Zeilen 24-27 läuft das Programm über alle Sensoren und fragt mit der Utility Routine GetSensorValue() den aktuellen Wert, der jeweils aufgenommenen Größe ab, hier mit CFNM die jeweilige Kontaktkraft. Ist die übertragene Kraft in einem Pseudo-Kontakt größer als 1.E-5 wird die zugehörige interne Variable auf Eins gesetzt (mit der Initialisierung ist Svars von Abaqus zu Beginn der Berechnung mit Nullen belegt). Damit bleibt für die Subroutine ein Kontakt auch dann aktiv, wenn die Kontaktkraft infolge zu großer Durchdringungen in den Kontaktflächen im Laufe der Berechnung wieder auf null abfällt. Die Anzahl der internen Variablen steht in der Variablen nSvars und ist mit variables=2 in
*Amplitude, name=AMP_USER, time=TOTAL TIME, definition=USER, variables=2
festgelegt (siehe Abb. 6 Zeile 1). Werden ein oder mehr als zwei Pseudo-Kontakte im Modell implementiert, ist der Wert für variables entsprechend anzupassen. Mit den Zeilen 29-33 wird anschließend die Anzahl der aktiven Kontakte ausgewertet.
Zunächst ist unterstellt, dass sich das Programm im zweiten Step befindet, so dass der Klipp mit einer Geschwindigkeit von -3 mm/s gegen den Halter gezogen wird (siehe Zeile 38). Mit Zeile 40 ist sichergestellt, dass von dieser Geschwindigkeit und Richtung nur dann abgewichen wird, wenn das Programm noch den ersten Step auswertet. Sind dann noch nicht alle Pseudo-Kontakte aktiv, wird der Klipp mit einer Geschwindigkeit von 7 mm/s noch weiter positioniert (siehe Zeile 41-42). Sind hingegen alle Kontakte aktiv, bricht das Programm mit Zeile 44 die Berechnung des ersten Step selbständig ab.