Maillage d'une géométrie "complexe"

Le tutoriel dont on s'inspire traite initialement du mouvement d'un cône dans un cylindre. Ce type de géométrie peut être qualifié de "simple" puisqu'elle peut être décrite rapidement grâce au fichier blockMeshDict. En effet, avec seulement 5 blocs et 24 points, tout le domaine pouvait être défini.

Dans notre projet, il s'agit de décrire la géométrie d'un train, géométrie que l'on peut qualifier de "complexe". En effet, le cône est remplacé par un train, avec plusieurs wagons, ce qui engendre d'introduire beaucoup plus de points, et donc de blocs, avec le fichier blockMeshDict.

Nous avons également pu s'initier et utiliser le mailleur automatique snappyHexMesh qui permet de réaliser le maillage autour d'une géométrie qui, elle, est définie dans un fichier au format bien spécifique.

Nous allons ici vous présenter les deux méthodes possibles pour définir une géométrie plus complexe, que ce soit avec un fichier classique blockMeshDict ou avec l'utilisation du mailleur snappyHexMesh.

Avec BlockMesh

La première idée, a priori la plus simple, est de décrire manuellement les nombreux points composant la géométrie du train au sein même du fichier blockMeshDict. En effet, avec cette méthode, nous serons assurés d'avoir des résultats puisque l'on devra définir la vitesse des points des bords du domaine. Or, comme nous définissons nous même le domaine avec cette méthode, il suffira d'indiquer la vitesse adéquate à chacune des parois du domaine. Toutes les mailles à l'intérieur du domaine auront alors une vitesse en cohérence avec la vitesse des bords du domaine.

Voici pour rappel la géométrie du train qui nous a été fournie par Mr Tekam :

Dans un premier temps, nous allons négliger les congés qui sont censés améliorer l'aérodynamique globale du train. En effet, cela complique la création d'un maillage avec un blockMeshDict puisqu'il faut créer des arcs de cercle avec deux points de base et un troisième point par lequel passera l'arc de cercle. Suite à cette concession, voici à quoi devra ressembler notre géométrie :

Il est par conséquent nécessaire de décrire tout les points qui vont servir à décrire l'ensemble des blocs d'une telle géométrie.

Au lieu des 24 points définis pour définir le rectangle, il est nécessaire d'en introduire 32 supplémentaires pour un total de 56 points. De plus, au lieu des 5 blocs initialement présents, il faudra en définir ici 17. Voici ci-dessous un schéma permettant de définir tous ces blocs.

On peut remarquer que 4 blocs sont des triangles. C'est ici une particularité acceptée par OpenFOAM. En fait, au lieu de décrire une face d'un bloc par 4 points distincts, on peut décrire une face d'un bloc par 4 points dont 2 sont identiques, on aura alors un triangle. Lors de l'étape du maillage, nous aurons des mailles triangulaires dans l'un des sommets de ce triangle.

Concernant l'étape du maillage réalisée dans ce fichier blockMeshDict, il faut simplement faire attention à toujours définir un nombre de mailles identique pour les deux blocs voisins. Avec suffisamment de rigueur, cela est tout à fait faisable.

Voici ce que l'on obtient après avoir exécuté blockMesh dans le terminal et lancé paraFoam pour visualiser le domaine maillé :

Avant de commenter la géométrie finalement obtenue, on peut remarquer une particularité probablement gênante de ce maillage. Cela concerne les mailles triangulaires. Pour assurer un nombre minimum satisfaisant de mailles dans le domaine, il est en effet obligatoire d'imposer un nombre de mailles dans ces blocs triangulaires. Cela a pour conséquence d'avoir des mailles triangulaires extrêmement petites par rapport à ses voisines rectangulaires. Ceci est certainement source de divergence et rend plus contraignant le choix du pas de temps du calcul pour assurer sa convergence.

L'idée est alors d'éviter ces mailles triangulaires en modifiant légèrement la définition des blocs. Au lieu d'introduire des blocs triangulaires, nous pouvons définir 2 points supplémentaires pour chaque côté du train afin d'obtenir un bloc trapézoïdal. Plus ces deux points sont éloignés de la paroi du train, plus la qualité des mailles initialement triangulaires (qui sont évidemment devenues des trapèzes) sera acceptable. Cela se fait par contre au détriment de la qualité des mailles initialement rectangulaires des blocs voisins qui deviennent des trapèzes. Par conséquent, on induit quelques erreurs de calculs puisque ces mailles ne sont plus orthogonales.

Voici finalement ce qu'on peut obtenir en visualisant le maillage après avoir exécuté paraFoam.

Cette méthode permet donc d'obtenir de manière assez simple un maillage correct, mais reste valable uniquement pour des géométries très simples composées de carrés, de triangles ou d'autres polygones réguliers.

Avec SnappyHexMesh

SnappyHexMesh est un mailleur automatique intégré à OpenFOAM. Il consiste, à partir d'un maillage hexaédrique et d'une géométrie superposée dessus, à créer un nouveau maillage hexaédrique prenant en compte cette géométrie.

L'outil SnappyHexMesh

Pour utiliser, en tapant la commande snappyHexMesh -overwrite, il est nécessaire d'avoir préalablement créé une géométrie au format .stl ou .obj (description des points et surfaces de l'objet) ainsi qu'un maillage de fond.

Création du fichier .obj ...


SnappyHexMesh peut lire deux types de format pour définir l'objet que l'on souhaite introduire sur le maillage de fond. En effet, cet outil est capable de lire les fichiers .stl ou .obj. Dans notre étude, nous sommes passés par des fichiers de type .obj.

Pour cela, il faut utiliser des logiciels de CAO pour définir une surface fermée par des segments, des courbes ou des points. Le logiciel choisi se dénomme FreeCAD, qui est un logiciel disponible librement et gratuitement ici

