Autor
|
Thema: Zugriff auf Nodesets in der odb (9102 mal gelesen)
|
Nicksen Mitglied wissenschaftlicher Mitarbeiter
Beiträge: 239 Registriert: 04.05.2007
|
erstellt am: 18. Apr. 2013 13:28 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, nach recht langer Zeit mal wieder ein Problem, auf das ich gestoßen bin. Um gezielte Auswertungen zu machen, nutzen wir bei uns die Möglichkeit Daten aus der odb zu entnehmen, weiter zu verarbeiten und anschließend in Textdateien zu schreiben. In der cae-Datei legen wir stets die interessanten Sets an, welche sowohl Knoten als auch Elemente sein können. Im Assembly-Modul sind diese definierten Sets zu finden und in der odb Datei kann man sie auch wiederfinden. In älteren Versionen von Abaqus konnte man per python skript recht einfach auf diese Sets zugreifen, output-Variablen anfordern und eben speichern. Mittlerweile verwenden wir hier Abaqus/CAE 6.12-1 und als ich diese Prozedur anwenden wollte erhielt ich einen Fehler, dass das Set nicht vorhanden sei. Ich schaute in die entsprechenden Listen und diese waren bzw. sind tatsächlich leer. Wenn ich den Baum der odb allerdings aufklicke, dann kann ich durchaus die definierten Sets finden. Im Anhang habe ich einen Screenshot der zeigt, was im odb-Baum zu sehen ist und im CLI unten den Fehler, bzw. die leere Liste. Meine Frage: Kann es sein, dass die odb-Knotensets woanders zu finden sind, als es ursprünglich im root.assembly.instances... der Fall war? Kann mir vielleicht jemand sagen, wie ich an die Knoten innerhalb dieser offensichtlich vorhandenen Knotensets komme? Ich muss bestimmte Ergebnisse dieser Knoten auswerten, was leider nicht per Report oder XY Hilfsmittel funktioniert. Es wäre wirklich sehr hilfreich, wenn jemand seine Erfahrungen preisgeben könnte. Auf eine alte Version kann ich leider nicht mehr zurück und die "What's new"- Dokumentation liegt mir ebenfalls nicht vor. Ganz vielen Dank im Voraus. mit besten Grüßen der Nixxen ------------------ =============== == Dingsen == =============== 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: 18. Apr. 2013 14:40 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
Vielleicht hast du dich irgendwo vertippt? Dein Setname ist z.B. nicht immer gleich. Bei mir funktioniert's jedenfalls. Je nachdem ob das Set auf Part- oder Assemblylevel angelegt wurde:
Code:
print session.odbs['Job-1.odb'].rootAssembly.nodeSetsprint session.odbs['Job-1.odb'].rootAssembly.instances['PART-1-1'].nodeSets
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nicksen Mitglied wissenschaftlicher Mitarbeiter
Beiträge: 239 Registriert: 04.05.2007
|
erstellt am: 18. Apr. 2013 14:55 <-- editieren / zitieren --> Unities abgeben:
Hallo mustaine, vielen Dank für die schnelle Hilfe. Ich war wirklich auf der falschen Ebene. Nun finde ich die Sets, aber die Abfrage der Knoten liefert leere Listen. pseudocode: print session.odbs[myOdb].rootAssembly.nodeSets.keys() liefert bspw.: [' ALL NODES', 'SET-LAGERSTELLE', 'SET-LASTEINLEITUNG'] len(session.odbs[myOdb].rootAssembly.nodeSets['SET-LAGERSTELLE'].nodes) liefert: 1 und weiter session.odbs[myOdb].rootAssembly.nodeSets['SET-LAGERSTELLE'].nodes[0].label AttributeError: 'OdbMeshNodeArray' object has no attribute 'label' Komischerweise hat eine derartige Abfrage auf Part-Ebene schon einmal funktioniert. In einer Testrechnung habe ich auch ein Knotenset auf Part-Ebene erstellt und mit der eingangs erwähnten Zeile aufgerufen. Das wurde gefunden und ist auch über die label-Abfrage einlesbar. Warum klappt das auf Assembly-Ebene nicht? Ich brauch die Knotennummern der Setknoten, damit ich mir die Ergebnisse auslesen kann. Sonst krieg ich nie einen ordentlichen Reaktionskraft-Zeit-Verlauf über alle Frames hin. mfg Nicksen ------------------ =============== == Dingsen == =============== 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: 18. Apr. 2013 15:24 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
nodes[0] ist erst die gesamte Liste. nodes[0][0] wäre der erste Knoten im Set und nodes[0][0].label dessen Knotennummer. Code:
a = session.odbs['Job-1.odb'].rootAssembly.nodeSets['SET-1'].nodes[0] for n in a: print n.label
Nachtrag: Auf Assembly-Ebene hat man deswegen eine extra Liste, weil die Sets über mehrere Instancen hinweg gehen können. Damit hat man z.B. mehrmals den Knoten #8. Deswegen hat man bei nodes erst eine Liste pro beteiligte Instance und dann in der nächsten Liste erst die Knoten pro Instance. Man müsste also ggf. über beide Ebenen iterieren, wenn man alle Knoten haben will (sofern das Set über mehrere Instancen hinweg geht).
[Diese Nachricht wurde von Mustaine am 18. Apr. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nicksen Mitglied wissenschaftlicher Mitarbeiter
Beiträge: 239 Registriert: 04.05.2007
|
erstellt am: 18. Apr. 2013 15:36 <-- editieren / zitieren --> Unities abgeben:
DANKE!!! Ganz vielen Dank. Zwar frage ich mich, worin der Sinn liegt die Syntax auf den verschiedenen Ebenen derart unterschiedlich zu formulieren, aber das scheint zu klappen. Nochmals vielen Dank! mfg Nicksen ------------------ =============== == Dingsen == =============== 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: 18. Apr. 2013 15:46 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
|
Nicksen Mitglied wissenschaftlicher Mitarbeiter
Beiträge: 239 Registriert: 04.05.2007
|
erstellt am: 18. Apr. 2013 15:57 <-- editieren / zitieren --> Unities abgeben:
Okay, das ergibt soweit schon Sinn. Danke für die Infos. Kann man das denn eigentlich im Skripting-Manual finden? Manche Fragen sind mir schon fast peinlich, aber ich finde in den Handbüchern selten eine wirkliche Antwort, wenn es ums Skripten geht. mfg Nicksen ------------------ =============== == Dingsen == =============== 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: 18. Apr. 2013 18:23 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
Wenn man will kommt man mit dem Scripting Reference Manual fast bis zum Ziel (Beispiel unten). Manchmal geht es aber schneller, sich z.B. mit "print" im CAE Python Interpreter die Inhalte der aktuellen Ebene anzuschauen und dann tiefer zu gehen. Beispiel: Zugriff auf Knoten in Node Sets
Zitat:
34.24.1 NodeSet(...)Path session.odbs[name].parts[name].NodeSet session.odbs[name].rootAssembly.instances[name].NodeSet session.odbs[name].rootAssembly.NodeSet
Ganz unten unter "Members" findet man auf der Seite dann:
Zitat:
nodes An OdbMeshNodeArray object specifying if a set spans more than one part instance, this member is a sequence of sequences for each part instance.
Das ODBMeshNodeArray ist ein Link und führt einen hierhin:
Zitat:
34.19 OdbMeshNode objectOdbMeshNode objects are created with the part.addNodes method. Access import odbAccess session.odbs[name].parts[name].elementSets[name].nodes[i] session.odbs[name].parts[name].nodes[i] session.odbs[name].parts[name].nodeSets[name].nodes[i] session.odbs[name].parts[name].surfaces[name].nodes[i] session.odbs[name].rootAssembly.elementSets[name].nodes[i] session.odbs[name].rootAssembly.instances[name].elementSets[name]\ .nodes[i] session.odbs[name].rootAssembly.instances[name].nodes[i] session.odbs[name].rootAssembly.instances[name].nodeSets[name]\ .nodes[i] session.odbs[name].rootAssembly.instances[name].surfaces[name]\ .nodes[i] session.odbs[name].rootAssembly.nodes[i] session.odbs[name].rootAssembly.nodeSets[name].nodes[i] session.odbs[name].rootAssembly.surfaces[name].nodes[i] session.odbs[name].steps[name].frames[i].fieldOutputs[name].values[i]\ .instance.elementSets[name].nodes[i] session.odbs[name].steps[name].frames[i].fieldOutputs[name].values[i]\ .instance.nodes[i] session.odbs[name].steps[name].frames[i].fieldOutputs[name].values[i]\ .instance.nodeSets[name].nodes[i] session.odbs[name].steps[name].frames[i].fieldOutputs[name].values[i]\ .instance.surfaces[name].nodes[i] 34.19.1 Members
The OdbMeshNode object has the following members: label An Int specifying the node label. coordinates A tuple of Floats specifying the nodal coordinates in the global Cartesian coordinate system.
[Diese Nachricht wurde von Mustaine am 18. Apr. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SavanGowda Mitglied Student
Beiträge: 6 Registriert: 20.03.2015 Abaqus 6.12, Python Script, Programmierung
|
erstellt am: 20. Mrz. 2015 22:47 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
Hallo Alle Ich habe ein Problem mit python script, dass ich gescrieben habe!! Mein Deutsch ist nicht so gut bitte Entschuldigung!. Ich habe schon ein Node SET-& und brauche ich die FieldOutputs 'POR' von diese nodes. ich habe "set_node_number = session.odbs ['Job-3.odb']. rootAssembly.nodeSets ['SET-7']. nodes [0]" benutzt und bekam alle nodes und jetzt brauche ich 'POR' oder pressure values nur auf diese nodes. Dann habe ich data_i=odb.steps[stepname].frames[i].fieldOutputs['POR'] geschrieben fur mein 'POR' values aber ich weiß nicht wie kann ich die Pressure Values von nodes in [SET-7] bekommen!! Bitte helfen sie mir!! Vielen Dank 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: 22. Mrz. 2015 18:00 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
Siehe Abaqus Scripting Users Guide 9.5 Reading from an output database Hier ein Beispiel: Code:
from abaqus import * from abaqusConstants import *odb = session.odbs['Job-1.odb'] lastFrame = odb.steps[odb.steps.keys()[-1]].frames[-1] displacement = lastFrame.fieldOutputs['U'] nodes = displacement.getSubset(region=odb.rootAssembly.nodeSets['SET-X']) for i in nodes.values: print i.magnitude
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SavanGowda Mitglied Student
Beiträge: 6 Registriert: 20.03.2015 Abaqus 6.12, Python Script, Programmierung
|
erstellt am: 08. Apr. 2015 15:42 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
Danke sehr!!! Das funktioniert sehr gut. ich habe das einbisschen verändert fuer die Voraussetzung und dann es funktioniert. Ich habe noch ein frage!! Wie kann ich diese Daten for die gleiche Nodes aber fuer viele verschiedene Frequencies bekommen!! Ich brauch das fuer 1-500 Hz. Ich habe ein for loop benutzt aber ich weiss nicht das gibt fuer allen Frequency die gleich Ergebnisse bekommen. Bitte finden Sie mein code im Anhang! Ich freue mich auf Ihre antwort Viele Grüße Savan 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: 09. Apr. 2015 09:40 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
In Zeile 24 holst du dir bei jedem Schleifendurchlauf der letzten Frame vom letzten Step. lastFrame = odb.steps[odb.steps.keys()[-1]].frames[-1] Da musst du den aktuellen Frame nehmen, also z.B. anstatt der -1 deine Laufvariable i. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SavanGowda Mitglied Student
Beiträge: 6 Registriert: 20.03.2015 Abaqus 6.12, Python Script, Programmierung
|
erstellt am: 21. Jan. 2016 17:42 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
Hallo Mustaine, Das Programm jetzt funktioniert nicht!! Warum ist das so? Ich habe die Werte von Frequenz in GUI verändert z.B. Früher es war 1-500Hz aber jetzt habe ich 100-200Hz mit 10 Teilung gemacht, darum habe ich jetzt 11 Frames. Bitte finden sie das Programm im Anhang. Bitte helfen sie mir! Viele Grüße Savan 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: 21. Jan. 2016 23:41 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
Ohne Modell und Fehlermeldung ein Script zu debuggen ist ganz schön viel verlangt. Nichts desto trotz: Code:
for i in xrange(number_freq): : : lastFrame = odb.steps[odb.steps.keys()[i]].frames[i] : :
Das erscheint mir merkwürdig. Mit odb.steps.keys()[i] würdest du in jedem Schleifendurchlauf einen anderen Step ansprechen. Das dürfte nicht gewollt sein... [Diese Nachricht wurde von Mustaine am 21. Jan. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SavanGowda Mitglied Student
Beiträge: 6 Registriert: 20.03.2015 Abaqus 6.12, Python Script, Programmierung
|
erstellt am: 22. Jan. 2016 15:07 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
|
SavanGowda Mitglied Student
Beiträge: 6 Registriert: 20.03.2015 Abaqus 6.12, Python Script, Programmierung
|
erstellt am: 22. Jan. 2016 15:12 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
|
Mustaine Ehrenmitglied V.I.P. h.c.
Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 25. Jan. 2016 22:12 <-- editieren / zitieren --> Unities abgeben: Nur für Nicksen
|