URL: https://linuxfr.org/news/tutoriel-code_aster Title: Tutoriel Code_Aster Authors: Joalland Davy Defaud, ZeroHeure, bubarđŠ„, BenoĂźt Sibaud et palm123 Date: 2018ćčŽ01æ06æ„T22:17:27+01:00 License: CC By-SA Tags: code_aster, programmation_par_contraintes, modĂ©lisation, 2d, 3d, mĂ©canique et tutoriel Score: 48 Une fois nâest pas coutume, il pleut en HauteâGaronne ! Alors jâai tuĂ© le temps jetant un Ćil Ă [Code_Aster](https://www.code-aster.org/spip.php?rubrique1), qui est un code de calcul de structure thermomĂ©canique par la mĂ©thode des Ă©lĂ©ments finis isoparamĂ©triques. Il est dĂ©veloppĂ© par EDF sous licence GNU GPL v3. Il permet de faire Ă peu prĂšs tout ce qui est imaginable en mĂ©canique, voir Ă ce propos la [plaquette de prĂ©sentation](https://www.code-aster.org/UPLOAD/DOC/Presentation/plaquette_aster_fr.pdf) (PDF).  Ce code de calcul est intĂ©grĂ© Ă la suite de logiciels libres [SalomĂ©âMĂ©ca](http://www.salome-platform.org/), qui contient un prĂ©processeur, Code_Aster, et un postâprocesseur/visionneur pour voir les rĂ©sultats. Aujourdâhui, nous allons utiliser le code en version autonome (_stand alone_) et nous utiliserons notre Ă©diteur de texte prĂ©fĂ©rĂ©, _gmsh_, _astk_, puis de nouveau _gmsh_ pour voir les rĂ©sultats de nos calculs. ---- [Journal Ă lâorigine de la dĂ©pĂȘche](https://linuxfr.org/users/joalland/journaux/tutorial-code_aster) [Code Aster, sur WikipĂ©dia](https://fr.wikipedia.org/wiki/Code_Aster) [Code Aster, site officiel](https://www.code-aster.org) ---- #Installation Cela se passe [_ici_](https://www.code-aster.org/spip.php?rubrique7). Deux options : 1. soit on compile code_aster ; 1. soit on nâaime pas compiler et lâon tĂ©lĂ©charge le binaire de SalomĂ©âMĂ©ca qui contient Code_Aster de façon prĂ©installĂ© et quelques Gio dâoutils dont nous ne nous servirons pas. La compilation se passe assez bien, et les paquets prĂ©requis (voir les [instructions de compilation sur leur site](https://www.code-aster.org/spip.php?article91)) se trouvent assez facilement. # Calcul de poutre # Nous allons Ă©tudier le comportement mĂ©canique dâune poutre encastrĂ©e dâun cĂŽtĂ© et soumise Ă un effort ponctuel de lâautre cĂŽtĂ© :  Nous allons le faire de trois façons : 1. En modĂ©lisation poutre 1D ; 1. En modĂ©lisation plaque 2D ; 1. En modĂ©lisation complĂšte 3D. ## CrĂ©ation de la gĂ©omĂ©trie avec Gmsh## Pour fonctionner, Code_Aster a besoin dâun fichier de commandes, et dâun fichier dĂ©crivant un maillage : une liste de nĆuds et une liste dâĂ©lĂ©ments reliant ces nĆuds. On pourrait lui fournir un fichier texte contenant les coordonnĂ©es gĂ©omĂ©triques de chaque nĆud du maillage, mais vu quâon a la flemme et que cela peut ĂȘtre assez ennuyeux pour des problĂšmes complexes, on va demander Ă [Gmsh](http://gmsh.info/) de le faire pour nous. On crĂ©e tout dâabord la **gĂ©omĂ©trie** de notre problĂšme Ă lâaide de points, de lignes, surfaces et volumes, on **doit** aussi dĂ©finir des groupes dâintĂ©rĂȘts (la poutre entiĂšre, la partie encastrĂ©e et la partie sur laquelle on applique la force). On peut jouer cinq minutes avec la partie interface graphique de Gmsh, pour lequel on trouvera de nombreux tutoriaux sur le Web, mais on en revient vite Ă un fichier texte. Voici donc `poutre1d.geo` : ```python //== paramĂštres == //taille maillage autour des nĆuds. 2,5 mm entre deux nĆuds. cl__1 = 2.5; // == gĂ©omĂ©trie == //points Point(1) = {0,0, 0, cl__1}; // extrĂ©mitĂ© encastre de ma poutre Point(2) = {100,0, 0, cl__1}; // extrĂ©mitĂ© libre de ma poutre, soumise Ă une force //lignes Line(1) = {1, 2}; // on crĂ©e la ligne entre Point1 et Point2 //== groupe == Physical Point("encastr") = {1}; // on encastrera le nĆud correspondant Ă ce point Physical Point("force") = {2}; //on appliquera la force sur le nĆud correspondant Ă ce point Physical Line ("poutre") = {1}; // notre poutre sera constituĂ©e de tous les nĆuds et Ă©lĂ©ments correspondant Ă cette ligne ``` Une fois ce fichier `poutre1d.geo` créé, on lâouvre avec gmsh (terminal : `gmsh poutre1d.geo`). On clique sur _Mesh_ â _1D_, le maillage est fait, mais on ne le voit pas, car seule la gĂ©omĂ©trie est affichĂ©e ! Donc, _Tools_ â _Options_, onglet _Visibily_ de _Geometry_, on dĂ©coche _Points_ et _Lines_, et dans Mesh, on coche _Nodes_ et _Lines_. Cela donne ceci :  Notez quâavec _Tools_ â _Options_, dans lâonglet _list bowser_, on peut visualiser ou masquer (taper la touche `EntrĂ©e` au clavier aprĂšs avoir cliquĂ© sur le nom du groupe dans la fenĂȘtre) les groupes que nous avons créés et leurs affectations. Câest trĂšs pratique. On voit par exemple bien que notre groupe « poutre » est constituĂ© de tous les Ă©lĂ©ments de la poutre. Pour sauvegarder notre maillage, on fait _File_ â _Export_ et lâon choisit le format de maillage appelĂ© `.MED`, on obtient donc un beau `mesh1d.med`. **Surtout**, on veille Ă ce que tout soit dĂ©cochĂ© dans la fenĂȘtre surgissante qui apparaĂźt et lâon clique rapidement sur _OK_. De mĂȘme, voici poutre2d.geo, qu'on maille en 2D avec gmsh: ```python //== paramĂštres: == //taille maillage autour des nĆuds. 2,5 mm entre deux nĆuds. cl__1 = 2.5; L=100; //longueur poutre de 100 mm R=5; // ratio longueur/largeur l=L/R; //== gĂ©omĂ©trie == //points Point(1) = {0, 0, 0, cl__1}; Point(2) = {L, 0, 0, cl__1}; Point(3) = {L, l, 0, cl__1}; Point(4) = {0, l, 0, cl__1}; Point(5) = {L, l/2, 0, cl__1}; //lignes Line(1) = {1, 2}; Line(2) = {2, 5}; Line(3) = {5, 3}; Line(4) = {3, 4}; Line(5) = {4, 1}; //surface Line Loop(1) = {1, 2, 3, 4, 5}; //on crĂ©e une boucle de lignes Plane Surface(1) = {1}; // on crĂ©e une surface Ă partir de la boucle //== groupe == Physical Line("encastr") = {5}; // on encastrera cette ligne Physical Point("force") = {5}; // lieu application force Physical Surface("poutre") = {1}; // notre poutre 2D ```  Et `poutre3d.geo` quâon maille en 3D avec gmsh : ```python //== paramĂštres: == //taille maillage autour des nĆuds. cl__1 = 5; L=100; // longueur poutre R=5; // ratio longueur/largeur l=L/5; //== gĂ©omĂ©trie == //points Point(1) = {0,0, 0, cl__1}; Point(2) = {L,0, 0, cl__1}; Point(3) = {L,l, 0, cl__1}; Point(4) = {0,l, 0, cl__1}; Point(5) = {L, l/2, 0, cl__1}; //lignes Line(1) = {1, 2}; Line(2) = {2, 3}; Line(3) = {3, 4}; Line(4) = {4, 1}; //surface Line Loop(1) = {1, 2, 3, 4}; Plane Surface(1) = {1}; Point{5} In Surface{1}; // pour que le point 5 soit contenu dans la surface //volume Extrude {0,0,-3}{Surface{1};Layers{3}; Recombine;} //on extrude la surface 1 de -3 mm selon lâaxe Z //en crĂ©ant 3 Ă©lĂ©ments dans lâĂ©paisseur avec lâaide de calques //== groupe == //on sait que câest la surface 25 parce quâon le visualise sous gmsh en affichant « surface label ». //il peut y avoir une erreur lors de lâimportation si le numĂ©ro de la surface créée par lâextrusion nâest pas 25. // Câest pas grave, on regarde Ă quoi correspond la surface Ă encastrer, on trouve son label, et mon modifie les lignes ci-dessous. Physical Surface("encastr") = {25}; // on encastrera cette surface Physical Point("force") = {5}; // lieu application force Physical Volume("poutre") = {1}; // notre poutre 3D //== maillage == Transfinite Line{1,3}=8*R+1; // 8*R Ă©lĂ©m dans la longueur = 41 nĆuds entre lignes 1 et 3 Transfinite Line{4,2}=8+1; // 8 Ă©lĂ©m dans la largeur = 9 nĆuds entre lignes 4 et 2 Transfinite Surface "*"; // on veut un maillage propre Recombine Surface "*"; // on veut un maillage quadra ```  Nous voici maintenant avec trois maillages au format `.med`. Il nous faut maintenant crĂ©er notre fichier de commandes ! ## Fichier de commandes ## ```python #U1.03.02 DEBUT(); #on charge le fichier de maillage .MED, unitĂ© logique 20 mesh=LIRE_MAILLAGE( INFO=2, INFO_MED=2, UNITE=20, FORMAT='MED', ); #on a importĂ© le maillage et ses groupes, on crĂ©e d'autres groupes: mesh=DEFI_GROUP( reuse =mesh, INFO=2, MAILLAGE=mesh, #on crĂ©e un groupe nommĂ© TOUT qui contient toutes les mailles du maillage. #on ne va pas s'en servir, mais ça peut ĂȘtre utile CREA_GROUP_MA=_F(NOM='TOUT',TOUT='OUI',), #on crĂ©e un groupe de nĆuds qui contient tous les nĆuds de toutes les mailles. # Il faut le faire quand le maillage provient de Gmsh, car Gmsh transforme les nĆuds en maille, on les retransforme ici en nĆuds CREA_GROUP_NO=_F(TOUT_GROUP_MA='OUI',), ); #on affecte au groupe de mailles 'poutre' créé avec gmsh, # des Ă©lĂ©ments finis de types Poutre, ici POU_D_T model=AFFE_MODELE( MAILLAGE=mesh, AFFE=( _F( GROUP_MA=('poutre',), PHENOMENE='MECANIQUE', MODELISATION='POU_D_T', ), ), ); #on dĂ©finit un matĂ©riaux, ici de l''acier: # Module d'Young' E = 210000 N/mm2 # Coefficient de Poisson, nu = 0.3 # masse volumique = 8e-9 tonne/mm3 steel=DEFI_MATERIAU(ELAS=_F(E=210000.,NU=0.3,RHO=8e-9),); #U4.43.03 #on assigne notre matĂ©riaux Ă nos mailles du groupe 'poutre' material=AFFE_MATERIAU( MAILLAGE=mesh, AFFE=_F(GROUP_MA=('poutre',), MATER=steel,), ); #U4.42.01 #On assigne Ă nos Ă©lĂ©ments poutre POU_D_T une section rectangulaire de largeur 20 mm et dâĂ©paisseur 3 mm elemcar=AFFE_CARA_ELEM( MODELE=model, INFO=2, POUTRE=( _F( GROUP_MA=('poutre',), SECTION='RECTANGLE', CARA=('HY','HZ',), VALE=(3,20), ), ), ); #on interdit toute rotation et translation aux nĆuds du groupe 'encastr' (1 seul nĆud ici). # cela simule l'encastrement encast=AFFE_CHAR_MECA( MODELE=model, DDL_IMPO=( _F( GROUP_NO=('encastr',), DX=0,DY=0,DZ=0,DRX=0,DRY=0,DRZ=0, ), ), INFO=1, ); # on applique 500 N selon la direction -Z au nĆud de notre groupe 'force' force_f=AFFE_CHAR_MECA( MODELE=model, FORCE_NODALE=_F( GROUP_NO=('force',), FZ=-500, ), INFO=2, ); #U4.51.01 #on compile les prĂ©cĂ©dents concepts pour le calcul stat=MECA_STATIQUE( MODELE=model, CHAM_MATER=material, CARA_ELEM=elemcar, EXCIT=( _F(CHARGE=encast,), _F(CHARGE=force_f,), ), ); # Par dĂ©faut, sont calculĂ©s uniquement les dĂ©placements et les rĂ©actions nodales aux points de Gauss des Ă©lĂ©ments, je crois. # du coup on enrichit le concept "stat" pour lui demander d'autres choses. # SIEF_ELNO: ici, efforts thĂ©orie des poutres au niveau des nĆuds des Ă©lĂ©ments # SIPO_ELNO: ici, contraintes dans la poutre, au niveau des nĆuds des Ă©lĂ©ments # SIPM_ELNO: ici, contrainte max dans la poutre # REAC_NODA: forces/moments aux nĆuds limites stat=CALC_CHAMP( reuse =stat, RESULTAT=stat, CONTRAINTE=( 'SIEF_ELNO','SIPO_ELNO','SIPM_ELNO', ), FORCE=('REAC_NODA',), ); #on imprime ça dans un fichier de sortie .med, unitĂ© logique 80. #on n'imprime que les dĂ©placements et les contraintes # (on n'affiche pas tout ce qu'on a calculĂ©, genre SIPM_ELNO ou REAC_NODA pourquoi pas !) IMPR_RESU( FORMAT='MED', UNITE=80, RESU=_F( RESULTAT=stat, NOM_CHAM=( 'DEPL', 'SIPO_ELNO', 'SIPM_ELNO', ), ), ); FIN(); ``` Notez que les #U4.51.01 ou autres renvoient Ă la documentation. On enregistre ce fichier texte en `1d.comm`, par exemple, et nous allons lancer le calcul Ă lâaider dâastk. ## Astk ## Astk est lâoutil permettant de mener Ă bien un calcul, on le lance via `/opt/code_aster/bin/astk` (si vous avez installĂ© Code_Aster dans `/opt`). On cherche Ă obtenir une fenĂȘtre qui a cette allure :  Ensuite : - _File_ â _New_ ; - on choisit notre dossier de travail (_path_) ; - dans la colonne dâicĂŽnes au milieu Ă droite, on clique sur lâicĂŽne en forme de dossier bleu, pour aller chercher son `mesh1d.med` et son `1d.comm` ; - on clique sur lâicĂŽne du dessus pour ajouter deux lignes, puis dans _type_ pour la ligne, on choisit _mess_ et _rmed_, dans _name_ on les appelle `./log1d.mess` et `./resu1d.rmed` ; - _File_ â _Save_As_ â `1d.astk`. - _File_ -> _New_ - on choisit notre _path_ / dossier de travail - dans la colonne d'icĂŽnes au milieu Ă droite, on clique sur lâicĂŽne en forme de dossier bleu, pour aller chercher son mesh1d.med et son 1d.comm - on clique sur lâicĂŽne du dessus pour ajouter deux lignes, puis dans _type_ pour la ligne, on choisit _mess_ et _rmed_, dans _name_ on les appels ./log1d.mess et ./resu1d.rmed - _File_ -> _Save_As_ -> 1d.astk La colonne LU correspond Ă _Logical Unit_ ou UnitĂ© Logique, câest lâendroit de la mĂ©moire oĂč je ne sais quoi oĂč lâon sâattend Ă trouver le fichier ; dans `fichier.comm`, on a prĂ©cisĂ© que lâunitĂ© logique Ă©tait 20 pour le maillage `.med` et 80 pour le rĂ©sultat `.med`. Les colonnes DRC veulent dire DonnĂ©es, RĂ©sultats, CompressĂ©. Une fois que cela est fait on clique sur _Run_ ! Le calcul est lancĂ©. Il se termine, on va voir le `log1d.mess` qui a Ă©tĂ© créé, il contient toutes les infos relatives au calcul. Lâinformation la plus importante Ă©tant la derniĂšre ligne. Chez moi jâai : `EXECUTION_CODE_ASTER_EXIT_13223-localhost=0`. Si le code renvoie 0, câest que cela a fonctionnĂ© ! Sâil renvoie 1, câest que ça a plantĂ© et quâil faut dĂ©boguer... ## RĂ©sultat ## Normalement tout a fonctionnĂ©, nous avons un beau `resu1d.rmed` que nous ouvrons avec gmsh (terminal `gmsh resu1d.rmed`). On peut donc voir les dĂ©placements et la contrainte, tout ce dont a besoin un mĂ©canicien pour dimensionner des systĂšmes mĂ©caniques ! Voici les paramĂštres sur lesquels agir pour afficher le dĂ©placement multipliĂ© par 10. Il faut afficher des _Vectors_ et non pas lâ_Original Field_. Comme ciâdessous :  Pour les contraintes, SIPO_ELNO contient la contribution de chaque force ou moment aux contraintes de la poutre. Câest grosso modo un vecteur de six composantes que voici :  Pour les afficher une par une, on se place dans _Options_ â _Visibility_ et, en bas, la premiĂšre case Ă droite de la liste dĂ©roulante _Original Field/Scalar Force/Vector/Tensor_. ZĂ©ro correspond Ă SN et cinq correspond Ă SNT, par rapport au tableau ciâdessus (je ne sais pas trop ce que prĂ©sente SIPO_ELNO par dĂ©faut). SIPM_ELNO, quant Ă lui, reprĂ©sente par dĂ©faut la contrainte maximum selon XX. Voici dâautres visualisations avec les modĂšles 2D et 3D :    # Aller plus loin # Code_Aster est trĂšs vaste, il contient prĂšs de 400 types dâĂ©lĂ©ments finis ! Pour aller plus loin, nâhĂ©sitez pas Ă lire la [doc](https://www.code-aster.org/spip.php?rubrique5), qui contient aussi des [exemples](https://www.code-aster.org/V2/doc/v13/fr/index.php?man=V4) de calculs qui sont livrĂ©s avec le code. Je vous conseille aussi notamment lâexcellent livre sous licence libre de [JeanâPierre Aubry](https://framabook.org/docs/Code_Aster/beginning_with_Code_Aster_JPAubry_20131206.pdf), qui est un passage obligatoire pour prendre en main le code ! Le code date, en revanche, de la version 11 de Code_Aster ; mais une nouvelle version est en cours dâĂ©criture ! On y fait notamment des analyses non linĂ©aires avec du contact entre piĂšces et du frottement. [_Aster Study_](https://www.youtube.com/watch?v=BsaTZpJta3Y) vient aussi de faire son apparition. Voilou, cher lecteur. NâhĂ©site pas Ă tâamuser ! Je poste en commentaire les fichiers `.comm` de calcul en [2D](https://linuxfr.org/nodes/113462/comments/1726128) et [3D](https://linuxfr.org/nodes/113462/comments/1726129).