Cette étape se résumait à ​définir les premiers points définissant grossièrement la géométrie. Ensuite, pour réaliser les congés à l'avant et l'arrière du train, de nomreux points ont été ajoutés afin de correspondre au mieux à la géométrie désirée. Enfin, il a fallu réaliser une extrusion de cette géométrie 2D afin de lui donner une épaisseur et d'avoir une surface 3D fermée.

Voici ce que l'on peut obtenir au final :

 

Création du premier maillage de "background" ...


Ceci se fait se façon assez classique avec un fichier blockMeshDict. On peut créer le maillage de fond avec la commande blockMesh.

 

Lancement de snappyHexMesh ...


Une fois ce fichier .obj obtenu et bien placé, et une fois le maillage de background créé, on peut lancer snappyHexMesh avec la commande snappyHexMesh -overwrite.

​Concrètement, lancer ce mailleur consiste à réaliser les étapes suivantes : 

Étape 1 : Intersection des mailles avec la géométrie

Repérer les intersections du maillage de fond avec la géométrie et affiner les mailles au niveau de ces intersections. Le niveau de raffinement de ces mailles dépend de ce que l'utilisateur a indiqué dans le fichier snappyHexMeshDict. Le niveau 0 correspond au maillage de fond, le niveau 1 correspond à des mailles deux fois plus petites et ainsi de suite...


Source : http://www.openfoam.org/docs/user/snappyHexMesh.php

Étape 2 : Suppression des mailles solides

Pour l'instant, tout le domaine reste maillé. Il faut pouvoir indiquer à snappyHexMesh quelle est la région qui correspond au solide (à l'intérieur ou à l'extérieur de la géométrie). Cela se fait dans le fichier blockMeshDict.

Voici ci-dessous une illustration du domaine obtenu :


Source : http://www.openfoam.org/docs/user/snappyHexMesh.php 

On voit alors que toutes les mailles sont carrées. Il serait donc utile de pouvoir éviter d'avoir ces mailles carrées au niveau de la surface de l'objet. SnappyHexMesh est capable de gérer cette problématique, comme on peut le voir lors de l'étape 3.

Étape 3 : Amélioration des mailles à la surface de l'objet

Par l'intermédiaire d'une légère déformation des mailles proches de l'objet, on peut réussir à parfaitement suivre les points de la surface de l'objet, comme on peut le voir sur l'image suivante.


Source : http://www.openfoam.org/docs/user/snappyHexMesh.php

                                                  

Cet outil, au premier abord difficile à adopter et à utiliser, reste toutefois extrêmement performant. Son principal inconvénient reste qu'il maille automatiquement le domaine. Par conséquent, l'utilisateur n'a pas un contrôle total sur toutes les mailles, notamment leur qualité.

 

Le fichier snappyHexMeshDict

Nous allons maintenant nous intéresser à la structure du fichier snappyHexMeshDict et détailler les principales parties qui composent ce fichier. Les paramètres modifiés seront également expliqués. Toutefois, les options qui n'ont pas été modifiées durant le projet ne seront pas explicitées. Pour plus d'informations concernant snappyHexMesh, le User Guide constitue une bonne base. Le rapport de Projet de Fin d'Etudes réalisé par la promotion 2011 de l'IPSA et intutilé "Présentation, essai et validation du logiciel Open-Source OpenFOAM" détaille également de manière approfondie chaque partie du fichier snappyHexMeshDict.


Le fichier snappyHexMeshDict est situé dans le dossier system/. Il commence comme tout autre fichier OpenFoam, par une en-tête contenant les informations sur le fichier.

Il s'ensuit alors trois lignes pour définir quelles options l'utilisateur souhaite activer. Ces options s'activent en mettant true ou false à la suite du mot clé.

La première option castellatedMesh intervient pour raffiner le maillage autour de l'objet considéré. L'option snap concerne la découpe des mailles et enfin, l'option addLayers désigne l'ajout ou non d'un couche de prisme le long du solide afin par exemple d'obtenir de meilleurs résultats dans la couche limite.

Une fois les options choisies, l'utilisateur doit alors désigner le nom du fichier .obj ou .stl à mailler. Il peut également changer la façon dont est désigné l'objet dans la suite du fichier avec la ligne name.

La suite du fichier s'organise globalement de la manière suivante :

La première partie concerne les paramètres de raffinement de l'option castellatedMesh. Parmi ces options, une est particulièrement intéressante puisqu'il s'agit de définir les régions de raffinement, qui permettent d'obtenir différents niveaux de raffinements du maillage. Il existe plusieurs manières de définir ces zones. Nous les avons définies par rapport à leur distance de la surface de l'objet. La syntaxe est la suivante :

mode distance ;

levels ((distance1 niveau1)(distance2 niveau2)(distance3 niveau3)...);

On définit ainsi les différentes zones de raffinement.

Les autres paramètres de raffinement contiennent divers paramètres comme par exemple le nombre de cellules pour passer d'un niveau de raffinement à un autre, le nombre de cellules maximum etc...

La seconde partie appelée snapControls contrôle la découpe du maillage autour de la géométrie. Elle contient des paramètres de type tolerance où nombre d'itérations maximum.

Enfin, la dernière partie concerne l'ajout de couche de prismes le long de la surface de l'objet. Elle contient de nombreux paramètres sur la qualité des cellules, l'épaisseur des mailles, le nombre de cellules de la couche de prismes etc...

Globalement, seule les paramètres de la première partie ont été modifié pour parvenir au résultat final. Voici par exemple un des maillages que nous avons pu obtenir avec snappyHexMesh :

On remarque bien les différents niveaux de raffinements autour de l'objet, définis par leur distance à ce dernier.