Obstacle poreux

Ce tutoriel est une introduction à l’outil olaFlow. olaFlow est un solveur spécialement conçu pour l’ingénierie côtière. Vous pouvez le télécharger à l’adresse:

https://github.com/phicau/olaFlow

en suivant les instructions. Consultez aussi sa page web, qui expose toutes les capacités du solveur.

Pour nos simulations, olaFlow est intéressant car il utilise une modélisation assez avancée des milieux poreux. En ingénierie côtière, les milieux poreux nous permettent de modéliser les enrochements sur des digues de protection, par exemple.

Ce tutoriel est similaire au tutoriel de l’obstacle poreux pour le solveur interFoam. La seule différence est dans la modélisation du milieu poreux. Ce tutoriel est directement tiré des tutoriels d’olaFlow.

L’ensemble des commandes à exécuter se trouve dans les fichiers Allrun.case.laminar et Allrun.case.turbulent selon le type de simulation que vous voulez effectuer. Vous pouvez les exécuter directement pour ne pas avoir à exécuter chaque commande individuellement. Voici un exemple avec le fichier Allrun.case.turbulent:

#!/bin/bash

# Lancer le maillage
Allmesh -c

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

# Choisir le modèle de turbulence kEpsilon
cp constant/turbulenceProperties.turbulent constant/turbulenceProperties

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

# Attendre 2 secondes avant de lancer le monitoring
sleep 5

# Suivre la progression du calcul et lancer la lecture
# des points de mesure de pression
AllpostProcess lirePoints.py

traceSondes.py point1.csv

Maillage

Le maillage que nous allons utiliser est un maillage rectangulaire simple. Consultez le fichier system/blockMeshDict pour plus de détails.

Lancez blockMesh avec la commande:

blockMesh

Visualisez-le si besoin avec ParaView.

Paramétrage du milieu poreux

La géométrie que nous allons étudier utilise plusieurs zones d’enrochements, définies par des surfaces dans le dossier constant/triSurface/. Chaque surface correspond à un type d’enrochement différent, donc à un milieu poreux différent.

Dans olaFlow, chaque milieu poreux est marqué par la variable porosityIndex, qui part de la valeur 0 pour un milieu non-poreux, et qui s’incrémente de 1 pour référencer chaque milieu poreux ajouté. Pour initialiser la valeur de porosityIndex à chaque surface, nous utilisons l’outil setFields. Le paramétrage s’effectue dans le fichier system/setFieldsDict:

defaultFieldValues
(
    volScalarFieldValue alpha.water 0
    volScalarFieldValue porosityIndex 0
);

regions
(
    boxToCell
    {
        box (-10 -10 -10) (500 10 0.8);

        fieldValues
        (
            volScalarFieldValue alpha.water 1
        );
    }

    surfaceToCell
    {
        file            "./constant/triSurface/primLayer.stl";
        outsidePoints   ((16 0.001 0.25));    // definition of outside
        includeCut      true;              // cells cut by surface
        includeInside   true;              // cells not on outside of surf
        includeOutside  false;              // cells on outside of surf
        nearDistance    -1;                 // cells with centre near surf
                                            // (set to -1 if not used)
        curvature       -100;                // cells within nearDistance
                                            // and near surf curvature
                                            // (set to -100 if not used)

        fieldValues
        (
            volScalarFieldValue porosityIndex 3
        );
    }

    surfaceToCell
    {
        file            "./constant/triSurface/secLayer.stl";
        outsidePoints   ((16 0.001 0.25));    // definition of outside
        includeCut      true;              // cells cut by surface
        includeInside   true;              // cells not on outside of surf
        includeOutside  false;              // cells on outside of surf
        nearDistance    -1;                 // cells with centre near surf
                                            // (set to -1 if not used)
        curvature       -100;                // cells within nearDistance
                                            // and near surf curvature
                                            // (set to -100 if not used)

        fieldValues
        (
            volScalarFieldValue porosityIndex 2
        );
    }

    surfaceToCell
    {
        file            "./constant/triSurface/core.stl";
        outsidePoints   ((16 0.001 0.25));    // definition of outside
        includeCut      true;              // cells cut by surface
        includeInside   true;              // cells not on outside of surf
        includeOutside  false;              // cells on outside of surf
        nearDistance    -1;                 // cells with centre near surf
                                            // (set to -1 if not used)
        curvature       -100;                // cells within nearDistance
                                            // and near surf curvature
                                            // (set to -100 if not used)

        fieldValues
        (
            volScalarFieldValue porosityIndex 1
        );
    }
);

La première liste defaultFieldValues met une valeur par défaut pour chaque variable dans l’ensemble du domaine. Le premier sous-dictionnaire de la liste regions permet d’initialiser la hauteur d’eau, mais ce n’est pas ce qui nous intéresse ici. Le deuxième sous-dossier initialise la valeur 3 dans la zone délimitée par la surface ./constant/triSurface/primLayer.stl. On effectue la même chose pour les 2 autres surfaces, en leur attribuant un porosityIndex différent.

Créez le dossier 0 en copiant le dossier 0.orig, et lancez setFields:

cp -r 0.orig 0
setFields

Visualisez les zones poreuses sous ParaView en affichant le champ porosityIndex.

Génération de houle

Nous allons générer de la houle irrégulière, de la même manière que pour le tutoriel de houle irrégulière. les paramètres du spectre de JONSWAP sont donnés dans le fichier jonswapDict:

Tmin  5.9
Tmax  14.8
Tp    10.6
Hs    3.1
gamma 1.0
scale 28.6

Générez le fichier constant/waveProperties avec la commande:

genHouleIrreguliere --solver olaFlow

olaFlow utilise un format légèrement différent de interFoam, pour indiquer les paramètres de houle dans constant/waveProperties, donc il faut préciser l’option --solver olaFlow pour qu’il soit pris en compte par le programme de génération de houle.

De même, il faut modifier les conditions limites de houle dans les fichiers 0.orig/alpha.water:

inlet
{
    type            waveAlpha;
    waveDictName    waveProperties;
    value           uniform 0;
}

et 0.orig/U:

inlet
{
    type            waveVelocity;
    waveDictName    waveProperties;
    value           uniform (0 0 0);
}

outlet
{
    type            waveAbsorption2DVelocity;
    absorptionDir   666.0;
    value           uniform (0 0 0);
}

Notez dans ce dernier fichier que la condition d’absorption sur le patch outlet peut se donner directement dans la condition limite, sans définir cette condition dans constant/waveProperties.

Lancement de la simulation

Vérifiez les paramètres de simulation dans system/controlDict. Notez que nous avons posé deux points de mesure de part et d’autre du système d’enrochements, où nous préleverons la pression pour mettre en lumière les effets des enrochements.

functions
{

    points
    {
        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    1;
        fixedLocations false;
        interpolationScheme cellPoint;
        setFormat       raw;
        sets
        (
            point1
            {
                type cloud;
                axis distance;
                points
                (
                    (17.5 0 0.8)
                    (19.3 0 0.95)
                );
            }
        );
        fields
        (
            p
        );
    }
}

Pour une explication détaillée de la mesure de pression en plusieurs points, consultez le tutoriel sur la mesure de pression.

Vous pouvez maintenant lancer la simulation, en exécutant la commande:

olaFlow > log.olaFlow &

Vous pouvez aussi lancer setFields et olaFlow directement avec

Allrun -s &

Surveillance de simulation et post-traitement

Exécutez la commande suivante pour suivre le statut de votre simulation, et lire les points de mesure de pression lorsqu’elle sera terminée:

AllpostProcess lirePoints.py

Une fois tous les points lus, traceSondes.py va créer un fichier .csv avec les mesures de pression. Exécutez la commande suivante pour tracer ces mesures de pression:

traceSondes.py points1.csv

Ou en remplaçant points1.csv par le nom de votre fichier.