Modélisation numérique : TD 3

Transcription

Modélisation numérique : TD 3
Modélisation numérique : TD 3
Frédéric Hourdin
[email protected]
29 janvier 2014
1
Préparation : advection horizontale dans un cadre bi-dimensionnel
L’énoncé est disponible sur
wget http://www.lmd.jussieu.fr/~hourdin/COURS/TD3.pdf
On s’intéresse dans un premier temps à l’advection d’une distribution gaussienne de
traceurs dans la direction x, comme pour le TD2, mais en supposant que le traceur est
défini dans un espace bi-dimensionnel (x, z).
On supposera que la longueur horizontale du domaine est L = 3000 m et verticale
H = 1000 m. On utilisera 300 points sur l’horizontale et 100 sur la verticale pour atteindre une
résolution spatiale isotrope : δx = δz = 10 m. On prendra comme dans le TD2 une concentration initiale de traceur gaussienne, ne dépendant que de x : q(x, z, t = 0) = exp(−[(x−x0 )/λ]2 )
avec λ = L/15 et x0 = L/5.
On prendra un vent horizontal dépendant linéairement de l’altitude U (z) = Umin +
(Umax − Umin ) z/H avec Umin = 2 m s−1 et Umax = 10 m s−1 et un pas de temps δt pour
l’advection tel que le nombre de Courant Umax δt/δx = 0, 2.
Pour cette première partie, on utilisera le code disponible dans l’archive
wget http://www.lmd.jussieu.fr/~hourdin/COURS/TD3.tar
tar xvf TD3.tar
gedit TD3maquette.f90
1.1
Premiers tracés à partir de fichiers ASCII
Pour réaliser les premiers tracés, le code ’TD3maquette.F90’ utilise une écriture relativement artisanale, analogue à ce qui était proposé dans le TD2 :
integer, parameter :: imax=300,kmax=100
real xxx(imax),zzz(kmax),qqq(imax,kmax)
character*5 fichier
fichier="e...."
write(file(2:5),’(i4.4)’) it
open (10,file=fichier,form=’formatted’)
do k=1,kmax
do i=1,imax
write(10,*) xxx(i),zzz(k),qqq(i,k)
enddo
enddo
close(10)
1
Une fois le programme compilé et exécuté, vous verrez apparaı̂tre des fichiers ASCII ’e0101’
que vous pourrez tracer en lançant par exemple le logiciel ferret
ferret
Puis tapper les lignes suivantes :
DEFINE AXIS/X=10:3000:10 xm
DEFINE AXIS/Z=10:1000:10 zm
sh da
DEFINE GRID/X=xm/Z=zm gm
FILE/VAR="xlu,zlu,q"/GRID=gm e0001
FILE/VAR="xlu,zlu,q"/GRID=gm e0701
show data
fill q[d=1]
fill/o/lev=(0.05,1,0.05)/pal=orange_blue q[d=2]
contour/o/lev=(0.1,1,0.1) q[d=2]
Vous pouvez aussi directement lancer sous ferret le ”script” qui contient ses lignes et que
vous avez récupéré dans l’archive. Pour ce faire :
go trace.jnl
Les mêmes fichiers doivent pouvoir être tracés avec gnuplot.
Ferret sauvegarde systématiquement tout ce que vous avez tapé comme commande dans
un fichier ferret.jnl qui devient ferret.jnl.˜N˜(avec N=1, 2, ...) pour archive. Une fois que
vous êtes content d’une figure, vous pouvez récupérer le dernier ferret.jnl dans un fichier
majoliefigure.jnl (mv ferret.jnl majoliefigure.jnl).
Vous pouvez ensuite créer une image gif de la façon suivante :
ferret -gif -nojnl
go majoliefigure.jnl
frame/file=mafigure.gif
quit
1.2
Utilisation de la librairie netcdf
On se rend vite compte que cette façon de procéder est trop manuelle. Pour automatiser
les entrées/sorties, on va utiliser le format auto-documenté ”netcdf”.
Pour ce faire, on va commencer par remplacer, dans le fichier ”TD3maquette.F90” la ligne
#undef IONC
par
#define IONC
Les lignes incluses entre des lignes
#ifdef IONC
et
#endif IONC
2
seront alors considérées comme faisant partie du code fortran (ce n’était pas le cas précédemment)
lors de l’application d’un préprocesseur ’cpp’. Il s’agit d’une opération préalable à la compilation qui s’applique automatiquement aux fichiers se terminant par ’.F90’ plutôt que ’.f90’.
Le programme fera alors appel aux sous-programmes : ”iotd ini” qui crée un fichier netcdf,
”iotd ecrit” qui va écrire une variable dans le fichier créé et ”iotd fin” qui referme le fichier.
Ces sous-programmes fortran sont disponibles dans l’archive comme vous pouvez le constater
en lançant la commande
ls iotd*
Il font eux-même appel aux sous-programmes de la librairie ’netcdf’. Si vous lancez la compilation de TD3maquette.F90 seul, vous verrez que la compilation échoue. Il faut en fait compiler
simultanément les sous-programmes et ”éditer les liens” avec la librairie netcdf. Ceci peut
être fait automatiquement avec le script ’compile.x’ se trouvant sur le répertoire
./compile.x TD3maquette.F90
qui crée l’exécutable ’TD3maquette.exe’ plutôt que ’a.out’. Une fois le programme exécuté,
vous trouverez sur votre répertoire un fichier ’coucou.nc’. On peut regarder le contenu de ce
fichier grâce à la commande
ncdump -h coucou.nc
ncdump coucou.nc | more
Ce fichier s’ouvre sous ferret avec la commande
use coucou.nc
On peut voir le contenu du fichier sous ferret avec la commande
show data
Pour tracer le panache au pas de temps 5 il suffit de faire
fill/l=5 qexact
1.3
Advection horizontale
Coder l’advection horizontale du traceur avec un schéma amont (comme dans le TD2) et
tracer le traceur à deux instants.
2
Panache de cheminée : calcul explicite et paramétrisation
Dans cette question, on reprend les mêmes paramètres que précédemment, sauf qu’on
suppose que le champ de traceur est initialement nul sur tout le domaine.
On suppose en revanche qu’on a une source ponctuelle continue (le haut d’une cheminée
d’usine par exemple). En pratique on imposera à tout instant que
q(imax/6, 3 ∗ kmax/4) = 1.
3
(1)
2.1
Calcul explicite 2D
On suppose également que, en plus du vent horizontal, on a un vent vertical, fluctuant
dans le temps et dans l’espace.
Pour simplifier le calcul de l’advection (champ de vent non divergeant dans la direction
verticale), on va supposer que le champ de vent vertical W ne dépend que de la direction
horizontale et du temps.
On prendra comme formule :
x
x
0, 2 sin(k1 π − t/τ1 ) + sin(k2 ∗ π − t/τ2 )
L
L
W (x, t) = Wmax
(2)
avec Wmax = 5 m s−1 , k1 = 30, τ1 = 50 s, k2 = 10 et τ2 = 66 s soit, en fortran :
www=wmax*(0.2*sin(30.*pi*xxx(i)/xmax-temps/50.)+sin(10.*pi*xxx(i)/xmax-temps/66.))
Il sera intéressant, à chaque pas de temps, de calculer αz (x) = δtW (X)/δz. Effectuer le
calcul sur 2000 pas de temps et faire des sorties à des instants successifs.
2.2
Calcul avec diffusion
On suppose maintenant W (z) = 0 mais on ajoute dans le calcul une diffusion tubulente
avec un coefficient de diffusion constant dans le temps et dans l’espace Kz = 50 m2 /s.
Pour préparer la question suivante, on codera le calcul de la diffusion verticale en deux
étapes. Dans le première, on calculera le flux de traceur
Fq (x, z) = ρw0 q 0 = −Kz
∂q
∂z
(3)
Effectuer également un calcul sur 2000 pas de temps avec les mêmes valeurs des paramètres.
2.3
Comparaison des deux calculs
Comparer la concentration moyenne du traceur pour les deux calculs entre les pas de
temps 1000 et 2000, soit en traçant des profils verticaux en x = L soit en traçant des cartes
bi-dimensionnelles. La moyenne du traceur entre les pas de temps 3 et 10 se trace sous ferret
grâce à l’instruction
fill qexact[l=3:10@ave]
On fixera si possible les iso-valeurs des tracés bi-dimensionnels avec l’instruction suivante :
fill/lev=(0.001)(0.002)(0.005)(0.01)(0.02)(0.05)(0.1)(0.2)(0.5) qexact[l=10]
Commenter.
Faire le lien entre le coefficient Kz et les valeurs des fluctuations de W dans le calcul
explicite.
4