• Aucun résultat trouvé

La librairie X-FEM, utilisée comme base de développement, est une librairie élé- ments nis. Il faut tout d'abord préciser que le prétraitement (dénition de géométries et maillages) ainsi que le post-traitement (visualisation) sont eectués à l'aide du logi- ciel GMSH. Les systèmes linéaires sont également résolus à l'aide de librairies externes. La librairie X-FEM fournit donc les outils nécessaires au stockage de données et à l'assemblage d'un problème élément ni.

3.1.a Interpolations

Un des points forts de la librairie X-FEM est la souplesse d'utilisation des inter- polations. Les interpolations sont hiérarchiques. L'extraction de l'interpolation linéaire sous-jacente à une interpolation d'ordre supérieure est alors facilitée. Cette extraction, illustrée sur la gure III.18, est mise a prot pour l'application de conditions aux li- mites, où les valeurs nodales des parties linéaires (u1 et u2) sont imposées tandis que

les valeurs nodales d'ordre supérieures (u3) sont nulles.

L'extrait de code III.1 montre la construction d'une interpolation P1+/P1 en deux dimensions. Les deux premières lignes dénissent une interpolation de Lagrange de de- gré 1 pour les deux composantes du vecteur vitesse, les deux suivantes une interpolation d'ordre 3 nécessaire à la construction de la bulle. La classe xSpaceFiltered permet de l- trer ces fonctions d'ordre 3 an de ne conserver que les valeurs nodales se trouvant sur

Fig. III.18: Élément ni P2 hiérarchique de dimension 1. u1, u2 et u3 sont les valeurs

nodales.

Algorithme III.1 Implémentation d'une interpolation P1+/P1.

//Vitesse :

xSpaceLagrange laglinx("VELOCITY_X", xSpace : :VECTOR_X, xSpaceLagrange : :DEGREE_ONE) ; xSpaceLagrange lagliny("VELOCITY_Y", xSpace : :VECTOR_Y,

xSpaceLagrange : :DEGREE_ONE) ; xSpaceLagrange lag3x("VELOCITY_X", xSpace : :VECTOR_X,

xSpaceLagrange : :DEGREE_THREE) ; xSpaceLagrange lag3y("VELOCITY_Y", xSpace : :VECTOR_Y,

xSpaceLagrange : :DEGREE_THREE) ; xSpaceFiltered bubx(lag3x, bubbleFunction(2)) ;

xSpaceFiltered buby(lag3y, bubbleFunction(2)) ;

xSpaceComposite interpolation_V(laglinx,bubx,lagliny,buby) ; //Pression :

xSpaceLagrange lagpr("PRESSURE", xSpace : :SCALAR, xSpaceLagrange : :DEGREE_ONE) ; xSpaceComposite interpolation_P(lagpr) ;

une facette (fonction bubbleFunction(2)). Les interpolations sont ensuite assemblées dans un espace dit composite. Suit enn la construction de l'interpolation P1 pour le champ de pression.

Enrichissement et déplacement d'interface An de dénir les interpolations spé- ciques à la méthode X-FEM, une level-set permet de donner la position de l'enri- chissement. Des fonctions d'enrichissement sont déclarées sur les éléments coupés par l'iso-zéro de la level-set. Cependant, l'interpolation est indépendante de la physique et n'est déclarée qu'à l'aide du maillage et de la level-set initiale. Dans le cas où la level- set décrit une surface libre qui évolue, l'interpolation doit donc être redénie à chaque déplacement de level-set. En particulier, si l'iso-zéro de la level-set change d'élément, l'enrichissement doit également changer d'élément. Le nombre de degrés de liberté peut alors changer, et le transport des variables d'histoire est dicile.

Bien que les interpolations soient implémentées de manière très souple dans la li- brairie X-FEM l'enrichissement associé à une interface mobile pose des dicultés. C'est pourquoi les simulations eectuées dans cette étude ne présentent pas d'enrichissement à l'interface.

3.1.b Le stockage des données

Les champs et le double manager Dans la librairie éléments nis X-FEM, le stockage des donnés est eectué à l'aide de plusieurs classes. Les valeurs nodales d'un champ sont stockées dans une classe appelée double manager. Cette classe permet d'attacher à chaque valeur des informations telles que l'entité géométrique à laquelle elle correspond, la physique qu'elle représente et le type d'interpolation associée. Cette étape de déclaration d'interpolation s'eectue en itérant sur l'ensemble des éléments du maillage.

