Autor
|
Thema: Field Output aus zwei odb's (3954 mal gelesen)
|
nbuhl Mitglied Dipl.-Ing.
Beiträge: 52 Registriert: 25.06.2007 RedHat 6.0 Workstation ABAQUS 6.101
|
erstellt am: 05. Feb. 2014 16:32 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich arbeite erst seit kurzem mit Abaqus und habe nun eine Frage bei der mir auch meine Kollegen nicht mehr weiterhelfen können. Und zwar möchte ich zwei heat-Rechnungen vergleichen. Dabei handelt es sich jeweils um das selbe Modell (kleine Knoten- und Element-IDs), lediglich der Wärmeeintrag hat sich verändert. Nun möchte ich mir bei einem bestimmten Inkrement die Differenztemperatur der Knoten als field output generieren. Leider weiß ich nicht wie ich die Werte aus zwei verschiedenen obd's verrechnen kann. Bringt das der Abaqus Viewer von Haus aus mit? Für Eure Tipps bin ich sehr dankbar! Grüße! nico Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mustaine Ehrenmitglied V.I.P. h.c.
Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 05. Feb. 2014 17:17 <-- editieren / zitieren --> Unities abgeben: Nur für nbuhl
Odbs verschmelzen Users Manual 3.2.19 Joining output database (.odb) files from restarted analyses Users Manual 3.2.21 Combining data from multiple output databases und dann die Felder miteinander verrechnen
CAE Manual 42.7.4 Creating field output by operating on fields Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nbuhl Mitglied Dipl.-Ing.
Beiträge: 52 Registriert: 25.06.2007 RedHat 6.0 Workstation ABAQUS 6.101
|
erstellt am: 06. Feb. 2014 09:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Mustaine, Danke für Deine Antwort. Ich glaube das geht schon in die richtige Richtung. Jedoch macht mir das Ganze ein bisschen Probleme, da die Anzahl der Steps und der Inkremente unterschiedlich sind. Beim Verbinden von Restart-ODBs scheint er mir dann die Steps mit gleicher Nummer zu überschreiben bzw. beim Kombinieren der Daten wirft er mir einen Fehler aus. Leider ist es von der Rechnung her nicht möglich die Steps anders zu definieren um so beide Rechnungen hier anzugleichen. Im Grunde geht es mir um den Fieldoutput von der Knotentemperatur bei einem bestimmten Inkrement. Dieses Inkrement hat aber in beiden ODBs nicht die gleiche Nummer bzw. Zeitstempel. Vielleicht hat hier jemand noch eine Idee für einen Workaround? Grüße! nico Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mustaine Ehrenmitglied V.I.P. h.c.
Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 06. Feb. 2014 12:02 <-- editieren / zitieren --> Unities abgeben: Nur für nbuhl
Das mit dem Restart hatte ich befürchtet, da beide Steps intern die ersten sind. Zwei Ideen hätte ich noch: 1. Python Du liest mit Python aus beiden odbs die gewünschten Daten aus, verrechnest sie und schreibst sie dann in einen neuen Step und neuen Frame auf eine der beiden odbs (oder eine ganz neue). siehe Scripting Users Guide 9. Using the Abaqus Scripting Interface to access an output database 2. Restart Du rechnest die erste Analyse ggf. nochmal und schreibst Restart-Daten. Dann kopierst du die .inp und wandelst sie mit einem Editor in eine Restart-Analyse um. Das ist simpel, sofern man mit der Restart-Methodik vertraut ist. Du liest von der ersten Analyse und setzt dann in einem dummy-Step alle Knotentemperaturen auf den Anfangswert zurück. Dann kommt der Step der die eigentliche zweite Analyse ist. Danach kannst du die erste odb und die restart odb verschmelzen und die Daten verrechnen. Ich habe das mal einem kleinen Beispiel getestet. Die Eingabedateien sind im Anhang. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nbuhl Mitglied Dipl.-Ing.
Beiträge: 52 Registriert: 25.06.2007 RedHat 6.0 Workstation ABAQUS 6.101
|
erstellt am: 06. Feb. 2014 16:04 <-- editieren / zitieren --> Unities abgeben:
Hallo! Vielen Dank nochmal für deine Antwort. Ich denke ich werde mich jetzt ersteinmal um Deine erste Idee kümmern. Früher oder später muss man sich wohl eh mit Python auseinandersetzen. Grüße + Danke! nico Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nbuhl Mitglied Dipl.-Ing.
Beiträge: 52 Registriert: 25.06.2007 RedHat 6.0 Workstation ABAQUS 6.101
|
erstellt am: 07. Feb. 2014 10:10 <-- editieren / zitieren --> Unities abgeben:
So,.. nun nochmal ich. Ich habe mich heute Morgin hingesetzt und versucht mittels Scripting Manual und dem Internet ein entsprechendes Python-Skript zu basteln, dass mir die Temperatur NT11 an den Knoten aus den zwei verschiedenen ODBs ausliest, von einander abzieht und anschließend ausgibt. Das Schreiben in eine neue ODB halte ich nicht für notwendig, da mir die reine Ausgabe vorerst reichen soll. Hier nun mein Skript mit dem ich Probleme habe. Im Grunde verstehe ich jeden Befehl bis auf die drei letzten Zeilen und genau da liegt auch der Hund begraben. Bei der vorletzten Zeile bekomme ich im PDE folgende Fehlermeldung: "VisError: There is no valid step data on the output database. Requested operation cancelled" Kann jemand helfen?
Code: from abaqus import * from abaqusConstants import * import visualization# Welcher fieldOutput soll behandelt werden f_output = 'NT11' # Angabe der ODBs die verarbeitet werden sollen odb_1 = '/pfad/zu/odb1' odb_2 = /pfad/zu/odb2' # Angabe der Steps und Frames in der jeweiligen ODB die verarbeitet werden sollen # STEP s_odb_1 = 'Step-1' s_odb_2 = 'Step-2' # FRAME f_odb_1 = 16 f_odb_2 = 6 # Auslesen des fieldOutput in ODB_1 myodb = visualization.openOdb(path = odb_1) step_odb_1 = myodb.steps[s_odb_1] frame_odb_1 = step_odb_1.frames[f_odb_1] temperatur_1 = frame_odb_1.fieldOutputs[f_output] # Auslesen des fieldOutput in ODB_2 myodb = visualization.openOdb(path = odb_2) step_odb_2 = myodb.steps[s_odb_2] frame_odb_2 = step_odb_1.frames[f_odb_2] temperatur_2 = frame_odb_1.fieldOutputs[f_output] # Berechnen der Temperaturdifferenz deltatemperatur = temperatur_1 - temperatur_2 # Viewport erstellen und mit zweiter ODB verbinden myviewport = session.Viewport(name='Temperaturdifferenz', origin=(10,10), width=150, height=100) myviewport.setValues(displayedObject=myodb) # Ausgabe der Temperaturdifferenz myviewport.odbDisplay.setPrimaryVariable(field=deltatemperatur, outputPosition=NODAL) myviewport.odbDisplay.display.setValues(plotState=(CONTOURS_ON_DEF, ))
[Diese Nachricht wurde von nbuhl am 07. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mustaine Ehrenmitglied V.I.P. h.c.
Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 07. Feb. 2014 11:58 <-- editieren / zitieren --> Unities abgeben: Nur für nbuhl
Du musst entweder auf der odb Step und Frame Container erzeugen um dort Daten abzulegen, oder temporär in der Session. Schmeiß' mal alles im Code nach der deltatemperatur weg und füge das ein.
Code:
currentOdb = session.odbs[odb_1] scratchOdb = session.ScratchOdb(odb=currentOdb) sessionStep = scratchOdb.Step(name='Session Step', description='Step for Viewer non-persistent fields', domain=TIME, timePeriod=1.0) sessionFrame = sessionStep.Frame(frameId=0, frameValue=0.0, description='Session Frame') sessionField = sessionFrame.FieldOutput(name='diff NT11', description='T1-T2', field=deltatemperatur)
Jetzt müsstest du in der ersten odb einen neuen Session Step mit einem Frame und Ergebnissen finden. Danach kannst du noch ein paar Darstellungsbefehle hinzufügen. Außerdem sind in deinem Code noch kleine Fehler. Du referenzierst beim verarbeiten von odb 2 mehrmals auf Dinge von odb 1. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nbuhl Mitglied Dipl.-Ing.
Beiträge: 52 Registriert: 25.06.2007 RedHat 6.0 Workstation ABAQUS 6.101
|
erstellt am: 07. Feb. 2014 13:36 <-- editieren / zitieren --> Unities abgeben:
Hallo! Suuper! Es lief direkt durch und hat das gewünschte Ergebniss erzielt! Vielen Dank! Ich werde nun noch versuchen deinen Codeschnippsel vollends nachzuvollziehen und dann kann ich damit arbeiten! Grüße! nico Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kappel Mitglied WMA
Beiträge: 48 Registriert: 14.11.2006 EDIT: Ich kann mit meinem Script defo1 und defo2 verarbeiten und daraus neue Felder erzeugen. Der Fehler tritt also aus wenn ich die Daten aus zwei ODBs verarbeite. Die Dimensionen der Felder müssen aber gleich groß sein weil ODB2 auf dem gleichen Modell basiert wie ODB1 wobei nur die Knotenkoordinaten verschoben wurden.
|
erstellt am: 27. Feb. 2014 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für nbuhl
Hallo mustaine, hallo nbuhl, ich hänge mich hier einmal an weil ich an einem sehr ähnlichen Problem arbeite. Ich habe zwei ODBs von denen ich die Verformungen (also das Feld U) vergleichen möchte. mit dem zuvor genannten Code komme ich zu diesem Punkt! Code: # Berechnen der Temperaturdifferenz deltatemperatur = temperatur_1 - temperatur_2
der bei mir dann so heißt: Code: # Berechnen der Verschiebungsdifferenz dU = -defo1 +defo2
Wenn ich das nun mache bekomme ich folgende Fehlermeldung: Specified operands are invalid. Habt ihr eine Idee, es es dazu kommen kann? Erik [Diese Nachricht wurde von Kappel am 27. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mustaine Ehrenmitglied V.I.P. h.c.
Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 03. Mrz. 2014 14:05 <-- editieren / zitieren --> Unities abgeben: Nur für nbuhl
Entweder du hast was vorher im Script nicht angepasst (z.B. den Namen der Variable) oder man kann die Verschiebungen nicht so direkt verrechnen. Vielleicht muss man es Komponentenweise machen, also U1, U2, U3. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |