Résolution numérique des équations de St-Venant par la méthode des volumes finis

La connaissance de la bathymétrie et le maillage

Lorsque l’on veut faire une simulation du cours d’eau d’une rivière, le premier obstacle est la connaissance précise de la bathymétrie. La bathymétrie correspond aux relevés de la profondeur de la rivière et sa connaissance précise est cruciale pour que les simulations numériques aient une chance de correspondre à la réalité. Dans cet objectif, des relevés bathymétriques sont effectués dans les rivières et fleuves que l’on veut simuler. Ces campagnes de mesures sont souvent coûteuses, d’autant plus que la précision demandée est importante. Plusieurs méthodes peuvent être employées pour faire ces relevés. Des lasers peuvent être utilisés pour mesurer la profondeur de l’eau mais ils se limitent souvent à des eaux très peu profondes ou parfaitement limpides. Le reste du temps, ce sont des versions plus ou moins sophistiquées de sonar qui sont utilisées. Ces relevés bathymétriques permettent de générer un maillage du fond de la rivière. Dans le cadre de l’étude d’inondations le domaine à mailler comprend le domaine fluvial ainsi que les rives qui pourront être inondées lors des simulations. Les données bathymétriques doivent donc être couplées à des données topographiques pour créer un maillage complet du domaine d’étude. La création d’un tel maillage nécessite aussi de prendre compte tout un tas d’obstacles dans la rivière, la présence d’îles, de piles de pont et toutes autres structures. La création du maillage d’un domaine de simulation est une tâche longue et demandera souvent une étape de validation durant laquelle plusieurs résultats de simulations seront comparés à des relevés de hauteur d’eau réels pour assurer une bonne précision. On se servira donc, dans un premier temps, de simulations pour lesquelles des relevés de hauteur d’eau sont connus pour valider le maillage. On pourra, dans un second temps, faire une étude des inondations dans des situations plus critiques pour lesquelles des relevés de hauteur d’eau ne sont pas présents.

Différents objectifs de simulation

Lorsque l’on traite un nouveau domaine de simulation, il y a deux phases importantes à traiter. La première consiste à générer une solution stabilisée, c’est-à-dire au régime permanent, sur le domaine pour un débit d’entrée moyen de la rivière. On considère que le régime permanent est atteint lorsque le débit de sortie de la rivière est égal au débit d’entrée pendant une longue période. Cette phase est souvent la plus complexe car l’initialisation de la solution sur tout le domaine pose plusieurs problèmes. On a rarement des relevés précis de hauteur d’eau dans toute la rivière et encore moins des relevés de vitesse. Il nous faut alors choisir arbitrairement ces paramètres pour les premières simulations. Les paramètres ainsi choisis mèneront plus ou moins rapidement à une solution stabilisée. Beaucoup de bancs couvrant-découvrant seront présents et mettront en difficulté la stabilité des différents schémas numériques. On pourra alors utiliser plusieurs stratégies d’initialisation pour converger le plus rapidement vers la solution permanente, parfois au prix d’une solution transitoire qui n’est pas physique. La seconde phase est celle qui présente le réel intérêt pour faire l’étude des inondations. Lors de cette phase on initialisera la simulation à partir de la solution stable calculée précédemment. On lancera ensuite plusieurs simulations en faisant varier certains paramètres. On pourra par exemple simuler de fortes intempéries en augmentant le débit d’entrée de la rivière. Le but de cette seconde phase est de générer une base de données de résultats de simulations lancées avec différents paramètres (débit d’entrée, hauteur de sortie, coefficient de frottement). On pourra par la suite utiliser cette base de données pour faire des études statistiques des inondations (Abdedou & Soulaïmani, 2018; Fahsi, Soulaïmani & Tchamen, 2010; Zokagoa & Soulaïmani, 2012). On peut aussi utiliser ces bases de données pour entraîner des algorithmes de machine learning (Jacquier, Abdedou, Delmas & Soulaïmani, 2020) pour prédire en un temps très faible des situations qui n’ont pas été simulées.

Le besoin d’un calcul rapide Que ce soit pour la première ou la seconde phase des simulations, on veut toujours pouvoir traiter des domaines les plus grands possibles le plus rapidement possible. La possibilité de traiter de très grands maillages comprenant un nombre de cellules très important est cruciale pour avoir une représentation précise de la bathymétrie du domaine. Plus le maillage aura un grand nombre d’éléments, plus il sera simple d’y traduire les relevés bathymétriques et plus le maillage pourra être raffiné dans les zones critiques de la rivière (barrages, piles de ponts, îles). Un maillage plus raffiné combiné à des mesures de bathymétrie précises permettra à coup sûr d’avoir de meilleures solutions. D’autre part, si les calculs sont plus rapides on pourra simuler bien plus de cas d’inondations différents dans un même temps. Plus on simulera de cas différents, plus les bases de données seront fournies ce qui permettra de diminuer les incertitudes sur les prédictions. Pour atteindre ces objectifs on se tourne vers de la programmation parallèle pour distribuer les calculs et/ou la mémoire sur plusieurs unités de calculs. Une revue de littérature des différentes méthodes utilisées pour faire de la programmation parallèle dans le cadre de la résolution des équations de St-Venant sera présentée dans le chapitre 1. On souhaite pour finir cette introduction présenter les raisons qui nous poussent à vouloir utiliser des GPU, puis pourquoi on veut coupler leur utilisation à MPI.

