lun. oct. 12, 2026 : Un prisme dans un tube
Cette simulation s’inscrit dans la continuité de la série sur l’allée de tourbillons de Von Kármán. Cette fois-ci, au lieu d’une sphère, nous plaçons un prisme à l’intérieur du cylindre.
Comme OpenFOAM ne propose pas de forme de prisme prédéfinie (de type
searchable), nous devons utiliser un fichier STL. Deux approches sont
envisageables pour spécifier la géométrie :
- Créer un prisme et l’intégrer dans un
searchableCylinder. - Créer l’ensemble de la géométrie combinée dans un logiciel de CAO.
La seconde approche permet un bien meilleur contrôle des arêtes vives.
La géométrie a été créée sous FreeCAD puis exportée au format STL. Avant de
configurer snappyHexMesh, il est nécessaire de préparer le maillage
surfacique.


snappyHexMesh est capable de traiter les fichiers STL multi-solides. La
première étape consiste donc à séparer le STL en différentes surfaces. Cela
simplifie l’étape de placage du maillage (snapping) ainsi que la génération
des couches limites prismatiques, car chaque surface du STL devient soit lisse
(le cylindre), soit plane (toutes les autres faces).
Pour découper le fichier STL en surfaces distinctes, nous utilisons l’utilitaire
surfacePatch. Cet utilitaire est une évolution de surfaceAutoPatch et permet
de spécifier les surfaces ainsi que les algorithmes de découpe via le fichier
surfacePatchDict :
geometry
{
TubePrism.stl
{
type triSurfaceMesh;
}
};
surfaces
{
TubePrism.stl
{
type autoPatch;
featureAngle 30;
}
}
L’exécution de cet utilitaire génère un fichier TubePrism_patched.stl contenant plusieurs solides :
solid Tube
facet normal -0.999975 -1.57288e-18 0.00708072
outer loop
vertex -1.9998 12 0.0282381
vertex -2 12 2.66454e-15
vertex -2 -4 -8.88178e-16
endloop
endfacet
...
endsolid Tube
solid Outlet
...
endsolid Outlet
...
solid Prism-3
...
endsolid Prism-3
Remarque : Par défaut, surfacePatch nomme les solides selon un motif générique du type zone*. Les noms de patch Tube, Outlet et Prism-3 ont été attribués manuellement en éditant directement le fichier texte STL.
Après découpage, le fichier STL comprend 6 solides distincts : la paroi du tube, l’entrée (inlet), la sortie (outlet) et les trois faces du prisme.

Extraction des arêtes caractéristiques
La deuxième étape de préparation du maillage consiste à extraire les arêtes
caractéristiques explicites à l’aide de l’utilitaire surfaceFeatureExtract.

Ces arêtes caractéristiques permettent de guider le raffinement du maillage de fond et d’améliorer le placage de la géométrie lors de la génération du maillage.
Génération du maillage
Une fois la préparation de la surface terminée, nous pouvons générer le maillage. La première phase consiste à créer le maillage crénelé (castellated mesh). Nous raffinons le maillage de fond le long des arêtes caractéristiques extraites :
features
(
{
file "TubePrism_patched.extendedFeatureEdgeMesh";
level 2;
}
);
Ainsi que sur l’ensemble de la surface géométrique :
refinementSurfaces
{
TubeWithPrism
{
level (2 2);
}
}
Le placage (snapping) s’appuie sur des paramètres standards ciblant à la fois les caractéristiques surfaciques explicites et implicites.
Ensuite, nous ajoutons trois couches limites surfaciques le long de la paroi du tube et des surfaces du prisme :
layers
{
"TubeWithPrism_(Tube|Prism.*)"
{
nSurfaceLayers 3;
}
}
L’insertion des couches limites repose sur le nom des patchs. Étant donné que
nous avons précédemment renommé nos solides (Inlet, Outlet, Tube et
Prism{1,2,3}), nous pouvons les cibler directement à l’aide d’expressions
régulières dans la configuration des couches. Les autres paramètres d’ajout de
couches conservent leurs valeurs par défaut.
L’exécution de snappyHexMesh permet d’obtenir le maillage final. Ci-dessous sont illustrées les couches prismatiques générées autour des patchs spécifiés :


