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