2.2. Gestion du maillage#
2.2.1. Une classe par élément#
Nous proposons de construire 3 classes : Point
, Segment
et Triangle
représentant un élément de type point, segment et triangle. La première étape consiste à transcrire les informations du maillage dans notre structure de données. Nous pouvons aussi ne pas passer par cette étape et n’utiliser que GMSH, cependant, cela nous donnera un meilleur contrôle par la suite.
La classe Point
contient les coordonnées du point et un identifiant (0,1,2,3, …), son indice globale, qui correspondra en P1 à la ligne dans la matrice du degré de liberté (DOF). Les classes Segment
et Triangle
ont pour paramètres :
Un identifiant (0,1,2,3…)
Une liste orientée de
Point
qui le définissentUn tag
Physical
(ou -1 sinon)
L’identifiant n’a pas besoin d’être le même que dans GMSH, il est même plus logique que les identifiants soient consécutifs et incrémenté à chaque nouvelle instance (0, 1, 2, …). Le tag Physical
doit en revanche être le même que GMSH pour éviter toute confusion. Vous êtes évidemment libre d’ajouter des paramètres et des méthodes à ces classes !
Par ailleurs, les 2 classes d’élément Segment
et Triangle
, disposeront au moins des méthodes suivantes :
area()
: calcule l’aire de l’élément (pour un segment, sa taille ; peut être stockée dans un paramètre et être calculé une fois pour toute)jac()
: calcule son jacobien (son aire pour un segment, 2 fois l’aire pour un triangle)
2.2.2. Une classe pour les gouverner toutes…#
Il peut être assez malin de construire une classe Mesh
qui représente le maillage et permettra d’effectuer des recherches d’éléments. Cette classe aura pour paramètre trois listes : une liste de Point
, une de Segment
et une de Triangle
. De plus, nous lui ajoutons deux méthodes :
Mesh.getElements(dim, physical_tag)
: retourne une liste de tous les éléments ayant la dimensiondim
(=1 pour segment, 2 pour triangle) et le tag physiquephysical_tag
Mesh.getPoints(dim, physical_tag)
: retourne uniquement les points du domaine de dimensiondim
et de label physiquephysical_tag
2.2.3. …Et dans les ténébres les lier (à GMSH)#
Le maillage étant construit avec GMSH, il s’agit maintenant de convertir les données issues de GMSH dans notre structure. Nous supposons ici que le maillage est déjà chargé en mémoire, soit parce qu’il vient d’être construit par GMSH (via gmsh.model.mesh
) soit parce qu’il a été lu sur disque (via gmsh.merge("fichier.msh")
). Nous proposons que le constructeur de Mesh
soit vide (ne construit rien) et que l’instance de Mesh
soit construite à l’aide d’une méthode GmshToMesh(string filename)
, qui lit les données GMSH et construit les Point
, Segment
et Triangle
et les ajoute dans les listes correspondent à Mesh
. L’argument filename
peut être optionnel si le maillage est déjà construit.
La méthode la plus délicate à construire est GmshToMesh
. Pour vous aider un petit peu, n’hésitez pas à fouiller dans l’API de GMSH) :
gmsh.model.mesh.getNodes()
: retourne tous les noeudsgmsh.model.getPhysicalGroups()
: retourne tous les groupes physiques avec leurs dimension et taggmsh.model.getEntitiesForPhysicalGroup(dim, physical_tag)
: retourne toutes les entités d’un groupe physiquegmsh.model.mesh.getElements(dim, tag)
: retourne tous les éléments de dimensiondim
(segments (dim=1
), triangles (dim=2
), …) appartenant à l’entity de labeltag
.
L’algorithme ressemble surement à ceci :
// Création des points
For every Nodes
Point(...)
End
//Création des éléments
For every Physical Entity
For every Entity
For every Element