WN CFD 06 76
WN CFD 06 76
Estelle Etienne
Je tiens en premier lieu à remercier Jean-François Boussugue, notre chef d’équipe et Marc
Montagnac, mon maître de stage pour m’avoir accueillie au CERFACS.
Merci aussi à Yann Colin qui a toujours su répondre à mes questions avec compétence et
patience, merci à Guillaume Puigt pour sa gentillesse et sa disponibilité, merci à Antoine Devesa,
mon collègue de bureau, qui m’a suivie dans mon apprentissage de Linux... enfin merci à toute
l’équipe pour la bonne ambiance qui y règne.
Je tiens aussi à remercier mes collocataires pour ces quatre mois agréables passés à Toulouse.
Bonne continuation à vous tous !
2
Table des matières
Introduction 7
3 Points d’étude 20
3.1 Modélisation de la turbulence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.1.1 Modèle de Spalart-Allmaras . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.2 Modèle k-ω . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.3 Couche limite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.4 Phénomènes physiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2 Influence des schémas numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.1 Schéma centré de Jameson . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.2 Schéma décentré de Roe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 Techniques d’accélération de la convergence . . . . . . . . . . . . . . . . . . . . . . 34
3.3.1 Méthode explicite / implicite . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3
3.3.2 Méthode multi-grille . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Conclusion 38
4
Table des figures
2.1 TP squelette . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Conditions initiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Géométrie du profil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 configuration du maillage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5 Répartition des points sur le profil . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6 repère propre au maillage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.7 Maillage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5
Liste des notations
6
Introduction
Le stage ingénieur, dont le travail est décrit dans ce rapport, a été effectué au sein de la
société CERFACS (Centre de Recherche et de Formation Avancée en Calcul Scientifique) dans
le département Computational Fluid Dynamics (CFD) au sein de l’équipe AAM (Advanced Ae-
rodynamics and Multiphysics). L’entreprise, ses activité principales, son organisation et celle de
l’équipe AAM sont présentées dans l’annexe A.
Le sujet du stage, "création d’une base de données de Travaux Pratiques en calcul numérique"
s’inscrit dans un projet interne au Cerfacs. Une série de trois Travaux Pratiques avait déjà été
mise au point mais les sujets ne suivaient pas une architecture commune.
Cette base de données a pour but de proposer un ensemble de sujets construits sur le même
modèle. La première étape a été de définir la base de tous les sujets : un TP squelette, qui servira
de canneva pour la construction de tous les TP. Le choix d’un plan chronologique a été fait. A
chaque étape, figurent les points théoriques qui interviennent. Ce sont ces différents points que les
travaux pratiques s’attachent à illustrer. Ils apparaissent ou non dans l’énoncé selon les objectifs
du sujet.
Ces Travaux Pratiques sont à vocation pédagogique. Ils sont destinés à initier les élèves de
troisième année de l’ENSEEIHT à la simulation numérique avec le code de calcul elsA utilisé chez
Airbus. Dans un premier temps, le but est de leur faire intégrer le déroulement d’un calcul CFD et
ensuite d’aborder certaines notions importantes de la modélisation et des méthodes numériques.
Cette base de données a été mise en ligne sur un site internet de type WIKI (www.cerfacs.fr/wiki/cfdwiki),
ce qui offre la possibilité de l’enrichir à tout moment. Vous pouvez aller consulter ce site pour mieux
vous rendre compte du travail effectué durant le stage.
7
Chapitre 1
PmWiki est un système de type wiki pour la création et l’entretien collectif de sites Internet.
Un WikiWikiWeb est un "système ouvert d’édition" où l’accent est mis sur l’écriture et la
collaboration à l’écriture de documents plutôt que la lecture rapide ou leur visualisation simple. Le
mot "wiki" provient du terme hawaïen "wiki wiki" qui signifie "informel" ou "rapide". Le concept
de base d’un WikiWikiWeb (ou "wiki") est que (presque) tout le monde peut éditer n’importe
quelle page. L’objectif de ce système est de rendre la création et l’édition de contenus en ligne
aussi facile que possible
Les pages PmWiki ont le même aspect et fonctionnent comme des pages Internet ordinaires,
sauf qu’elles possèdent un lien pour "éditer" ce qui permet de modifier ou d’ajouter facilement
des pages à un site, en utilisant les règles d’édition de base. Il n’est pas nécessaire de connaître
le langage HTML. Il existe notamment un émulateur Latex pour faciliter l’écriture des formules
mathématiques. L’édition des pages peut être laissée ouverte à tout public ou restreinte à un
groupe d’utilisateurs.
Le choix d’un support Wiki a été fait déjà pour permettre un travail collaboratif durant le
stage et pour donner l’opportunité à ce site d’évoluer et de s’enrichir. Par la suite, ce site sera
ouvert à d’autres utilisateurs tels que l’ONERA. D’autres sujets de TP pourront être proposés et
rédigés en se servant des travaux déjà effectués. Ils bénéficieront de tout l’environnement du site.
8
raient l’énoncé et qui ne sont pas forcément nécessaires aux étudiants. Elles permettent
d’obtenir rapidement une aide ponctuelle durant la séance.
– un lexique qui recense les mots difficiles et en donne une brève définition.
Rappels théoriques
On y trouve pour l’instant deux parties, les équations de base et une partie théorique sur
la couche limite, mais au fur et à mesure de l’évolution du site, de nouveaux points théoriques
y seront traités. La partie « Equation de base » rappelle les équations d’Euler, Navier-Stokes, et
Navier-Stokes moyennées (RANS). Ce sont ces équations que résout le code de calcul elsA utilisé
dans les TP. Ce code de calcul est présenté dans la partie suivante.
Outils
Il s’agit d’un inventaire des logiciels que les étudiants vont être amenés à utiliser, avec pour
chaque logiciel, un lien vers un pseudo guide d’utilisation orienté spécifiquement pour ce qui est
demandé en TP. Y figurent les logiciels de visualisation Tecplot et Quickview, l’outil EDM (Editor
of Model) qui permet de générer les fichiers nécessaires à un calcul elsA et de convertir les résultats
du calcul au format souhaité, le code de calcul elsA où l’on trouve la démarche à suivre pour lancer
un calcul et enfin un guide Unix qui répertorie les commandes de base et qui présente l’éditeur de
texte « vi ».
9
Fig. 1.1 – page d’accueil
10
– Etat amont : On défini le champ infini. On donne les valeurs adimensionnées des variables
conservatives et des quantités turbulentes suivant le modèle de turbulence choisi. On ini-
tialise généralement l’état initial avec les valeurs de l’état infini.
– Création et initialisation des blocs : c’est là que l’on fournit le maillage.
– Conditions aux limites : celles-ci doivent être précisées pour chaque frontière.
– Extraction des résultats : on précise dans cette partie les variables à extraire et le nom des
fichiers dans lesquels on souhaite les mettre.
Il ne s’agit bien évidemment pas là d’une liste exhaustive des possibilités d’un script Python pour
ce qui est de la définition des conditions d’un calcul, mais, sont cités les principaux paramètres
que l’on a été amené à modifier pendant ce stage.
11
Chapitre 2
2.1 TP squelette
Le TP squelette est, comme il a été dit dans l’introduction, le modèle sur lequel sont et
seront construits tous les autres sujets de TP. Son plan doit pouvoir convenir pour n’importe quel
cas test. C’est pourquoi on a choisi un plan chronologique qui permet aussi de bien mettre en
évidence le déroulement d’un calcul en insistant sur chaque étape. Le TP squelette s’apparente à
un cours succint de CFD organisé de manière chronologique. En effet, à chaque étape, figurent les
points théoriques qui s’y rattachent, sous forme de lien. S’il font partie intrinsèque du déroulement
d’un calcul, ils apparaissent systématiquement dans l’énoncé du TP, sinon, s’il s’agit de points
se rapportant au numérique, ils apparaissent selon l’objectif du sujet. Le plan du TP squelette
(cf Figure 2.1) reprend donc les étapes d’un calcul, à savoir : l’analyse du cas physique, le pré-
traitement, le maillage, le calcul à proprement parler, et le post-traitement.
12
Fig. 2.1 – TP squelette
Sur ce modèle là, ont déjà été traités trois cas tests : « Plaque plane », « Calcul Euler autour
d’un profil NACA 0012 » et « Ecoulement autour d’un profil RAE2822 ». Nous allons voir comment
chaque étape a été illustrée au sein des TP.
13
2.2 Analyse du cas physique
Cette partie permet de poser le problème. Elle sera plus ou moins importante selon la com-
plexité du cas. On y fixe d’une certaine manière l’objectif du TP : on référence dans cette partie
sous forme de mots clefs les points importants du TP afin d’orienter l’analyse des étudiants.
2.3 Pré-traitement
L’étape de pré-traitement sert à créer le script Python qui sera ensuite « lu » par elsA. On
calcule là les valeurs adimensionnées du champ initial et on fixe les conditions aux limites.
14
2.3.2 Conditions aux limites
L’attribution des conditions aux limites est une étape primordiale, et qui peut ne pas être
évidente. Plusieurs possibilités peuvent convenir sans pour autant qu’elles donnent les même ré-
sultats. C’est pour initier les étudiants à ce choix qu’est donné une liste des conditions aux limites
usuelles. La configuration du maillage leur est fournie avec, en couleur, les frontières des blocs du
maillage pour lesquelles ils ont à choisir les conditions aux limites. Ils n’auront pas cependant à
entrer dans le script Python.
2.3.3 Adimensionnement
Pour résoudre les équations de Navier-Stokes, il est conseillé d’utiliser des quantités adimen-
sionnées. Il n’existe pas de système d’unité dans elsA. C’est donc à l’utilisateur de rentrer des
données utilisant un système d’unité cohérent.
La normalisation est basée sur le choix de 4 quantités indépendantes que l’on prend égales
à l’unité. La longueur de référence est toujours prise égale à 1. Il existe quatre possibilités
qui mènent aux normalisations SRPT (Static-Rho-Pressure-Temperature), SRVT (Static-Rho-
Velocity-Temperature), SRCT (Static-Rho-Celerity-Temperature) et TRCT
(Total-Rho-Celerity-Temperature).
Selon la normalisation choisie, on fixe certaines quantités et les autres sont calculées à l’aide
des relations isentropiques. Le fluide est considéré comme un gaz parfait. Est détaillée ici la nor-
malisation SRPT. On prend donc les trois variables suivantes égales à 1 :
ρ∗∞ = 1 , p∗∞ = 1 , ∗
T∞ = 1.
p∞ = ρrgaz T∞ ,
avec
rgaz = Cv(γ − 1) .
On en déduit :
p∞ = ρ∞ (γ − 1)CvT∞
et il vient
1
Cv = .
γ−1
D’après la relation
γ − 1 2 γ−1
−γ
p∞ = pt∞ 1 + M∞ ,
2
on déduit :
γ − 1 2 γ−1
γ
p∗t∞ = 1 + M∞ .
2
De même, pour Tt∞ , d’après la relation :
γ − 1 2 −1
T∞ = Tt∞ 1 + M∞ ,
2
on déduit :
γ−1 2
Tt∗∞ = 1 + M∞ .
2
D’après la relation : q
a∞ = (γrgaz T∞ ) ,
15
soit : p
a∞ = γ(γ − 1)CvT∞ ,
il vient :
√
a∗∞ = γ.
Il en découle :
∗ √
U∞ = M∞ a∗∞ = M∞ γ .
D’après la relation :
1 2
et∞ = Cv T∞ + U∞ ,
2
on déduit :
1 1 2
e∗t∞ = + M∞ γ.
γ−1 2
D’après la relation :
ht∞ = γCvTt∞ ,
il résulte :
γ γ−1 2
h∗t∞ = (1 + M∞ ) .
γ −1 2
Comme on connaît le nombre de Reynolds, et que l’on a la relation :
ρ∞ U ∞
µ∞ =
Re∞
il vient : √
M∞ γ
µ∗∞ = .
Re∞
On accède aux valeurs des variables conservatives ρu, ρv et ρw grâce aux relations suivantes :
ρu = ρ∞ U∞ cos(α)cos(β)
ρv = ρ∞ U∞ sin(β)
ρw = ρ∞ U∞ sin(α)cos(β)
Cet exercice est proposé au début de chaque TP. Les étudiants ont un script Python à remplir.
Dans un souci de facilité, les scripts ont été modifiés, on a créé de nouvelles variables qui renvoient
aux valeurs adimensionnées à entrer et que l’on a placées en début de script.
2.4 Maillage
Le maillage sera, dans la majorité des cas, fourni. C’est une étape longue qui alourdirait
considérablement les TP si elle devait être répétée à chaque séance. Il est cependant souhaitable
que les étudiants en aient l’expérience pour apprendre à ne pas négliger cette étape et se rendre
compte de l’impact d’un maillage plus ou moins bien fait sur le calcul.
Le sujet « calcul Euler autour d’un profil NACA 0012 » est un TP qui s’échelonnera sur
plusieurs séances dont une consacrée au maillage. Le mailleur utilisé s’appelle Megacads. Les
étudiants ne connaissant pas le logiciel, toutes les étapes sont détaillées. Voilà, en général, comment
s’effectue la réalisation d’un maillage :
• On choisit dans quel repère on va travailler. On importe les données géométriques du profil,
un ensemble de points, par lequel on fait passer une courbe. On a ainsi créé la géométrie du
profil (cf. Figure 2.3). On définit ensuite le domaine de calcul en créant les frontières et on crée à
l’intérieur les blocs du maillage qui seront discrétisés (cf. Figure 2.4).
16
• On répartit les points du maillage aux frontières. On choisit une distribution de Poisson, de
manière à avoir une discrétisation plus fine près du profil. On peut choisir la longueur des premier
et dernier espacements. Pour les blocs qui ne sont pas rectangulaires, on joue sur cette valeur
pour obtenir le maillage le plus orthogonal possible, ce qui est le gage d’un maillage de qualité (cf.
Figure 2.5).
• Le maillage à créer est un maillage structuré : un sommet du maillage est repéré par un
triplet (i,j,k), ce qui impose une conservation du nombre de maille sur les faces « parallèles » des
blocs. Pour construire le maillage, on fonctionne comme dans un repère, en reliant les points des
frontières qui se font face. (cf. Figures 2.6 et 2.7).
Ce maillage sera ensuite utilisé pour le calcul, ce qui permettra de voir (un peu trop tard !) si
il était ou non bien fait. Pour ne pas fausser les résultats attendus dans la suite du TP, un maillage
dont on est sûr est fourni. Ce qui simplifiera aussi la démarche de calcul. En effet le passage d’un
maillage Mégacads à un fichier d’entrée elsA est long et présente de nombreuses occasions de se
tromper. C’est pourquoi, on a mis au point deux scripts qui reprennent les commandes à effectuer.
17
Fig. 2.5 – Répartition des points sur le profil
18
préciser le script Python qu’ils exécutent. Ce fichier batch est un script de commande qui permet
de se « logger » sur le calculateur et d’avoir accès aux processeurs de calcul. Les processeurs
sont attribués selon un système de queue. Nos calculs sont assez courts et s’effectent sur un seul
processeur, on se met donc sur la queue « dev » pour développement. L’avantage de cette queue
est la rapidité de passage, mais le temps alloué par calcul est faible, aux alentours de 20 minutes.
#!/bin/tcsh
# BSUB -n 1
# BSUB -o sortie%J.txt
# BSUB -e sortie%J.txt
# BSUB -q dev
# BSUB -J naca
echo ’------------------------------------------------------------’
setenv MPI_USE_LIBELAN_SUB 0
cd $LS_SUBCWD
source ~etienne/ELSA/setupelsa.csh I3203g dec_r8_so ~etienne/ELSA
elsa -f naca01-1deg_V.epy
echo ’------------------------------------------------------------’
2.6 post-traitement
Le post-traitement consiste à visualiser les résultats. On utilise pour cela le logiciel Tecplot.
Pour les visualisations un peu compliquées, une aide Tecplot est accessible depuis la barre d’outils.
Ce lien répertorie suivant les TP les visualisations à faire et guide l’étudiant. On cherche à valider
les résultats numériques par comparaison avec des données expérimentales, ou à observer des
phénomènes physiques.
19
Chapitre 3
Points d’étude
L’objectif de ce chapitre est de présenter succintement l’ensemble des points théoriques abor-
dés et de montrer comment ils ont été illustrés.
20
– les modèles à une seule équation de transport, comme le modèle de Spalart-Allmaras,
permettent de calculer directement l’évolution de µt en fonction des champs conservatifs,
– les modèles à 2 équations de transport, comme le modèle k − ω de Wilcox calculent 2
échelles de la turbulence et ces 2 échelles permettent d’obtenir µt par relation algébrique.
Dans le cadre des TP, seuls les modèles de Spalart-Allmaras et k − ω de Wilcox ont été présentés.
21
Sous-couche linéaire
Zone logarithmique
Dans cette zone, les tensions turbulentes dominent la composante laminaire du tenseur des
contrainte car la viscosité turbulente domine la viscosité laminaire. La viscosité turbulente est
obtenue par produit des échelles caractéristiques de la turbulence. Des essais en souflerie montre
qu’on peut la modéliser comme suit :
µt = ρκuτ y .
La nouvelle constante est appelée constante de Von Karman : κ = 0.41.
On a par ailleurs,
∂u
µt = ρw u2τ ,
∂y
et d’autre part, la contrainte de Reynolds reste en première approximation constante dans la
direction normale à la paroi :
τ = τw = ρw u2τ
On obtient donc,
∂u ∂u
µt = ρu2τ = ρκuτ y
∂y ∂y
où y représente la distance à la paroi. Soit,
uτ ∂u
=
ky ∂y
On peut intégrer cette équation par rapport à y et l’écrire en fonction des variables de paroi,
soit :
1
u+ = ln(y + ) + C
k
où C est une constante d’intégration.
Les très nombreux essais en soufflerie subsonique et transonique montrent que c’est une
constante universelle proche de 5. La loi logarithmique est valable pour des valeurs de y + supé-
rieures à environ 30. La région comprise entre y + = 3 et y + = 30 est appelée région tampon.
22
Comparaison entre calculs et lois théoriques
Les comportements théoriques sont obtenus sur une plaque plane. L’objectif d’un TP est
de les retourver par simulation numérique. Pour cela, on simule avec elsA un écoulement sur
une plaque plane adiabatique à M∞ = 0.85. Pour retrouver les lois linéaire et logarithmique (cf
Figure 3.1), on construit les variables de paroi u+ et y + et on trace la fonction u+ = f (y + ). On se
place en un point assez éloigné du bord d’attaque de la plaque afin de disposer d’une couche limite
suffisamment établie. On récupère la valeur du frottement pariétal en ce point. On fait ensuite
une coupe en ce même point suivant la direction normale à la paroi et on relève les valeurs de la
viscosité et de la masse volumique à la paroi.
Frame 001 21 Sep 2006 Laminar computation -- Flat Plate
20
uplus, uplus_th, uplus_log
15
u+=f(y+)
u+=y+
u+=5.6 log(y+)+5
10
0 0 1 2 3 4 5
10 10 10 10 10 10
yplus
Les couches limites pour les régimes d’écoulement laminaire et turbulent sont différentes(cf
Figure 3.2). La couche limite turbulente est plus épaisse que la laminaire. En effet, la loi de
variation de la vitesse dépend de la viscosité du fluide qui induit un frottement entre les couches
voisines. Par rapport à un écoulement laminaire, il existe en plus de la viscosité turbulente qui
renforce le terme de diffusion visqueuse. Comme l’écoulement est plus visqueux, il y a besoin de
plus de place pour que la vitesse locale atteigne la valeur de la vitesse amont.
Les écoulements sur plaque plane sont les plus simples à reproduire par le calcul. On doit
obtenir la même couche limite pour tous les modèles de turbulence (cf. Figure 3.2) dans la mesure
où les modèles ont été mis au point pour coller aux résultats expérimentaux sur la plaque plane.
Sur des configurations plus complexes, comme un profil d’aile d’avion par exemple, les résul-
tats peuvent fortement différer. Dans le cadre du TP « Ecoulement autour d’un profil RAE2822 »
23
Frame 001 21 Sep 2006 Laminar computation -- Flat Plate
0.7
0.6
laminaire
Spalart
K-Omega
0.5
u
0.4
0.3
0 0.02 0.04
y
Fig. 3.2 – Plaque plane - couche limite laminaire et turbulente. Effet du choix du modèle de
turbulence.
on traite deux cas bien connus d’écoulements transoniques, les cas 9 et 10, pour lesquels on pos-
sède des données expérimentales. Ces cas servent notamment à valider ou comparer des modèles
numériques.
Le cas 9 est un cas considéré sans décollement ou avec un décollement très faible. Pour ce cas,
on obtient des résultats qui collent bien aux données expérimentales. On visualise le coefficient de
pression et le coefficient de frottement (cf Figures 3.3 et 3.4). On constate que les deux modèles
de turbulence donnent des résultats quasiment identiques.
24
Frame 001 27 Sep 2006 RAE2822 - Mach 0.73
Spalart
1 K-Omega
exp
0.5
Cp, V2
-0.5
0.01
Spalart
Spalart
K-Omega
K-Omega
exp
Cf, frictionmodulus, V2
0.005
-0.005
Le cas 10 est un cas avec décollement en pied de choc (cf Figure 3.5). Là, la physique est
beaucoup plus complexe et les modèles ne sont pas initiallement conçus pour la reproduire par-
faitement. On touche là aux limites d’une modélisation RANS. Les calculs effectués dans le cadre
du TP montrent que la position du choc et la taille du décollement sont dépendants du choix du
25
modèle de turbulence. Aucun ne donne la même chose et aucun non plus n’est capable de prédire
correctement la position du choc. On remarque que la simulation prédit le choc trop tard par
rapport à la solution expérimentale (cf Figure 3.6) et que l’évolution du frottement (variation de
u) change fortement entre les 2 modèles (cf. Figure 3.7). On retrouve la présence d’un décollement
quand le coefficient de frottement change de signe le long du profil, car il est directement lié aux
variations de la vitesse par la relation Cf = µ ∂u
∂y .
0.0535
0.053
z
0.0525
0.052
0.659 0.66
x
Fig. 3.5 – RAE2822 (cas 10) - vecteurs vitesse suivant une ligne du maillage proche du pied du
choc. Visualisation du retournement des vecteurs vitesse (décollement)
26
Frame 001 21 Sep 2006 RAE2822 - Mach 0.73
K-Omega
1 Spalart
exp
Cp, V2
0.5
-0.5
0.008 Spalart
Spalart
K-Omega
0.006 K-Omega
exp
Cf, frictionmodulus, V2
0.004
0.002
-0.002
-0.004
27
3.1.4 Phénomènes physiques
Déplacement du choc avec l’incidence
L’écoulement autour d’un profil est fortement dépendant des conditions de vol. Pour le vérifier
à moindre coût numérique, un TP propose d’effectuer 2 calculs Euler autour du profil NACA0012
pour 2 angles d’incidence différents. On constate alors que la position du pied de choc sur le profil
change fortement (décalage de 5% vers le bord de fuite). Ce résultat est montré sur les figures 3.8
et 3.9.
Frame 002 20 Sep 2006 NACA0012 - Mach 0.85
0.3
0.1
0.2
z
0.1
0
0
-0.1
0.8 1
x
0.2
0.1
0.2
z
0.1
z
0 0
-0.1
0.8 1
x
-0.1
28
Phénomène de décrochage
Le phénomène de décrochage est lié à une baisse de la portance Cz et peut être obtenu
par le calcul. Pour preuve, une polaire est tracée en scéance de TP pour le profil NACA 0012
en Euler. Normalement, le décrochage n’existe pas avec les écoulements obtenus par résolution
des équations d’Euler car le décrochage est lié à la viscosité du fluide dans la couche limite (en
particulier, présence de décollement). Les équations d’Euler ne permettent pas de modéliser une
couche limite et c’est la viscosité numérique du solveur elsA qui permet ici de construire une telle
polaire.
Polaire : Cz = f (α)
1.4
1.2
0.8
Cz
0.6
0.4
0.2
0
0 2 4 6 8 10 12 14 16
angle d’attaque en degrés
Fig. 3.10 – Polaire obtenue par calcul Euler : effets de la viscosité numérique d’elsA.
29
Fig. 3.11 – détails du maillage
On peut réécrire :
∂Y
Z Z
= Y.n.ds ,
Ci ∂x ∂Ci
avec
– ∂Ci bord de la cellule Ci ,
– n vecteur normal dirigé vers l’extérieur de Ci .
Ainsi, en 1D, :
∂Y
Z
α = fi+1/2 − fi−1/2
Ci ∂x
où fk représente le flux à l’interface k et f peut s’écrire sous la forme f = αY . Pour les deux
schémas expliqués ci-dessous, on ne s’interessera plus qu’au flux numérique permettant le calcul
des flux advectifs aux interfaces.
30
Il s’agit donc d’un schéma centré d’ordre 2. Mais un schéma purement centré est instable,
c’est pourquoi on utilise le schéma centré de Jameson qui lui rajoute de la dissipation numérique
ou dissipation artificielle. L’équation d’advection s’écrit alors :
∂u ∂u ∂4u
+a = 4
∂t ∂x ∂x
et le flux à l’interface :
1
fi+1/2 = (fi + fi+1 ) − k 4 (ui+2 − 3ui+1 + 3ui−1 + ui−2 ) .
2
si α > 0
fi
fi+ 12 =
fi+1 si α < 0
a>0 a<0
i i+1
a>0
a<0
31
α− = min(α, 0)
|α| = α+ − α−
α = α+ + α−
On obtient :
ui+1 + ui ui+1 − ui
fi+1/2 =α − |α| ,
2 2
soit :
1 |α|
fi+1/2 = (fi+1 + fi ) − (ui+1 − ui ) .
2 2
Mettre en évidence l’influence des schémas numériques sur une simulation est assez difficile
car on constatera seulement que le calcul aboutit ou n’aboutit pas. C’est ce que l’on montre
aux étudiants dans un premier temps en leur faisant lancer un calcul avec un schéma purement
centré puis avec un schéma décentré de Roe. Ces calculs introduisent une activité Matlab qui
vient en démonstration et explication du comportement des schémas numériques. Trois schémas
numériques différents ont été codé sous Matlab. Il s’agit du schéma de Lax-Wendroff, que l’on
peut rapprocher d’un schéma centré, d’un schéma « upwind method » qui correspond à un schéma
décentré et d’un schéma « superbee limiter » que l’on peut comparer à un schéma décentré d’ordre
2. On les applique à un maillage, où l’on a initialisé une moitié en forme de porte à la valeur u0 .
On recalcule la valeur de l’écoulement à chaque pas de temps avec les trois schémas. On observe
l’évolution de la solution exacte.
On constate effectivement que le schéma purement centré est instable, que le schéma décentré
est trop dissipatif alors que le schéma décentré d’ordre deux reste assez proche de la solution exacte.
32
Fig. 3.13 – schémas numériques à t=0s
33
Fig. 3.16 – schémas numériques à t=7s
W n+1 − W n
V +R=0
∆t
avec V le volume d’une cellule et W vecteur des variables conservatives.
Phase explicite
On réécrit l’équation :
W n+1 − W n
V + Rn = 0
∆t
avec Rn calculé au temps n, c’est-à-dire avec les champs conservatifs pris au temps n. On parle
alors de schéma explicite car l’état n + 1 se calcule directement à partir de l’état n :
∆t n
W n+1 = W n − R
V
La phase explicite à l’avantage d’être facile à implémenter. Cependant, elle n’est pas très
robuste. Sa condition de stabilité impose un pas de temps très faible et par conséquent un grand
nombre d’itérations pour atteindre la convergence. Le temps et le coût de calcul peuvent ainsi être
très importants.
34
Phase implicite
On réécrit l’équation :
∆W
V + Rn+1 = 0
∆t
On développe Rn+1 en séries de Taylor :
∆R n
Rn+1 = Rn + ∆W
∆W
On réinjecte dans l’équation :
−
→ ∆R n
∆W
V + Rn + ∆W = 0
∆t ∆W
∆R n
V
⇐⇒ I+ ∆W + Rn = 0
∆t ∆W
⇐⇒ K∆W + Rn = 0
⇐⇒ ∆W = K −1 Rn
La phase implicite revient à faire une inversion de matrice, ce qui est assez lourd ; cependant,
il n’y a pas de limitation sur le CFL, ce qui implique une réduction du temps de calcul importante.
Dans la pratique, on ne calcule pas exactement la matrice inverse, mais on l’approxime. Il
existe plusieurs méthodes. On peut soit l’approximer par un scalaire, soit essayer d’en calculer une
valeur aprochée par des méthodes numériques d’inversion de matrice (méthode LU par exemple).
35
Fig. 3.17 – 2 niveaux de grilles
36
Frame 001 28 Sep 2006 NACA0012 - Mach 0.85 - Residus
0
10
10-2 monogrille
multi-grille
10-4
residual_ro
-6
10
-8
10
-10
10
10-12
10-14
37
Conclusion
Le site propose donc aujourd’hui trois TP cohérents avec le modèle de base que l’on s’est fixé.
Grâce au système Wiki, il va être amené à evoluer, en s’enrichissant de l’apport de chacun : de
nouveaux sujets de TP, des points théoriques supplémentaires ou plus approfondis, un lexique plus
complet, etc. Le fait d’avoir défini un modèle à suivre impose quelques contraintes de rédaction
selon le sujet mais garantit cependant une unité des sujets de TP et une évolution structurée du
site.
On peut se rendre compte avec le recul que les TP ne présentent pas aux étudiants une vision
très objective de ce qu’est le numérique. En effet, les exercices proposés ont été « prémachés »
pour que les calculs soient rapides et aboutissent. En réalité, le travail d’ingénieur en simulation
numérique est une boucle comprennant :
– le maillage,
– le prétraitement du calcul,
– le calcul lui-même,
– le post-traitement.
et plusieurs passages de cet algorithme sont souvent nécéssaires pour obtenir une solution de bonne
qualité.
38
Annexe A
présentation du Cerfacs
Créé en 1987, le CERFACS est une organisation de recherche qui a pour but de développer
des méthodes avancées pour la simulation numérique et la solution algorithmique de problèmes
scientifiques et technologiques complexes intéressant aussi bien la recherche que l’industrie. Cette
mission requiert l’accès aux ordinateurs les plus puissants disponibles.
Le CERFACS a cinq actionnaires :
1. le CNES (Centre National d’Études spatiales)
2. EADS (European Aeronautic and Defence Space company)
3. EDF (Électricité de France)
4. Météo-France
5. SNECMA (Société Nationale d’Étude et de Construction de Moteurs d’Avions)
Le CERFACS abrite des équipes inter-disciplinaires, aussi bien pour la recherche que pour
la formation avancée dans les domaines de la physique, les mathématiques appliqués, l’analyse
numérique et l’informatique.
Environ 100 personnes travaillent au CERFACS, dont 90 chercheurs et ingénieurs venant de
10 pays différents. L’activité est répartie en six groupes de recherche :
1. algorithmique parallèle
2. aérodynamique
3. combustion
4. climat et environnement
5. fusion de données
6. électromagnétisme.
Moyens informatiques
39
configuration de 4096 processeurs. Démontrant ainsi l’excellente stalabilité de leur code puisque
proche d’un speed-up linéaire.
40
Annexe B
!/usr/bin/env EpMuse.py
# ==========================================================================
# Project: elsA - DSNA/ELSA - Copyright (c) 1998-2000 by ONERA
# Type : <17470693 7474> Test file
# File : script/naca01-EXTRACT/naca01-EXTRACT.epy
# Vers : $Revision: 1.13 $
# Chrono : No DD/MM/YYYY Author V Comments
# 1.1 15/05/2000 MCLP 2.0 User Python, tex text, nb it, join.
# 1.0 30/08/1999 AJ/SB 1.0 Creation
# ==========================================================================
# Name naca01-EXTRACT
# Memo transonic inviscid flow around a 2-D profile - 1 domain
# See
# void
# Physics
# 1- Configuration
# > 2-D profile
# 2- Computational domain
# > The computational domain is a C-shape domain around the profile.
# 3- Equations
# > Euler equations with perfect gas EOS
# 4- Wall conditions
# > Slip condition on the walls
# 5- External conditions
# > Non-reflective conditions
# 6- Initial conditions
# > Uniform flowfield
# Numerics
# 1- Computational domain
# > See physics for the definition of the domain
# > Mesh : 1 domain with 257x33x2 mesh points
# 2- Space discretization
# > Jameson centered scheme with artificial dissipation
# 3- Time discretization
# > Explicit Runge-Kutta (RK4) with local time stepping
# 4- Resolution method
# > Explicit
# 5- Wall conditions
# > boundary type "wallslip" with extrap 0
# 6- External conditions
# > boundary type "nref"
# 7- Initial conditions
# > At t=t0, the far-field state is defined in each cell.
# Computer
# 1- Type : SGI
# 2- Processors: 1
# 3- Memory: ?
# 4- CPU: ?
#
# Files
# 1- Data
# > not used
# 2- Mesh
# > ./naca_eu.mai
# 3- t0 fields
# > not used
# 4- t1 fields
# > not used
# Design
# void
41
# References
# void
#
# ===========================================================================
#
# --- HighLigths
# This par is used into the Validation document
# Each line is a LaTeX item, thus you can insert pure LaTeX text
#
#@ NACA0012 2D wing profile.
#@ Infinite flow : ${M_\infty}~=~0.85$, $\alpha~=~1\deg$.
#@ Steady transonic perfect gas flow.
#@ Mesh:~ $257 \times 33 \times 2$ .
#@ Initial field : far-field state.
#@ Jameson centered fluxes with artificial dissipation ‘‘dissca’’ : $[~0.5~,~0.032~,~1~]$.
#@ Time integration : Runge-Kutta 4 steps with freezing.
#@ Implicit residual smoothing.
#@ Local time step.
#@ 1500 iterations, CFL=15.
#@ Flux extraction.
#
import time
#
# ---------------------------------------------------------------------------
# PRELIMINARY COMPUTATION
#
# Reference used by normalization: RoInf, Vinf
# Calculation of the far-field state corresponding to the values
# of the Mach number and the angle of attack
# (flow is 2-D in coordinates (x,z))
#
from math import *
#
MachInf=0.85
Gamma=1.4
Alpha = 1.0 * pi /180.
Pinf = 1. / (Gamma*MachInf*MachInf)
#
RoInf = 1.
RouInf = cos(Alpha)
RovInf = 0.
RowInf = sin(Alpha)
RoeInf = Pinf/(Gamma-1.) + 0.5
#
IBF1=33
IBF2=225
#
IMIN=1
IMAX=257
#
JMIN=1
JMAX=33
#
KMIN=1
KMAX=2
#
#-----------------------------------------------------------
# PROBLEM CREATION AND NAMING
#----------------------------
#
naca = cfdpb(name=’naca’)
naca.set(’config’,’2d’)
#
#-----------------------------------------------------------
# MESH CREATION, NAMING, DESCRIPTION
#-----------------------------------
#
mshnaca = mesh(name=’mshnaca’)
#
mshnaca.set(’file’,’naca_eu.mai’)
mshnaca.set(’format’,’fmt_tp’)
#
mshnaca.submit()
#
#-----------------------------------------------------------
# BLOCK CREATION, NAMING, DESCRIPTION
#------------------------------------
#
blknaca = block(name=’blknaca’)
#
42
blknaca.set(’mesh’,’mshnaca’)
#
blknaca.show()
blknaca.submit()
#
#-----------------------------------------------------------
# MODEL CREATION, NAMING, DESCRIPTION
#------------------------------------
#
mod = model(name=’mod’)
#
mod.set(’fluid’,’pg’)
mod.set(’phymod’,’euler’)
mod.set(’gamma’,1.4)
#
mod.show()
mod.submit()
#
#-----------------------------------------------------------
# NUMERICS CREATION, NAMING, DESCRIPTION
#---------------------------------------
#
num = numerics(name=’num’)
num.set(’limiter’,’none’)
#num.set(’multigrid’,’none’)
num.set(’restrict_type’,’synchronous’)
#
num.set(’time_algo’,’steady’)
num.set(’ode’,’rk4’)
num.set(’implicit’,’irs’)
num.set(’flux’,’jameson’)
num.set(’artviscosity’,’dissca’)
num.set(’av_base’,[0.5, 0.032, 1.0])
num.set(’freezing’,1)
num.set(’multigrid’,’w_cycle’)
num.set(’nbcoarsegrid’,2)
num.set(’nitercoarse’,2)
num.set(’niter’,700)
num.set(’inititer’,1)
#
#
num.set(’avcoef_k2’,0.5)
num.set(’avcoef_k4’,0.032)
num.set(’avcoef_sigma’,1.)
#
num.set(’freqcomptimestep’,1)
num.set(’cfl’,11.)
#
#
num.set(’freqcompres’,1)
num.set(’convergence_level’,1e-10)
#
num.show()
#
#-----------------------------------------------------------
# BOUNDARY CREATION, NAMING, DESCRIPTION
#---------------------------------------
# No boundary on K-faces due to 2-D calculation
#
#--- jmin - join
#
w1 = window(’blknaca’,name=’w1’)
#
w1.set(’iw1’,IMIN)
w1.set(’iw2’,IBF1)
w1.set(’jw1’,JMIN)
w1.set(’jw2’,JMIN)
w1.set(’kw1’,KMIN)
w1.set(’kw2’,KMAX)
#
b1 = boundary(’blknaca’,’w1’,’join’,name=’b1’)
#
b1.set(’jtype’,’match’)
b1.set(’blkrac’,’blknaca’)
b1.set(’wndrac’,’w3’)
#
#--- jmin - wallslip
#
w2 = window(’blknaca’,name=’w2’)
#
43
w2.set(’iw1’,IBF1)
w2.set(’iw2’,IBF2)
w2.set(’jw1’,JMIN)
w2.set(’jw2’,JMIN)
w2.set(’kw1’,KMIN)
w2.set(’kw2’,KMAX)
#
b2 = boundary(’blknaca’,’w2’,’wallslip’,name=’b2’)
#
b2.set(’extrap’,0)
#
#--- jmin - join
#
w3 = window(’blknaca’,name=’w3’)
#
w3.set(’iw1’,IBF2)
w3.set(’iw2’,IMAX)
w3.set(’jw1’,JMIN)
w3.set(’jw2’,JMIN)
w3.set(’kw1’,KMIN)
w3.set(’kw2’,KMAX)
#
b3 = boundary(’blknaca’,’w3’,’join’,name=’b3’)
#
b3.set(’jtype’,’match’)
b3.set(’blkrac’,’blknaca’)
b3.set(’wndrac’,’w1’)
#
#--- jmax - nref
#
w4 = window(’blknaca’,name=’w4’)
#
w4.set(’iw1’,IMIN)
w4.set(’iw2’,IMAX)
w4.set(’jw1’,JMAX)
w4.set(’jw2’,JMAX)
w4.set(’kw1’,KMIN)
w4.set(’kw2’,KMAX)
#
b4 = boundary(’blknaca’,’w4’,’nref’,name=’b4’)
#
b4.set(’state’,’stateInf’)
#
#--- imin - nref
#
w5 = window(’blknaca’,name=’w5’)
#
w5.set(’iw1’,IMIN)
w5.set(’iw2’,IMIN)
w5.set(’jw1’,JMIN)
w5.set(’jw2’,JMAX)
w5.set(’kw1’,KMIN)
w5.set(’kw2’,KMAX)
#
b5 = boundary(’blknaca’,’w5’,’nref’,name=’b5’)
#
b5.set(’state’,’stateInf’)
#
#--- imax - nref
#
w6 = window(’blknaca’,name=’w6’)
#
w6.set(’iw1’,IMAX)
w6.set(’iw2’,IMAX)
w6.set(’jw1’,JMIN)
w6.set(’jw2’,JMAX)
w6.set(’kw1’,KMIN)
w6.set(’kw2’,KMAX)
#
b6 = boundary(’blknaca’,’w6’,’nref’,name=’b6’)
#
b6.set(’state’,’stateInf’)
#
#-----------------------------------------------------------
# INITIAL FIELD CREATION, NAMING, DESCRIPTION
#--------------------------------------------
#
stateInf = state(name=’stateInf’)
#
stateInf.set(’ro’, RoInf)
44
stateInf.set(’rou’,RouInf)
stateInf.set(’rov’,RovInf)
stateInf.set(’row’,RowInf)
stateInf.set(’roe’,RoeInf)
#
winit = window(’blknaca’,name=’winit’)
#
winit.set(’all’,’yes’)
#
init1 = init(’winit’,name=’init1’)
#
init1.set(’state’,’stateInf’)
#
#-----------------------------------------------------------
# EXTRACTION CREATION, NAMING, DESCRIPTION
#-----------------------------------------
#
#--- Cell extraction
#
wext1 = window(’blknaca’,name=’wext1’)
#
wext1.set(’all’,’yes’)
#
ext1 = extract(’wext1’,name=’ext1’)
#
ext1.set(’file’,’naca01_1deg_W_cell.tp’)
ext1.set(’var’,’conservative ’)
ext1.set(’title’,’NACA0012 - Mach 0.85 ’)
ext1.set(’loc’,’cell’)
#
#--- Node extraction
#
wext2 = window(’blknaca’,name=’wext2’)
#
wext2.set(’iw1’,1)
wext2.set(’iw2’,IMAX)
wext2.set(’jw1’,1)
wext2.set(’jw2’,JMAX)
wext2.set(’kw1’,1)
wext2.set(’kw2’,1)
#
ext2 = extract(’wext2’,name=’ext2’)
#
ext2.set(’file’,’naca01-1deg_W_node.tp’)
ext2.set(’var’,’xyz ro rou rov row roe mach’)
ext2.set(’title’,’NACA0012 - Mach 0.85 ’)
ext2.set(’loc’,’node’)
#
#--- Cell + boundary extension extraction
#
ext3 = extract(’wext1’,name=’ext3’)
#
ext3.set(’file’,’naca01-1deg_W_cellfict.tp’)
ext3.set(’var’,’xyz ro mach’)
ext3.set(’title’,’NACA0012 - Mach 0.85 ’)
ext3.set(’loc’,’cellfict’)
#
#--- Residus
#
extRes = extract_group(name=’extRes’)
#
extRes.set(’title’,’NACA0012 - Mach 0.85 - Residus’)
extRes.set(’windows’,’winit’)
extRes.set(’var’,’residual_ro residual_rou residual_row residual_roe’)
extRes.set(’file’,’./residual_1deg_W.tp’)
extRes.set(’norm’,1)
#
#--- Lift (standard output)
#
extLift1 = extract_group(name=’extLift1’)
#
extLift1.set(’windows’,’+w2’)
extLift1.set(’var’,’convflux_row’)
extLift1.set(’fluxcoeff’,-2.)
#
#--- Lift (file)
#
extLift2 = extract_group(name=’extLift2’)
#
extLift2.set(’title’,’NACA0012 - Mach 0.85 - Lift (fluxcoeff -2)’)
45
extLift2.set(’windows’,’+w2’)
extLift2.set(’var’,’convflux_row’)
extLift2.set(’file’,’./lift_1deg_W.tp’)
extLift2.set(’fluxcoeff’,-2.)
#
#--- Test : mode = 2
#
extMode = extract_group(name=’extMode’)
#
extMode.set(’title’,’Test : mode=2’)
extMode.set(’windows’,’-w2’)
extMode.set(’var’,’convflux_row’)
extMode.set(’file’,’./allfluxes_1deg_W.tp’)
extMode.set(’fluxcoeff’,-2.)
#
#--- Test : multiple observors period/mode
#
extObs = extract_group(name=’extObs’)
#
extObs.set(’windows’,’-w2’)
extObs.set(’var’,’convflux_row’)
extObs.set(’period’,2)
#
#--- Test : lift on two windows
#
w7 = window(’blknaca’,name=’w7’)
#
w7.set(’iw1’,IBF1)
w7.set(’iw2’,100)
w7.set(’jw1’,JMIN)
w7.set(’jw2’,JMIN)
w7.set(’kw1’,KMIN)
w7.set(’kw2’,KMAX)
#
w8 = window(’blknaca’,name=’w8’)
#
w8.set(’iw1’,100)
w8.set(’iw2’,IBF2)
w8.set(’jw1’,JMIN)
w8.set(’jw2’,JMIN)
w8.set(’kw1’,KMIN)
w8.set(’kw2’,KMAX)
#
extWnds = extract_group(name=’extWnds’)
#
extWnds.set(’title’,’Test : lift on two winodws’)
extWnds.set(’windows’,’-w7-w8’)
extWnds.set(’var’,’convflux_row’)
extWnds.set(’file’,’./liftWindows_1deg_W.tp’)
#
#-----------------------------------------------------------
# CONNECTING NUMERICS AND MODEL WITH PROBLEM
#-------------------------------------------
#
naca.set(’global_numerics’,’num’)
naca.set(’global_model’,’mod’)
#
naca.submit()
naca.show()
#
#-----------------------------------------------------------
# FLOW COMPUTATION
#-----------------
#
t1=time.clock()
#
naca.compute()
#
t2=time.clock()
#
#-----------------------------------------------------------
# RESULT EXTRACTION
#------------------
#
naca.extract()
#
#-----------------------------------------------------------
# PRINT CPU Time
#---------------
#
46
print ""
print "============================="
print "CPU Time"
print "-----------------------------"
print "total for compute : ", t2-t1
print "============================="
print ""
#
#-----------------------------------------------------------
# PRINT Memory
#-------------
#
naca.statistics()
#
47
Bibliographie
48