Erste Schritte mit PyAnsys anhand eines End-to-End Beispiels

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.

Header_All_PyAnsys_1093x410
© 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_Blog_Bruecke

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:

  1. Simulation-Bibliotheken
  2. Utility-Bibliotheken
  3. 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)

PyAnsys_Blog_PyAnsys-Kategorien

Ü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.

PyAnsys_Blog_Python-Manager

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.

Teaser_PyAnsys_Webinar

 

Tipp

Automatisierung und Digitalization mit PyAnsys.

Arbeitsabläufe rationalisieren und tiefere Einblicke in die Simulationen gewinnen.

Webinar on Demand anschauen

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)

PyAnsys_Blog_Geometrie

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.

PyAnsys_Blog_Modellsetup-Automatisieren

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)

PyAnsys_Blog_Simulationsergebnisse

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ß.

PyAnsys_Blog_Model-Setup_Berichterstellung

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

Autor

Aileen Lützke

CADFEM Germany GmbH

+49 (0)8092 7005-536
aluetzke@cadfem.de

Redakteur

Dr.-Ing. Hendrik Donner

CAE Engineer

+49 (0)8092 7005-725
hdonner@cadfem.de

Technische Redaktion

Dr.-Ing. Marold Moosrainer

Head of Professional Development

+49 (0)8092 7005-45
mmoosrainer@cadfem.de