Initiation à la CFD open-source avec le code OpenFOAM - Tome I : Présentation générale du code, premières simulations et premiers programmes - Cyprien Soulaine (cyprien.soulaine@gmail.com) Toulouse 27 et 28 mars 2013 Version 3.05
Objectifs Connaitre les possibilités du code OpenFOAM Savoir trouver de l aide Savoir lancer et post-traiter un calcul à partir des tutoriaux existants Lancer un calcul en adaptant les tutoriaux à son propre cas Savoir décrypter un solveur pour identifier le plus adapté à sa situation Créer son propre solveur en modifiant un solveur existant Oser se lancer dans l aventure OpenFOAM 2
Présentation de la plateforme OpenFOAM Qu est ce qu OpenFOAM? OpenFOAM : programmation des équations Où trouvez de l aide et de la documentation? Premières simulations avec OpenFOAM Structure générale d un cas OpenFOAM Exercice n 1 : Diffusion de la chaleur Exercice n 2 : Cavité entrainée Exercice n 3 : Ecoulement de Poiseuille Exercice n 4 : Ascension d une bulle (VoF) Programmer des équations avec OpenFOAM Structure générale d une application Exercice n 5 : Ajout d une équation de transport de chaleur dans icofoam Exercice n 6 : Température dans cavité entrainée Transfert en milieu poreux avec OpenFOAM Exercice n 7 : Créer un solveur «Darcy» Exercice n 8 : Température dans un milieu poreux Exercice n 9 : Personnaliser des conditions aux limites Exercice n 10 : Modèle à deux températures 3
Présentation de la plateforme OpenFOAM Qu est ce qu OpenFOAM? OpenFOAM : programmation des équations Où trouvez de l aide et de la documentation? Premières simulations avec OpenFOAM Structure générale d un cas OpenFOAM Exercice n 1 : Diffusion de la chaleur Exercice n 2 : Cavité entrainée Exercice n 3 : Ecoulement de Poiseuille Exercice n 4 : Ascension d une bulle (VoF) Programmer des équations avec OpenFOAM Structure générale d une application Exercice n 5 : Ajout d une équation de transport de chaleur dans icofoam Exercice n 6 : Température dans cavité entrainée Transfert en milieu poreux avec OpenFOAM Exercice n 7 : Créer un solveur «Darcy» Exercice n 8 : Température dans un milieu poreux Exercice n 9 : Personnaliser des conditions aux limites Exercice n 10 : Modèle à deux températures 4
Qu est ce qu OpenFOAM? = Open Field Operation and Manipulation - Résout les équations aux dérivées partielles par la méthode des volumes finis - Code multi-physique principalement orienté vers la mécanique des fluides - Prise en compte par défaut des géométries 3D - Code open-source développé en C++ (programmation orientée objets) - Téléchargeable gratuitement sur www.openfoam.com - Conçu comme une boite à outils «facilement» programmable - Modules de calcul-parallèle - Installation multi-plateforme (préférence Linux) 1989 : Début du développement à l Imperial College London 1996 : Première version de FOAM 2004 : OpenFOAM distribué sous license GPL par OpenCFD Ltd. 2013 : version 2.2.0 ; rachat de OpenCFD par ESI Group 5
La boîte à outils OpenFOAM OpenFOAM = plus de 200 programmes (pas seulement 1 exécutable) Préprocesseurs : - Mailleur (blockmesh, snappyhexmesh ) - Convertisseur de maillage (Ansys, Salomé, ideas, CFX, Star-CD, Gambit, Gmsh ) Solveurs : - écoulement incompressible / compressible - écoulement multiphasique - combustion, électromagnétique, structure - transfert de chaleur - plusieurs approches de turbulence (DNS, RANS, LES) - etc post-traitement : - livré avec ParaView (et l utilitaire parafoam) - exportation vers d autres plateformes de post-traitement (Fluent, Fieldview, EnSight - Utilitaire «sample» pour l échantillonnage 1D ou 2D (export vers gnuplot, Grace/xmgr et jplot) 6
openfoam.com Initiation à OpenFOAM openfoam.com openfoam.com Exemples de simulations 7
OpenFOAM : programmation des équations Le champ considéré peut-être scalaire, vectoriel ou tensoriel La discrétisation des opérateurs est précisée lors du lancement de la simulation Ecriture des équations très proche de la formulation mathématique 8
Où trouver de l aide et de la documentation? 2 guides officiels par OpenCFD («user guide» et «programmer guide» ) (Documentation souvent insuffisante) Plusieurs thèses fondatrices (Hrvoje Jasak 1996, Henrik Rusche 2001, ) Un tutorial par solver. Il a souvent valeur de cas-test (Validation non-disponible publiquement) Accès direct au code-source (attention, le code est peu annoté!!) En payant un support auprès d OpenCFD Ltd, Wikki Ltd,. Communauté active! - Forum d entraide (www.cfd-online.com/forums/openfoam/) - Un wiki (openfoamwiki.net) - un Workshop annuel (8ème édition en 2013) (www.openfoamworkshop.org) - Projet de travail collaboratif dirigé par 2 des développeurs orignaux (www.extend-project.de) 9
OpenFOAM à l IMFT? (intranet de Cosinus) 10
Quels avantages / inconvénients? Gratuit (pas de limitations dues aux licences), Accès aux sources (pas une boîte noire ), Un outil supplémentaire pour les benchmarks codeto-code, Bénéficie de mises à jour régulières, De nombreux solveurs clé en main, Facilité pour programmer des équations, Une communauté réactive (forum, congrès, université d été ),.. Temps de prise en main, La documentation!! Pas d interface graphique, Commandes unix et C++,.. 11
Présentation de la plateforme OpenFOAM Qu est ce qu OpenFOAM? OpenFOAM : programmation des équations Où trouvez de l aide et de la documentation? Premières simulations avec OpenFOAM Structure générale d un cas OpenFOAM Exercice n 1 : Diffusion de la chaleur Exercice n 2 : Cavité entrainée Exercice n 3 : Ecoulement de Poiseuille Exercice n 4 : Ascension d un bulle (VoF) Programmer des équations avec OpenFOAM Structure générale d une application Exercice n 5 : Ajout d une équation de transport de chaleur dans icofoam Exercice n 6 : Température dans cavité entrainée Transfert en milieu poreux avec OpenFOAM Exercice n 7 : Créer un solveur «Darcy» Exercice n 8 : Température dans un milieu poreux Exercice n 9 : Personnaliser des conditions aux limites Exercice n 10 : Modèle à deux températures 12
Structure générale d un cas OpenFOAM $ cd ~ $ mkdir -p $FOAM_RUN Paramétrage du calcul (choix des solvers, des schémas de discrétisation, du pas de temps, des sorties fichiers ) Toutes valeurs constantes pendant le calcul (Propriétés du transport, des modèles de turbulence, de thermodynamique etc) Contient les informations relatives au maillage Un répertoire par pas de temps. Chaque répertoire contient autant de fichier que de champs calculés (T,U,p, Yi, k, Omega ) L initialisation du calcul se fait via un répertoire «0» 13
Exercice n 1 : Diffusion de la chaleur (1/4) T ini = 273K 273K Exemple issu des tutoriaux livrés avec OpenFOAM Géométrie et maillage générés avec Ansys Conversion avec l utilitaire ansystofoam Résolution de l équation de la chaleur 573K Solver : laplacianfoam 14
Exercice n 1 : Diffusion de la chaleur (2/4) $ run $ cp r $FOAM_TUTORIALS/basic/laplacianFoam/flange Exo1 $ cd Exo1 $ ls $ gedit 0/T Conditions initiales et conditions aux limites pour le champ T Maillage : faces, points défini plus loin avec ansystofoam Valeur du coefficient de diffusion (m 2 /s) Paramètres du calcul (pas de temps, sorties fichiers ) Schémas de discrétisation des différents opérateurs (div, laplacian, ddt, grad ) Paramètres et choix des solveurs linéaires Scripts pour lancer automatiquement le tuto et nettoyer le répertoire Maillage créé avec Ansys 15
Exercice n 1 : Diffusion de la chaleur (3a/4) Définition des conditions initiales et des conditions à la limite Dimensions du champ T [kg m s K kgmol A cd] Température initiale uniforme (T=273K) à l intérieur du solide Condition à aux limites à t=0s Flux nul Valeur fixe (T=273K) Valeur fixe (T=573K) 16
Exercice n 1 : Diffusion de la chaleur (3b/4) $ gedit constant/transportproperties 17
Exercice n 1 : Diffusion de la chaleur (3c/4) $ gedit system/controldict 18
Exercice n 1 : Diffusion de la chaleur (4/4) Conversion du maillage : $ ansystofoam flange.ans scale 0.001 Visualisation du maillage dans paraview $ parafoam Lancement de la simulation $ laplacianfoam Visualisation du résultat dans paraview $ parafoam Création de fichiers dans le répertoire polymesh Création d un répertoire / pas de temps 4 - Choix du champ à visualiser 5 - Pour lire l ensemble des pas de temps 3- Choisir «surface» 2 - «apply» 1 - Choix des champs à visualiser Exo1bis : DT = 1e -3 m²/s Jusqu à l état stationnaire 19
fixedwalls fixedwalls Exercice n 2 : Cavité entrainée (1/6) U x =1m/s Tutorial détaillé dans le User Guide movingwall Création de la géométrie et du maillage avec l utilitaire BlockMesh Résolution de Navier-Stokes incompressible en régime laminaire (solver icofoam) y x fixedwalls Post-traitement avec ParaView $ run $ cp r $FOAM_TUTORIALS/incompressible/icoFoam/cavity Exo2 $ cd Exo2 $ ls 20
Exercice n 2 : Cavité entrainée (2/6) BlockMesh = utilitaire de prétraitement pour les géométries simples Définition des points Définition du bloc hexa Géométrie et maillage définis dans le fichier blockmeshdict $ gedit constant/polymesh/blockmeshdict Définition de la géométrie en 3D car OpenFOAM n accepte que des géométrie 3D 7 3 6 2 Définition du maillage (Maillage homogène, 1 seule maille dans la direction z pour calcul 2D) y z x 0 1 Définition des bords de la géométrie («patches») pour application des conditions aux limites. Les faces orthogonales a l axe Oz sont «vides» pour préciser que le calcul est 2D 4 Attention l ordre de numérotation des points est important!! On précise que le calcul est 2D Les patches peuvent être de plusieurs types : -patch (type générique) -wall (pour les conditions de mur, utile pour la turbulence) -cyclic (pour les conditions périodiques) -symmetryplane (pour les plans de symétrie) -empty (pour revenir à des géométries 2D ou 1D) -wedge (pour les géométries axi-symmétrique) -processor (pour le calcul parallèle) 5 21
Exercice n 2 : Cavité entrainée (3/6) Exécution de blockmesh : Contrôle du maillage : Visualisation du maillage : $ blockmesh $ checkmesh $ parafoam 6 Edit>view Setting>use Parallel Projection 4 - «Apply» 5 - «wireframe» 2 Visualiser le nom des patch sur la géométrie 1 - Choix des parties à visualiser 22
Exercice n 2 : Cavité entrainée (4a/6) $ gedit constant/transportproperties & On est donc bien en régime laminaire 23
Exercice n 2 : Cavité entrainée (4b/6) $ gedit 0/U 24
Exercice n 2 : Cavité entrainée (4c/6) $ gedit 0/p Attention aux unités, ici, 25
Exercice n 2 : Cavité entrainée (4d/6) $ gedit system/controdict Gestion de la discrétisation en temps (début, fin, pas de temps) Gestion des sorties fichiers 26
Exercice n 2 : Cavité entrainée (5/6) Lancement du calcul : $ icofoam Post-traitement avec ParaView : $ parafoam 27
Exercice n 2 : Cavité entrainée (6a/6) Pour visualiser les vecteurs «vitesse» On précise que l on choisit les valeurs au centre des cellules avec le filtre CellCenter : filters>alphabetical>cellcenter>apply On applique ensuite le filtre Glyph pour tracer les vecteurs vitesses: filters>alphabetical>glyph>properties apply 28
Exercice n 2 : Cavité entrainée (6b/6) Pour visualiser les vecteurs «vitesse» Display> color by > U 29
inlet outlet Exercice n 3 : Ecoulement de Poiseuille (1/4) Objectifs : Simuler un écoulement de Poiseuille dans un tube (2D), avec condition de symétrie Résolution de Navier-Stokes incompressible en régime laminaire (solver icofoam) symmetryplane y x bottomwall $ run $ cp r $FOAM_TUTORIALS/incompressible/icoFoam/cavity Exo3 $ cd Exo3 30
Exercice n 3 : Ecoulement de Poiseuille (2/4) $ gedit constant/polymesh/blockmeshdict 3 symmetryplane 2 inlet 7 6 outlet y z x 0 1 4 bottomwall $ blockmesh 31
Exercice n 3 : Ecoulement de Poiseuille (3a/4) $ gedit 0/U 32
Exercice n 3 : Ecoulement de Poiseuille (3b/4) $ gedit 0/p 33
Exercice n 3 : Ecoulement de Poiseuille (4/4) On garde les mêmes paramètres de calcul que ceux de l exercice 2 Lancement du calcul : $ icofoam Visualisation du résultat : $ parafoam 1 Filters>Data Analysis>Plot Over Line 3 Désélectionner la visualisation du champ de pression p 2 On va tracer le profil de vitesse le long de l axe y au milieu du tube 34
Exercice n 4 : Ascension d une bulle (1/5) Objectifs : Simuler l ascension d une bulle dans une colonne d eau Exercice adapté du tutoriel dambreak détaillé dans le user guide Utilisation d un solveur de suivi d interface (VoF) Utilisation de l utilitaire setfields pour initialiser des champs. $ run $ cp r $FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak Exo4 $ cd Exo4 $ cp../exo3/constant/polymesh/blockmeshdict constant/polymesh/. 35
Exercice n 4 : Ascension d une bulle (2/5) $ gedit constant/polymesh/blockmeshdict 3 atmosphere 2 7 6 4 0 1 y x z fixedwalls 36
Exercice n 4 : Ascension d une bulle (3a/5) $ gedit 0/alpha1.org alpha1 représente la distribution gaz/liquide dans le domaine (alpha1=0 pour le gaz, alpha1=1 pour l eau) Cette distribution sera initialisée par la suite avec l outil setfields. A ce stade, seules les conditions aux limites sont nécessaires. setfields écrasera 0/alpha1, c est pourquoi on en fait une sauvegarde 0/alpha1.org 37
Exercice n 4 : Ascension d une bulle (3b/5) $ gedit 0/p_rgh On utilise ici une pression hydrostatique 38
Exercice n 4 : Ascension d une bulle (3c/5) $ gedit 0/U 39
Exercice n 4 : Ascension d une bulle (3d/5) $ gedit constant/transportproperties Eau définit dans le domaine par alpha1=1 Air, définit pour alpha1 = 0 Tension de surface 40
Exercice n 4 : Ascension d une bulle (3e/5) $ gedit constant/g 41
Exercice n 4 : Ascension d une bulle (3f/5) $ gedit system/controldict 42
Exercice n 4 : Ascension d une bulle (4/5) Avant de lancer le calcul, il faut initialiser la distribution gaz/liquide. On utilise setfields $ cp 0/alpha1.old/ 0/alpha1 $ parafoam $ gedit system/setfieldsdict $ setfields $ parafoam AVANT APRES 43
Exercice n 4 : Ascension d une bulle (5/5) Lancement du calcul : $ interfoam Post-traitement avec ParaView : $ parafoam t = 0 s t = 0.04 s t = 0.07 s 44
Présentation de la plateforme OpenFOAM Qu est ce qu OpenFOAM? OpenFOAM : programmation des équations Où trouvez de l aide et de la documentation? Premières simulations avec OpenFOAM Structure générale d un cas OpenFOAM Exercice n 1 : Diffusion de la chaleur Exercice n 2 : Cavité entrainée Exercice n 3 : Ecoulement de Poiseuille Exercice n 4 : Ascension d une bulle (VoF) Programmer des équations avec OpenFOAM Structure générale d une application Exercice n 5 : Ajout d une équation de transport de chaleur dans icofoam Exercice n 6 : Température dans cavité entrainée Transfert en milieu poreux avec OpenFOAM Exercice n 7 : Créer un solveur «Darcy» Exercice n 8 : Température dans un milieu poreux Exercice n 9 : Personnaliser des conditions aux limites Exercice n 10 : Modèle à deux températures 45
Où trouvez le code source d un programme? OpenFOAM peut-être vu comme une boîte à outils facilement programmable 1 solver = 1 programme (par exemple l équation de la chaleur se résout avec le solveur laplacianfoam) Où trouvez les solvers dans OpenFOAM? $ cd $FOAM_APP/solvers/ $ ls Les solveurs sont classés par type (basic, heat transfer, combustion, incompressible, multiphase.) Par exemple, on trouve laplacianfoam dans /basic $ cd basic/laplacianfoam $ ls $ gedit laplacianfoam.c 46
Derrière laplacianfoam : laplacianfoam.c Appel des librairies d OpenFOAM Création de la matrice fvm:: termes implicites fvc:: termes explicites T et DT déclarés dans createfield.h 47
Derrière laplacianfoam : createfields.h On déclare le champ T comme une instance de l objet volscalarfield. - Il s agit d un champ scalaire - Il doit être lu au temps initial -il est dimensionné (les dimensions sont définis dans 0/T) - Il est écrit dans chaque répertoire du pas de temps (runtime.timename()) - Il contient les conditions aux limites On lit le fichier transportproperties dans le répertoire /constant On déclare ici la variable DT Sa valeur et ses dimensions sont défnits dans constant/transportproperties 48
Structure générale d une application Code source. Le fichier.c est le fichier principal. Liste des fichiers à compiler Liens vers les librairies OpenFOAM utilisées dans l application Exemple du solver icofoam $ cd $FOAM_APP/solvers/incompressible/icoFoam $ ls $ gedit icofoam.c 49
Exercice n 5 : Ajout d une équation de transport dans icofoam (1/4) Objectif : développer un solver qui résout le couplage Navier- Stokes + équation de la chaleur Comment faire?? Ajouter l équation de transport d un champ de températures à un solver Naviers-Stokes déjà existant On choisit de modifier le solver Naviers-Stokes incompressible icofoam 50
Exercice n 5 : Ajout d une équation de transport dans icofoam (2/4) On créé son espace «application» dans le répertoire personnel $ cd $WM_PROJECT_USER_DIR $ mkdir -p applications/solvers/incompressible $ cd applications/solvers/incompressible Copie du solver icofoam que l on modifera ensuite $ cp r $FOAM_APP/solvers/incompressible/icoFoam myicofoam $ cd myicofoam $ mv icofoam.c myicofoam.c $ gedit Make/files Fichier principal de l appication Compilation de myicofoam Liens vers les librairies OpenFOAM L application «myicofoam» sera compilée dans un dossier utilisateur $ wclean $ wmake 51
Exercice n 5 : Ajout d une équation de transport dans icofoam (3/4) $ gedit createfields Déclaration du scalaire DT. Il sera lu dans le fichier «constant/transportproperties» Déclaration du champ scalaire T. -Ce champ apparaitra dans chaque répertoire de pas de temps -On précise qu il doit être lu à l initialisation du calcul 52
Exercice n 5 : Ajout d une équation de transport dans icofoam (3/4) $ gedit myicofoam.c - Naviers-Stokes calculé par l algorithme PISO de icofoam - Le champ «phi» représente le flux surfacique de vitesse A jout de l équation de la chaleur après la résolution du couplage pression vitesse. -L équation est codée dans la matrice TEqn Compilation de myicofoam $ wmake -On aurait pu aussi directement écrire solve ( fvm::ddt(t) + fvm::div(phi,t) - fvm::laplacian(dt,t) ); 53
fixedwalls fixedwalls T=293 K T=293 K Exercice n 6 : température dans cavité entrainée (1/3) T=493 K U x =1m/s movingwall Objectif : simuler un transport de chaleur dans le cas de la cavité entrainée Adapter l exercice n 2 au transport de température T=293 K Résolution de Navier-Stokes incompressible en régime laminaire et de l équation de la chaleur (notre solver myicofoam) y x fixedwalls T=293 K $ run $ cp r Exo2 Exo6 $ cd Exo6 $ rm r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9* $ cp 0/p 0/T $ gedit 0/T 54
Exercice n 6: température dans cavité entrainée(2a/3) $ gedit 0/T Conditions initiales et conditions aux limites pour le champ T 55
Exercice n 6: température dans cavité entrainée(2b/3) $ gedit constant/transportproperties Valeur du coefficient de diffusion pour la température 56
Exercice n 6: température dans cavité entrainée(2c/3) $ gedit system/fvsolution Paramètres du solveur linéaire pour T 57
Exercice n 6: température dans cavité entrainée(2d/3) $ gedit system/fvschemes Schéma de discrétisation pour l équation en température 58
Exercice n 6: température dans cavité entrainée(2e/3) $ gedit system/controldict Le temps est plus long pour atteindre le régime établie 59
Exercice n 6: température dans cavité entrainée (3/3) $ myicofoam $ parafoam 60
Présentation de la plateforme OpenFOAM Qu est ce qu OpenFOAM? OpenFOAM : programmation des équations Où trouvez de l aide et de la documentation? Premières simulations avec OpenFOAM Structure générale d un cas OpenFOAM Exercice n 1 : Diffusion de la chaleur Exercice n 2 : Cavité entrainée Exercice n 3 : Ecoulement de Poiseuille Exercice n 4 : Ascension d une bulle (VoF) Programmer des équations avec OpenFOAM Structure générale d une application Exercice n 5 : Ajout d une équation de transport de chaleur dans icofoam Exercice n 6 : Température dans cavité entrainée Transfert en milieu poreux avec OpenFOAM Exercice n 7 : Créer un solveur «Darcy» Exercice n 8 : Température dans un milieu poreux Exercice n 9 : Personnaliser des conditions aux limites Exercice n 10 : Modèle à deux températures 61
Exercice n 7 : Créer un solveur Darcy (1/6) Objectif : développer un solveur qui résout l écoulement dans un milieu poreux où la vitesse est évaluée par une loi de Darcy. (1) (2) Comment résoudre un tel système? On obtient une équation différentielle sur la pression en injectant (2) dans (1) : On va créer notre solveur en se basant sur le solveur existant laplacianfoam $ cd $WM_PROJECT_USER_DIR/applications/solvers/ $ cp r $FOAM_APP/solvers/basic/laplacianFoam darcyfoam $ cd darcyfoam $ mv laplacianfoam.c darcyfoam.c $ gedit Make/files 62
Exercice n 7 : Créer un solveur Darcy (2/6) $ gedit createfields.h Déclaration du champ scalaire p. -Ce champ apparaitra dans chaque répertoire de pas de temps -On précise qu il doit être lu à l initialisation du calcul Déclaration du champ vitesse U. -Ce champ apparaitra dans chaque répertoire de pas de temps, - Il ne sera pas lu à l initialisation du calcul (même si il est présent dans le répertoire 0), - Pour satisfaire tous les constructeurs de l objet volvectorfield, on précise via un argument supplémentaire la dimension et une valeur initiale de U. Déclaration de la viscosité du fluide mu et de la perméabilité k du milieu poreux. Ils seront lus dans le fichier «constant/transportproperties» 63
Exercice n 7 : Créer un solveur Darcy (3/6) $ gedit darcyfoam.c Le champ de pression p est évalué par une équation de diffusion Le vecteur vitesse U est déduit du champ de pression par la loi de Darcy $ rm write.h $ wclean $ wmake On supprime les fichiers inutiles et on compile le programme darcyfoam 64
Exercice n 7 : Créer un solveur Darcy (4/6) Astuce pour définir les coordonnées des On prépare le «case» en s appuyant sur le tutorial laplacianfoam/flange, dont le paramétrage se rapproche le plus de notre exemple points $ run $ mkdir darcyfoam $ cd darcyfoam $ cp -r $FOAM_TUTORIALS/basic/laplacianFoam/flange Exo7 $ cd Exo7 $ rm Allrun Allclean flange.ans Nous allons simuler l écoulement dans un milieu poreux 1D : Définition du maillage (Maillage homogène, 1 seule maille dans les directions y et z car le calcul est 1D) y inlet z x 3 7 0 4 5 6 2 1 outlet Pour gagner du temps, on récupère un blockmeshdict déjà existant, que l on va modifier Les faces orthogonales aux axes Oy et Oz sont «vides» pour préciser que le calcul est 1D $ cp $FOAM_TUTORIALS/incompressible/icoFoam/cavity/constant/ polymesh/blockmeshdict constant/polymesh/. $ gedit constant/polymesh/blockmeshdict On créé ensuite le maillage à l aide de blockmesh $ blockmesh 65
Exercice n 7 : Créer un solveur Darcy (5a/6) $ mv 0/T 0/p $ gedit 0/p On impose un différentiel de pression entre l entée et la sortie du domaine 66
Exercice n 7 : Créer un solveur Darcy (5b/6) $ gedit constant/transportproperties 67
Exercice n 7 : Créer un solveur Darcy (5c/6) $ gedit system/controldict darcyfoam est un solveur stationnaire, un seul pas de temps est donc suffisant. 68
Exercice n 7 : Créer un solveur Darcy (5d/6) $ gedit system/fvschemes 69
Exercice n 7 : Créer un solveur Darcy (5e/6) $ gedit system/fvsolution 70
Exercice n 7 : Créer un solveur Darcy (6/6) On lance la simulation : $ darcyfoam On va tracer les résultats à l aide de l outil d échantillonnage sample, livré avec OpenFOAM, et du programme Gnuplot. Comme blockmesh, sample requiert un fichier d entrée, sampledict, placé quant-à-lui dans le répertoire /system : $ cp $FOAM_UTILITIES/postProcessing/sampling/sample/sampleDict system/. $ gedit system/sampledict On exécute ensuite l échantillonnage : $ sample Et on trace le champ de pression avec gnuplot : $ gnuplot gnuplot> set xlabel "distance (m)" gnuplot> set ylabel "Pressure (kg/m/s)" gnuplot> plot "sets/1/linex1_p.xy" using 1:2 with lines lw 4 title "p 71
Exercice n 8 : Température dans un milieu poreux (1/7) Objectif n 1 : développer un solveur qui résout le transport d un champ scalaire dans un milieu poreux où la vitesse est évaluée par une loi de Darcy. (1) (2) (3) Objectif n 2 : Tracer les résultats en fonction du temps en plaçant des sondes. Objectif n 3 : Changer les schémas de discrétisation On va créer notre solveur en se basant sur le solveur précédent darcyfoam $ cd $WM_PROJECT_USER_DIR/applications/solvers/ $ $ cp r darcyfoam darcytemperaturefoam $ cd darcytemperaturefoam $ mv darcyfoam.c darcytemperaturefoam.c $ gedit Make/files 72
Exercice n 8 : Température dans un milieu poreux (2/7) $ gedit createfields.h Déclaration du flux de vitesse phi. - Il s agit d un champ surfacique (vecteur U projeté sur les surfaces du maillage) - nécessaire pour utiliser l opérateur divergence (fvm::div(phi,t) ) - Peut également être déclaré avec #include createphi.h Déclaration du champ de température T. En plus de la viscosité du fluide mu et de la perméabilité k du milieu poreux, on déclare la diffisivité thermique DT et la porisité eps. Ils seront lus dans le fichier «constant/transportproperties» 73
Exercice n 8 : Température dans un milieu poreux (3/7) $ gedit darcytemperaturefoam.c Le flux surfacique phi est actualisé à partir de la nouvelle valeur du champ de vitesse U. Résolution de l équation d advection/diffusion de la température $ wclean $ wmake on compile le programme darcytemperaturefoam 74
Exercice n 8 : Température dans un milieu poreux (4/7) On cherche à évaluer la température dans un milieu poreux 1D P 1 Milieu poreux de perméabilité k et de porosité eps P0 T in Flux libre en sortie On va se baser sur l exercice précédent pour paramétrer le calcul $ run $ mkdir darcytemperaturefoam $ cp r../darcyfoam/exo7 Exo8 $ cd Exo8 $ rm r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9* sets $ cp 0/p 0/T $ gedit 0/T 75
Exercice n 8 : Température dans un milieu poreux (5a/7) $ gedit 0/T 76
Exercice n 8 : Température dans un milieu poreux (5b/7) $ gedit constant/transportproperties 77
Exercice n 8 : Température dans un milieu poreux (5c/7) $ gedit system/fvschemes 78
Exercice n 8 : Température dans un milieu poreux (5d/7) $ gedit system/fvsolution 79
Exercice n 8 : Température dans un milieu poreux (5e/7) $ gedit system/controldict Les sondes sont des fonctions qui sont exécutées au cours du calcul. Elles permettent de tracer la valeur d un champ pour une cellule donnée (la sonde) au cours du temps. On peut préciser autant de sondes qu on le désire. 80
Exercice n 8 : Température dans un milieu poreux (6/7) On lance la simulation : $ darcytemperaturefoam On va tracer les résultats des sondes à l aide du script gnuplot suivant $ gedit plot_probes $ gnuplot persist plot_probes 81
Exercice n 8 : Température dans un milieu poreux (7/7) On remarque des oscillations dans la simulation précédente. Elles sont dues à une mauvaise stabilité des schémas numériques de convection utilisés. On peut utiliser un schéma amont ou limiteur de pente en précisant, dans system/fvschemes Gauss upwind phi ou Gauss vanleer au lieu de Gauss linear. Le schéma amont est plus stable, mais plus diffusif. Les schémas du type limiteur de pente semblent plus adaptés. 82
Exercice n 9 : Personnaliser des conditions aux limites (1/4) Objectif : Créer des conditions aux limites personnalisées De base, OpenFOAM, gère un certain nombre de conditions à la limite. Elles sont situées dans le répertoire suivant : $ cd $FOAM_SRC/finiteVolume/fields/fvPatchFields $ ls Toutes ces conditions sont dérivées des conditions de base fixedvalue et fixedgradient. $ ls derived Pour définir une condition à la limite qui dépend du temps ou des autres champs, il existe plusieurs possibilités : Programmation en dure dans le code Programmation de condition aux limites personnalisées Utilisation de l utilitaire swak4foam (http://openfoamwiki.net/index.php/contrib/swak4foam) 83
Exercice n 9 : Personnaliser des conditions aux limites (2/4) Dans les exercices précédents (6 et 7), nous évaluons l écoulement dans un milieu poreux à partir de la résolution d une équation différentielle sur la pression. Les conditions aux limites sont donc précisées sur la pression. Dans certain cas cependant, il est plus commode de définir une vitesse en entrée du domaine plutôt qu une pression. Il faut donc traduire cette condition d entrée en vitesse en une condition d entrée en pression via la relation : Nous allons créer une condition à la limite personnalisée, inspirée de la condition buoyantpressure, ( ) elle-même dérivée d un fixedgradient. $ cd $WM_PROJECT_USER_DIR/ $ mkdir boundaryconditions/ $ cd boundaryconditions/ $ $ cp r $FOAM_SRC/finiteVolume/fields/fvPatchFields/derived/buoyantPressure darcygradpressure $ cd darcygradpressure $ rename 's/buoyantpressure/darcygradpressure/g' *.* $ sed -i 's/buoyantpressure/darcygradpressure/g' *.* $ mkdir Make On remplace la chaine de caractère «buoyantpressure» par «darcygradpressure» à l intérieur de tous les fichiers du répertoire $ gedit Make/files $ gedit Make/options 84
Exercice n 9 : Personnaliser des conditions aux limites (3a/4) $ gedit darcygradpressurefvpatchscalarfield.h Cette condition à la limite dérive de la condition de base «fixedgradient» On précise que le gradient de p sera calculé à partir de U Nom de la condition à la limite qu il faudra préciser dans les fichiers 0/p Déclaration des constructeurs 85
Exercice n 9 : Personnaliser des conditions aux limites (3b/4) Suite de la déclaration des constructeurs et des constructeurs de copie Déclaration de la fonction updatecoeffs(). C est à travers cette fonction que l expression de la condition à la limite est définie Déclaration de la fonction write() qui écrit les valeurs aux limites dans les fichiers timedirectory/p 86
Exercice n 9 : Personnaliser des conditions aux limites (4a/4) $ gedit darcygradpressurefvpatchscalarfield.c Définition des constructeurs et des constructeurs de copie 87
Exercice n 9 : Personnaliser des conditions aux limites (4b/4) On récupère la valeur du champ de vitesse U au niveau de la condition à la limite On récupère les valeurs de la viscosité du fluide et de la perméabilité du milieu poreux dans le fichier transportproperties On évalue ici le gradient de pression à la limite selon la formule : mu.value() permet d accéder à la valeur de l objet mu déclarer comme dimensionedscalar patch().nf() renvoie le vecteur normal au patch $ wclean $ wmake libso on compile la librairie ldarcygradpressure.so qui est maintenant valable pour tous les solveurs 88
Exercice n 10 : Modèle à 2 températures (1/6) Objectif n 1 : Résoudre un transfert de chaleur dans un milieu poreux par un modèle à 2 équations (1) (2) (3) Objectif n 2 : Utiliser des conditions à la limite personnalisées (4) On va créer notre solveur en se basant sur le solveur darcytemperaturefoam $ cd $WM_PROJECT_USER_DIR/applications/solvers/ $ $ cp r darcytemperaturefoam darcytwotemperaturesfoam $ cd darcytwotemperaturesfoam $ mv darcytemperaturefoam.c darcytwotemperaturesfoam.c $ gedit Make/files 89
Exercice n 10 : Modèle à 2 températures (2/6) $ gedit createfields.h Le champ U est maintenant initialisé à partir de 0/U, ce qui nous permet de définir des conditions d entrée pour U phi est créé en appelant createphi.h Déclaration des champs de température pour le solide et pour le fluide Les constantes du modèles seront lues dans le fichier constant/transportproperties 90
Exercice n 10 : Modèle à 2 températures (3/6) $ gedit darcytwotemperaturesfoam.c Résolution de la température dans le fluide. Une partie du terme d échange est traitée en implicite, l autre en explicite. Résolution de la température dans la matrice poreuse. $ wclean $ wmake 91
Exercice n 10 : Modèle à 2 températures (4/6) On cherche à évaluer le transfert de chaleur dans un milieu poreux 1D via un modèle à deux températures Dans cet exemple, un milieu poreux initialement à 573K est refroidit par l injection d un fluide à 273K Milieu poreux de perméabilité k Vitesse U in imposée et de porosité eps en entrée P 0 Température du fluide Tf in imposée en entrée Flux de chaleur (fluide et solide) libre en sortie On va se baser sur l exercice précédent pour paramétrer le calcul $ run $ mkdir darcytwotemperaturesfoam $ cp r../darcytemperaturefoam/exo8 Exo10 $ cd Exo10 $ rm r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9* sets probes $ mv 0/T 0/Tf $ cp 0/Tf 0/Ts $ gedit 0/Tf 92
Exercice n 10 : Modèle à 2 températures (5a/6) $ gedit 0/U On impose une vitesse du fluide à l entrée du milieu. Cette vitesse va permettre d évaluer le gradient de pression à l entrée. 93
Exercice n 10 : Modèle à 2 températures (5b/6) $ gedit 0/p On utilise ici la condition à la limite darcygradpressure définie dans l exercice précédent. Le gradient de pression à la limite est évalué via : On doit préciser dans le fichier system/controldict que l on utilise la librairie ldarcygradpressure.so 94
Exercice n 10 : Modèle à 2 températures (5c/6) $ gedit 0/Ts 95
Exercice n 10 : Modèle à 2 températures (5d/6) $ gedit 0/Tf 96
Exercice n 10 : Modèle à 2 températures (5e/6) $ gedit constant/transportproperties 97
Exercice n 10 : Modèle à 2 températures (5f/6) $ gedit system/controldict On précise ici que l on va utiliser la librairie ldarcygradpressure.so qui nous permettra d utiliser la condition à la limite personnalisée darcygradpressure 98
Exercice n 10 : Modèle à 2 températures (5g/6) $ gedit system/fvsolution $ gedit system/fvschemes 99
Exercice n 10 : Modèle à 2 températures (6/6) On lance la simulation : $ darcytwotemperaturesfoam On post-traite ensuite les résultats (ici on a tracé les valeurs de Ts et Tf en fonction du temps pour les 3 sondes) 100
101