| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Ansys |
Autor
|
Thema: Schleife: Wechsel zwischen /solu und /post1 (1752 mal gelesen)
|
climbon Mitglied
Beiträge: 17 Registriert: 30.05.2018
|
erstellt am: 06. Jun. 2018 22:49 <-- editieren / zitieren --> Unities abgeben:
Guten Abend allerseits, Ich habe eine DO Schleife, die zwischen dem preprocessor und der solution Umgebung hin und her wechselt. Der prinzipielle Aufbau sieht folgendermaßen aus (nicht der vollständige code nur die grobe Struktur): *do,ii,1,schritte /solu bf,all,hgen,Last !Aufbringen der Wärmelast time,ii /post1 etable,schmelz,temp, esel,s,etab,schmelz,0,25 /solu (Hier muss anscheinend noch ein antype,,rest hin) ealive,all *enddo Ziel des ganzen ist es zunächst die Elemente mit einer Wärmelast zu beaufschlagen, später im postprocessor die elementtemperaturen zu registrieren und später in der solution umgebung die entsprechenden Elemente unterhalb einer definierten Temperatur zum Leben zu erwecken. Dieses Vorgehen habe ich gemäß: https://sites.ualberta.ca/~wmoussa/AnsysTutorial/AT/BirthDeath/BirthDeath.html versucht umzusetzen. Das Probelm das auftaucht ist, dass nach jedem Iterationsschritt der Lastschritt überschrieben wird und ich somit am Ende nur noch den letzten Schritt sehe. Ich wäre sehr dankbar wenn mir jemand helfen könnte Grüße C.O. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
arnd13 Mitglied Dipl. Ing.
Beiträge: 735 Registriert: 05.11.2008
|
erstellt am: 07. Jun. 2018 13:42 <-- editieren / zitieren --> Unities abgeben: Nur für climbon
Hi C.O., Ich verstehe zwar Dein Problem nicht im Detail, aber wenn es darum geht, dass Du die Ergebnisse der Zwischenschritte benötigst, die im finalen rst nicht mehr enthalten sind, kann ich folgendes Vorgehen vorschlagen: - Nach jedem Zwischenschritt die aktuelle .rst in einem separaten Ordner speichern (Befehl: /copy,...) und die Namen dabei durchnummerieren. - Am Ende können dann entweder diese rst zum jeweiligen Postprozessing wieder eingelesen werden (file,...), - oder um das Ganze komfortabler zu gestalten können die einzelnen rst zu einem großen rst mit mehreren Loadsteps kombiniert werden (/Aux3; Combine,...; modify,..., weitere) ------------------ Gruß, A. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
climbon Mitglied
Beiträge: 17 Registriert: 30.05.2018
|
erstellt am: 08. Jun. 2018 00:27 <-- editieren / zitieren --> Unities abgeben:
Hallo arnd13 und danke für deine Antwort. Dadurch, dass ich die solution Umgebung verlasse, muss ich auf die Ergebnisse des Loadsteps ii zurückgreifen. Mittlerweile denke ich, dass es eigentlich sinnvoller ist erst garnicht diese Umgebung zu verlassen und die aktuellen Elementtemperaturen über den *VGET Befehl ausgeben lasse. Hat da jemand ein Beispiel für mich wie ich das am besten hinbekomme? Grüße C.O. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
arnd13 Mitglied Dipl. Ing.
Beiträge: 735 Registriert: 05.11.2008
|
erstellt am: 08. Jun. 2018 08:48 <-- editieren / zitieren --> Unities abgeben: Nur für climbon
Wenn Du mit *vget auf Temperaturergebnisse zugreifen willst, musst Du in den /post1 wechseln. Das löst also nicht Dein Problem. Was spricht dagegen, die temporäre file.rst direkt nach dem solve-Befehl zu speichern? Diese kannst Du dann wann immer Du willst wieder einlesen (im Postprozessor). ------------------ Gruß, A. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
arnd13 Mitglied Dipl. Ing.
Beiträge: 735 Registriert: 05.11.2008
|
erstellt am: 12. Jun. 2018 12:48 <-- editieren / zitieren --> Unities abgeben: Nur für climbon
Ein paar Codeschnipsel, die Dir eventuell weiter helfen: Direkt nach dem Solve-Befehl die RST kopieren: /solu !... solve /copy,file,rst,,X:\Beispielpfad\Beispiel_,rst !!!!Der Filename kann auch mit einer Laufvariable verknüpft werden, z.B.file_%LS%, wobei LS eine Laufvariable einer *do-Schleife ist (Bsp.:*do,Ls,1,20). Die Ergebnisdateien im Ordner X:\Beispielpfad heißen dann file_1, file_2, file_3 usw. !!! !Wenn Du die Ergebnisse dann später auslesen willst, folgende Befehle eingeben: /post1 file,X:\Beispielpfad\file_%LS%,rst !Ergebnisfile einlesen set,last !letzten Lastschritt (oder einen beliebigen anderen eingeben) auswählen !... plnsol,u,sum !z.B. die Verformung plotten ------------------ Gruß, A. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
climbon Mitglied
Beiträge: 17 Registriert: 30.05.2018
|
erstellt am: 12. Jun. 2018 18:41 <-- editieren / zitieren --> Unities abgeben:
Danke für deine Antwort! Ich habe wie du es beschrieben hast aus jedem Iterationsschritt eine Ergebnisdatei nach dem solve abgespeichert. Später im Post1 rufe ich die jeweilige Datei auf mit: /post1 file,RST/Ergebnisdatei_%ii%,rst Wenn ich dann aber ein etable aus den Ergebnissen erstellen möchte: ... etable,schmelz,temp, esel,r,etab,schmelz,0,1500 kann er leider nicht auf die Temperaturen zugreifen oder sie "sind keine DOF der Lösung". Hat da jmd eine Idee? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DeeJot Mitglied Berechner
Beiträge: 39 Registriert: 05.06.2012 ANSYS CAELINUX
|
erstellt am: 13. Jun. 2018 10:44 <-- editieren / zitieren --> Unities abgeben: Nur für climbon
|
arnd13 Mitglied Dipl. Ing.
Beiträge: 735 Registriert: 05.11.2008
|
erstellt am: 13. Jun. 2018 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für climbon
|
climbon Mitglied
Beiträge: 17 Registriert: 30.05.2018
|
erstellt am: 14. Jun. 2018 22:55 <-- editieren / zitieren --> Unities abgeben:
Danke soweit. Ich habe nun nach der solution schleife im post1 in jedem Schritt ii zwei Arrays erstellt, die zum einen die Knoten und dann die dazugehörigen Temperaturen in einem anderen array speichern: *do,ii,1,schritte /post1 file,RTH/Ergebnisdatei_%ii%,rth set,last allsel vsel,s,,,2 NSLV,s,1 nsel,r,loc,z,toleranz,-toleranz-ebreite*ii *get,ANZ_KNOTEN,nodes,,count !Aktuell selektiert *dim,ARRAY_NODES_%ii%,ARRAY,ANZ_KNOTEN,1 *dim,ARRAY_TEMP_%ii%,ARRAY,ANZ_KNOTEN,1
*vget,ARRAY_NODES_%ii%,node,,nlist *vget,ARRAY_TEMP_%ii%,node,,temp *enddo Meine Frage an euch: - Wie kann ich jetzt für jeden erstellten Array die Knoten auswählen, die unter einer bestimmten Temperatur liegen? Ich würde also im ARRAY_TEMP prüfen welche Temperaturen unterhalb eines bestimmten Wert liegen, den Spalteneintrag y_i abspeichern und dann die entsprechenden Knoten aus dem ARRAY_NODES auswählen. Wie lässt sich das bewerkstelligen? Ich habe den gleichen Vorgang mit ETABLE versucht, aber leider ohne erfolg. Danke im Vorausv EDIT: Ich habe die Schleife mithilfe von woschs Beitrag hier im Forum anders aufgebaut. Kontennummer und Temperaturen sind nun in einem Array. *do,ii,1,schritte /post1 file,RTH/Ergebnisdatei_%ii%,rth set,last allsel vsel,s,,,2 NSLV,s,1 nsel,r,loc,z,toleranz,-toleranz-ebreite*ii !ESLN,s,1 *get,ANZ_KNOTEN,nodes,,count *get,NODE_MIN,node,,num,min *dim,ARRAY_NODETEMP_%ii%,ARRAY,ANZ_KNOTEN,2 NARB=NODE_MIN *do,jj,1,ANZ_KNOTEN ARRAY_NODETEMP_%ii%(jj,1)=NARB ARRAY_NODETEMP_%ii%(jj,2)=temp(NARB) NARB=ndnext(NARB) *enddo *enddo [Diese Nachricht wurde von climbon am 15. Jun. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
arnd13 Mitglied Dipl. Ing.
Beiträge: 735 Registriert: 05.11.2008
|
erstellt am: 15. Jun. 2018 12:50 <-- editieren / zitieren --> Unities abgeben: Nur für climbon
Hi, Der Befehl, den Du benötigst heißt *VMASK Das Prinzip: Du erstellst Dir einen Maskingvektor (Array) in dem Du die Ergebnisse der Abfrage, ob die Temp über einem bestimmten Wert liegt mit 0 bzw. 1 abspeicherst. Diesen Maskingvektor kannst Du dann mit *VMASK auf den Knotenvektor (oder auf die Spalte der Gesamtmatrix, je nachdem wie das Array nun aufgebaut ist) anwenden und damit die Knoten auswählen, für die das zutrifft. ------------------ Gruß, A. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
climbon Mitglied
Beiträge: 17 Registriert: 30.05.2018
|
erstellt am: 15. Jun. 2018 15:06 <-- editieren / zitieren --> Unities abgeben:
Danke soweit, es geht immer weiter Richtung Lösung! Ich habe wie beschrieben eine Abfrage über *IF eingebaut und einen Maskingvektor aufgebaut, siehe code. Mir ist jetzt jedoch nicht ganz klar, wie ich über mit dem *VMASK Befehl mit dem Maskingvektor die Knoten des anderen Array selektieren kann. Die Dokumentation dafür ist sehr mager gehalten. *do,ii,1,schritte /post1 file,RTH/Ergebnisdatei_%ii%,rth set,last allsel vsel,s,,,2 NSLV,s,1 nsel,r,loc,z,toleranz,-toleranz-ebreite*ii !ESLN,s,1 *get,ANZ_KNOTEN,nodes,,count *get,NODE_MIN,node,,num,min *dim,ARRAY_NODETEMP_%ii%,ARRAY,ANZ_KNOTEN,2 *dim,MASKARR_%ii%,ARRAY,ANZ_KNOTEN,1 NARB=NODE_MIN *do,jj,1,ANZ_KNOTEN ARRAY_NODETEMP_%ii%(jj,1)=NARB ARRAY_NODETEMP_%ii%(jj,2)=temp(NARB) NARB=ndnext(NARB) *if,ARRAY_NODETEMP_%ii%(jj,2),GT,500,THEN MASKARR_%ii%(jj)=0 *else MASKARR_%ii%(jj)=1 *endif *enddo *enddo Grüße C.O. [Diese Nachricht wurde von climbon am 15. Jun. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
arnd13 Mitglied Dipl. Ing.
Beiträge: 735 Registriert: 05.11.2008
|
erstellt am: 19. Jun. 2018 12:21 <-- editieren / zitieren --> Unities abgeben: Nur für climbon
Mir ist nicht ganz klar, was Du mit selektieren meinst. Wenn Du die Knoten einfach nur auswählen willst, brauchst Du auch keinen Maskingvektor. Knoten auswählen in der *do-Schleife: !.... nsel,none *do,jj,1,ANZ_KNOTEN ARRAY_NODETEMP_%ii%(jj,1)=NARB ARRAY_NODETEMP_%ii%(jj,2)=temp(NARB) NARB=ndnext(NARB) *if,ARRAY_NODETEMP_%ii%(jj,2),GT,500,THEN nsel,a,node,,%ARRAY_NODETEMP_%ii%(jj,XY)% !Für XY die Spalte eintragen, in der die Knotennummer steht, bzw. den Array einsetzen, in dem die Knotennummern stehen. *endif *enddo Eleganter geht das sicher mit *vmask, aber da müsste ich mich im Detail erst mal wieder schlau machen. Das habe ich lange nicht mehr gebraucht.
------------------ Gruß, A. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|