OpenFOAM

De MaGridWiki
Aller à : Navigation, rechercher

N.B :

  • Ce tutoriel explique un exemple d’exécution de l'application Open Foam sur la grille de calcul.
  • Ce tutoriel est adapté principalement à la VO nationale : magrid
  • L'utilisateur est supposé connecté à l'interface utilisateur (ex: ui.magrid.ma), authentifié (certificat valide) et autorisé (vo magrid).
  • Ce tutoriel démontre l'utilisation du solveur icoFoam . les scripts peuvent être adaptés pour lancer d'autres solveurs(boundaryFoam , buoyantPimpleFoam ... ) selon le besoin .


Sommaire

Description de OpenFoam

[www.openfoam.com/ OpenFoam ] OpenFOAM is the free, open source CFD software released and developed primarily by OpenCFD Ltd since 2004. It has a large user base across most areas of engineering and science, from both commercial and academic organisations. OpenFOAM has an extensive range of features to solve anything from complex fluid flows involving chemical reactions, turbulence and heat transfer, to acoustics, solid mechanics and electromagnetics...

Description des inputs/outputs

  • Inputs: cavity.tar.gz dossier compressé contenant le dossier d’exécution


Fichier: cavity.tar.gz
./
./0/
./0/p
./0/U
./constant/
./constant/polyMesh/
./constant/polyMesh/owner
./constant/polyMesh/points
./constant/polyMesh/neighbour
./constant/polyMesh/faces
./constant/polyMesh/boundary
./constant/transportProperties
./system/
./system/decomposeParDict
./system/controlDict
./system/fvSolution
./system/fvSchemes
./system/blockMeshDict


  • Outputs: log output du solveur ainsi stdout.log et stdout.err qui sont simplement les sorties standard et d'erreurs.


Récupérer le tag de OpenFoam sur le VO magrid

On fait appel au système d'information [1].

[rahim@ui openfoam]$lcg-infosites --vo magrid tag


Le fichier du job: openfoam.jdl

Fichier: openfoam.jdl
Type = "Job";
JobType = "Normal";
Executable = "openfoam.sh";
CpuNumber = 8;
InputSandbox = {"openfoam.sh","hooks.sh","cavity.tar.gz"};
Arguments = "icoFoam";
StdOutput = "stdout.log";
StdError = "stderr.log";
OutputSandbox = {"stdout.log", "stderr.log","log"};
Requirements = Member("VO-magrid-openfoam_v4.1",other.GlueHostApplicationSoftwareRunTimeEnvironment);
MyProxyServer = "myproxy.magrid.ma";

le nombre de cpu doit correspondre au nombre spécifié dans le fichier input system/decomposeParDict

Le fichier exécutable: openfoam.sh

Fichier: openfoam.sh
#!/bin/bash
app=$1
prefix=cavity
export VO_MAGRID_SW_DIR=/opt/exp_soft/magrid
source $VO_MAGRID_SW_DIR/setenv_openfoam-4.1.sh
export MPI_FLAVOR=OPENMPI
export MPI_FLAVOR_LOWER=`echo $MPI_FLAVOR | tr '[:upper:]' '[:lower:]'`
eval MPI_PATH=/usr/lib64/openmpi-1.10
eval MPI_OPENMPI_PATH=$MPI_PATH
eval MPI_OPENMPI_MPIEXEC=$MPI_OPENMPI_PATH/bin/mpiexec
eval MPI_OPENMPI_VERSION=1.10
eval I2G_${MPI_FLAVOR}_PREFIX=$MPI_PATH
export I2G_${MPI_FLAVOR}_PREFIX
export I2G_MPI_APPLICATION="$app"
export I2G_MPI_APPLICATION_ARGS=" -parallel > log"
export I2G_MPI_PRE_RUN_HOOK=
export I2G_MPI_POST_RUN_HOOK=
export I2G_MPI_TYPE=$MPI_FLAVOR_LOWER
export I2G_MPI_PRE_RUN_HOOK=hooks.sh
export I2G_MPI_POST_RUN_HOOK=hooks.sh
export I2G_MPI_START_VERBOSE=1
export I2G_MPI_START_DEBUG=1
export RUNMPI=$I2G_MPI_START
$RUNMPI


