Modifications du solveur

Préparation pour la compilation du nouveau solveur


Afin de mener à bien la simulation finale, celle-ci doit être décomposée en plusieurs sous-simulations. Le fait de diviser ainsi la simulation ajoute un certain nombre de contraintes qui doivent être résolues. Une de ces contraintes est qu'il faut repérer entre chaque simulation la position finale du train de la simulation $n-1$ pour pouvoir communiquer à la simulation $n$. En effet, c'est cette information qui est nécessaire pour pouvoir remailler la géométrie translatée. Cependant, dans le solveur utilisé pimpleDyMFoam, cette information n'est présente nulle part de manière explicite. Il faut donc l'implémenter dans le solveur. Cette étape nécessite de bien comprendre comment s'organise un solveur, et d'être capable de coder quelques lignes en C++, même si de nombreuses aides sont disponibles ce qui facilite grandement la tâche.

Il faut tout d'abord créer une copie du solveur que l'on veut modifier, pimpleDyMFoam. Pour cela, on crée un dossier qui contiendra les solveurs modifiés par l'utilisateur, et on vient copier le solveur original dans ce dossier.

On possède alors une copie du solveur placé dans le dossier $WM_PROJECT_USER_DIR et renommée pimpleDyMFoamModified. Plusieurs fichiers sont présents dans le dossier mais celui qui nous intéresse ici est le fichier principal du solveur qui est pour le moment pimpleDyMFoam.C, que l'on renomme en pimpleDyMFoamModified.C, et on supprime les dépendances et autres fichiers binaires créés lors de la compilation du solveur d'origine.

Une dernière modification est nécessaire avant de pouvoir passer à l'implémentation à proprement parler. Il faut aller modifier le fichier Make/files dans le dossier du solveur qui indique quels fichiers seront à compiler. Le dossier Make est l'équivalent d'un Makefile. On remplace les lignes du fichier par les suivantes :

On indique ici que le fichier à compiler sera pimpleDyMFoamModified.C et que l'exécutable créé se nommera pimpleDyMFoamModified et sera placé dans le bin de l'utilisateur, c'est-à-dire là où sont rangés tous les exécutables créés par l'utilisateur.

 

Modification du solveur


Une fois toute cette préparation préliminaire effectuée, on peut alors passer à l'ajout du calcul de la position du train à la fin d'une simulation. Pour cela, on se place à la fin du fichier principal du solveur et on ajoute les lignes suivantes :

La méthode utilisée est ici assez simple. Notre domaine étant divisé en trois blocs distincts, on vient chercher la position du point le plus à droite du patch farFieldLeft (qui correspond à la condition limite paroi du tunnel sur le bloc de gauche) à la fin de la simulation. Connaissant sa position initiale et sa position finale, on peut alors calculer le déplacement du train.
Les lignes codées ci-dessus reprennent exactement cette démarche. La ligne 113 permet de trouver le patch que l'on cherche. On vient alors récupérer tous les points de cette partie du maillage. Pour cela, on trouve d'abord la partie du maillage correspondant au patch trouvé, à la ligne 115 puis les points correspondants. On déclare ensuite un nombre de type float nommé "max" que l'on initialise à -10000. Ce nombre va en fait nous permettre de trouver la position extrême du patch, en faisant une boucle sur tous les points identifiés comme appartenant au patch. Dès qu'un nombre est plus grand que "max", ce dernier prend sa valeur. Finalement, on affiche la position du segment de gauche du bloc du milieu, qui vaut "max". On est alors en mesure de connaître le déplacement du train durant une simulation.

 

Compilation et test du solveur


Il reste enfin à compiler ce nouveau solveur. Pour cela, on se place dans le dossier du solveur, et on exécute la commande wmake, ce qui aura pour résultat de créer l'exécutable du solveur, et puisque $FOAM_USER_APPBIN est ajouté au PATH, la commande pimpleDyMFoamModified sera disponible depuis le terminal. On peut alors tester notre nouveau solveur sur une simulation simple. Voici ce qui s'affiche à la fin d'une simulation :

Pour récupérer cette valeur, il suffit d'écrire les logs de la simulation dans un fichier, et de venir récupérer cette valeur avec les commandes grep, cut, etc ...

Une fois cette étape terminée, il faut notamment déterminer une procédure pour lancer les simulations et l'intégrer au sein d'un script en bash, qui permet d'automatiser ceci.