Autor
|
Thema: Umat - konvergiert nicht (1469 mal gelesen)
|
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 19. Mrz. 2009 11:08 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe eine Umat (linear elastisch, orthotrop) zum Testen zusammengeschrieben, doch die Tests dazu laufen mal wieder sehr enttäuschend. Ich habe das Problem, das Abaqus immer mit Konvergenzproblemen abbricht. Vorher wird moniert, dass die Systemmatrix negative Eigenwerte hat. Ich weiß nicht so recht was das Problem ist.. Ich habe die aufgestellte Elastizitätsmatrix dahingehend untersucht, dass sie positiv definit und symmetrisch ist. Beides ist erfüllt, das legt den Verdacht nahe, dass das Spannungsupdate nicht richtig ist (Nur weiß ich nicht wie es anders sein sollte), oder dass vom FE-Modell her etwas falsch ist. Edit: Upload ging nicht Wenn sich jemand beides mal anschauen könnte und mir einen Hinweis geben könnte, wäre ich sehr dankbar. [Diese Nachricht wurde von carsten1983 am 19. Mrz. 2009 editiert.]
[Diese Nachricht wurde von carsten1983 am 19. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Viktor M. Mitglied Wissenschaftlicher Mitarbeiter
Beiträge: 55 Registriert: 27.10.2008
|
erstellt am: 23. Mrz. 2009 12:02 <-- editieren / zitieren --> Unities abgeben: Nur für carsten1983
Hallo Carsten, ich habe nicht arg sorgfälltig über deine Routine geschaut, aber es ist mir trotzdem etwas aufgefallen: In deinem Hauptprogramm verwendest du "aba_param.inc" und in den Unterprogrammen nicht. Ich empfehle dir das "aba_param.inc" garnicht zu verwenden, sondern die Variablen alle zu deklarieren (implicit none). Dadurch hast du mehr kontrolle über eventuelle Tippfehler und ähnliches. Vielleicht entdeckst du so einen Fehler. MfG Viktor 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: 25. Mrz. 2009 12:47 <-- editieren / zitieren --> Unities abgeben: Nur für carsten1983
Hi Carsten, leider finde ich die exakte Stelle im Manual gerade nicht, aber ich meine gelesen zu haben, dass im Manual empfohlen wird, eigene Routinennamen mit einem "K" beginnen zu lassen, um Konflikte zu vermeiden. Meine Routine "KJacobi" wird ueber: call KJacobi(...) aufgerufen. Weiterhin empfiehlt ABAQUS auch fuer die eigenen Routinen die Zeile INCLUDE 'aba_param.inc' einzubinden. Klar kann man alle Variablen selbst definieren, aber es besteht die Moeglichkeit, dass manche fuer die Loesung wichtigen Variablen verwendet werden muessen und ohne die Zeile nicht gefunden werden koennen. Ist jetzt zwar nur eine Vermutung, aber ausprobieren kannst du es ja mal. Halte uns bitte ueber deine Fortschritte und weitere Probleme auf dem Laufenden. Ich bin mir sicher, dass der ein oder andere in naher Zukunft was mit UMAT anstellen wird und dann bestimmt auch vor aehnlichen Problemen steht. Viel Erfolg vorerst!!! Grueße Nicksen ------------------ ========== == Dingsen == ========== Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Viktor M. Mitglied Wissenschaftlicher Mitarbeiter
Beiträge: 55 Registriert: 27.10.2008
|
erstellt am: 25. Mrz. 2009 13:52 <-- editieren / zitieren --> Unities abgeben: Nur für carsten1983
Hallo zusammen, Nicksen hat Recht, was die Definition mit dem "K" betrifft. Daraus ergeben sich für mich auch die Probleme, die man hat, wenn man "aba_param.inc" verwendet: Wenn eine function mit KYield oder ähnliches definiert wird, kann es passieren, dass das Resultat als integer interpretiert wird, da mit "aba_param.inc" alle Variablen, die mit i,j,k,l,n,m beginnen automatisch integer sind. Da muss man dann höllisch aufpassen, was in Carstens Fall auch mit ein Grund sein könnte, warum die Umat nicht konvergiert. MfG Viktor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 26. Mrz. 2009 08:15 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle Interessierten, die Aba_param.inc habe ich in der Umat drin, jedoch nicht in allen Unteroutinen. Wenn ich das tue, dann meckert Abaqus. Jedenfalls habe ich den starken Verdacht, dass ähnlich wie es schon vermutet wurde, tatsächlich ein Typenkonlikt vorlag (wie eigentlich immer, wenn etwas offensichtliches in Fortran nicht geht..). Ich habe eigentlich nur das Interface der Umat nochmal 1 zu 1 aus der Hilfe kopiert. Was soviel bedeutet wie, ich weise den Argumenten von Umat nicht erneut einen Typ zu, sondern dimensioniere lediglich. Ein Wehrmutstropfen bleibt dennoch: Die Zeile, wo getDDSDDE aufgerufen wird muss eine Variable x statt direkt DDSDDE rausschreiben: call GetDDSDDE (eigenwert1,eigenwert2,eigenwert3,A11,A22,A33, 1 A44,A55,A66,E1_UD,E2_UD,G12_UD,Nue12_UD,Nue23_UD, 2 Nue21_UD,Delta,x) DDSDDE=x das geht.. Das geht nicht: call GetDDSDDE (eigenwert1,eigenwert2,eigenwert3,A11,A22,A33, 1 A44,A55,A66,E1_UD,E2_UD,G12_UD,Nue12_UD,Nue23_UD, 2 Nue21_UD,Delta,DDSDDE) Hier bricht Abaqus den job ab und konvergiert nicht. Auch hier kann eigentlich nur ein Typenkonflikt vorliegen, den ich bislang nicht verstanden habe.. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Viktor M. Mitglied Wissenschaftlicher Mitarbeiter
Beiträge: 55 Registriert: 27.10.2008
|
erstellt am: 27. Mrz. 2009 11:10 <-- editieren / zitieren --> Unities abgeben: Nur für carsten1983
Hallo Carsten, warum das nicht funktioniert, kann ich dir nicht sagen. Rein theoretisch sollte es schon gehen. Ein häufige Fehlerquelle ist auch, dass in Fortran die an eine Subroutine übergebenen Parameter auch gleichzeitig Rückgabewerte sein können, d.h. wenn du in der Subroutine einer "Eingabevariablen" einen neuen Wert zuweist, dann ändert es auch den Wert im Hauptprogramm. Das wusstest du sicherlich schon und es verstärkt die Vermutung, dass etwas anderes an deinem Programm nicht stimmt. Was ich entdeckt habe ist: Code: DDSDDE=ZERO DO 20 K1=1,NTENS DO 10 K2=1,NTENS DDSDDE(K2,K1)=0.D0 10 CONTINUE 20 CONTINUE
Du verwendest dies in der Unterroutine "GetDDSDDE". Generell reicht die erste Zeile schon aus um dem Feld an jeder Stelle die 0.d0 zu zuweisen. Zudem ist das NTENS in der Unterroutine nicht definiert und wird auch nicht übergeben. Außerdem ist mir noch aufgefallen, dass du Variablen wie Code: Nue_m,Nue_f,Nue12_UD,Nue21_UD,Nue23_UD
in dem Hauptprogramm als real definierst. Da bin ich mir nicht ganz sicher, ob das so geht und ob die dann nicht doch integer sind. Warum rechnest du nicht mit double precision? Noch eine Frage: wenn Abaqus abbricht, bringt es eine Fehlermeldung? MfG Viktor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 27. Mrz. 2009 12:10 <-- editieren / zitieren --> Unities abgeben:
Wie gesagt in der geposteten Version geht die Routine. Mit der NTENS Geschichte, haste du natürlich recht. Normalerweise, reicht ja auch die Definition mit : DDSDDE=Zero, wenn Zero definiert ist. Die Schleife hatte ich übersehen, das kommt noch aus nem Test. So wie es aussieht hast du mit dieser Schleife und dem fehlenden NTENS tatsächlich das Problem gefunden. Ich habe die Schleife, die eh sinnlos da rum steht entfernt und es geht ohne diesen Mist mit dem x. Zur Prezision: Um ehrlich zu sein, weiß ich nicht ob Abaqus in Standard mit double rechnet Ich weiß nur, dass wenn ich die Variablen als double (real*8) deklariere nichts mehr geht. Ich danke dir für dir Hilfe! [Diese Nachricht wurde von carsten1983 am 27. Mrz. 2009 editiert.]
[Diese Nachricht wurde von carsten1983 am 27. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Konstrukteur Schiffbau (m/w/d) | Vielseitige technische und kaufmännische Projekte aus sämtlichen industriellen Branchen bestimmen das Tätigkeitsfeld der KBN-Gruppe. Spannende herausfordernde Aufgaben in Kombination mit ausgeprägter Wertschätzung jedes einzelnen Mitarbeiters sorgen für ein motivierendes Arbeitsumfeld, in dem man sich wohlfühlen und seine Fähigkeiten einbringen als auch weiterentwickeln kann. Zusammen wollen wir weiter wachsen.... | Anzeige ansehen | Konstruktion, Visualisierung |
|
Viktor M. Mitglied Wissenschaftlicher Mitarbeiter
Beiträge: 55 Registriert: 27.10.2008
|
erstellt am: 27. Mrz. 2009 14:16 <-- editieren / zitieren --> Unities abgeben: Nur für carsten1983
Deklariere sie doch einfach mit: Code: DOUBLE PRECISION :: HUND, KATZE, MAUS
Du wirst deine Routine ja sicherlich auch an Hand eines Einelements testen? Wieviel total iterations braucht Abaqus? Bei meiner einfachen UMAT braucht Abaqus in den ersten Schritten 13 Iterationen, bei der Hälfte der Rechnung etwa 5-8 und zum Ende hin fast immer 7. Ich habe leider gar keine Erfahrung, ob das ok ist oder nicht. Wie sieht es bei dir aus? Und da dies Thema um Konvergenz geht, ist folgende Frage auch angebracht: wird die Gleichgewichtskonvergenz hauptsächlich von der Tangente (DDSDDE) beeinflusst, oder gibt es noch weitere Einflussgrößen? MfG Viktor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|