Hallo alle zusammen,
ich habe ein paar Fragen bzgl. Python skripting:
Ziel ist alle vorhanden steps und jeweils alle dazu verfügbaren Frames & jeweils alle dazu verfügbaren FieldOutput-Variablen auszulesen abzuspeichern in Variablen, um Sie für die spätere Verwendung/Manipulation zur Verfügung zu haben.
Dazu benötige ich die steptime für jeden step, die maximale anzahl an frames, maximale Anzahl an feldvariablen (pro frame), um diese gezielt mittels for schleifen ansprechen zu koennen.
Meine Fragen lauten deshalb:
(1.) Wie komme ich für jeden beliebigen step an die jeweilige step time heran?
(2.) Wie komme ich für jeden beliebigen step an die maximale frameanzahl heran?
(3.) Wie komme ich für jeden beliebigen step an die maximale FieldOutput-Anzahl heran?
Bezogen auf einen fest vorgebenen step, fest vorgebenen frame & eine fest vorgegebene Ausgabevariable würde laut Abaqus Manual das ganze wie folgt aussehen:
lastFrame = odb.steps['Step-1'].frames[-1] # letzter frame
for fieldName in lastFrame.fieldOutputs.keys():
print fieldName # ausgabe aller Feldvariablen
for f in lastFrame.fieldOutputs.values():
print f.name, ':', f.description
print 'Type: ', f.type
displacement=lastFrame.fieldOutputs['U'] # exemplarisch x,y-Werte von Displacement von Step-1, letzter frame ausgeben
fieldValues=displacement.values
for v in fieldValues:
print 'Node = %d U[x] = %6.4f, U[y] = %6.4f' % (v.nodeLabel,
v.data[0], v.data[1])
# Mein Versuch das zu bewerkstelligen lautet bisher:
from abaqus import *
from abaqusConstants import *
import visualization
import odb
import odbAccess
import step
myOdb=session.openOdb(name='myOdb', path='visco_3steps.odb', readOnly=False)
# oeffnen der ODB
Nosteps1={}
Nosteps1=myOdb.steps.keys()
laengeS=len(Nosteps1)
# ablegen aller stepnamen in Nosteps1 & Gesamtanzahl der steps in laengeS
# Was klappt ist für alle steps den Gesamt-Container des letzten frames ausgeben:
lastFrame={}
for stepanz in range (0,laengeS):
lastFrame = myOdb.steps[myOdb.steps.keys()[stepanz]].frames[-1]
#firstFrame= lastFrame = myOdb.steps[myOdb.steps.keys()[stepanz]].frames[0]
print 'last FRAME :',stepanz, lastFrame
# Zugriff auf den letzten (ersten) Frame des jeweiligen Steps
Obiger Print Befehl liefert für den ersten Step:
last FRAME : 0 ({'cyclicModeNumber': None, 'description': 'Increment 4331: Step Time = 5.0000E-03', 'domain': TIME, 'fieldOutputs': 'Repository object', 'frameId': 4331, 'frameValue': 0.00499999988824129, 'frequency': None, 'incrementNumber': 4331, 'isImaginary': False, 'loadCase': None, 'mode': None})
Step time ist also hinterlegt, nur wie komme ich an Step-Time, frameID===Increment Nummer, frameValue===realer Zeitpunkt heran?
Gewollt ist etwas in der Art:
frames_steps={}
for stepanz in range (0,laengeS):
for anzahlframes in range (0,anzFrame):
frames_pro_steps=myOdb.steps[myOdb.steps.keys()[stepanz]].frames[ ÜBER ALLE FRAMES d.h. von 0.0 bis maxframe ]
# Abspeichern der Step/Frame-Daten in eine Liste der Form (steps-1 x frames_step1, step-2 x frames_step2, ..., last_step x frames_last_step)
# um damit beliebig auch auf unbekannte Daten zugreifen zu können
felder_frame={}
for anzahlfelder in range (0,anzFelder)
felder_frame=frames_pro_steps.fieldOutputs[ Speicherstelle des aktuellen OUTPUTFIELDS === anzahlfelder(???) ]
# An der Stelle --> [ Speicherstelle des aktuellen OUTPUTFIELDS === anzahlfelder(???) ] wird ein String erwartet
# würde obige Variante funktionieren?
Sinn der ganzen Sache ist es dann mittels
felder_frame.values[] etc. auf die abgespeicherten Werte, positionen Typen etc. ganz beliebig zugreifen zu können, diese durch das Speichern z.B. in externen Dateien dann besser verwalten zu können.
# Mein Versuch die Anzahl der gespeicherten Felder zu bestimmen ging leider schief:
counter=0
for fieldName in lastFrame.fieldOutputs.keys():
counter=counter+1
laengeFeldnamen=len(fieldName)
# gibt die Laenge der Strings der einzelnen Feldvariablen aus & leider nicht die Anzahl der vorhandenen Feldvariablen :-(
AnzFelder=counter # kommt einfach nur Quark heraus
print anzFelder, laengeFeldnamen, fieldName
# Mittels folgendem Code-Teil kann man dann auf die jeweiligen frames zugreifen.
for anzsteps in range (0,laengeS):
s1=myOdb.steps[myOdb.steps.keys()[anzsteps]]
print 's1 ist =', s1
frK= s1.getFrame(0.03)
print 'frK ist =', frK
Wenn jemand Rat weiss auch bei Unterpunkten bitte Antworten.
ciao Gunkerle
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP