Houle irrégulière

Description de la situation

Ce tutoriel est une introduction à la génération de houle irré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

# Lancer le maillage
Allmesh

# Générer la houle irrégulière
genHouleIrreguliere

# Charger le fichier de turbulence
cp constant/turbulenceProperties.laminar constant/turbulenceProperties

# Lancer le calcul. L'option -s lance setFields
Allrun -s &

# Attendre 3 secondes avant de lancer le monitoring
sleep 3

# Suivre la progression du calcul et lancer la commande
# de lecture de sondes lorsque le calcul est terminé
AllpostProcess lireSondes.py

# Tracer les sondes
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)
        );
    }
);

Attention, ce maillage n’est pas optimisé pour des résultats précis, mais pour que la simulation soit plus rapide. Vous devrez créer un maillage plus fin si vous souhaitez obtenir une bonne propagation de houle.

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 irrégulière. Les paramètres doivent être donnés dans le fichier jonswapDict :

Tmin  5.3
Tmax  13.2
Tp    9.5
Hs    2.8
gamma 1.0
scale 28.6 //prototype = scale*modele
Ncomposantes 500
activeAbsorption yes

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 irrégulière genHouleIrreguliere.py.

Pour générer le fichier de houle irrégulière, lancez la commande:

genHouleIrreguliere.py

Cette commande générera le fichier constant/waveProperties:

inlet
{

    alpha            alpha.water;

    waveModel        irregularMultiDirectional;

    nPaddle          1;

    rampTime         2.0;

    activeAbsorption no;

    // Périodes
    wavePeriods
    500
    (
(2.468260053622327)
(2.4609090567047303)
(2.4536017153974696)
...
(0.9922338633836915)
(0.9910438094089646)
    );

    // Hauteurs
    waveHeights
    500
    (
(0.003396375978114038)
(0.003465582605517084)
...
(0.0033642199662089972)
(0.0033551190392587947)
    );

    // Déphasages
    wavePhases
    500
    (
(5.730876186873959)
(2.1365116696284603)
...
(3.4502359148319943)
(3.484300558914438)
    );

    // Directions
    waveDirs
    500
    (
(0.0)
(0.0)
...
(0.0)
(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 jonswapDict sont présents par défaut. Le programme a généré les hauteurs de houle, périodes, déphasages et directions de chaque composante de houle monochromatique. La géométrie étant 2D, les directions sont toutes fixées à 0. 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.

Note

Si vous souhaitez expérimenter avec la reconstruction de spectre, il est conseillé d’augmenter le temps de simulation à 300 secondes au minimum.

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
        );
    }
}
interFoam > log.interFoam &

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. 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

Note

Pour la reconstruction de spectre, la commande à lancer est

AllpostProcess lireSondes.py resample.py spectre.py

Qui correspond à la lecture de sondes, rééchantillonnage du signal et reconstruction de spectre.