La stratégie à suivre pour faire ou modifier un cas pré-existant

 

Nous présenterons dans ce qui suit deux cas simples d'applications du code OpenFOAM.

 

Tout d'abord, le premier cas correspond au cas test de la cavité entraînée, en démontrant pas à pas les différentes étapes à franchir afin de mettre en place un simulation numérique sur OpenFOAM. Puis, nous étudierons un cas plus complexe, celui d'une chambre chauffée par le bas, pour montrer comment on peut comprendre une simulation sur tutoriel avec un solveur plus complexe, et comment, à partir de là, on peut adapter notre projet.

Cas test 1 : Cavity

Dans ce qui suit, nous nous inspirerons essentiellement les conseils donnés sur les sites  suivants:

http://www.openfoam.org/docs/user/cavity.php#x5-40002.1

http://openfoamwiki.net/index.php/How_to_add_temperature_to_icoFoam

Néanmoins, nous tenterons d'effectuer une synthèse ainsi que de souligner notamment les difficultés que l'on pourrait rencontrer. Aussi, dans le prolongement de la cavité entraînée, nous traiterons également de l'ajout d'une équation de température (et on traitera alors de la convection Rayleigh-Benard).

 

 

Tout d'abord, en cas de modification apporté à un tutoriel de base, il faut absolument éviter de modifier directement le cas de base qui constitue une référence. Tout d'abord il convient de créer un répertoire de travail personnel dans lequel effectuer nos modifications en utilisant la commande suivante :

> mkdir -p /work/username/OpenFOAM/username-${WM_PROJECT_VERSION}/run

Puis, il est conseillé de copier les exemples du tutoriel qui se trouvent normalement dans les sources, soit depuis $WM_PROJECT_DIR/tutorials  vers le dossier /work/username/OpenFOAM/username-${WM_PROJECT_VERSION}/run.

Enfin, il ne reste plus qu'à se placer dans les tutoriels dans le solveur de notre choix, pour tester les différents cas test proposés.

 

Dans ce qui nous intéressera dans les prochains paragraphes, on cherchera plutôt à étudier et modifier un cas déjà existant de cavité entraînée, auquel on accède rapidement en entrant la commande suivante :

> cd /work/username/OpenFOAM/username-${WM_PROJECT_VERSION}/run/tutorials/incompressible/icoFoam/cavity

Remarque : ce faisant, on se place dans le fichier de base copié pour le solveur icoFoam, que l'on peut exécuter immédiatement. Toutefois, il serait préférable de copier le dossier cavity au sein même de icoFoam  pour chaque nouvelle modification que l'on apportera.

Cas de la cavité entraînée

 

Tout d'abord, on peut se servir d'un modèle déjà existant pour se faire une idée de la mise en place d'une simulation numérique sous OpenFOAM.

Notre objectif est d'effectuer la simulation numérique du cas suivant :

 

           Figure : Geometry of the lid driven cavity

source : http://www.openfoam.org/docs/user/cavity.php#x5-40002.1

Nous nous plaçons dans le cas d'un écoulement incompressible, d'un fluide Newtonien, en régime laminaire transitoire. Cela correspond au solveur icoFoam que nous utiliserons.

 

 

Tout d'abord, avant de commencer l'étude d'un cas sur OpenFOAM dans un terminal donné, taper la commande : 

> source /mnt/hmf/OpenFOAM/OF21.sh

Sans cela, il se peut que des commandes que l'on appliquera ultérieurement ne soient pas reconnues. Cette commande n'est valide que sur le terminal utilisé, et sera à entrer sur tout nouveau terminal.

Pour étudier ce cas, nous partirons des tutoriaux, qui sont déjà prêt à être lancés. Par conséquent, nous utiliserons la commande suivante pour nous rendre à l'emplacement voulu :

> cd $FOAM_RUN/tutorials/incompressible/icoFoam/cavity

Puis, il possible de directement lancer le cas test avec :

> icoFoam

Enfin, nous pouvons observer les résultats suivant :

> paraFoam

 

Figure : Obtention des résultats d'une simulation existante pour un cas de cavité entraînée

Remarque : le 'Time' indiqué représente le temps physique auquel on est parvenu pour la simulation.

 

 

 

 