Le maillage capture l’ensemble des détails géométriques requis, ce qui nous permet de passer à la configuration du solveur.
Configuration de la simulation
Comme pour les simulations précédentes, nous définissons la vitesse d’entrée
ainsi que le nombre de Reynolds ciblé dans le dictionnaire personnalisé settings
situé à la racine du cas :
// Flow conditions
Uin 1;
Re 400;
Nous calculons ensuite les propriétés dynamiques du fluide dans le fichier
constant/transportProperties :
nu #eval "$Uin*$D/$Re";
Script d’exécution HPC
Pour soumettre le calcul sur un cluster HPC géré par le gestionnaire de tâches Slurm, le script d’exécution en lot (batch) se présente comme suit :
#!/bin/bash
#SBATCH -p partition
#SBATCH -N 1
#SBATCH -n 32
#SBATCH -J VK/P
#SBATCH -t 8-00:00:00
module purge
module load openfoam/v2606
. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions
runApplication -o foamDictionary \
-set $SLURM_NTASKS \
-entry numberOfSubdomains system/decomposeParDict
[ -d processor0 ] || {
runApplication blockMesh
runApplication surfaceFeatureExtract
runApplication decomposePar
srun snappyHexMesh -overwrite -parallel > log.snappyHexMesh 2>&1
runApplication reconstructParMesh -constant
rm -rf processor*
restore0Dir
runApplication decomposePar
}
srun pimpleFoam -parallel > log 2>&1
Le script configure l’environnement à l’aide des modules, puis met à jour le
paramètre numberOfSubdomains dans decomposeParDict pour correspondre au nombre
de cœurs Slurm alloués (32 cœurs). Il génère ensuite le maillage de base avec
blockMesh, extrait les arêtes caractéristiques, génère le maillage en parallèle
avec snappyHexMesh, le reconstruit, et enfin exécute pimpleFoam sur l’ensemble
des cœurs.
Post-traitement & Visualisation
Visualisation par lignes de courant
Une fois la simulation terminée, nous passons à la phase de visualisation. L’extraction du champ de vitesse dans le plan médian du tube confirme l’instabilité de l’écoulement :

Bien que la coupe dans le plan médian confirme le lâcher de tourbillons, il s’agit d’une vue 2D. Pour appréhender la structure tourbillonnaire globale en 3D, nous pouvons émettre des lignes de courant.
Le maillage au niveau de l’entrée étant relativement fin, utiliser l’intégralité du patch d’entrée comme source d’injection générerait un nombre excessif de lignes de courant. À la place, nous utilisons un Programmed Source dans ParaView afin d’injecter des points de départ personnalisés.
En supposant que le centre de l’entrée se situe en (0, 0), nous distribuons les
points sources en coordonnées polaires (r*cos(theta), r*sin(theta)).
Remarque : Si le centre de votre plan d’entrée est décalé, ajoutez simplement le décalage en translation correspondant.
Dans le script du Programmed Source, nous définissons le nombre total de points, le rayon de distribution ainsi que le facteur multiplicateur de l’angle d’or pour assurer une répartition uniforme :
import vtk
from math import pi, sqrt, cos, sin
num_points = 200
radius = 0.5
golden_angle = pi * (3.0 - sqrt(5.0))
Nous créons ensuite les objets de sortie VTK :
output = self.GetOutput()
points = vtk.vtkPoints()
verts = vtk.vtkCellArray()
Les coordonnées des points sont calculées selon une distribution en spirale de Fibonacci :
for i in range(num_points):
r = radius * sqrt(i / float(num_points))
theta = i * golden_angle
x = r * cos(theta)
y = r * sin(theta)
point_id = points.InsertNextPoint(x, -3.99, y)
verts.InsertNextCell(1)
verts.InsertCellPoint(point_id)
Enfin, nous assignons les points et sommets générés à l’objet de sortie VTK :
output.SetPoints(points)
output.SetVerts(verts)
Cela génère une distribution équilibrée de points d’injection sur le plan d’entrée :

L’application du filtre Stream Tracer à partir de ces points d’injection produit une animation qui révèle clairement la dynamique 3D des tourbillons en aval du prisme :
Iso-surfaces du critère Q
Une autre méthode très efficace pour identifier les structures tourbillonnaires est le critère Q, défini comme la moitié de la différence entre la norme au carré du tenseur de vorticité (Ω) et celle du tenseur des taux de déformation (S) :
Q = 0.5( ||Ω||² − ||S||² )
Lorsque Q est positif, le mouvement de rotation l’emporte sur la déformation par cisaillement, faisant des iso-surfaces de Q un excellent indicateur du cœur des tourbillons. Dans ParaView, le critère Q peut être calculé directement à l’aide du filtre Gradient :

Le tracé des iso-surfaces de Q positif donne l’animation d’écoulement suivante :
Bien que ces deux méthodes de rendu apportent des éclairages très intéressants, la représentation par lignes de courant offre une vision plus lisible des trajectoires de l’écoulement.
Comme d’habitude, l’ensemble des fichiers de configuration du cas ainsi que les géométries CAO sont disponibles dans le dépôt showcases d’O2M.