Ce fichier exécute d'abord le fichier setenv_openfoam-4.1.sh qui charge l’environnement d’exécution d'open foam 4.1 ensuite il exécute le solver spécifié en argument du JDL en mode parallele.

le fichier fait référence au script hooks.sh qui précise les commandes à faire avant et apres l'execution du solver. pour al version parallele , on commence d abord par la décomposition (decomposePar).à la fin de l'execution on passe à la reconstruction (reconstructPar)

Fichier: hooks.sh
#!/bin/sh
pre_run_hook () {
    echo "Executing pre hook "
    echo "untar input"
    tar -xzvf cavity.tar.gz
    ls -l
    echo "Decompose"
    decomposePar
    ls -l
    echo "Finished the post hook "
    return 0
}
 
post_run_hook () {
    echo "Executing post hook "
    echo "Reconstructing "
    reconstructPar
    echo "Finished the post hook "
    return 0
}

Soumettre le job

Ce job est soumis sur la grille en utilisant la commande

[rahim@ui openfoam]$ glite-wms-job-submit -a -o jobId openfoam.jdl Connecting to the service https://wms2.magrid.ma:7443/glite_wms_wmproxy_server ====================== glite-wms-job-submit Success ====================== The job has been successfully submitted to the WMProxy Your job identifier is: https://wms2.magrid.ma:9000/APYXI_FiFf4hitAEATmukw The job identifier has been saved in the following file: /home/rahim/exemples/openfoam/jobId ==========================================================================

L'option -o jobId permet de sauvegarder l'ID du job soumis dans le fichier jobId. Ce fichier pourra ensuite être utilisé comme paramètre pour interroger le statut du job ou bien télécharger les fichiers de sorties de l'OutputSandbox. L'option -a est indispensable pour des raisons de délégation de proxy.

Pour interroger le statut du job, vous devez utiliser la commande suivante en spécifiant le fichier dans lequel vous avez sauvé l'ID du job :

[rahim@ui openfoam]$ glite-wms-job-status -i jobId ======================= glite-wms-job-status Success ===================== BOOKKEEPING INFORMATION: Status info for the Job : https://wms2.magrid.ma:9000/APYXI_FiFf4hitAEATmukw Current Status: Running Status Reason: unavailable Destination: atlas-ce1.cnrst.magrid.ma:8443/cream-pbs-magrid Submitted: Fri Dec 23 11:45:10 2016 WET ==========================================================================

Current Status peut prendre les valeurs suivantes :

   Submitted : soumis avec succès à la grille
   Waiting : un CE répondant aux besoins du job doit être sélectionnée
   Ready : un CE a été trouvée
   Scheduled : le job a été soumis avec succès au CE sélectionné
   Running : le job est en cours d'exécution
   Done : l'exécution est terminée (sans erreur ou non)
   Cleared : les sorties du job ont été téléchargées
   Aborted : le job a échoué et a été arrêté
   Cancelled : le job a été annulé

Récupérer les outputs du job

Lorsque le job a le statut Done (Success), cela signifie qu'il s'est terminé correctement, sans retourner de code d'erreur. Les sorties - le contenu de l'OutputSandbox, peut alors être téléchargé avec la commande :

[rahim@ui openfoam]$ glite-wms-job-output -i jobId --dir . Connecting to the service https://wms2.magrid.ma:7443/glite_wms_wmproxy_server ================================================================================ JOB GET OUTPUT OUTCOME Output sandbox files for the job: https://wms2.magrid.ma:9000/APYXI_FiFf4hitAEATmukw have been successfully retrieved and stored in the directory: /home/rahim/exemples/openfoam/rahim_APYXI_FiFf4hitAEATmukw ================================================================================

Les fichiers de l'OutputSandbox du job dont l'ID est contenu dans jobId sont sauvés dans le répertoire spécifié par l'option --dir, dans un sous-répertoire au nom généré aléatoirement.