Ajout de l'équation de température

Dans ce qui suit, nous nous inspirerons essentiellement des conseils donnés sur le site suivant (en établissant toutefois une synthèse de ce que nous connaissons également pour ne retenir que ce qui reste le plus utile) :

http://openfoamwiki.net/index.php/How_to_add_temperature_to_icoFoam

 

Aussi, nous nous servirons du cas de la cavité entraînée que nous modifierons : en effet, on mettra la vitesse de la plaque du haut à 0 m/s, et nous verrons par la suite comment imposer des températures sur les faces voulues.

Il s'agit d'une modification apportée sur un cas simple, pour un solveur assez simple donné. Ce genre d'ajout peut être bien plus difficile à adapter suivant le solveur employé. Néanmoins, même dans ce cas simple, des modifications non négligeables doivent être apportées au niveau des fichiers sources du répertoire copié.

 

Création du répertoire source modifiable

 

Tout d'abord, il faut se placer au niveau du répertoire run/ dernièrement établi, et y créer le répertoire applications/solvers, comme c'est indiqué par les commandes ci-dessous :

> cd /work/username/OpenFOAM/username-{WM_PROJECT_VERSION}/run

> mkdir -p applications/solvers

> cd  applications/solvers

Puis il faut aller chercher dans les fichiers sources le solveur voulu à copier dans le répertoire solvers/. Par exemple, on copiera le répertoire icoFoam/ sous le nom de exe_icoFoam/, comme c'est indiqué dans les lignes suivantes, pour le cas particulier de la configuration des ordinateurs à l'ENSEEIHT :

> cp -r /mnt/hmf/OpenFOAM/OpenFOAM-2.1.0/applications/solvers/incompressible/icoFoam exe_icoFoam
 

Puis, en se plaçant dans exe_icoFoam/, on trouve divers fichiers d'extension .C, .H, et un dossier Make/. Il convient tout d'abord de détruire comme il suit :

> rm icoFoam.dep

et de renommer comme il suit :

> mv icoFoam.C exe_icoFoam.C

Puis, dans le dossier Make/ :

> rm -rf linuxGccDP0pt

De plus, il ne faut pas oublier de changer dans le fichier files les lignes avec 'icoFoam' en :

exe_icoFoam.C

EXE = $(FOAM_USER_APPBIN)/exe_icoFoam

Finalement, on peut vérifier que l'installation renommée marche à l'aide de la commande :

> wmake

Aussi, si tout a bien fonctionné, un fichier nommé exe_Foam devrait apparaître au niveau du répertoire suivant :

> ls $FOAM_USER_APPBIN

 

 

Modifications à apporter au niveau du code source

 

Une fois que l'on a  effectué ces modifications, il convient à présent d'ajouter les champs de température au coeur même des équations à résoudre. Ainsi, en ouvrant le fichier createFields.H, on aura :

                                               

Puis, après avoir ajouté la grandeur température à l'ensemble des grandeurs résolues, on implémente désormais la nouvelle équation à résoudre en ouvrant le fichier exe_icoFoam.C et en procédant comme indiqué ci dessous :

                               

 

Attention ! Ce travail terminé, enregistrer les résultats, et exécuter dans exe_icoFoam/ la commande  :

> wmake

Si aucun message d'erreur apparaît, on peut procéder aux modification au sein du fichier du cas étudié.

 

Modifications à apporter au sein du fichier du cas étudié

 

Il est tout d'abord fortement recommandé de copier le cas étudié, par exemple dans notre cas le dossier cavity/ qui se trouve dans usernamel/OpenFOAM/username-2.1.0/run/tutorials/incompressible/icoFoam ("username-2.1.0" car la version d'OpenFOAM utilisée est ici 2.10), dans le répertoire run/ de l'arborescence de fichiers manipulée, et peut-être de le renommer cavity_T/

Puis, en se plaçant dans cavity_T/, aller dans le répertoire constant/ et ajouter les lignes suivantes dans le fichier transportProperties :

DT            DT [0 2 -1 0 0 0 0] 0.002;

Cette ligne s'ajoute à la suite de la ligne sur la viscosité cinématique, avec la même structure. Pour l'instant, la valeur numérique importe peu.