Pourquoi utiliser un GPU? Le GPU : Graphical Processing

Unit est un coprocesseur qui a été historiquement utilisé pour faire du calcul graphique beaucoup plus rapidement que le CPU : Central Processing Unit. Dans cet objectif le GPU est construit avec une architecture SIMD : Single Instruction Multiple Data qui lui permet d’effectuer les mêmes opérations sur une grande quantité de données. Il a vite été remarqué qu’une telle architecture pouvait être particulièrement adaptée à certaines simulations numériques dans lesquelles les mêmes opérations sont répétées sur des données différentes. Dans notre cas, avec une méthode volumes finis explicite en temps, porter le code sur GPU n’est pas une tâche très complexe, bien que l’optimisation requise pour atteindre les plus hauts speed-up peut être longue. Comme on le verra, ce qui rend l’adaptation d’un code sur GPU relativement facile est la manière incrémentale avec laquelle ce portage peut être fait. Finalement, il est relativement simple de trouver de nos jours des ordinateurs fixes ou même portables qui contiennent un GPU et sur lesquels un tel code peut être lancé. Le code est donc relativement portable même si des étapes de configuration du système sont requises.

Table des matières

INTRODUCTION
0.1 La connaissance de la bathymétrie et le maillage
0.2 Différents objectifs de simulation
0.3 Le besoin d’un calcul rapide
0.4 Pourquoi utiliser un GPU ?
0.5 Pourquoi utiliser MPI et une décomposition de domaine ?
0.6 Objectifs du mémoire
0.7 Plan du mémoire
CHAPITRE 1 REVUE DE LITTÉRATURE
1.1 L’utilisation de GPU pour accélérer les calculs
1.2 Le passage au multi-GPU pour utiliser plusieurs GPU
CHAPITRE 2 MODÉLISATION DES ÉCOULEMENTS À SURFACE LIBRE À FAIBLE PROFONDEUR
2.1 Présentation des équations de St-Venant
2.2 Résolution numérique des équations de St-Venant par la méthode des volumes finis
2.2.1 Discrétisation par des schémas de volumes finis
2.2.2 Schéma HLL et HLLC
2.2.3 Traitement des termes sources
2.2.3.1 Bathymétrie
2.2.3.2 Friction
CHAPITRE 3 LES BASES DE LA PROGRAMMATION GPU
3.1 Code hôte et kernels
3.2 Configuration de lancement
3.3 Copies mémoires CPU-GPU : mémoire pageable, pinned et constant
3.4 Première version d’un programme sur GPU
3.5 Profiler et échanges mémoires implicites
3.6 Synchronisation Hôte-Device et superposition de kernels avec des streams
3.7 Mémoire partagée et réductions sur le GPU : l’exemple du minimum
CHAPITRE 4 DÉCOMPOSITION DE DOMAINE
4.1 Utilisation de METIS
4.2 Renumérotation des sous-domaines
4.3 Ajout de mailles fantômes
4.4 Renumérotation des mailles fantômes et génération des informations d’envoi/réception
4.5 Écriture des différents fichiers de sortie
CHAPITRE 5 PROGRAMMATION MULTI-GPU AVEC MPI ET CUDA FORTRAN
5.1 Présentation de MPI
5.1.1 Initialisation, rang et type de variables
5.1.2 Communications globales : Exemple du REDUCE et ALLREDUCE
5.1.3 Communications point à point : SEND et RECV
5.1.4 Communications non-bloquantes
5.2 Échange de mémoire sur le GPU de manière classique
5.3 Échange mémoire sur GPU en utilisant du CUDA-Aware OpenMPI
CHAPITRE 6 CUTEFLOW EN MPI/CUDA-FORTRAN
6.1 Compilation
6.2 Maillages
6.3 Initialisation
6.3.1 Pas de temps local
6.3.2 Mailles sèches comme murs
6.4 Traitement des conditions aux limites
6.5 Fichiers de sortie
6.6 Description du fonctionnement de CUTEFLOW
6.6.1 Recherche des voisins
6.6.2 Calcul des flux
6.6.3 Calcul des termes sources
6.6.4 Calcul de la solution avec Euler explicite et la semi-implicitation
6.7 Superposer le calcul du pas de temps via la CFL et les échanges MPI
6.8 Fin de simulation et post-traitement
CHAPITRE 7 RÉSULTATS
7.1 Grappes de calculs utilisées
7.2 Définition du Speed-Up et de l’efficacité
7.3 Cas d’un bris de barrage unidimensionnel
7.3.1 Solutions
7.3.2 Speed-Up et efficacité pour différents maillages
7.4 Cas de la rivière des Mille Îles
7.4.1 Initialisation du domaine et première solution
7.4.2 Initialisation en mode bris de barrage fictif
7.4.3 Visualisation de la ligne d’inondation
7.4.4 Speed-up et efficacité
7.5 Cas de l’archipel de Montréal
7.5.1 Solutions
CONCLUSION ET RECOMMANDATIONS
ANNEXE I CALCUL DE L’INTÉGRATION SUR LA HAUTEUR D’EAU DES ÉQUATIONS DU MOUVEMENT
ANNEXE II CALCUL DE LA MATRICE JACOBIENNE DU TERME DE FRICTION
BIBLIOGRAPHIE

Cours gratuitTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *