LMDZ
flxtr.F90
Go to the documentation of this file.
1 
2 ! $Id: flxtr.F90 2346 2015-08-21 15:13:46Z emillour $
3 
4 SUBROUTINE flxtr(pdtime, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, pt, pplay, &
5  paprs, kcbot, kctop, kdtop, x, dx)
6  USE dimphy
7  IMPLICIT NONE
8  ! =====================================================================
9  ! Objet : Melange convectif de traceurs a partir des flux de masse
10  ! Date : 13/12/1996 -- 13/01/97
11  ! Auteur: O. Boucher (LOA) sur inspiration de Z. X. Li (LMD),
12  ! Brinkop et Sausen (1996) et Boucher et al. (1996).
13  ! ATTENTION : meme si cette routine se veut la plus generale possible,
14  ! elle a herite de certaines notations et conventions du
15  ! schema de Tiedtke (1993).
16  ! --En particulier, les couches sont numerotees de haut en bas !!!
17  ! Ceci est valable pour les flux, kcbot, kctop et kdtop
18  ! mais pas pour les entrees x, pplay, paprs !!!!
19  ! --Un schema amont est choisi pour calculer les flux pour s'assurer
20  ! de la positivite des valeurs de traceurs, cela implique des eqs
21  ! differentes pour les flux de traceurs montants et descendants.
22  ! --pmfu est positif, pmfd est negatif
23  ! --Tous les flux d'entrainements et de detrainements sont positifs
24  ! contrairement au schema de Tiedtke d'ou les changements de signe!!!!
25  ! =====================================================================
26 
27  include "YOMCST.h"
28  include "YOECUMF.h"
29 
30  REAL pdtime
31  ! --les flux sont definis au 1/2 niveaux
32  ! --pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls
33  REAL pmfu(klon, klev) ! flux de masse dans le panache montant
34  REAL pmfd(klon, klev) ! flux de masse dans le panache descendant
35  REAL pen_u(klon, klev) ! flux entraine dans le panache montant
36  REAL pde_u(klon, klev) ! flux detraine dans le panache montant
37  REAL pen_d(klon, klev) ! flux entraine dans le panache descendant
38  REAL pde_d(klon, klev) ! flux detraine dans le panache descendant
39  ! --idem mais en variables locales
40  REAL zpen_u(klon, klev)
41  REAL zpde_u(klon, klev)
42  REAL zpen_d(klon, klev)
43  REAL zpde_d(klon, klev)
44 
45  REAL pplay(klon, klev) ! pression aux couches (bas en haut)
46  REAL pap(klon, klev) ! pression aux couches (haut en bas)
47  REAL pt(klon, klev) ! temperature aux couches (bas en haut)
48  REAL zt(klon, klev) ! temperature aux couches (haut en bas)
49  REAL paprs(klon, klev+1) ! pression aux 1/2 couches (bas en haut)
50  REAL paph(klon, klev+1) ! pression aux 1/2 couches (haut en bas)
51  INTEGER kcbot(klon) ! niveau de base de la convection
52  INTEGER kctop(klon) ! niveau du sommet de la convection +1
53  INTEGER kdtop(klon) ! niveau de sommet du panache descendant
54  REAL x(klon, klev) ! q de traceur (bas en haut)
55  REAL zx(klon, klev) ! q de traceur (haut en bas)
56  REAL dx(klon, klev) ! tendance de traceur (bas en haut)
57 
58  ! --variables locales
59  ! --les flux de x sont definis aux 1/2 niveaux
60  ! --xu et xd sont definis aux niveaux complets
61  REAL xu(klon, klev) ! q de traceurs dans le panache montant
62  REAL xd(klon, klev) ! q de traceurs dans le panache descendant
63  REAL xe(klon, klev) ! q de traceurs dans l'environnement
64  REAL zmfux(klon, klev+1) ! flux de x dans le panache montant
65  REAL zmfdx(klon, klev+1) ! flux de x dans le panache descendant
66  REAL zmfex(klon, klev+1) ! flux de x dans l'environnement
67  INTEGER i, k
68  REAL zmfmin
69  parameter(zmfmin=1.e-10)
70 
71  ! On remet les taux d'entrainement et de detrainement dans le panache
72  ! descendant a des valeurs positives.
73  ! On ajuste les valeurs de pen_u, pen_d pde_u et pde_d pour que la
74  ! conservation de la masse soit realisee a chaque niveau dans les 2
75  ! panaches.
76  DO k = 1, klev
77  DO i = 1, klon
78  zpen_u(i, k) = pen_u(i, k)
79  zpde_u(i, k) = pde_u(i, k)
80  END DO
81  END DO
82 
83  DO k = 1, klev - 1
84  DO i = 1, klon
85  zpen_d(i, k) = -pen_d(i, k+1)
86  zpde_d(i, k) = -pde_d(i, k+1)
87  END DO
88  END DO
89 
90  DO i = 1, klon
91  zpen_d(i, klev) = 0.0
92  zpde_d(i, klev) = -pmfd(i, klev)
93  ! Correction 03 11 97
94  ! zpen_d(i,kdtop(i)-1) = pmfd(i,kdtop(i)-1)-pmfd(i,kdtop(i))
95  IF (kdtop(i)==klev+1) THEN
96  zpen_d(i, kdtop(i)-1) = pmfd(i, kdtop(i)-1)
97  ELSE
98  zpen_d(i, kdtop(i)-1) = pmfd(i, kdtop(i)-1) - pmfd(i, kdtop(i))
99  END IF
100 
101  zpde_u(i, kctop(i)-2) = pmfu(i, kctop(i)-1)
102  zpen_u(i, klev) = pmfu(i, klev)
103  END DO
104 
105  DO i = 1, klon
106  DO k = kcbot(i), klev - 1
107  zpen_u(i, k) = pmfu(i, k) - pmfu(i, k+1)
108  END DO
109  END DO
110 
111  ! conversion des sens de notations bas-haut et haut-bas
112 
113  DO k = 1, klev + 1
114  DO i = 1, klon
115  paph(i, klev+2-k) = paprs(i, k)
116  END DO
117  END DO
118 
119  DO i = 1, klon
120  DO k = 1, klev
121  pap(i, klev+1-k) = pplay(i, k)
122  zt(i, klev+1-k) = pt(i, k)
123  zx(i, klev+1-k) = x(i, k)
124  END DO
125  END DO
126 
127  ! --initialisations des flux de traceurs aux extremites de la colonne
128 
129  DO i = 1, klon
130  zmfux(i, klev+1) = 0.0
131  zmfdx(i, 1) = 0.0
132  zmfex(i, 1) = 0.0
133  END DO
134 
135  ! --calcul des flux dans le panache montant
136 
137  DO k = klev, 1, -1
138  DO i = 1, klon
139  IF (k>=kcbot(i)) THEN
140  xu(i, k) = zx(i, k)
141  zmfux(i, k) = pmfu(i, k)*xu(i, k)
142  ELSE
143  zmfux(i, k) = (zmfux(i,k+1)+zpen_u(i,k)*zx(i,k))/ &
144  (1.+zpde_u(i,k)/max(zmfmin,pmfu(i,k)))
145  xu(i, k) = zmfux(i, k)/max(zmfmin, pmfu(i,k))
146  END IF
147  END DO
148  END DO
149 
150  ! --calcul des flux dans le panache descendant
151 
152  DO k = 1, klev - 1
153  DO i = 1, klon
154  IF (k<=kdtop(i)-1) THEN
155  xd(i, k) = (zx(i,k)+xu(i,k))/2.
156  zmfdx(i, k+1) = pmfd(i, k+1)*xd(i, k)
157  ELSE
158  zmfdx(i, k+1) = (zmfdx(i,k)-zpen_d(i,k)*zx(i,k))/ &
159  (1.-zpde_d(i,k)/min(-zmfmin,pmfd(i,k+1)))
160  xd(i, k) = zmfdx(i, k+1)/min(-zmfmin, pmfd(i,k+1))
161  END IF
162  END DO
163  END DO
164  DO i = 1, klon
165  zmfdx(i, klev+1) = 0.0
166  xd(i, klev) = (zpen_d(i,klev)*zx(i,klev)-zmfdx(i,klev))/ &
167  max(zmfmin, zpde_d(i,klev))
168  END DO
169 
170  ! --introduction du flux de retour dans l'environnement
171 
172  DO k = 1, klev - 1
173  DO i = 1, klon
174  IF (k<=kctop(i)-3) THEN
175  xe(i, k) = zx(i, k)
176  zmfex(i, k+1) = -(pmfu(i,k+1)+pmfd(i,k+1))*xe(i, k)
177  ELSE
178  zmfex(i, k+1) = (zmfex(i,k)-(zpde_u(i,k)*xu(i,k)+zpde_d(i,k)*xd(i, &
179  k)))/(1.-(zpen_d(i,k)+zpen_u(i,k))/min(-zmfmin,-pmfu(i,k+1)-pmfd(i, &
180  k+1)))
181  xe(i, k) = zmfex(i, k+1)/min(-zmfmin, -pmfu(i,k+1)-pmfd(i,k+1))
182  END IF
183  END DO
184  END DO
185  DO i = 1, klon
186  zmfex(i, klev+1) = 0.0
187  xe(i, klev) = (zpde_u(i,klev)*xu(i,klev)+zpde_d(i,klev)*xd(i,klev)-zmfex( &
188  i,klev))/max(zmfmin, zpen_u(i,klev)+zpen_d(i,klev))
189  END DO
190 
191  ! --calcul final des tendances
192 
193  DO k = 1, klev
194  DO i = 1, klon
195  dx(i, klev+1-k) = rg/(paph(i,k+1)-paph(i,k))*pdtime* &
196  (zmfux(i,k+1)-zmfux(i,k)+zmfdx(i,k+1)-zmfdx(i,k)+zmfex(i,k+1)- &
197  zmfex(i,k))
198  END DO
199  END DO
200 
201  RETURN
202 END SUBROUTINE flxtr
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
subroutine flxtr(pdtime, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, pt, pplay, paprs, kcbot, kctop, kdtop, x, dx)
Definition: flxtr.F90:6
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL &zphi geo500!IM on interpole a chaque pas de temps le paprs
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
Definition: dimphy.F90:1
real rg
Definition: comcstphy.h:1