Fichier: log
/*---------------------------------------------------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  4.1                                   |
|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
Build  : 4.1
Exec   : icoFoam -parallel
Date   : Dec 27 2016
Time   : 10:34:25
Host   : "atlas-wn15.cnrst.magrid.ma"
PID    : 14108
Case   : /sharempi/mpistart_atlas-wn15.cnrst.magrid.ma_vbpVz/home/magrid008/home_cream_952751151/CREAM952751151
nProcs : 8
Slaves :
7
(
"atlas-wn15.cnrst.magrid.ma.14109"
"atlas-wn15.cnrst.magrid.ma.14110"
"atlas-wn15.cnrst.magrid.ma.14111"
"atlas-wn14.cnrst.magrid.ma.12635"
"atlas-wn14.cnrst.magrid.ma.12636"
"atlas-wn14.cnrst.magrid.ma.12637"
"atlas-wn14.cnrst.magrid.ma.12638"
)
 
Pstream initialized with:
    floatTransfer      : 0
    nProcsSimpleSum    : 0
    commsType          : nonBlocking
    polling iterations : 0
sigFpe : Enabling floating point exception trapping (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster
allowSystemOperations : Allowing user-supplied system call operations
 
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time
 
Create mesh for time = 0
 
 
PISO: Operating solver in PISO mode
 
Reading transportProperties
 
Reading field p
 
Reading field U
 
Reading/calculating face flux field phi
 
 
Starting time loop
 
Time = 0.005
 
Courant Number mean: 0 max: 0
smoothSolver:  Solving for Ux, Initial residual = 1, Final residual = 9.36407e-06, No Iterations 103
smoothSolver:  Solving for Uy, Initial residual = 0, Final residual = 0, No Iterations 0
DICPCG:  Solving for p, Initial residual = 1, Final residual = 1.20892e-05, No Iterations 1001
time step continuity errors : sum local = 8.46732e-10, global = -3.35091e-21, cumulative = -3.35091e-21
DICPCG:  Solving for p, Initial residual = 0.729746, Final residual = 1.07479e-05, No Iterations 1001
time step continuity errors : sum local = 1.0137e-09, global = 4.00052e-21, cumulative = 6.49613e-22
ExecutionTime = 9.43 s  ClockTime = 13 s
 
....
....
Time = 9.995
 
Courant Number mean: 0.574454 max: 2.48473
smoothSolver:  Solving for Ux, Initial residual = 1.17427e-05, Final residual = 9.26439e-06, No Iterations 3
smoothSolver:  Solving for Uy, Initial residual = 1.54941e-05, Final residual = 9.67729e-06, No Iterations 6
DICPCG:  Solving for p, Initial residual = 0.000515951, Final residual = 9.91713e-07, No Iterations 712
time step continuity errors : sum local = 3.76432e-11, global = -1.26675e-20, cumulative = -7.97184e-18
DICPCG:  Solving for p, Initial residual = 0.000515915, Final residual = 9.80393e-07, No Iterations 712
time step continuity errors : sum local = 3.72154e-11, global = 1.22749e-20, cumulative = -7.95957e-18
ExecutionTime = 12911.9 s  ClockTime = 13323 s
 
Time = 10
 
Courant Number mean: 0.574458 max: 2.48473
smoothSolver:  Solving for Ux, Initial residual = 1.17328e-05, Final residual = 9.25657e-06, No Iterations 3
smoothSolver:  Solving for Uy, Initial residual = 1.54806e-05, Final residual = 9.66884e-06, No Iterations 6
DICPCG:  Solving for p, Initial residual = 0.000515508, Final residual = 9.78012e-07, No Iterations 712
time step continuity errors : sum local = 3.71235e-11, global = -2.40739e-20, cumulative = -7.98364e-18
DICPCG:  Solving for p, Initial residual = 0.000515475, Final residual = 9.95463e-07, No Iterations 707
time step continuity errors : sum local = 3.77936e-11, global = -6.75311e-21, cumulative = -7.9904e-18
ExecutionTime = 12917.7 s  ClockTime = 13333 s
 
End
 
Finalising parallel run

Jobs de longue durée

Si la durée d’exécution dépasse 12h alors il faut créer un proxy de renouvellement et ajouter dans le fichier JDL:

MyProxyServer = "myproxy.magrid.ma";

Exécuter la commande:

[rahim@ui openfoam]$voms-proxy-init --voms magrid
[rahim@ui openfoam]$myproxy-init -d -n -s myproxy.magrid.ma

Après soumettre normalement le job.

[rahim@ui openfoam] $ glite-wms-job-submit -a -o jobId openfoam.jdl $ glite-wms-job-status -i jobId $ glite-wms-job-output -i jobId --dir .

Plus de détails sur [2].

Job avec un gros output

OutputSandbox ne peut pas être utilisé pour récupérer les gros output du job dans ce cas (>10M). On doit plutôt passer par les services

qui permettent la gestion des fichiers i.e. le LFC (LCG File Catalog) et le SE (Storage Element).

Le principe est simple, transférer les gros résultats du WN vers le SE, ensuite du SE vers le UI.

  • Etape 1: Choisir un LFC
[rahim@ui openfoam]$ lcg-infosites --vo magrid lfc lfc.magrid.ma
  • Etape 2: Définir la variable d’environnement LFC_HOST:
[rahim@ui openfoam]$ export LFC_HOST=lfc.magrid.ma
  • Etape 3: Créer son dossier sur la LFC (vous pouvez le faire une fois pour toute).
[rahim@ui openfoam]$ lfc-mkdir -p /grid/magrid/rahim/openfoam


  • Etape 4: Supposons alors dans notre cas qu'on veut récupérer tout le dossier de travail du wn ,

on modifié le script hooks.sh pour creer l'archive contenant la dossir de travail de cette manière :

Fichier: hooks.sh
#!/bin/sh
export DPM_HOST=atlas-se1.cnrst.magrid.ma
export LFC_HOME=/grid/magrid/rahim/openfoam
export LFC_HOST=lfc.magrid.ma
 
pre_run_hook () {
    echo "Executing pre hook "
    echo "untar input"
    tar -xzvf cavity.tar.gz
    ls -l
    echo "Decompose"
    decomposePar
    ls -l
    echo "Finished the post hook "
    return 0
}
 
post_run_hook () {
    echo "Executing post hook : "
    echo "Reconstructing : "
    reconstructPar
    NOW=$(date +%Y-%0m-%0d_%0H%0M)
    export OUTPUT_ARCHIVE=cavity_output${NOW}.tar.gz
    echo "Préparer le tar "
    tar cvzf $OUTPUT_ARCHIVE *
    echo "Copie de $OUTPUT_ARCHIVE vers $LFC_HOME/$OUTPUT_ARCHIVE "
    lcg-cr --vo magrid -d $DPM_HOST -l $LFC_HOME/$OUTPUT_ARCHIVE file://$PWD/$OUTPUT_ARCHIVE
    echo "Finished the post hook :"
    return 0
}
  • Etape 5: Soumission du Job

Après soumettre normalement le job.

[rahim@ui openfoam] $ glite-wms-job-submit -a -o jobId openfoam.jdl $ glite-wms-job-status -i jobId $ glite-wms-job-output -i jobId --dir .
  • Etape 6: Une fois le job est terminé on peut vérifier la présence de notre fichier sur le SE:
[rahim@ui openfoam]$ export LFC_HOST=lfc.magrid.ma $export LFC_HOME=/grid/magrid/rahim/openfoam $lfc-ls -ll -rw-rw-r-- 1 113 108 991751280 Dec 26 20:12 cavity_output2016-12-26_2003.tar.gz
  • Etape 7: A la fin on le récupère sur le UI:
[rahim@ui openfoam]$ lcg-cp --vo magrid lfn:cavity_output2016-12-26_2003.tar.gz file:`pwd`/cavity_output2016-12-26_2003.tar.gz

Ne pas oublier de supprimer le fichier pour liberer l espace .

[rahim@ui openfoam]$ lcg-del -a --vo magrid lfn:/grid/magrid/rahim/cavity_output2016-12-26_2003.tar.gz
Navigation
Administrateur
Utilisateur
Applications
Autorité de Certification