Erste Schritte mit PyAnsys anhand eines End-to-End Beispiels
Aileen Lützke 20.12.2024
Tech Artikel 24/18 | PyAnsys: Automatisierung leicht gemacht
Ist Ihr Schreibtisch auch voll mit Simulationsaufgaben? Wir zeigen ihnen anhand eines kleinen Workflows, wie Sie mit PyAnsys Simulationen automatisieren und damit fehlerfrei und standardisiert laufen lassen können. Gewinnen Sie so wieder wertvolle Zeit für neue spannende Themen und nutzen diese, um neue Felder zu ergründen und Ideen auszutesten.
© Adobe Stock
PyAnsys: Eine Brücke zwischen Ansys und Python
Haben Sie schon einmal daran gedacht, Simulationsworkflows in Ansys einfach im Hintergrund durchführen zu lassen und das vollkommen automatisch, fehlerfrei und standardisiert? Sie haben auch schon von PyAnsys gehört und haben grundsätzlich Affinität zum Programmieren, bisher aber keine Zeit gehabt, sich einzulesen? Wir möchten Ihnen mit den nächsten Zeilen zeigen, dass der Einstieg in PyAnsys gar nicht so schwer ist. Mit PyAnsys haben Sie die Möglichkeit Geometrien automatisch anzupassen und zu bearbeiten, Simulationen durchzuführen und das Postprocessing von Ergebnissen in Ansys zu automatisieren, um Zeit und Aufwand zu sparen.
PyAnsys – Eine Brücke zwischen der Power der Ansys-Simulations-Tools und dem Python-Ökosystem | © CADFEM Germany GmbH
Was ist nun neu an PyAnsys: PyAnsys bietet einen breiten Anwendungsbereich für die Automatisierung und Anpassung von Workflows, der über einzelne Ansys-Produkte hinausgeht und das gesamte Ansys-Ökosystem per Python zugänglich macht. Das In-Product-Scripting war und ist dagegen auf das spezifische Produkt beschränkt, in dem sie implementiert ist. PyAnsys bietet somit die nahtlose Integration und Zusammenarbeit zwischen verschiedenen Ansys-Produkten und Python-Bibliotheken, eben wie eine Brücke. Sicher erfordert auch PyAnsys ein gewisses Maß an Einarbeitung, aber Ansys stellt umfangreiche Ressourcen wie Dokumentation, Tutorien und Community-Foren zur Verfügung, die das Lernen und Wachsen unterstützen.
An einem kleinen Workflow inkl. Geometrieaufbereitung mit PyAnsys Geometry und Simulations-Setup mit PyMechanical möchten wir aufzeigen, wie Prozesse projekt- und teamübergreifend standardisiert werden können. Verwenden Sie darüber hinaus benutzerdefinierte Skriptbibliotheken und nutzen Sie die Kompatibilität von PyAnsys mit anderen Python-Bibliotheken und Tools, um die Automatisierungsmöglichkeiten über Ansys hinaus zu erweitern. Eingebettet in einer Web-Applikation, ergibt sich so ein Easy-To-Use Tool auch für unerfahrene Anwender. Durch die Automatisierung lässt sich die Effizienz steigern, Fehler reduzieren und vor allem aber Zeit schaffen, um höherwertige Aufgaben angehen zu können.
PyAnsys: Eine Kollektion von Python Bibliotheken im Ansys-Umfeld
Ansys bietet eine breite Palette von Modulen. Eine sehr gute Übersicht ist unter dem folgenden Link zu finden: PyAnsys. Zu jedem Modul gibt es umfassende Benutzerhandbücher, API-Referenzen und Beispiele, die das Erlernen und die Anwendung der jeweiligen Ansys-Tools erleichtern. Als Teil des PyAnsys-Ökosystems werden diese Module regelmäßig aktualisiert, um neue Versionen und Updates der entsprechenden Ansys-Software zu unterstützen.
Ansys kategorisiert die PyAnsys-Module in drei Hauptgruppen:
- Simulation-Bibliotheken
- Utility-Bibliotheken
- Postprocessing-Bibliotheken.
Simulationsbibliotheken ermöglichen automatisierte Simulationen wie z.B. PyMAPDL (Ansys Mechanical), PyAEDT (Ansys Electronics) und PyFluent (Ansys Fluent). Utility-Bibliotheken bieten allgemeine Funktionalitäten wie die Bearbeitung von Geometrien (PyAnsys Geometry) oder dem Erzeugen von Netzen (PyPrimeMesh). Das Modul PyDynamicReporting ermöglicht das Erstellen von Diagrammen, Animationen oder Bildern aus den Simulationsergebnissen, um wertvolle Erkenntnisse ableiten zu können. Die PyDPF-Module konzentrieren sich auf die Extraktion und Nachbearbeitung der Simulationsergebnisse für Bewertungen, Reporting oder die Weiterverwendung in nachgelagerten Analysen.
Durch die neutralen Schnittstellen können erzeugte Daten in anderen Python-Modulen wiederverwendet und somit komplexe, multidisziplinäre Probleme gelöst werden.
Die Python-Welt bietet im Allgemeinen eine Vielzahl an hilfreichen Bibliotheken:
- Numpy ist eine numerische Bibliothek zur leichteren Bearbeitung von n-dimensionalen Daten.
- Scipy baut auf NumPy auf und unterstützt bei Berechnungen wie numerische Integration, Optimierung, Interpolation, Signalverarbeitung und vieles mehr.
- Matplotlib ist eine Datenvisualisierungsbibliothek in Python, mit der mit nur wenigen Codezeilen Diagramme, Histogramme, Balkendiagramme, Streudiagramme usw. erstellt werden können
- PyVista unterstützt dabei Daten/Modelle in 3D zu visualisieren.
- Pandas – Lesen, Schreiben und Verarbeiten von Tabellendaten (Excel)
Überblick PyAnsys-Kategorien | © CADFEM Germany GmbH
Aller Anfang mit PyAnsys ist schwer – oder doch nicht?
Der schnellste Weg, etwas zu lernen, ist, es selbst zu tun und das am besten in gewohnter Umgebung. PyAnsys kann in jeder integrierten Entwicklungsumgebung (IDE) geschrieben und ausgeführt werden, die Python-Code ausführen kann. Um das Debuggen zu vereinfachen, verwenden wir JupyterLab, ein Open-Source-Tool, mit dem der Python-Code interaktiv ausgeführt werden kann. Die Ansys-Installation kann als Basis verwendet werden, um eine virtuelle Python-Umgebungen zu erstellen, eine neue Python Installation ist nicht notwendig. Hierfür stellt Ansys einen Ansys-Python-Manager im Ansys Developer Portal zur Verfügung (Ansys Python Manager).
Der Ansys-Python-Manager führt durch die Erstellung der virtuellen Python-Umgebung und die Installation der PyAnsys packages in wenigen Schritten. Installiert man das PyAnsys metapackage, installiert man den vollen Umfang an PyAnsys Bibliotheken. Bitte hierbei die Angabe der korrekten Python-Version installieren. Es wird empfohlen, die neueste Python-Version in der aktuellen Ansys-Version zu installieren.
Nach erfolgreicher Installation hat man über den Ansys-Python Manager 2 Möglichkeiten. Über einen Button lässt sich nun das JupyterLab starten, in der Sie ihr erstes PyAnsys-Beispiel entwickeln können. Sollten Sie mehrere Versionen installiert haben, beachten Sie auch hier die Auswahl der korrekten Python-Umgebung. Um kurze Code-Zeilen schnell mal auszuführen und zu testen, lässt sich über den Manager ebenfalls eine Konsole starten. Nun sind auch wir startklar, um ein kleines Beispiel von der Geometrie-Vorbereitung bis zur Simulation zu erläutern.
Der Ansys Python Manager - Vereinfachte Verwaltung der Python-Umgebung | © CADFEM Germany GmbH
Von der Geometrieverarbeitung zu den Ergebnissen mit PyAnsys
Haben Sie Ihre Python-Umgebung startklar, dann können wir jetzt gemeinsam loslegen. In den folgenden Abschnitten werden wir mit PyAnsys Geometry eine Geometrie importieren, bereinigen und für die Weiterverarbeitung in Mechanical speichern. Mit PyMechanical setzen wir die Randbedingungen, Analyseeinstellungen, rechnen das Simulationsmodell und speichern uns die Ergebnisse als 3D-Result. In unserem Fall ist das eine simple Halterung, die durch eine kleine Belastung verformt wird.
Aber was kann ich mit PyAnsys Geometry eigentlich alles tun. PyAnsys Geometry ist eine Python-Client-Bibliothek für den Ansys Geometry-Dienst und kann somit über Docker, lokal oder auch remote genutzt werden. In den meisten Fällen werden die Modelle bereits in CAD-Systemen erzeugt. Diese lassen sich importieren, topologisch analysieren und für die Simulation nachbearbeiten, wie etwa das Bereinigen oder das Erstellen von Named Selection für zielsichere Selektionen bei der Weiterverwendung in den Berechnungsabläufen. Über Sketch und Shapes lassen sich sogar einfache Geometrien erstellen.
PyMechanical ist ein Modul für die Modellierung, Simulation und Analyse mechanischer Systeme auf Basis einer bereits bestehenden Geometrie. Wie auch interaktiv im Mechanical und darüber hinaus haben Sie Zugriff auf Elemente, Materialeigenschaften, Kontakte, Lasten und Randbedingungen, können statische und dynamische, lineare und nichtlineare Analysen durchführen. PyMechanical überbrückt somit die Lücke zwischen Geometrieerstellung und Ergebnisvisualisierung. Auch hier gilt, wie bei allen PyAnsys Modulen, die Kompatibilität zu anderen Python-Bibliotheken, was die Erstellung von effizienten, zuverlässigen und interoperablen Workflows ermöglicht.
Tipp
Automatisierung und Digitalization mit PyAnsys.
Arbeitsabläufe rationalisieren und tiefere Einblicke in die Simulationen gewinnen.
PyAnsys Geometry – der initiale Schritt
Wir bearbeiten unsere Geometrie mit Ansys Discovery. PyAnsys Geometry ist unter anderem in der Lage, sich mit einer laufenden Sitzung von Discovery oder SpaceClaim zu verbinden oder eine neue Sitzung zu erstellen, um dort die Funktionalitäten zu nutzen:
from ansys.geometry.core import launch_modeler_with_discovery
modeler = launch_modeler_with_discovery()
Zum Öffnen der Geometrie müssen die Pfade entsprechend automatisiert erstellt werden. In unserem Fall liegt die Geometrie im selben Verzeichnis wie das Python-Skript:
import os
fd = os.getcwd()
des_fp = os.path.join(fd,"data","bracket_with_ns.scdoc")
design = modeler.open_file(des_fp)
Unsere Geometrie hat viele kleine Rundungen und Fasen. Um die Vernetzung und die Simulation zu beschleunigen, selektieren und entfernen wir Verrundungen unter einem Radius von 0.2mm und Fasen unter einer Länge von 0.5mm. Hierfür hat Discovery bereits fertige Funktionen, die man ganz smart nutzen kann.
Für die Verrundungen sieht das dann wie folgt aus: Selektieren über die Power-Selection-Methode und entfernen über die Fill-Methode.
selection = PowerSelection.Faces.ByRoundRadius(MM(0.2), PowerSelectOptions(False, Selection.Create(GetRootPart().Bodies[1])), SearchCriteria.SizeComparison.SmallerOrEqual,
SearchCriteria.RoundType.All)
secondarySelection = Selection.Empty()
options = FillOptions()
result = Fill.Execute(selection, secondarySelection, options, FillMode.ThreeD, None)
Für die Fasen ändert sich der Aufruf PowerSelection() etwas, ist vom Prinzip her aber ähnlich:
selection = PowerSelection.Faces.ByChamferLength(MM(0.5),PowerSelectOptions(False, Selection.Create(GetRootPart().Bodies[1])),SearchCriteria.SizeComparison.SmallerOrEqual)
Geometrie mit Fasen und Rundungen – Bereinigen mit PyAnsys Geometry | © CADFEM Germany GmbH
Arbeiten Sie strukturiert. Spätestens bei der zweiten Verwendung lohnt es sich eine Unterfunktion zu schreiben. Hier einmal am Beispiel unserer Defeaturing-Aufgabe: Packt man die Codezeilen in eine separate Funktion, hat man die Möglichkeit, Default-Werte zu setzen und diese aber per Aufruf auch anzupassen:
def remove_fillets_chamfers(fillet_radius=0.2,chamfer_length = 0.5):
#Fillets
selection = PowerSelection.Faces.ByRoundRadius(MM(fillet_radius),
PowerSelectOptions(False, Selection.Create(GetRootPart().Bodies[1])),
SearchCriteria.SizeComparison.SmallerOrEqual,
SearchCriteria.RoundType.All)
secondarySelection = Selection.Empty()
options = FillOptions()
result = Fill.Execute(selection, secondarySelection, options, FillMode.ThreeD, None)
# Chamfers
selection =
PowerSelection.Faces.ByChamferLength(MM(chamfer_length),PowerSelectOptions(False,
Selection.Create(GetRootPart().Bodies[1])),SearchCriteria.SizeComparison.SmallerOrEqual)
secondarySelection = Selection.Empty()
options = FillOptions()
result = Fill.Execute(selection, secondarySelection, options, FillMode.ThreeD, None)
# Function Call
remove_filltes_chamfers()
Speichert man diese nun in eine separate Bibliotheksdatei, kann der Aufruf wie folgt erfolgen:
import os
fd = os.getcwd()
fp = os.path.join(fd,"scdm_functions.py")
des_fp = os.path.join(fd,"data","bracket_with_ns.scdoc")
design = modeler.open_file(des_fp)
result,design = modeler.run_discovery_script_file(file_path=fp,script_args={},import_design=True)
path_clean_geom = os.path.join(fd,”cleaned_geom_bracket.scdoxc”)
PyMechanical: Von der Geometrie zum Simulationsmodell
Nun können wir die bereinigte Geometrie für das Modell-Setup in PyMechanical verwenden. In unserem Fall sind bereits in dem CAD-Modell Attribute auf den Flächen in Form von Named Selections definiert, um ein sauberes Modell-Setup zu bewerkstelligen.
from ansys.mechanical.core import launch_mechanical
mechanical = launch_mechanical(batch=True)
def attach_geometry(path_clean_geom):
geometry_import_group = Model.GeometryImportGroup
geometry_import = geometry_import_group.AddGeometryImport()
geometry_import_format = (
Ansys.Mechanical.DataModel.Enums.GeometryImportPreference.Format.Automatic
)
geometry_import_preferences = Ansys.ACT.Mechanical.Utilities.GeometryImportPreferences()
geometry_import_preferences.ProcessNamedSelections = True
geometry_import.Import(part_file_path, geometry_import_format, geometry_import_preferences)
return "success"
Sollten Sie im Mechanical-Scripting noch nicht sattelfest sein, öffnen Sie Mechanical interaktiv und lassen sich die manuellen Schritte einfach aufzeichnen (Ansys Mechanical > Tab Automation > Button Scripting > Start Recording). Diese können dann 1:1 übernommen werden.
Basis für viele Modell-Setup-Methoden ist das Objekt ExtAPI.DataModel.Project.Model. Hier finden sich die Untermethoden zum Erstellen von Randbedingungen, Kontakten und Vernetzen. Die Struktur ähnelt dem Objekt-Baum im Mechanical, so dass die Suche nach der korrekten Methode oder dem Objekt, auch über die Hilfe, recht einfach ist.
contact_container = ExtAPI.DataModel.Project.Model.Connections
mesh_container = ExtAPI.DataModel.Project.Model.Mesh
Auf Basis von Geometrieselektion oder in unserem Fall auf Basis von Named Selections lässt sich das Simulationsmodell jetzt sukzessive aufbauen. Über den Namen der Named Selection lässt sich auf z.B. Flächen wie folgt zugreifen:
sel_info = DataModel.GetObjectsByName(“Name_Named_Selection”).Location
Das sel_info-Objekt lässt sich dann für weitere Funktionen, wie z.B. für das Erstellen von Randbedingungen oder Kontaktbedingungen verwenden, ähnlich wie Sie das interaktiv gewohnt sind:
# create new contact
sel_info_contact = DataModel.GetObjectsByName(“NS_contact”).Location
sel_info_target = DataModel.GetObjectsByName(“NS_target”).Location
contact_region = contact_container.AddContactRegion()
contact_region.SourceLocation =sel_info_contact #Kontaktseite
contact_region.TargetLocation = sel_info_target # Targetseite
contact_region.ContactType = ContactType.Frictional
#create mesh
element_size = 3 # in mm
element_size_quantity = Quantity(element_size,'mm')
mesh_container = ExtAPI.DataModel.Project.Model.Mesh
mesh_container.ElementSize = element_size_quantity
mesh_container.UseAdaptiveSizing = False
mesh_container.GenerateMesh()
Randbedingungen befinden sich wie im Mechanical -Baum auch unterhalb des Analyse-Objektes:
#Set Boundary Conditions
analysis = ExtAPI.DataModel.Project.Model.Analyses[0]
sel_info_support = DataModel.GetObjectsByName(“NS_support”).Location
remote_displacement = analysis.AddRemoteDisplacement()
remote_displacement.Location = sel_info_support
remote_displacement.XComponent.Output.DiscreteValues=[Quantity(0, "mm")]
remote_displacement.YComponent.Output.DiscreteValues=[Quantity(0, "mm")]
remote_displacement.ZComponent.Output.DiscreteValues=[Quantity(0, "mm")]
remote_displacement.RotationX.Output.DiscreteValues=[Quantity(0, "grad")]
remote_displacement.RotationY.Output.DiscreteValues=[Quantity(0, "grad")]
remote_displacement.RotationZ.Output.DiscreteValues=[Quantity(0, "grad")]
sel_info_bc = DataModel.GetObjectsByName(“NS_bc”).Location
displacement = analysis.AddDisplacement()
displacement.Location = sel_info_bc
displacement.XComponent.Output.DiscreteValues=[Quantity(0, "mm")]
displacement.YComponent.Output.DiscreteValues=[Quantity(-0.1, "mm")]
displacement.ZComponent.Output.DiscreteValues=[Quantity(0, "mm")]
Bei all diesen Methoden lassen sich die Eigenschaften, wie auch im interaktiven Arbeiten, anpassen. Achten Sie bei der Programmierung besonders auf Einheiten und Ausrichtung im Koordinatensystem. Diese beiden Faktoren sind große Fehlerquellen in der Automatisierung.
Modellsetup automatisieren mit PyAnsys | © CADFEM Germany GmbH
PyMechanical: Ergebnisse und Auswertung
Um die Ergebnisse nach der Simulation zu evaluieren, fügen wir unserem Modell noch Post-Processing-Objekte für die Gesamtverformung und die Von-Mises-Spannungen zu. Auch hier gilt wieder dieselbe Struktur, wie Sie es im Mechanical gewohnt sind. Die Ergebnisse werden unterhalb des Solution-Objektes eingefügt, ein Kind-Objekt des Analyse-Objektes.
# Set Results
analysis = ExtAPI.DataModel.Project.Model.Analyses[0]
analysis.Solution.AddTotalDeformation()
analysis.Solution.AddEquivalentStress()
Für einzelne Körper können auch hier wieder die Selection-Objekte verwendet werden:
sel_info_def = DataModel.GetObjectsByName(“NS_tot_def”).Location
total_deformation = analysis.Solution.AddTotalDeformation()
total_deformation.Location = sel_info
Und last but not least, bitte das Speichern nicht vergessen!
ExtAPI.DataModel.Project.Save(file_path)
Im besten Fall haben Sie sich beim Nachprogrammieren die einzelnen Schritte Funktionen geschrieben und können nun am Ende das Modell übersichtlich in einem Schritt aufbauen:
mechanical.run_python_script(f"attach_geometry(r'{fp}')")
mechanical.run_python_script("an=Model.AddStaticStructuralAnalysis()")
mechanical.run_python_script("create_contact('NS_contact','NS_target')")
element_size = 3 # in mm
mechanical.run_python_script(f"set_mesh({element_size})")
mechanical.run_python_script("set_bc('NS_support','NS_bc')")
mechanical.run_python_script("set_result()")
mechanical.run_python_script("an.Solve()")
Setzen Sie Ihre Automatisierung für End-To-End-Workflows ein, fehlen natürlich noch Bilder und der Report. Holen Sie sich das entsprechende Result-Objekt aus dem Baum und erstellen Bilder. Ansys bietet hierfür auch die Möglichkeiten verschiedener Kameraeinstellungen. Lassen sich die Ansichten nicht klar definieren, da sich die Modelle doch stark ändern, ist es sinnvoller ein 3D-File zu erzeugen. Ansys exportiert zum Beispiel avz-Files, die sich dann später über externe Viewer anschauen oder in z.B. einen HTML-Report einbinden lassen.
sol = analysis.Solution
results = sol.GetChildren(DataModelObjectCategory.Result,True)
export_setting = Ansys.Mechanical.Graphics.GraphicsImageExportSettings()
res[0].Activate()
Graphics.Camera.SetFit()
#Export Image
f_name = "{0}_{1}.png".format(res.Name,res.ObjectId)
f_path = os.path.join(fd,f_name)
Graphics.ExportImage(f_path,GraphicsImageExportFormat.PNG,export_setting)
#Export 3D Image
f_name = "{0}_{1}.avz".format(res.Name,res.ObjectId)
f_path = os.path.join(fd,f_name)
Graphics.Export3D(f_path,Graphics3DExportFormat.AVZ,export_setting)
Simulationsergebnisse - ganz automatisch erhalten | © CADFEM Germany GmbH
PyDynamicReporting: Wie funktioniert das mit dem Reporting?
Schreiben Sie gerne Berichte? Mithilfe von PyDynamicReporting können Sie nun automatisch Berichte auf der Grundlage vordefinierter Vorlagen erstellen, wodurch der manuelle Aufwand reduziert und ein einheitliches Layout über mehrere Berichte hinweg gewährleistet ist. Die zuvor generierten Bilder und 3D-Bilder lassen sich schnell und einfach integrieren. Der Bericht kann in verschiedene Dateiformate, wie z. B. PDF, HTML und Microsoft Office Suite-Dokumente(beta) exportiert werden. Sie werden sehen, Berichte schreiben (lassen) macht wieder Spaß.
Model-Setup und Berichterstellung - Zeitraubend und teuer | © CADFEM Germany GmbH
Noch ein paar Tipps ganz zum Schluss: Kommentieren Sie Ihren Code, denn auch als Entwickler vergisst man nach einiger Zeit, was die eigenen Gedanken damals waren. Hilfreich ist das auch für Ihre Kollegen, die sich ggf. später einarbeiten müssen. Schreiben Sie für die Endanwender eine Log-Datei, somit lassen sich Fehler schneller finden und beseitigen. Und „Nobody is perfect“: beachten Sie beim Aufsetzen einer Automatisierung, dass auch Anwender bei der Eingabe Fehler machen können und versuchen Sie diese frühzeitig zu überlegen und abzufangen über Wertebereiche, Eingabetypen und Einheiten.
Natürlich war dies nur ein kurzer Einblick mit einem kleinen Beispiel. Ich hoffe aber, dass die Hürde, sich PyAnsys einmal genauer anzuschauen, hiermit überwunden wurde. Werfen Sie auch gerne einen Blick auf unser Python-Basisseminar, das an dieser Stelle anschließt um den Einstieg noch leichter zu gestalten. Und wenn Sie den Nutzen von Automatisierung zwar sehen, aber das Know-How und auch die Zeit fehlt, dieses umzusetzen, sprechen Sie uns gerne an und wir finden gemeinsam eine Lösung.
Seminare zum Thema
-
Einführung in Python für Ansys
In dieser Schulung erlernen Sie die Grundlagen der Python-Programmierung für den Einsatz von PyAnsys und die Automatisierung Ihrer Ansys-Simulationen.
-
Automatisierung mit Python Scripting in Ansys Maxwell
Im Seminar lernen Sie die IronPython-Schnittstelle sowie PyAEDT-Bibliotheken & API zur Automatisierung von Workflows in Ansys Maxwell zu verwenden.
-
Automatisierung mit Python Scripting in Ansys Mechanical
Lernen Sie Ihre eigenen Skripte zu schreiben: von der automatischen Geometrieselektion bis zu standardisierten Reports.
-
Automatisierung von Fluent mittels PyFluent
Erlernen Sie in dieser Schulung, wie Sie Ihre Ansys Fluent Strömungssimulation mit PyFluent steuern und automatisieren können.
-
Automatisierung mit Ansys Discovery Scripting
Im Seminar lernen Sie Ansys Discovery über die Skriptsprache Python zu steuern: von der Geometrie bis zur Simulation.
Technische Redaktion
Dr.-Ing. Marold Moosrainer
Head of Professional Development
+49 (0)8092 7005-45
mmoosrainer@cadfem.de