Commit des premiers développements ThixoWall permettant de s’affranchir de la description topologique des frontières lors d’un calcul de mise en forme en grandes déformations.
La frontière de la structure est décrite par l’iso-zéro d’une level set (fonction distance signée - cf l’exemple si dessous pour une frontière circulaire). Dans les zones ou la level set est négative, on suppose qu’on est dans la matière, inversement si elle est positive on est dans le vide. La formulation éléments finis doit donc être enrichie de manière à pouvoir considérer les cas ou l’élément est vide, rempli, ou partiellement rempli. Les deux premiers cas sont triviaux : on les enlève de l’analyse ou on utilise une formulation classique sur l’élément. Pour le dernier cas, on va intégrer par partie les forces internes et la matrice de raideur en utilisant des sous-cellules triangulaires d’intégration. Ces sous-cellules n’ont pas de degrés de liberté associés. Ce sont uniquement des supports des quantités du quadrangle sur les section de l’élément ou il existe de la matière.
On introduit deux nouvelles dll :
Pour l’élément XFEM, j’ai divisé les sources en 3 :
Plus précisément, l’élément XFEM est définit un peu comme un quadrangle classique mais on lui associe quelques données supplémentaires :
… et bien sûr on définit dans l’élément quelques fonctions pour calculer tout ca…
Le XFEMFieldApplicator a été définit à l’origine pour avoir un conteneur de mes sous cellules d’intégrations (getXFEMintegrationCells(), qui permet un affichage via win.add(app.getXFEMintegrationCells().getWireSet())). Ces sous-cellules sont vues comme des TriangleSide, et associés en une géométrie. La fonction getXFEMElementSet() regroupe les éléments non-découpés et substitue les éléments triangulaires associés aux sous-cellules d’intégration aux éléments quadrangulaires découpés. Cet ElementSet est utilisé pour l’affichage. On ne peut pas sur-définir l’ElementSet classique car celui-ci est utilisé au moment de l’assemblage (et donc ne doit pas voir les éléments triangulaires). Le XFEMFieldApplicator contient également les fonctions qui permettent de définir les sides triangulaires et les éléments associés a partir des coordonnées des nœuds et des points d’intersection. Les sous-cellules sont systématiquement crées autour du centre de gravité de l’élément :
Une dernière fonction « initIteration » est utilisée dans le XFEMFieldApplicator pour la mise a jour des positions des points d’intersection et du centre de gravité, qui ne sont pas mis à jour au cours des itérations mécanique quand on calcule l’équilibre. Elle remplace dans le fieldApplicator et les classes héritées la fonction « contactDetection » qui est appelée à chaque itération mécanique.
La méthode d’intégration permet de calculer les forces internes et la matrice de raideur en utilisant les sous-cellules d’intégration. Il faut donc connaitre les déformations et les contraintes sur les sous-cellules. Dans un premier temps je les calcule par sous-cellule en utilisant la déformation des sous-cellules d’intégration (il faudrait surement les calculer au niveau de l’élément pour bien faire, en ramenant le point de Gauss du triangle dans le quadrangle). Une fois qu’elles sont connues sur chaque sous cellule, on utilise une intégration « par parties ». La matrice gradient sur le quadrangle est calculée en chaque point de Gauss des sous-cellules en utilisant les fonctions de forme du quadrangle. De même que la matrice jacobienne de la transformation est calculée sur les points de Gauss à partir des données sur le quadrangle.
Le drawable XFEM est assez simple: il parcourt l’ElementSet getXFEMElementSet() au lieu du getElementSet() classique. En présence d’un élément enrichi, il trace donc les données connues sur les sous-cellules d’intégration. Si on trace l’élement set classique, les élements qui sont enrichis ne possèdent aucune donnée en propre (contrainte et déformations sont naturellement nulles car calculées sur les sous-cellules).
En entête de fichier, rajouter :
from wrap.mtXFEM import * try: from wrap.mtXFEMDrawables import * #importation de la vizu si on est en GUI except: pass
Dans ElementProperties, definir un XFEMElement. Les propriétés additionnelles sont :
prp1 = ElementProperties(XFEMElement) prp1.put(BOUNDARY_WIRE, 3) prp1.put(NB_PG_INTCELL, 4) prp1.put(INVERSE_WIRE, -1) prp1.put(TOL_LEVELSET, 0.15)
Enfin, le FieldApplicator doit être remplacé par un XFEMFieldApplicator :
app = XFEMFieldApplicator(1)
Si tout se passe bien, ca devrait fonctionner. A noter que ca ne fonctionne pour le moment pas dans toutes les configurations (les élements trop distordus limitent la convergence) et qu’il faut souvent baisser la précision du solveur itératif (pour le moment, ca passe sur les cas test avec 1e-2).
Les hypothèses de calcul sont dans un premier temps :
Les résultats de compilation de Metafor sur les stations étaient illisibles a cause des nombreux warning (plus de 10k lignes chez moi…). J'ai fait quelques modifs pour les limiter :
A présent les messages d'erreur sont limités aux lignes suivantes que je n'ai pas réussi à résoudre ou que je n'ai pas osé toucher (entre autre SloanConnexionBuilder n'est pas évident avec des Goto dans tous les sens, j'ai eu peur d'introduire une crasse) :
/home/biotteau/b/oo_meta/geniso/_src/geniso.i:57: Warning(509): Overloaded method gIso::Vec3::__mul__(gIso::Vec3 &) is shadowed by gIso::Vec3::operator *(gIso::Vec3 const &) const at /home/biotteau/b/oo_meta/geniso/src/gisoVec3.h:48. /home/biotteau/b/oo_meta/mtFEMBase/DofSet.h:41: Warning(503): Can't wrap 'operator Dof*' unless renamed to a valid identifier. /home/biotteau/b/oo_meta/mtFEMBase/DofSet.h:48: Warning(503): Can't wrap 'operator ==' unless renamed to a valid identifier. /home/biotteau/b/oo_meta/mtFEMBase/SloanConnexionBuilder.cpp:1442: attention : converting to ‘int’ from ‘float’ /home/biotteau/b/oo_meta/mtFEMBase/SloanConnexionBuilder.cpp:1451: attention : converting to ‘int’ from ‘float’ /home/biotteau/b/oo_meta/mtFEMBase/SloanConnexionBuilder.cpp:1454: attention : converting to ‘int’ from ‘float’ /home/biotteau/b/oo_meta/mtFEMBase/SloanConnexionBuilder.cpp:656: attention : converting to ‘int’ from ‘double’ /home/biotteau/b/oo_meta/mtFEMBase/SloanConnexionBuilder.cpp:666: attention : converting to ‘int’ from ‘double’ /home/biotteau/b/oo_meta/mtFEMBase/SloanConnexionBuilder.cpp:680: attention : converting to ‘int’ from ‘double’ /home/biotteau/b/oo_meta/mtFEMBase/SloanConnexionBuilder.cpp:692: attention : converting to ‘int’ from ‘double’ /home/biotteau/b/oo_meta/mtFEMBase/SloanConnexionBuilder.cpp:725: attention : converting to ‘int’ from ‘double’ /home/biotteau/b/oo_meta/mtFEMBase/StrID.h:20: Warning(401): Maybe you forgot to instantiate 'IDBase< DummyStrID >' using %template. /home/biotteau/b/oo_meta/mtFEMBase/StrID.h:20: Warning(401): Nothing known about base class 'IDBase< DummyStrID >'. Ignored. /home/biotteau/b/oo_meta/mtMath/SmallList.inl:62: attention : cannot receive objects of non-POD type ‘class Field’ through ‘...’; call will abort at runtime /home/biotteau/b/oo_meta/mtPython/PythonMultiParameterFunction.cpp:102: attention : cannot pass objects of non-POD type ‘class Field’ through ‘...’; call will abort at runtime
Les résultats de compilations sont désormais plus propre, avec plus de 8000 lignes de warning en moins…