Une fois ce gestionnaire de valeur déclaré, un champ est déni. Le champ permet simplement, à partir de l'interpolation et des valeurs nodales, de retourner la valeur en chaque point de l'espace. La librairie X-FEM contient une classe nommée xField que l'on dénit à l'aide d'une interpolation et d'un double manager. Cette classe xField ne contient aucune donnée, mais permet seulement de faire le lien entre interpola- tions et valeurs nodales. L'extrait de code III.2 montre l'instanciation d'un champ et d'un gestionnaire de valeur à partir de l'interpolation présentée précédemment (Algo- rithme III.1) .

Les variables internes Outre les valeurs nodales, il est souvent utile de stocker des valeurs nécessaires à la construction des résidus. Par abus de langage, nous appellerons

Algorithme III.2 Instanciation du champ et du double manager.

xDoubleManager double_manager ; xField V(double_manager) ; V.insert(interpolation_V) ;

xValueCreator<ValueOldAndCurrentDouble_c> creator ;

DeclareInterpolation(V, creator, mesh.begin(), mesh.end()) ;

ces valeurs les variables internes. Elles peuvent être un ux de chaleur, un tenseur des contraintes ou encore la taille de l'élément courant (nécessaire pour le résidu de la formulation SUPG). Puisque le résidu est intégré à l'aide d'une méthode de quadrature de Gauss classique, seules les valeurs de ses variables internes aux points de Gauss sont nécessaires. An de stocker et de mettre à jour ces valeurs, la librairie X-FEM contient deux classes utiles. La classe gestionnaire de variables et les classes matériau.

La classe gestionnaire de variables permet de stocker des valeurs scalaires, vecto- rielles ou tensorielles identiées à l'aide d'une chaîne de caractères. La classe matériau dénit les variables internes à stocker dans le gestionnaire de variables. De plus cette classe matériau a accès aux valeurs ainsi qu'au jeu de donné utilisateur (tels que les paramètres matériaux) et permet ainsi de mettre à jour certaines variables internes (comme par exemple la contrainte). D'autres sont mises à jour à l'aide des champs (comme par exemple le taux de déformation).

3.1.c L'assemblage et la résolution

Formes La librairie X-FEM est développée de manière générique en dénissant de nombreuses classes à l'aide de patrons. Des formes linéaires ou formes bilinéaires per- mettent de décrire de manière abstraite les opérandes des intégrales de résidus ou de matrice tangente. Le résidu du problème élastique donné équation (III.3) et la matrice tangente associée, donnée par l'équation (III.16) oùSe est la matrice d'élasticité et Lg et Ld sont les opérateurs gradients, peuvent ainsi être implémentés de manière très gé-

nérique, comme le montre l'extrait de code III.3. La contrainte, ainsi que la sensibilité e

S sont données par le gestionnaires de variables internes. Des formes linéaires et bili- néaires sont ensuite dénies à l'aide de ces lois. L'assemblage est enn eectué à l'aide du champ de déplacement U pour obtenir le résidu et la matrice tangente (Jacobienne).

Résolution Les vecteurs et les matrices obtenus permettent de dénir un système linéaire, résolu de manière externe. Nous utilisons généralement la librairie de résolution de système linéaire SuperLu. Néanmoins, pour des problèmes de grandes dimensions, un solveur itératif est nécessaire. La librairie ITL issue de MTL a été utilisée. La librairie PETSc est également envisageable.

Algorithme III.3 Assemblage d'un résidu et d'une matrice tangente.

// résidu :

GetMaterialVariable_c<xTensor2> stress("stress",* variab_manager) ; xFormLinearWithLoad<xGradOperator<xIdentity<xTensor2> >,

GetMaterialVariable_c<xTensor2>> stress_contribution(stress) ; Assemble(stress_contribution, residu, intrule_uu, U,

mesh.begin(), mesh.end()) ; // matrice tangente : NonUniformMaterialSensitivity_c<xTensor4> sensibility("strain",*variab_manager) ; xFormBilinearWithLaw<xGradOperator<xSymmetrize >, NonUniformMaterialSensitivity_c<xTensor4>, xGradOperator<xSymmetrize > > J(sensibility) ; Assemble(J, jacobienne, intrule_uu, U, U,

mesh.begin(), mesh.end()) ;

3.1.d Récapitulatif

La gure III.19 récapitule les interactions entre les principales classes utilisées dans la librairie X-FEM. En outre, la librairie possède de nombreux outils permettant de gérer les level-sets. A l'heure actuelle, la boite centrale du schéma que nous avons dé- nommé librairie X-FEM est un exécutable qui doit être reconstruit à chaque nouvelle application. Nous proposons donc de développer un vrai code éléments nis multiphy- sique permettant de capitaliser les diérents outils existant dans la librairie X-FEM. Le développement de ce code, bien que motivé par notre application, le soudage par ultrasons, est eectué en vue d'être utile à d'autres simulations.