Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SIMULIA/ABAQUS
  Python: Erzeugung eines reportfiles

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   Python: Erzeugung eines reportfiles (942 mal gelesen)
Gunkerle
Mitglied
WMA


Sehen Sie sich das Profil von Gunkerle an!   Senden Sie eine Private Message an Gunkerle  Schreiben Sie einen Gästebucheintrag für Gunkerle

Beiträge: 133
Registriert: 15.03.2007

erstellt am: 30. Mrz. 2009 14:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von carsten1983 an!   Senden Sie eine Private Message an carsten1983  Schreiben Sie einen Gästebucheintrag für carsten1983

Beiträge: 125
Registriert: 11.10.2007

erstellt am: 30. Mrz. 2009 16:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Gunkerle an!   Senden Sie eine Private Message an Gunkerle  Schreiben Sie einen Gästebucheintrag für Gunkerle

Beiträge: 133
Registriert: 15.03.2007

erstellt am: 30. Mrz. 2009 17:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von carsten1983 an!   Senden Sie eine Private Message an carsten1983  Schreiben Sie einen Gästebucheintrag für carsten1983

Beiträge: 125
Registriert: 11.10.2007

erstellt am: 31. Mrz. 2009 10:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

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,odbAccess

odb_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


Sehen Sie sich das Profil von Gunkerle an!   Senden Sie eine Private Message an Gunkerle  Schreiben Sie einen Gästebucheintrag für Gunkerle

Beiträge: 133
Registriert: 15.03.2007

erstellt am: 31. Mrz. 2009 14:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von carsten1983 an!   Senden Sie eine Private Message an carsten1983  Schreiben Sie einen Gästebucheintrag für carsten1983

Beiträge: 125
Registriert: 11.10.2007

erstellt am: 01. Apr. 2009 08:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Glockner55 an!   Senden Sie eine Private Message an Glockner55  Schreiben Sie einen Gästebucheintrag für Glockner55

Beiträge: 15
Registriert: 10.07.2008

erstellt am: 21. Apr. 2009 12:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von carsten1983 an!   Senden Sie eine Private Message an carsten1983  Schreiben Sie einen Gästebucheintrag für carsten1983

Beiträge: 125
Registriert: 11.10.2007

erstellt am: 21. Apr. 2009 13:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Glockner55 an!   Senden Sie eine Private Message an Glockner55  Schreiben Sie einen Gästebucheintrag für Glockner55

Beiträge: 15
Registriert: 10.07.2008

erstellt am: 21. Apr. 2009 13:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2019 CAD.de | Impressum | Datenschutz