Enfin, aller dans le répertoire 0/ et créer le fichier T comme il suit :

                                            

Remarque : il est important de bien retrouver les noms des faces définies dans le fichier blockMeshDict. Quand aux conditions limites, nous avons ici repris l'exemple qui est communément répété.

Enfin, en allant dans le répertoire system/, il y a deux dernier fichiers à modifier. 

Le fichier fvSchemes de la manière suivante :

Et le fichier fvSolution :

 

 

Quand tout ce travail est fini et sauvegardé, il suffit de se placer dans cavity_T/, et d'exécuter les commandes :

> source /mnt/hmf/OpenFOAM/OF21.sh                 (si cela n'a pas déjà été fait)

> blockMesh                                                                 (juste pour être sûr)

> exe_icoFoam

Si aucun message d'erreur apparaît, il doit être possible d'observer les résultats obtenus via paraFoam.

Cas test 2 : Hot Room

Dans le cas suivant, nous exécuterons le cas test du solveur dont nous nous servirons ultérieurement pour notre projet. Il s'agit de buoyantBoussinesqSimpleFoam, et nous testerons le cas de la chambre chaude (hotRoom/).

Aucune modification au niveau des équations du solveur utilisé n'étant requise, nous nous placerons pour cette simulation dans le répertoire buoyantBoussinesqSimpleFoam/, situé au niveau de : tutorials/heatTransfer/. Puis, nous copierons le répertoire hotRoom/ pour ensuite l'exécuter directement (en tapant : > buoyantBoussinesqSimpleFoam).

 

Premières erreurs possibles

Les premières difficultés surviennent lorsqu'un message d'erreur s'affiche expliquant qu'il ne peut trouver le fichier T. Le plus simple pour nous est de copier le fichier T.org situé dans 0/ en T, et éventuellement de modifier certaines valeurs si on le souhaite.

De plus, on s'aperçoit que, au cours de modifications mineures comme un insignifiant changement au niveau du maillage (passage d'un maillage de 20x20x40 à 40x40x80,  par exemple), le calcul divergeait purement et simplement ! Ce problème réside au niveau du pas de temps fixe, que l'on peut ajuster au niveau du fichier controlDict, dans le répertoire system/. Il convient de manière générale de respecter la règle du nombre de CFL (ou nombre de Courant Friedrichs Lewy), qui se résume à :

$ CFL = \frac{U \delta_{t}}{\delta_{x}} $ , et $ CFL < 1$, en tout point.

Avec U étant la norme de la vitesse (principalement suivant la direction $\overrightarrow{x}$),  $\delta_{t}$ étant le pas de temps, et $\delta_{x}$ l'intervalle entre 2 mailles.

 

Réglage de la précision pour la simulation numérique

Aussi, il conviendra pour la suite de choisir une tolérance convenable pour nos calculs. Suivant l'échelle et la précision avec lesquelles on travaille, il peut être bon de modifier le facteur de convergence au niveau des résidus, dans le fichier fvSolution, dans system/, comme c'est indiqué ci dessous :

 

Ici, on prend une précision à 10-6 en guise d'exemple, et parce que c'est ce  qui se prête le plus à nos travaux.

En effet, si la convergence mentionnée est atteinte trop tôt, le calcul s'arrêtera même si l'on a pas atteint le temps physique voulu, ou même si la situation semble continuer à évoluer à l'oeil nu sur paraFoam pour certaines grandeurs physiques. Il est donc important de prêter attention à la précision désirée, mesurable par le biais des résidus obtenus.

 

Comment relancer une simulation à partir d'un instant donné ?

Finalement, dans le cas où une simulation est interrompue trop tôt ou voudrait être poursuivie pour un temps physique plus long, il est assez simple de repartir du dernier temps enregistrer sur OpenFOAM : en effet, il suffit d'ouvrir le fichier controlDict situé dans system/, et de modifier la valeur du 'startTime' pour le faire commencer à la dernière itération enregistrée (c'est le nom du dernier fichier créé dans le répertoire du cas étudié), ainsi que la valeur de 'endTime' pour le faire terminer au temps physique voulu.