• Aucun résultat trouvé

maillage

1.9.1 Méthode

L’objectif final de notre outil est d’être capable de simuler l’écoulement au sein de fermes d’hydroliennes composées de multiples machines (de l’ordre de la centaine). La surface du domaine de simulation va donc passer de quelques centaines de mètres carrés pour une turbine seule, à plusieurs kilomètres carrés dans le cas d’une ferme d’hydroliennes à pleine échelle. Les cas de simulation les plus grands nécessiteront alors un nombre élevé de cellules en fonction du nombre de machines qui composeront les fermes et de la précision de calcul requise.

Deux propriétés entrent en jeu pour diminuer les temps de calcul globaux : -la parallélisation du code, de manière à distribuer la charge de calcul sur plusieurs processeurs

-la possibilité de raffiner et dé-raffiner localement l’espace pour obtenir une précision suffisante dans les zones d’intérêt majeur (sillages turbulents, turbulence ambiante amont, ...), et approcher de manière plus grossière les résultats de simulation dans les zones qui présentent un intérêt moindre.

Le travail de recherche qui a été réalisé au cours de ce doctorat s’inscrit dans un cadre algorithmique pré-existant dont voici les caractéristiques :

La figure 1.5 décrit le découpage d’un domaine spatial bi-dimensionnel permet-tant d’obtenir un raffinement de maillage adaptatif (AMR : Adaptative Mesh Re-finement), basé sur une structure de données de type «Octree». Un domaine de simulation initial de dimensions prédéfinies (taille du domaine fluide simulé) est créé, puis est découpé en quatre sous-domaines. Ces quatre sous-domaines peuvent à leur tour, si besoin, être découpés en quatre sous-domaines, de façon récursive, pour raffiner de plus en plus localement les calculs sur une zone spatiale donnée (ici la croix noire).

La notion de «bloc» est utilisée pour décrire ces différentes zones de calcul. Le domaine de simulation initial est appelé bloc racine (root), les quatre sous-blocs qui en découlent sont ses enfants et ainsi de suite (petits-enfants, ...). Un bloc donné (le bloc racine mis à part) a donc un bloc parent et potentiellement 4 blocs enfants (en deux dimensions, 8 en trois-dimensions).

Figure 1.5 – Découpages récursifs du domaine pour l’obtention du raffinement adaptatif de maillage (AMR).

lesquelles les calculs sont réalisés à chaque pas de temps.

Les différents blocs sont repérés par une courbe de remplissage en espace de type «Z-order» basée sur l’utilisation de clefs de Morton [56]. Cette méthode permet de cartographier le domaine, de lui donner une cohérence et d’effectuer des recherches binaires rapides dans la structure de donnée Octree.

Dans l’état actuel du code, le raffinement est exploité de façon statique au moyen de critères de raffinement géométriques simples (régions de formes parallélépipè-diques rectangulaires, cylindriques ou sphériques). Des critères dynamiques, basés par exemple sur les gradients ou encore les hessiens de pression, seront dévelop-pés par la suite pour pouvoir adapter de manière plus précise le raffinement aux grandeurs physiques locales des écoulements simulés.

De manière à accélérer les simulations, cet environnement AMR est intégré dans un contexte parallèle à mémoire distribuée basé sur une stratégie de décomposition de domaine. En pratique, les blocs sont répartis en suivant l’ordre de la courbe de Morton, qui est subdivisée en un nombre de tronçons égal au nombre de processeurs utilisés. De cette manière, la charge de calcul est globalement distribuée de façon équitable entre les différents processeurs.

1.9.2 Performances parallèles

De manière à maximiser les performances de la parallélisation de ce solveur, une optimisation par masquage des temps de communication MPI a été réalisée.

Une étude de scalabilité a été menée et montre de bonnes performances. La figure 1.6 présente les courbes de scalabilité obtenues sur une étude allant de 16 à 1024 cœurs en scalabilité forte et en scalabilité faible, sur un cas tri-dimensionnel avec une grille régulière.

Les courbes de scalabilité forte sont obtenues en fixant le nombre de cellules volumes finis et en faisant varier le nombre de cœurs. Les courbes de scalabilité faible sont obtenues en faisant varier le nombre de cellules volumes finis en même temps que le nombre de cœurs de manière à garder un nombre de cellules par cœur constant. Ces deux études complémentaires permettent d’évaluer les performances parallèles d’un code de calcul.

Une référence de 16 cœurs a été choisie afin d’éliminer les effets d’échelle liés aux communications intra-nœud, et de placer cette étude dans une configuration réaliste de calcul (nous utilisons toujours plus de 16 cœurs dans le cas de simulations hydroliennes).

Un comportement super-linéaire est observé en scalabilité forte pour pratique-ment tous les cas. Ces très bonnes performances peuvent être expliquées par les effets de cache. En effet, lorsque nous augmentons le nombre de cœurs, la taille des buffers diminue, diminuant ainsi les latences de mémoire (pourvu qu’aucune latence de communication ne soit présente, ce qui apparemment est le cas ici).

Une efficacité supérieure à 95 % est obtenue dans tous les cas en scalabilité faible. Notre code de calcul est donc scalable au moins jusqu’à 1024 cœurs et jusqu’à 130 × 106 cellules. De bonnes performances parallèles sont donc attendues pour les applications visées qui correspondent à des calculs ayant cet ordre de grandeur de nombre de cellules.

Figure 1.6 – Etude de scalabilité de 16 à 1024 coeurs en scalabilité forte à gauche (à gauche) et faible (à droite).