| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Ansys |
Autor
|
Thema: Schleife mit EMODIF - Problem mit Knotendefinition (4712 mal gelesen)
|
Arno07 Mitglied
Beiträge: 57 Registriert: 02.12.2008
|
erstellt am: 04. Dez. 2009 14:36 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte die Spannungen an Elementen abfragen und - falls die Spannungen einen Grenzwert überschreiten - die betroffenen Elemente mit dem EMODIF Befehl ändern. Realisieren möchte ich das mit einer Schleife deren Aufbau wie folgt aussieht: - Elemente des Materials 2 selektieren - Zählen der Elementanzahl und bestimmen der niedrigsten Elementnummer - Schleife über die Elementanzahl - Knoten des ersten Elements bestimmen - Spannungen der Knoten bestimmen - Falls die Spannungen kleiner 0 ist soll das betrachtete Element so belassen werden wie es ist. - Falls die Spannung größer 0 aber kleiner als ein Grenzwert ist soll das betrachtete Element ebenfalls belassen werden wie es ist - Falls die Spannung größer als der Grenzwert ist, dem Element die Materialeigenschaften von Material 3 zuweisen. Soweit ich das aus der Hilfe sehen konnte muss ich, um die Spannungen zu ermitteln auf die "Knotenebene" zurückgreifen, also für das jeweils betrachtete Element die Knoten wählen und von denen kann ich dann Spannungen abfragen da mit *GET und auch *VGET nur Spannungen an Knoten ausgelesen werden können. Derzeit sieht das bei mir wie folgt aus: Code: esel,s,mat,,2 ! Elemente auswählen *get, eanzahl, elem,,count ! Elemente zählen *get, emin, elem, ,num,min ! niedrigste Elementnummer bestimmen *do,i,1,eanzahl ! Schleife über die ausgewähleten Elemente earb=emin ! Laufvariable *get,enodes,elem, earb, node ! Knoten des im aktuellen Schleifendurchlauf ! betrachteten Elements *get,ns,node,earb,s,1 ! Spannung am Knoten *if,ns,lt,0,then ! Falls Spannung negativ earb=elnext(earb) ! gehe zum nächsthöheren Element *elseif,ns,gt,0,and,ns,le,zul_sigma,then !Falls Spannung positiv, aber kleiner als Grenzspannung earb=elnext(earb) *else mat,3 type,3 emodif,all *endif
Ich erhalte aber zum einen die Warnmeldung, dass ein angefragter Wert für einen Knoten nicht gespeichert wurde
Code: Requested data is not stored for node 166 Line= *get,ns,node,earb,s,1 The *GET command is ignored.
Und dann die Fehlermeldung
Code: Element 706 does not have all of its required nodes defined. The EMODIF command is aborted.
Ich vermute das das Element 706 das erste betrachtete Element ist, die Schleife also schon beim ersten Durchlauf hängen bleibt. Kann es daran liegen, das ich Volumenelemente mit mehreren Knoten pro Element verwende und mit dem *get Befehl nur einer anstatt aller Knoten des Elments "angesprochen" wird? Falls ja, gibt es eine Möglichkeit die Knoten der Reihe nach abzuarbeiten, also pro Element? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wosch Ehrenmitglied V.I.P. h.c. Elektrotechniker im Ruhestand
Beiträge: 2607 Registriert: 16.12.2004 Rechne zuerst ein Problem nach, für das Du eine analytische Lösung kennst.
|
erstellt am: 04. Dez. 2009 18:04 <-- editieren / zitieren --> Unities abgeben: Nur für Arno07
Stimmt vielleicht in folgender Zeile etwas nicht? Code: *get,ns,node,earb,s,1 ! Spannung am Knoten
Hier soll eine Knoteneigenschaft abgefragt werden und da wo die Knotennummer erwartet wird, steht eine Elementnummer.------------------ Viel Erfolg wünscht Wolfgang Schätzing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Arno07 Mitglied
Beiträge: 57 Registriert: 02.12.2008
|
erstellt am: 05. Dez. 2009 19:27 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für den Hinweis Herr Schätzing. Die von Ihnen zitierte Zeile ist in der Tat fehlerhaft. Ich habe meine Schleife jetzt mal bezüglich der Knoten überarbeitet. Ich habe mehrere Knoten pro Element und an denen kann ich Spannungen abfragen. An Elementen dagegen - wie schon erwähnt - soweit ich weiß nicht. Ich habe also zwei DO Schleifen: Eine äußere über die Anzahl der betrachteten Elemente und eine innere über die Knoten des jeweils betrachteten Elements
Code: esel, s, mat, , 2 ! Elemente auswaehlen *get, eanzahl, elem, , count ! Zaehlen der Elemente *get, emin, elem, , num, min ! Niedrigster Elementnummer den Namen emin geben *do, i, 1, eanzahl ! Schleife über Elementanzahl earb=emin ! Laufvariable Eemente esel, r, elem, earb {i]! Aus den selektierten Elemente emin=earb waehlen [/i] nsle, s, all ! Alle Knoten des Elements emin=earb waehlen *get, nanzahl, node, ,count ! Knoten des betrachteten Elements zählen *get, nmin, node, ,num, min ! Niedrigster Knotennummer den Namen nmin geben *do, j, 1, nanzahl ! Schleife über alle Knoten des betracheten Elements narb=nmin ! Laufvariable Knoten nsel, r, node, narb ! Aus den selektierten Knoten nmin=narb waehlen /POST1 ! Wechseln in Postprozessor zwecks Spannungsabfrage *get, ns, node, narb, s, 1 ! Spannung am Knoten nmin=narb abfragen *if, ns, lt, 0, then ! Falls Spannung kleiner 0 narb=ndnext(narb) ! Betrachte den nächsthöheren Knoten (aus der selektierten Gruppe) *cycle ! und starte den nächsten Durchlauf *elseif, ns, lt, zul_sigma, then ! Falls Spannung kleiner als zul_sigma narb=ndnext(narb) ! Betrachte den nächsthöheren Knoten (aus der selektierten Gruppe) *cycle ! und starte den nächsten Durchlauf *else /PREP77 ! Wechsel zurück in PREP7 mat, 3 type, 3 emodif, earb ! Modifiziere das betrachtete Element und *exit ! beende die DO Schleife, da das aktuell betrachtete Element modifiziert wurde *endif ! Beendigung der If Abfrage *enddo ! Beendigung der DO Schleife über Knoten eines (des aktuell betrachteten) Elements earb=elnext(earb) ! Element mit der nächst höheren Elementnummer betrachten und DO Schleife erneut beginnen *enddo
Diese Abfolge erscheint mir zumindest als sinnvolles Vorgehen. Ich betrachte die Elemente einzeln nacheinander und durch die zweite (innere) DO Schleife werden alle Knoten des jeweiligen Elements abgearbeitet. Leider bekomme ich zwei nicht endende Warmeldungen, so ich ANSYS "gewaltsam", also durch schließen des Output Fensters beenden muss. Diese beiden Warnmeldungen erhalte ich:
Code: *** WARNING *** For item= NODE, the component ( narb) is invalid. The NSEL command is ignored. *** WARNING *** Requested data is not stored for node 193. Line= *get, ns, node, narb, s, 1 The *GET command is ignored.
Die Knotennummer ändert sich dabei nicht, sondern bleibt immer bei 193. Der NSEL Befehl hat laut Hilfe folgenden Syntax NSEL,Type,Item,Comp,Vmin,Vmax,Vinc,Kabs Comp steht dabei für die Knotennummer. Diese ist bei mir aber doch gleich narb, sollte also keine Warnmeldung/Fehler produzieren. Beim *get Befehl wird dann ja offenbar die Knotennummer 193 als dem Knoten narb zugehörig identifiziert - wenn der zugehörige Wert auch nicht gespeichert wird/werden kann (Warum auch immer?). Ich müsste dann doch weiter oben bei der Selektion des Elements (earb) die gleiche Warnmeldung/Fehler erhalten - bekomme ich aber nicht. "earb" wird also offenbar richtig erkannt, warum aber narb dann nicht? Wer weiß Rat? Danke Arno
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristophN Mitglied Berechnungsingenieur
Beiträge: 773 Registriert: 13.12.2008
|
erstellt am: 06. Dez. 2009 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für Arno07
Zitat: Original erstellt von Arno07: Comp steht dabei für die Knotennummer.
Nein, VMIN steht für die Nummer, keine Ahnung, warum das bei den Elementen funktioniert!? Um den zweiten Fehler zu beheben (der ist nicht schlimm, kostet aber viel Rechenzeit), musst du nach dem nsle, s, all noch ein nsel, r, s, 1 einfügen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wosch Ehrenmitglied V.I.P. h.c. Elektrotechniker im Ruhestand
Beiträge: 2607 Registriert: 16.12.2004 Rechne zuerst ein Problem nach, für das Du eine analytische Lösung kennst.
|
erstellt am: 06. Dez. 2009 12:40 <-- editieren / zitieren --> Unities abgeben: Nur für Arno07
Es lassen sich mehrere Fehler erkennen: narb=nmin ist eine Startwertvorgabe, muss also vor Schleifenbeginn stehen. Gleiches gilt für earb=eminnsel, r, node, narb muss richtig heißen: nsel,r,node,,narbWarum werden eigentlich nicht nur alle Knoten abgefragt, wenn eine Knotenlösung existiert? ------------------ Viel Erfolg wünscht Wolfgang Schätzing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Arno07 Mitglied
Beiträge: 57 Registriert: 02.12.2008
|
erstellt am: 06. Dez. 2009 22:12 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für ihre/eure Antworten/Hilfe. Leider bin ich trotzdem noch nicht weitergekommen. Ich habe die beiden Startwertvorgaben/Laufvariablen vor die jeweilige DO-Schleife gezogen und in der nsel Befehlszeile noch ein Komma eingefügt, so daß narb jetzt an der Stelle von VMIN steht anstatt Comp. Gleiches habe ich in der esel Befehlszeile getan. Außerdem habe ich wie von ChristophN vorgeschlagen noch ein nsel, r, s, 1 eingefügt, so daß mein Code jetzt wie folgt aussieht:
Code: esel, s, mat, , 2 ! Elemente auswaehlen *get, eanzahl, elem, , count ! Zaehlen der Elemente *get, emin, elem, , num, min ! Niedrigster Elementnummer den Namen emin geben earb=emin ! Laufvariable Eemente *do, i, 1, eanzahl ! Schleife über Elementanzahl esel, r, elem, ,earb ! Aus den selektierten Elemente emin=earb waehlen nsle, s, all ! Alle Knoten des Elements emin=earb waehlen *get, nanzahl, node, ,count ! Knoten des betrachteten Elements zählen *get, nmin, node, ,num, min ! Niedrigster Knotennummer den Namen nmin geben narb=nmin ! Laufvariable Knoten *do, j, 1, nanzahl ! Schleife über alle Knoten des betracheten Elements nsel, r, node, , narb ! Aus den selektierten Knoten nmin=narb waehlen nsel, r, s, 1 /POST1 ! Wechseln in Postprozessor zwecks Spannungsabfrage *get, ns, node, narb, s, 1 ! Spannung am Knoten nmin=narb abfragen *if, ns, lt, 0, then ! Falls Spannung kleiner 0 narb=ndnext(narb) ! Betrachte den nächsthöheren Knoten (aus der selektierten Gruppe) *cycle ! und starte den nächsten Durchlauf *elseif, ns, lt, zul_sigma, then ! Falls Spannung kleiner als zul_sigma narb=ndnext(narb) ! Betrachte den nächsthöheren Knoten (aus der selektierten Gruppe) *cycle ! und starte den nächsten Durchlauf *else /PREP77 ! Wechsel zurück in PREP7 mat, 3 type, 3 emodif, earb ! Modifiziere das betrachtete Element und *exit ! beende die DO Schleife, da das aktuell betrachtete Element modifiziert wurde *endif ! Beendigung der If Abfrage *enddo ! Beendigung der DO Schleife über Knoten eines (des aktuell betrachteten) Elements earb=elnext(earb) ! Element mit der nächst höheren Elementnummer betrachten und DO Schleife erneut beginnen *enddo
Als Folge haben sich die Warnmeldungen leider nicht um zwei verringert, sondern um zwei erhöht. Und wieder muss ich ANSYS "gewaltsam beenden. *** WARNING *** The requested s data is not available. The NSEL command is ignored. *** WARNING *** Requested data is not stored for node 194. Line= *get, ns, node, narb, s, 1 The *GET command is ignored. *** WARNING *** Specified range of 0 to 0 is not permitted. The NSEL command is ignored. *** WARNING *** Node 0 of *GET command is undefined. Line= *get, ns, node, narb, s, 1 The *GET command is ignored. Wenn ich die Befehlszeile nsel, r, s, 1 rauslasse verschwindet auch die erste Warnmeldung. Anscheinend liest ANSYS den Knoten narb als 0 obwohl in der *GET Befehlszeile Knoten 194 angesprochen wird?! Ich verstehe gerade nicht was los ist @wosch: Wenn ich alle Knoten abfrage müsste ich wohl bei erfülltem Kriterium (Spannung oberhalb einer Grenzspannung) mit ESLN das zum Knoten zugehörige Element selektieren und dann den EMODIF Befehl anwenden. Da hat sich mir aber die Frage gestellt wie ich vorgehe wenn zum Beispiel Knoten 2 eine 8-knotigen Elements das Kriterium erfüllt. Dann müsste ich das zugehörige Element selektieren, modifizieren und dann aber 6 Knoten überspringen um zum nächsten Element zu kommen. Dort ist es dann vielleicht Knoten 7 der das Kriterium erfüllt usw. Vielleicht würde es durch wegselektieren der Knoten gehen, aber wann sollten die wegselektiert werden?
[Diese Nachricht wurde von Arno07 am 06. Dez. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wosch Ehrenmitglied V.I.P. h.c. Elektrotechniker im Ruhestand
Beiträge: 2607 Registriert: 16.12.2004 Rechne zuerst ein Problem nach, für das Du eine analytische Lösung kennst.
|
erstellt am: 07. Dez. 2009 09:10 <-- editieren / zitieren --> Unities abgeben: Nur für Arno07
Was die von ChristophN empfohlene Anweisung bewirken soll, kann ich nicht verstehen. Ein Fehler in den Schleifen lässt sich sinnvoll nur mit einem Testbeispiel finden. Normalerweise geht man dabei so vor, dass man die Schleifen schrittweise mit vorgegebenem Schleifenindex abarbeitet und auf jede Fehlermeldung sofort reagiert. ------------------ Viel Erfolg wünscht Wolfgang Schätzing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristophN Mitglied Berechnungsingenieur
Beiträge: 773 Registriert: 13.12.2008
|
erstellt am: 07. Dez. 2009 10:43 <-- editieren / zitieren --> Unities abgeben: Nur für Arno07
Der Befehl selektiert alle Knoten, für die die erste Hauptspannung als Ergebnis vorliegt. Dann meckert ANSYS nicht mehr, dass für den ausgewählten Knoten kein Ergebnis vorliegt, denn das hat man ausgeschlossen. Ich würde den Befehl jedoch ein wenig anders plazieren, eben so, wie ich es geschrieben hatte und nicht mit in die Schleife. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|