Les simulations numériques sont au cœur des nouveaux développements de produits. Ils permettent d’aller plus vite et de tester plusieurs configurations sans avoir à fabriquer de pièces. Pouvoir automatiser vos flux augmentera énormément votre efficacité. Je vais vous présenter dans cet article comment utiliser Python pour vos simulations avec le logiciel ANSYS via l’interface PyANSYS.
La simulation numérique est présente dans tous les types de physiques : mécanique, fluides, électromagnétique. Les interactions entre les physiques peuvent également être modélisées ce qui permet d’atteindre des degrés de complexité élevés. Toutes les industries ont aujourd’hui adopté la simulation numérique (aéronautique, automobile, horlogerie, …).
La construction d’un modèle peut vite prendre du temps. En effet, entre la simplification de la géométrie, le maillage, les conditions limites, la préparation du modèle et le temps de calcul, plusieurs heures peuvent se passer. C’est là qu’entre en jeu Python. Je ne vous présenterai pas ce langage de programmation, vous trouverez une série d’article pour débuter ici.
Imaginez que vous puissiez automatiser le lancement de vos simulations grâce à Python qui est un code facile à prendre en main. Nous verrons au travers de cet article comment créer une simulation avec le module MAPDL (Mechanical APDL).
Introduction à ANSYS
Le logiciel ANSYS fait partie des leaders dans le domaine de la simulation numérique. Il offre une gamme complète d’outils pour modéliser et résoudre une variété de problèmes. Les physiques prises en compte sont nombreux : thermique, mécanique des structures, mécanique des fluides, électromagnétique. La suite ANSYS propose également des outils d’analyse et d’optimisation vous permettant d’aller plus dans vos études.
La complexité d’ANSYS réside dans sa capacité à résoudre des équations prenant en compte les différentes non-linéarités que présentent les problèmes réels. Les sources de non-linéarité sont les suivantes : le matériau qui ne comporte pas de manière linéaire (plastification), les grands déplacements, les contacts.
PyANSYS : Interface entre Python et ANSYS
PyANSYS est une API (Application Programming Interface) permettant une interface entre le langage de programmation Python et le logiciel ANSYS.
Ainsi, vous pourrez bénéficier des avantages des deux mondes. En effet, la programmation en Python est assez intuitive et facile à prendre en main. Avec Python, vous pourrez automatiser certaines tâches très facilement. En communiquant avec ANSYS, vous pourrez alors piloter votre modèle selon les paramètre de votre choix. Ce faisant, au lieu de refaire votre modèle à chaque fois, tout se fera automatiquement.
Pour installer la librairie ANSYS, rien de plus simple :
pip install pyansys
PythonUne fois installé, vous pourrez importer la librairie « pyansys » dans vos scripts Python pour interagir avec ANSYS. Voici la structure de base pour créer et lancer des simulations via PyANSYS :
from ansys.mapdl.core import launch_mapdl
# Créer une instance ANSYS MAPDL
mapdl = launch_mapdl()
# Création du modèle géométrique et du maillage
mapdl.clear()
mapdl.prep7()
# Création des matériaux
mapdl.mp('ex',1,2e11)
mapdl.mp('nuxy',1,0.27)
# Application des conditions limites
mapdl.sf('all','pres',PRESSURE)
mapdl.finish()
# Simulation
mapdl.slashsolu()
mapdl.solve()
mapdl.finish()
# Afficher les résultats
# Plot the stress contours for the model
result = mapdl.result
result.plot_principal_nodal_stress(0,'seqv',background='w',show_edges=True,text_color='k',add_text=True)
# Quitter MAPDL
mapdl.exit()
PythonLa librairie « pyansys » permet de communiquer avec Mechanical APDL qui est le code original utilisé pour paramétrer les modèles de simulation. La librairie « pyansys » permet donc de s’affranchir d’apprendre un nouveau code mais également d’avoir accès à toutes les autres librairies disponibles avec Python. Cependant, l’utilisateur devra avoir des connaissances dans le logiciel pour maitriser les différentes fonctions utiles pour construire le modèle numérique.
La commande « pyansys.mapdl() » va vérifier que vous avez bien une licence disponible et un jeton sera alors automatiquement bloqué. Les lignes suivantes permettent de construire le modèle (géométrie, maillage, propriétés matériaux, conditions limites, résolution et post-traitement). Enfin, la commande « mapdl.exit() » permet de libérer la licence.
Automatisation des tâches de simulation
L’un des avantages clés de l’utilisation de Python avec ANSYS est la possibilité de personnaliser les flux de travail de vos simulations. Cela vous permettra d’optimiser les paramètres étudiés et atteindre plus rapidement vos objectifs.
Par exemple, vous pouvez créer de boucles Python pour effectuer une analyse de convergence de maillage automatiquement. De plus, vous pouvez récupérer très facilement les résultats et les stocker dans une liste ou un tableau Python. Une fois la boucle terminé, vous pourrez alors afficher les résultats sous forme de graphique grâce à la librairie « Matplotlib ». Je présente cette librairie dans cet article si cela vous intéresse.
Pour aller également plus loin, en récupérant une multitude de résultats en paramétrant votre modèle, vous pourrez alors utiliser une régression linéaire pour prédire le comportement du modèle et trouver plus facilement votre configuration optimale. Je parle de la régression linéaire dans ces deux articles (régression linéaire et régression linéaire multiple) avec la librairie « Scikit-Learn ».
Exemple d’utilisation
Voici un exemple issu de la documentation. L’idée est de créer une fonction qui va construire le modèle. Via les paramètres du modèle, le script pilote automatiquement les valeurs. Dans cet exemple, une étude de convergence du maillage est réalisée. La structure étudiée est la tranche d’un tube sous pression.
import numpy as np
import matplotlib.pyplot as plt
from ansys.mapdl.core import launch_mapdl
# STEP 1 : Lancement de MAPDL
mapdl = launch_mapdl()
# STEP 2 : création de la tranche du tube via une fonction python
def pipe_plane_strain(e, nu, inn_radius, out_radius, press, AESIZE):
"""Create 2D cross section modeling a pipe."""
# Remise à zéro de mapdl
mapdl.clear()
mapdl.prep7()
# Definition du type d'élément
# Quad 4 node 182 avec keyoption 3 = 2 (déformation plane)
mapdl.et(1, "PLANE182", kop3=2)
# Création de la géométrie : 1/4 du tube avec prise en compte des symétries
mapdl.pcirc(inn_radius, out_radius, theta1=0, theta2=90)
mapdl.cm("PIPE_PROFILE", "AREA")
# Propriétés matériau
mapdl.mp("EX", 1, e) # Module d'élasticité
mapdl.mp("PRXY", 1, nu) # Coefficient de poisson
# Paramètres du maillage
mapdl.aesize("ALL", AESIZE)
mapdl.mshape(0, "2D") # Maillage de la surface avec des éléments de type QUAD
mapdl.mshkey(1) # Maillage mappé
mapdl.cmsel("S", "PIPE_PROFILE") # Sélection de la surface à mailler
mapdl.amesh("ALL")
# Conditions limites et chargement
mapdl.nsel("S", "LOC", "X", 0) # Sélection des noeuds du coin supérieur gauche
mapdl.cm("X_FIXED", "NODES") # Creation d'un groupe
mapdl.nsel("S", "LOC", "Y", 0) # Sélection des noeuds dans le coin inférieur droit
mapdl.cm("Y_FIXED", "NODES") # Création d'un groupe
mapdl.allsel()
mapdl.lsel("S", "RADIUS", vmin=inn_radius) # Sélection de l'arête du rayon interne
mapdl.cm("PRESSURE_EDGE", "LINE") # On crée un groupe pour l'arète sous pression
mapdl.allsel()
# Définition du problème
mapdl.slashsolu() # On rentre dans la phase de définition du problème
mapdl.antype("STATIC", "NEW") # On crée une nouvelle analyse statique (Optionel)
mapdl.d("X_FIXED", "UX", 0) # On fixe les noeuds dans la direction Y
mapdl.d("Y_FIXED", "UY", 0) # On fixe les noeuds dans la direction Y
# On utilise une repère cylindrique au lieu d'un cartésien
mapdl.csys(1)
# Application d'une pression uniforme sur l'arète sélectionnée
mapdl.sfl("PRESSURE_EDGE", "PRES", press)
# Résolution du modèle
mapdl.allsel()
mapdl.solve()
mapdl.finish()
# On rentre dans la phase de post-traitement
mapdl.post1()
mapdl.set(1, 1) # Selection de l'incrément
max_eqv_stress = np.max(mapdl.post_processing.nodal_eqv_stress())
all_dof = mapdl.mesh.nnum_all
num_dof = 3*all_dof.size # Pour un problème en déformation plane, 3 DDL
return num_dof, max_eqv_stress
# STEP 3 : Analsye de convergence du maillage
# Définition des données d'entrée
rad1 = 175 # Rayon interne
rad2 = 200 # Rayon externe
pressure = 100
e = 2e5 # Module d'élasticité
nu = 0.3 # Coefficient de Poisson
# Liste pour stocker les résultats de l'analyse de convergence
num_dof = []
max_stress = []
# Tableau pour stocker la taille des éléments
esizes = np.logspace(1.4, 0, 20)
# Boucle "for" pour réaliser les simulations automatiquement
# Les résultats sont récupérés au fur et à mesure
for esize in esizes:
dof, eqv_stress = pipe_plane_strain(e, nu, rad1, rad2, pressure, esize)
num_dof.append(dof)
max_stress.append(eqv_stress)
print(f'DOF: {dof:5d} #Stress: {eqv_stress:.2f} MPa')
# Affichage des résultats sous forme de graphique
plt.figure(figsize=(8, 6), dpi=80)
plt.plot(num_dof, max_stress, 'b-o')
plt.plot([num_dof[0], num_dof[-1]], [max_stress[-1], max_stress[-1]], 'r:')
plt.title('Mesh Convergence Study')
plt.xlabel('Number of DOF')
plt.ylabel('Maximum eqv. Stress (MPa)')
plt.show()
# STEP 4 : Affichage de la configuration finale de l'analyse de convergence
mapdl.allsel('ALL')
mapdl.eplot(
title='Element Plot', line_width=1, show_bounds=True, cpos="xy"
)
# On rentre dans la phase de post-traitement
mapdl.post1()
mapdl.set(1, 1)
mapdl.post_processing.plot_nodal_displacement(
'NORM', cpos="xy", cmap="magma",
)
mapdl.post_processing.plot_nodal_eqv_stress(cpos="xy", cmap="magma")
# On quitte MAPDL
mapdl.exit()
PythonConclusion
Bien entendu, pour utiliser PyANSYS vous aurez besoin d’une licence ANSYS qui n’est pas donnée je vous l’accorde :). Je m’adresse essentiellement aux utilisateurs de ce logiciel ou similaires. En effet, je pense notamment au logiciel NASTRAN qui peut tout à fait être utilisé de la même manière.
Dans cet article, je vous ai présenté PyANSYS qui permet d’automatiser vos flux via le langage Python. Vous pouvez paramétrer entièrement vos modèles et lancer les simulations automatiquement sans intervention de votre part.
Pour plus d’informations, je vous invite à parcourir ces sites qui vous présenteront les fonctionnalités et les modules plus en détails de PyANSYS (PyAnsys – PyPI et docs.pyansys.com) . En effet, nous n’avons couvert qu’une petite partie du sujet mais l’idée était de vous présenter PyANSYS pour vous donner des idées pour gagner en efficacité dans votre travail de tous les jours.
N’hésitez pas à réagir et à commenter cet article, je vous répondrai avec plaisir.