
Bonjour à tous,
Je vais vous parler d’un ancien projet qui m’a passionné pendant quelques mois. Ayant travaillé dans le calcul de structure et la simulation numérique, j’ai voulu mettre en application mes connaissances pour développer moi-même ce genre d’outil. Ce projet m’a permis de rentrer dans le détail du fonctionnement des logiciels et de bien comprendre leur fonctionnement. Bien sûr, les logiciels du commerce donnent des performances bien plus élevées et les possibilités sont plus nombreuses. Néanmoins, connaitre et maîtriser la base permet de bien mieux comprendre les phénomènes complexes.
La présentation de ce projet permettra de voir les différentes étapes de construction d’un programme. Je vous présenterai la décomposition des différentes étapes, la structure globale et les fonctions / modules créés. J’ai réalisé ce projet il y a quelques années, je pourrai donc être également critiques sur ce que j’ai fait. Je ne suis pas développeur, juste un scientifique passionné de programmation. Le code sera certainement perfectible mais il a le mérite de fonctionner 🙂
Je me suis amusé à demander à ChatGPT de me donner les grandes étapes pour la construction d’un tel outil. J’étais content de voir que ce qui a été fait est cohérent avec les statistiques de notre cher ami ChatGPT.
Pour ce qui est de la conduite globale du programme, je crée un fichier « main.py ». Ce fichier déroule toutes les actions principales en appelant les fonctions nécessaires et gère toutes les variables principales. On évitera d’utiliser des variables globales. Cela est beaucoup trop néfaste pour la lecture du code. Si vous avez besoin d’une variable, mettez-la en argument.
Import des fonctions et modules nécessaires
La première chose à faire est d’importer les fonctions et les modules que vous utilisez dans cette partie du programme. J’ai utilisé la bibliothèque « time » pour chronométrer le programme et donner à l’utilisateur le temps passé à résoudre le problème. Les trois autres « modules » sont : « model », « MatrixOperations », PrintOufFunctions » et « PlotResults ». Ce sont trois fichiers qui contiennent des fonctions en lien avec leur nom.
Vous verrez dans le code qu’à cette époque, je ne respectais pas de règle de nommage bien précise. On peut voir des mixes majuscule / minuscule et parfois que des minuscules. Aujourd’hui, je m’impose de suivre les règles préconisées par la PEP 8 (Python Enhanchement Proposals, chapitre 8). J’en parle dans cet article qui décrit les bonnes pratiques en programmation.

Passons maintenant à l’étude des différentes étapes.
Lecture du modèle et récupération des données
Votre modèle sera écrit en fichier texte avec des mots clés particuliers. Votre script de lecture doit donc en tenir compte. Dans notre cas, le script permet de lire un modèle NASTRAN.

On récupère donc le type d’analyse souhaité et les cas de charges pour la définition globale du calcul. Ensuite, dans la variable « model », on récupère toutes les entités qui décrivent la structure (les nœuds, les éléments, les propriétés, les matériaux, … ). Ici j’ai utilisé une liste dans laquelle sont stockées des dictionnaires. C’est une solution, il existe certainement une meilleure manière de faire.
Construction des matrices globales MGG, KGG, FGG
L’étape suivante consiste à construire les matrices globales de masses, raideurs et forces. Dans la librairie « M », une fonction permet de construire ces matrices à partir du modèle complet et du dictionnaire contenant les forces. Je vous accorde qu’avoir renommer la librairie des opérations matricielles en « M » n’est pas des plus explicite.

Ensuite, la liste des chargement est affichée pour contrôler ce qui se passe dans le modèle. De plus, on voit en commentaire que pendant la période de débogage, les matrices « KGG » et « FGG » étaient exportées pour vérification. Avoir une fonction qui vous permet d’exporter certaines informations vous permet de pouvoir les contrôler plus facilement que si elles sont affichées dans le terminal.
Enfin, le bilan de masse, centrage et inertie (MCI) est réalisé. En simulation numérique, vérifier le bilan masse est très important pour détecter différentes erreurs. Alors, vous allez me dire qu’en statique la masse n’intervient pas mais si vous souhaitez réaliser une analyse modale ou un calcul en dynamique vibratoire, cette vérification est indispensable.
A ce stade du programme, nous avons donc les matrices globales. La suite consiste à appliquer les conditions limites suivant le cas de charge étudié.
Application des conditions limites
Dans cette partie, une boucle est réalisée sur les cas de charge. Pour chaque cas de charge, on récupère les conditions limites et on réduit les matrices pour passer à l’étape suivante qui est la résolution du problème.

Comme dans section précédente, les matrices réduites étaient exportées pour vérification. Ces lignes sont maintenant en commentaires.
Résolution du problème
En fonction du type d’analyse choisi par l’utilisateur, le programme appelle la méthode de résolution correspondante.

On peut voir sur l’image que je n’ai pas pris le temps de développer le module concernant la résolution pour un problème de flambage. Néanmoins, les trois autres modules sont disponibles. La dernière étape de cette section consiste à recalculer les vecteurs déplacements.
Affichage des résultats
La dernière étape de cette boucle sur les cas de charges consiste à afficher les résultats par le biais de deux fonctions. La première consiste à exporter dans un fichier les déplacements, les forces appliquées, les forces de réactions aux nœuds, de calculer l’équilibre du système et enfin les forces calculées dans les éléments.

La seconde fonction permet de tracer un graphique représentant la déformée de la structure.

Le graphique est affiché en 3D mais le problème est défini dans le plan ZX d’où une visualisation un peu particulière. Ce point pourra être amélioré pour la suite.
Conclusion
Nous avons vu ensemble que pour un problème complexe, nous pouvons le diviser en plusieurs étapes plus simples. Décomposer ainsi vos programmes permet d’anticiper les entrées / sorties de vos fonctions mais également de vous rendre compte que finalement ce n’est pas si insurmontable.
Clairement, on pourra critiquer la lisibilité du programme. Appliquer les conseils de la PEP8 pourra améliorer ce point. On notera la présence de commentaire expliquer ce qu’il se passe.
Si vous souhaitez que j’approfondisse certains point, n’hésitez pas à me le demander en commentaire. Je vous répondrai avec plaisir et ce sera peut-être l’objet d’un article 🙂
A bientôt, merci de m’avoir lu,
Benjamin