Houle régulière¶
Description de la situation
Ce tutoriel est une introduction à la génération de houle régulière sous OpenFOAM.
L’ensemble des commandes à lancer est donné dans les fichiers Allrun.case.laminaire ou
Allrun.case.turbulent, que vous pouvez exécuter directement selon le type de
simulation que vous voulez lancer. Voici un extrait du fichier Allrun.case.laminaire:
#!/bin/bash
Allmesh
genHouleReguliere
mv constant/turbulenceProperties.laminar constant/turbulenceProperties
Allrun -s &
sleep 2
AllpostProcess lireSondes.py
traceSondes.py line_probes.csv
Maillage
Nous utiliserons une géométrie rectangulaire 2D. Le maillage est défini dans le fichier
system/blockMeshDict:
xmin 0.0;
xmax 10.0;
ymin -0.5;
ymax 0.5;
zmin 0.0;
zmax 2.0;
Nz 60;
Nx #calc "$Nz * ( $xmax - $xmin) / ( $zmax - $zmin )";
vertices
(
( $xmin $ymin $zmin) //0
( $xmax $ymin $zmin) //1
( $xmax $ymax $zmin) //2
( $xmin $ymax $zmin) //3
( $xmin $ymin $zmax) //4
( $xmax $ymin $zmax) //5
( $xmax $ymax $zmax) //6
( $xmin $ymax $zmax) //7
);
blocks
(
hex (0 1 2 3 4 5 6 7) ($Nx 1 $Nz) simpleGrading (1 1 1)
);
edges
(
);
boundary
(
inlet
{
type patch;
faces
(
(0 4 7 3)
);
}
outlet
{
type wall;
faces
(
(1 5 6 2)
);
}
BOTTOM
{
type wall;
faces
(
(0 1 2 3)
);
}
TOP
{
type patch;
faces
(
(4 5 6 7)
);
}
frontPlane
{
type empty;
faces
(
(0 1 5 4)
);
}
backPlane
{
type empty;
faces
(
(3 2 6 7)
);
}
);
Exécutez blockMesh avec la commande
$ blockMesh
Vous pouvez visualiser le maillage avec ParaView.
Génération de houle
Nous allons générer de la houle régulière. Les paramètres doivent être donnés
dans le fichier regularWaveDict :
waveHeight 0.12 // Hauteur ( = 2*amplitude )
wavePeriod 1.3 // Période
activeAbsorption yes // Absorption sur la face d'entrée
ramptime 0.5 // Durée de la rampe en entrée
Vous pouvez éventuellement rajouter d’autres paramètres. Pour plus de détails sur les paramètres à rajouter, consultez la documentation du fichier de génération de houle régulière genHouleReguliere.py.
Pour générer le fichier de houle régulière, lancez la commande:
$ genHouleReguliere.py
Cette commande générera le fichier constant/waveProperties:
inlet
{
alpha alpha.water;
waveModel StokesI;
nPaddle 1;
rampTime 0.5;
activeAbsorption yes;
waveHeight 0.12;
wavePeriod 1.3;
waveAngle 0.0;
}
// Absorption sur la face de sortie
outlet
{
alpha alpha.water;
waveModel shallowWaterAbsorption;
nPaddle 1;
}
Comme vous pouvez le voir, d’autres paramètres que ceux spécifiés dans le
regularWaveDict sont présents par défaut. Le programme a aussi généré
une condition d’absorption dynamique sur la face outlet par défaut.
Conditions limites
Pour indiquer une condition de houle sur les faces d’entrée/sortie,
nous devons spécifier la condition waveAlpha dans le fichier
0.orig/alpha.water:
dimensions [0 0 0 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type waveAlpha;
value uniform 0;
}
outlet
{
type waveAlpha;
value uniform 0;
}
BOTTOM
{
type zeroGradient;
}
TOP
{
type inletOutlet;
inletValue uniform 0;
value uniform 0;
}
frontPlane
{
type empty;
}
backPlane
{
type empty;
}
}
De manière générale, un mur sera de type zeroGradient. Notez la condition
inletOutlet pour la face horizontale supérieure, qui modélise une condition
d’atmosphère.
Il faut également rajouter une condition limite de type waveVelocity dans le
fichier 0.orig/U:
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
inlet
{
type waveVelocity;
value uniform (0 0 0);
}
outlet
{
type waveVelocity;
value uniform (0 0 0);
}
BOTTOM
{
type fixedValue;
value uniform (0 0 0);
}
TOP
{
type pressureInletOutletVelocity;
value uniform (0 0 0);
}
frontPlane
{
type empty;
}
backPlane
{
type empty;
}
}
Notez là aussi la condition pressureInletOutletVelocity pour la modélisation
de l’atmosphère pour la face horizontale supérieure.
Il n’y a pas de traitement particulier pour les conditions limites de pression.
Lancement de la simulation
Si vous le souhaitez, vous pouvez utiliser un modèle de turbulence. Pour cela,
utilisez le script Allrun.case.turbulent ou lancez la commande:
cp constant/turbulenceProperties.komega constant/turbulenceProperties
En faisant cela, vous allez utiliser le modèle de turbulence \(k-\omega\) SST.
N’oubliez pas de copier le fichier 0.orig vers un nouveau dossier 0 et de
lancer setFields, pour initialiser une hauteur d’eau de \(0.864\,m\):
cp -r 0.orig 0
setFields
Vous pouvez maintenant lancer interFoam. Si vous le souhaitez, modifiez les
paramètres de system/controlDict. Par défaut, le temps de simulation est de
10 secondes avec une sauvegarde toutes les 0.1 secondes.
Nous avons aussi posé 4 sondes le long du canal, définies dans le dictionnaire
functions de system/controlDict:
// Indiquer ici les sondes et leurs coordonnées (position x en m)
sonde1 S1-1.0;
x1 1.0;
sonde2 S2-4.0;
x2 4.0;
sonde3 S3-7.0;
x3 7.0;
// Coordonnées des points de mesure
ystart 0.0;
yend 0.0;
zstart 0.0;
zend 2.0;
N 301; // Nombre de points
functions
{
line
{
type sets;
libs ("libsampling.so");
enabled true; // Mettre à false pour désactiver les sondes
// Contrôle d'écriture :
// - timeStep : pas de temps
// - adjustable : temps (si pas de temps adaptatif)
// - runTime : temps (si pas de temps constant)
writeControl timeStep;
writeInterval 2;
fixedLocations false;
interpolationScheme cellPoint;
setFormat raw;
sets
(
$sonde1
{
type uniform;
axis distance;
start ( $x1 $ystart $zstart );
end ( $x1 $yend $zend );
nPoints $N;
}
$sonde2
{
type uniform;
axis distance;
start ( $x2 $ystart $zstart );
end ( $x2 $yend $zend );
nPoints $N;
}
$sonde3
{
type uniform;
axis distance;
start ( $x3 $ystart $zstart );
end ( $x3 $yend $zend );
nPoints $N;
}
);
fields (
alpha.water
);
}
}
Lancez la simulation avec
interFoam > log.interFoam &
Vous pouvez aussi lancer setFields et interFoam directement avec la commande:
Allrun -s &
Post-traitement
Un fois que la simulation est lancée, vous pouvez la surveiller avec le
script AllpostProcess. En options, vous pouvez y ajouter des scripts
que vous voulez exécuter lorsque la simulation sera terminée.
Dans notre cas, nous allons exécuter le fichier de lecture de sondes
lireSondes.py, puis afficher le signal de houle
mesuré par ces sondes.
AllpostProcess lireSondes.py
traceSondes.py line_probes.csv