| |
| KISTERS 3DViewStation optimiert die Lizenzverwaltung für ihre Kunden, eine Pressemitteilung
|
Autor
|
Thema: Python: Erzeugung eines reportfiles (1070 mal gelesen)
|
Gunkerle Mitglied WMA
Beiträge: 133 Registriert: 15.03.2007
|
erstellt am: 30. Mrz. 2009 14:49 <-- editieren / zitieren --> Unities abgeben:
Hallo alle zusammen, ich habe eine Frage zum Thema Python/Reportfilegenerierung. Folgendes moechte ich tun: (A) Erzeugung eines Reportfiles aus einer vorhandenen ODB-Datei. In dem Reportfile sollen alle Variablen hineingeschrieben werden und zwar in folgender Variante: 1.) alle element nodal Variablen und zwar in der Sortierung nach den Elementlabels (default ist nodal label) 2.) Elementvariable EVOL 3.) alle unique nodal Variablen, die NICHT bereits unter Elementnodal erfasst sind. Wichtig sind zwei Dinge: (I) alle Steps & alle Zeitpunkte (timesteps) werden automatisch hineingeschrieben. (II) alle Variablen werden automatisch in das Reportfile hineingeschrieben. Wenn die Punkte (I) & (II) nicht automatisch funktionieren (oder nur sehr aufwändig realisiert werden können), wie kann man mit Python mittels einer Vorgabe z.B. in einer externe datei der Art: variablen.txt: s ee er ELSE, ... Steps.txt: name1 name 2 name3 ...mit einem Pythonskript die gewuenschte Reportfileausgabe realisieren? (B) Läßt sich der Start/die Ausführung des Pythonskriptes per Batch-Befehl in der Art von "call pythonskript" durchführen?
ciao Gunkerle
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 30. Mrz. 2009 16:39 <-- editieren / zitieren --> Unities abgeben: Nur für Gunkerle
Hallo Gunkerle, Was ich bis jetzt vestanden habe: Du willst aus einer odb verschiedene Variablen in eine (oder mehrere..) Dateien extrahieren. Soweit so gut. Ich versteh jedoch nicht so ganz was du unter 1. meinst. Kannst du das vielleicht ausführlicher erklären (am besten mit einem Beispiel wie der Output am Ende aussehen soll ). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Gunkerle Mitglied WMA
Beiträge: 133 Registriert: 15.03.2007
|
erstellt am: 30. Mrz. 2009 17:19 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von carsten1983: Hallo Gunkerle,Was ich bis jetzt vestanden habe: Du willst aus einer odb verschiedene Variablen in eine (oder mehrere..) Dateien extrahieren. Soweit so gut. Ich versteh jedoch nicht so ganz was du unter 1. meinst. Kannst du das vielleicht ausführlicher erklären (am besten mit einem Beispiel wie der Output am Ende aussehen soll :) ).
Hallo carsten1983, ich benoetige im Wesentlichen die Element-nodal Variante der Variablen, auch da ich u.a. die Elementnummerierung im Reportfile benoetge. Nicht alle Variablen wie z.B. (coord & NT11) stehen aber nicht als Element nodal zur Verfuegung, deshalb benoetige ich auch noch ein paar Variablen als Unique nodal. Man kann zwei verschiedene Sortierungen in ABQ-CAE einstellen: Sortierung nach Knotennummer (default Wert) oder Sortierung (aufsteigend) nach Elementnummer. Ich benoetige die letztgenannte Variante. Neben diesen benoetige ich (zur Zeit) noch die Elementvariable EVOL. Ich werte das Reportfile anschließend mit einem C-Programm aus, welches mir die Daten in Excel-konforme Formate umschreibt und allerlei Berechnungen darauf losläßt. Um den gesamten Auswertungsvorgang automatisieren zu können, muss ich allerdings in der Lage sein die Reportfiles per Skript (Pythonskript) erzeugen zu koennen. ciao gunkerle Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 31. Mrz. 2009 10:58 <-- editieren / zitieren --> Unities abgeben: Nur für Gunkerle
Hallo Gunkerle, ich habe mich mal an deinem Problem versucht. Ich bin mir jedoch nicht sicher, ob das was rauskommt, wirklich das ist was du suchst. Mit diesem Script wird jedenfalls die odb geöffnet und es werden alle Variablen die auf Knoten vorhanden sind und alle Variablen die nur für Elemente ausgegeben werden können, in zwei Dictionaries gespeichert. Aus diesen Dictionaries lässt sich dann mit ein paar Zeilen, eine den Wünschen entsprechend formatierte Datei erstellen. Das ist allerdings noch in Eigenregie zu tun.
Code: import visualization,odbAccessodb_name=r'c:\uni\abaqus\umatttest\ohne_umat.odb' myOdb=visualization.openOdb(path=odb_name) step_namen=myOdb.steps.keys() # ab hier ueber Steps, Frames und Outputvariablen iterieren.. for step_name in step_namen: Zeit_knoten_dict,Zeit_element_dict={},{} for k_frame in xrange(len(myOdb.steps[step_name].frames)): akt_frame=myOdb.steps[step_name].frames[k_frame] knoten_variablen=akt_frame.fieldOutputs.keys() zeit=akt_frame.description zeit=float(zeit[zeit.index('=')+1:].strip()) Knoten,Element={},{} for knoten_variable in knoten_variablen: daten=akt_frame.fieldOutputs[knoten_variable].values for x in daten: if x.nodeLabel!=None: # das ist vermutlich das was als unique-nodal gefuehrt wird if x.nodeLabel in Knoten.keys(): # nicht mehr frisches Knoten{}--> alle variablen eintragen werte=Knoten[x.nodeLabel] werte.update({knoten_variable:x.data}) Knoten.update({x.nodeLabel:werte}) else: # frisches Knoten dict werte={knoten_variable:x.data} Knoten.update({x.nodeLabel:werte}) elif x.elementLabel!=None: # Elementvariablen.. if x.elementLabel in Element.keys(): # nicht mehr frisches Element{}--> alle variablen eintragen werte=Element[x.elementLabel] werte.update({knoten_variable:x.data}) Element.update({x.elementLabel:werte}) else: # frisches Element dict werte={knoten_variable:x.data} Element.update({x.elementLabel:werte}) Zeit_element_dict.update({zeit:Element}) Zeit_knoten_dict.update({zeit:Knoten})
# Zeit_element_dict und Zeit_knoten_dict sind Dictionaries, deren Schluessel # die Zeitpunkte des jeweiligen Frame sind. Darin sind die Outputvariablen # aller Elemente/Knoten ueber ihren Schluessel abrufbar. myOdb.close() # sortieren.. for x in Zeit_element_dict: element_keys=Zeit_element_dict[x].keys() element_keys.sort() zed=Zeit_element_dict # Faulheit..
# Ausgabe.. ff=open(r'C:\1\ausgabe.txt','w') # hier muss jetzt die Reihenfolge der Variablen rein , und das iterierend ueber # alle (noch zu sortierenden) Zeiten und alle element_keys (sind sortiert). ff.write(...) ff.close()
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Gunkerle Mitglied WMA
Beiträge: 133 Registriert: 15.03.2007
|
erstellt am: 31. Mrz. 2009 14:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Carsten1983, erst mal vielen Dank, dass hilft mir schon gewaltig weiter. Ich habe da noch zwei Fragen: 1.) Kann man auch die Parts mit einlesen in der Art: step_namen=myOdb.steps.keys() 2.) Ich hatte mal gelesen, dass die Daten mittels Pythonskript in ein Reportfile schreiben kann, finde die Stelle aber gerade nicht wieder. Weisst Du wie die entsprechend Aenderung der Ausgabe aussehen muesste? # Ausgabe.. ff=open(r'C:\1\ausgabe.txt','w') # Reihenfolge Variablen Iteration über alle Zeiten & Elemente ff.write(...) ff.close()
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 01. Apr. 2009 08:53 <-- editieren / zitieren --> Unities abgeben: Nur für Gunkerle
Ich habe hier die Ausgabe für die Elementvariablen (so es denn die richtigen sind) noch angefügt. Außerdem ist im oberen Teil ein bischen was verändert. zu deiner 2. Frage: Du könntest beim Schreiben des Output einfach noch die Zugehörigkeit des Knotens zur Instance ermitteln und ebenfalls rausschreiben. Wie das geht steht im Handbuch: Abschnitt 8.5.4 wäre da relevant. Code: import visualization,odbAccess odb_name=r'c:\uni\abaqus\umatttest\ohne_umat.odb'
myOdb=visualization.openOdb(path=odb_name) step_namen=myOdb.steps.keys() # falls nur bestimmter Output gewuenscht ist, muss in #knoten_variablen=[] # eine Reihe von Strings, die die Variablen bezeichnen eingetragen werden. # Ausserdem muss bei # xxx die Zeile auskommentiert werden # ab hier ueber Steps, Frames und Outputvariablen iterieren.. for step_name in step_namen: Zeit_knoten_dict,Zeit_element_dict={},{} for k_frame in xrange(len(myOdb.steps[step_name].frames)): akt_frame=myOdb.steps[step_name].frames[k_frame] knoten_variablen=akt_frame.fieldOutputs.keys() # xxx zeit=akt_frame.description zeit=float(zeit[zeit.index('=')+1:].strip()) Knoten,Element={},{} for knoten_variable in knoten_variablen: daten=akt_frame.fieldOutputs[knoten_variable].values for x in daten: if x.elementLabel!=None: # Elementvariablen.. if x.elementLabel in Element.keys(): # nicht mehr frisches Element{}--> alle variablen eintragen werte=Element[x.elementLabel] werte.update({knoten_variable:x.data}) Element.update({x.elementLabel:werte}) else: # frisches Element dict werte={knoten_variable:x.data} Element.update({x.elementLabel:werte}) elif x.nodeLabel!=None: # das ist vermutlich das was als unique-nodal gefuehrt wird if x.nodeLabel in Knoten.keys(): # nicht mehr frisches Knoten{}--> alle variablen eintragen werte=Knoten[x.nodeLabel] werte.update({knoten_variable:x.data}) Knoten.update({x.nodeLabel:werte}) else: # frisches Knoten dict werte={knoten_variable:x.data} Knoten.update({x.nodeLabel:werte}) Zeit_element_dict.update({zeit:Element}) Zeit_knoten_dict.update({zeit:Knoten}) # Zeit_element_dict und Zeit_knoten_dict sind Dictionaries, deren Schluessel # die Zeitpunkte des jeweiligen Frame sind. Darin sind die Outputvariablen # aller Elemente/Knoten ueber ihren Schluessel abrufbar. # sortieren.. for x in Zeit_element_dict: element_keys=Zeit_element_dict[x].keys() element_keys.sort()
element_zeiten=Zeit_element_dict.keys() element_zeiten.sort() knotenvars=Zeit_knoten_dict[Zeit_knoten_dict[0].keys()[0]][Zeit_knoten_dict[0].keys()[0]].keys() elevars=Zeit_element_dict[Zeit_element_dict[0].keys()[0]][Zeit_element_dict[0].keys()[0]].keys() zed=Zeit_element_dict # Faulheit.. # Ausgabe.. ff=open(r'C:\1\ausgabe.txt','w') a=str(elevars) a=a.replace(',',';') a=a[a.index('[')+1:a.index(']')] ff.write('Zeit; Elementnummer;%s \n' %a) for x in element_zeiten: ff.write(str(x)+'; ') for y in element_keys: zeile='' ff.write(str(y)) for z in elevars: akt_var=str(repr(zed[x][y][z])) if '[' in akt_var and ']'in akt_var: akt_var=akt_var[akt_var.index('['):akt_var.index(']')+1] zeile=zeile+'; '+akt_var #print zed[x][y][z] #ff.write(str(zed[x][y][z])+'; ') ff.writelines(zeile+'\n') del zeile ff.close() myOdb.close()
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Glockner55 Mitglied
Beiträge: 15 Registriert: 10.07.2008
|
erstellt am: 21. Apr. 2009 12:54 <-- editieren / zitieren --> Unities abgeben: Nur für Gunkerle
Danke für das Script, aber ich hätte noch eine Frage. Kann man das ganze nicht auch noch dahin ändern, das man nur ausgewählte Elemente ausliest. Es ist bei mir leider nicht mehr möglich ein Element-Set zu erzeugen, da meine Berechnung ca 2 Wochen gedauert hat und ich nun nur noch die Ergebnisse auswerten muss. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 21. Apr. 2009 13:02 <-- editieren / zitieren --> Unities abgeben: Nur für Gunkerle
Wenn ich mich recht entsinne, liest das Script alle Daten (für Knoten und/oder Elemente) und schreibt sie für alle Elemente (so wie sie da steht )in eine Textdatei. Du müsstest deshalb nur Code: element_keys
mit einer Liste aller für dich relevanten Elemente überschreiben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Glockner55 Mitglied
Beiträge: 15 Registriert: 10.07.2008
|
erstellt am: 21. Apr. 2009 13:49 <-- editieren / zitieren --> Unities abgeben: Nur für Gunkerle
hmm, das ist schon mal gut für die ausgabe, aber ich würde es gerne auch schon beim einlesen verwenden, da ich ca 90000 Elemente und 150 Steps habe. Ich benötige aber nur Werte von ca. 30 Elementen. Da dauert es sonst ewig sie einzulesen. Kannst du mir da auch bei helfen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |