Schleife mit veränderlichen Variablen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
herttim
User
Beiträge: 17
Registriert: Mittwoch 8. Dezember 2021, 14:18

Hallo zusammen,

ich bin gerade dabei einige Abläufe meines Codes zu verschlanken. Dabei habe ich eine Reihe von Abfolgen, die sich wiederholen und super mit einer for-Schleife abbilden lassen. So zum Beispiel diese hier:

Code: Alles auswählen

anzahl_rollen = 16
x_ir = []
x_ri = []
x_ra = []
x_ar = []

y_ir = []
y_ri = []
y_ra = []
y_ar = []

for i in np.arange(0, 360+polar_rollen, polar_rollen):
    x_ir.append(radius_ir*np.sin(np.radians(i)))
    x_ri.append(radius_ri*np.sin(np.radians(i)))
    x_ra.append(radius_ra*np.sin(np.radians(i)))
    x_ar.append(radius_ar*np.sin(np.radians(i)))
    y_ir.append(radius_ir*np.cos(np.radians(i)))
    y_ri.append(radius_ri*np.cos(np.radians(i)))
    y_ra.append(radius_ra*np.cos(np.radians(i)))
    y_ar.append(radius_ar*np.cos(np.radians(i)))
    
#-------------------------- Selektionsbereich -------------------------

mapdl.lsel("R", "LOC", "Y", vmin=y_ir[0], vmax=y_ir[0]+0.001)
mapdl.lsel("R", "LOC", "X", vmin=x_ir[0], vmax=x_ir[0]+0.001)
mapdl.lsel("R", "LOC", "Z", vmin=p+r, vmax=p+r+s/2)
#mapdl.lplot(vtk=True, show_line_numbering=True)
mapdl.nplot(vtk=True, nnum=True) 
mapdl.nsll("S", 1)
ir_nnum_1 = mapdl.mesh.nnum
print("Node Numbers IR 1:\n", ir_nnum_1)

mapdl.lsel("ALL")
mapdl.lsel("S", "NDIV", vmin=anzahl_scheiben-1)
mapdl.lsel("R", "LOC", "Y", vmin=y_ir[1], vmax=y_ir[1]+0.001)
mapdl.lsel("R", "LOC", "X", vmin=x_ir[1], vmax=x_ir[1]+0.001)
mapdl.lsel("R", "LOC", "Z", vmin=p+r, vmax=p+r+s/2)
#mapdl.lplot(vtk=True, show_line_numbering=True)
mapdl.nplot(vtk=True, nnum=True) 
mapdl.nsll("S", 1)
ir_nnum_2 = mapdl.mesh.nnum
print("Node Numbers IR 2:\n", ir_nnum_2)
Ziel ist es dann später nur einmal diesen "Selektionsbereich" definieren zu müssen und mit einer Schleife in Abhängigkeit der "Anzahl Rollen" zu iterieren. Ich dachte mir das könnte ungefähr wie folgt aussehen:

Code: Alles auswählen

for i in range(0, anzahl_rollen+1):
    mapdl.lsel("R", "LOC", "Y", vmin=y_ir[i], vmax=y_ir[i]+0.001)
    mapdl.lsel("R", "LOC", "X", vmin=x_ir[i], vmax=x_ir[i]+0.001)
    mapdl.lsel("R", "LOC", "Z", vmin=p+r, vmax=p+r+s/2)
    #mapdl.lplot(vtk=True, show_line_numbering=True)
    mapdl.nplot(vtk=True, nnum=True) 
    mapdl.nsll("S", 1)
    ir_nnum+i = mapdl.mesh.nnum
Leider erhalte ich nicht das gewünschte Ergebnis. Ziel wäre es, so viele verschiedene

Code: Alles auswählen

ir_nnum
zu erhalten, wie zuvor

Code: Alles auswählen

anzahl_rollen
definiert wurden.

Ich würde freuen wenn mir da jemand weiterhelfen könnte :?
__deets__
User
Beiträge: 12289
Registriert: Mittwoch 14. Oktober 2015, 14:29

Einen Weg, Variablen "generieren" zu lassen, gibt es nicht. Jedenfalls nicht auf eine sinnvolle Weise. Sowas macht man mit Datenstrukturen. Listen, Woerterbuechern, und im Zweifel sogar eigenen Klassen oder Datenklassen.
herttim
User
Beiträge: 17
Registriert: Mittwoch 8. Dezember 2021, 14:18

@__deets__ Danke für die Antwort!
Ok, das habe ich mir schon gedacht. Gibt es da eventuell eine andere Möglichkeit dies umzusetzen? Ein kleines Beispiel würde mir dort sicherlich helfen.
__deets__
User
Beiträge: 12289
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso eine andere? Die gibt es nicht. Und Listen, Wörterbücher und Klassen sind doch gut beschrieben in diversen Tutorials. Was fehlt dir da?
herttim
User
Beiträge: 17
Registriert: Mittwoch 8. Dezember 2021, 14:18

Dieses hochzählen von Variablen wird eigentlich nicht in Python empfohlen, zumindest hab ich das nach meinen bisherigen Recherchen herausfinden können.
Ich denke es wäre auch möglich, dass unabhängig von den Variablen zu machen und alles in eine Liste zu packen und später das extrahieren, was man für die weiteren Schritte braucht...So wären meine aktuellen Gedanken dazu.
__deets__
User
Beiträge: 12289
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe nicht so recht was du meinst. Wo steht was von nicht empfohlen?
Sirius3
User
Beiträge: 16232
Registriert: Sonntag 21. Oktober 2012, 17:20

Vermeide kryptische Abkürzungen, was soll ir, ra, ar, oder ir denn bedeuten, und wie leicht kann man bei zwei Buchstaben da was verwechseln?
Wenn man Schleifen mit numpy verwendet, dann macht man etwas falsch.

Code: Alles auswählen

winkel = np.linspace(0, 2*np.pi, anzahl_rollen)
xir = radius_ir * np.sin(winkel)
Und wenn man dann noch alles in Matrizen packt, wird das noch kompakter:

Code: Alles auswählen

x = [radius_ir, radius_ri, radius_ar, radius_ra] * np.sin(winkel)[:, None]
Antworten