Aller au contenu
Accueil » PyANSYS : Maximiser l’efficacité des simulations numériques avec ANSYS

PyANSYS : Maximiser l’efficacité des simulations numériques avec ANSYS

    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.

    Découvrez comment maximiser votre efficacité pour vos simulations numériques en couplant ANSYS et Python

    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
    Python

    Une 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()
    Python

    La 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()
    Python

    Conclusion

    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.

    Si vous avez aimé l'article, vous êtes libres de le partager ! :)

    Laisser un commentaire

    Récupérez votre guide pour débuter en Python. Je vous offre plus de 80 pages pour partir sur de bonnes bases !