1 |
|
|
MODULE lmdz_thermcell_plume_6A |
2 |
|
|
! |
3 |
|
|
! $Id: lmdz_thermcell_plume_6A.F90 4590 2023-06-29 01:03:15Z fhourdin $ |
4 |
|
|
! |
5 |
|
|
CONTAINS |
6 |
|
|
|
7 |
|
288 |
SUBROUTINE thermcell_plume_6A(itap,ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & |
8 |
|
288 |
& zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & |
9 |
|
288 |
& lalim,f0,detr_star,entr_star,f_star,csc,ztva, & |
10 |
|
288 |
& ztla,zqla,zqta,zha,zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis,linter & |
11 |
|
|
& ,lev_out,lunout1,igout) |
12 |
|
|
! & ,lev_out,lunout1,igout,zbuoy,zbuoyjam) |
13 |
|
|
!-------------------------------------------------------------------------- |
14 |
|
|
!thermcell_plume: calcule les valeurs de qt, thetal et w dans l ascendance |
15 |
|
|
!-------------------------------------------------------------------------- |
16 |
|
|
|
17 |
|
|
USE lmdz_thermcell_ini, ONLY: prt_level,fact_thermals_ed_dz,iflag_thermals_ed,RLvCP,RETV,RG |
18 |
|
|
USE lmdz_thermcell_ini, ONLY: fact_epsilon, betalpha, afact, fact_shell |
19 |
|
|
USE lmdz_thermcell_ini, ONLY: detr_min, entr_min, detr_q_coef, detr_q_power |
20 |
|
|
USE lmdz_thermcell_ini, ONLY: mix0, thermals_flag_alim |
21 |
|
|
USE lmdz_thermcell_alim, ONLY : thermcell_alim |
22 |
|
|
USE lmdz_thermcell_qsat, ONLY : thermcell_qsat |
23 |
|
|
|
24 |
|
|
|
25 |
|
|
IMPLICIT NONE |
26 |
|
|
|
27 |
|
|
integer,intent(in) :: itap,lev_out,lunout1,igout,ngrid,nlay |
28 |
|
|
real,intent(in) :: ptimestep |
29 |
|
|
real,intent(in),dimension(ngrid,nlay) :: ztv |
30 |
|
|
real,intent(in),dimension(ngrid,nlay) :: zthl |
31 |
|
|
real,intent(in),dimension(ngrid,nlay) :: po |
32 |
|
|
real,intent(in),dimension(ngrid,nlay) :: zl |
33 |
|
|
real,intent(in),dimension(ngrid,nlay) :: rhobarz |
34 |
|
|
real,intent(in),dimension(ngrid,nlay+1) :: zlev |
35 |
|
|
real,intent(in),dimension(ngrid,nlay+1) :: pplev |
36 |
|
|
real,intent(in),dimension(ngrid,nlay) :: pphi |
37 |
|
|
real,intent(in),dimension(ngrid,nlay) :: zpspsk |
38 |
|
|
real,intent(in),dimension(ngrid) :: f0 |
39 |
|
|
|
40 |
|
|
integer,intent(out) :: lalim(ngrid) |
41 |
|
|
real,intent(out),dimension(ngrid,nlay) :: alim_star |
42 |
|
|
real,intent(out),dimension(ngrid) :: alim_star_tot |
43 |
|
|
real,intent(out),dimension(ngrid,nlay) :: detr_star |
44 |
|
|
real,intent(out),dimension(ngrid,nlay) :: entr_star |
45 |
|
|
real,intent(out),dimension(ngrid,nlay+1) :: f_star |
46 |
|
|
real,intent(out),dimension(ngrid,nlay) :: csc |
47 |
|
|
real,intent(out),dimension(ngrid,nlay) :: ztva |
48 |
|
|
real,intent(out),dimension(ngrid,nlay) :: ztla |
49 |
|
|
real,intent(out),dimension(ngrid,nlay) :: zqla |
50 |
|
|
real,intent(out),dimension(ngrid,nlay) :: zqta |
51 |
|
|
real,intent(out),dimension(ngrid,nlay) :: zha |
52 |
|
|
real,intent(out),dimension(ngrid,nlay+1) :: zw2 |
53 |
|
|
real,intent(out),dimension(ngrid,nlay+1) :: w_est |
54 |
|
|
real,intent(out),dimension(ngrid,nlay) :: ztva_est |
55 |
|
|
real,intent(out),dimension(ngrid,nlay) :: zqsatth |
56 |
|
|
integer,intent(out),dimension(ngrid) :: lmix |
57 |
|
|
integer,intent(out),dimension(ngrid) :: lmix_bis |
58 |
|
|
real,intent(out),dimension(ngrid) :: linter |
59 |
|
|
|
60 |
|
|
REAL zdw2,zdw2bis |
61 |
|
|
REAL zw2modif |
62 |
|
|
REAL zw2fact,zw2factbis |
63 |
|
576 |
REAL,dimension(ngrid,nlay) :: zeps |
64 |
|
|
|
65 |
|
576 |
REAL, dimension(ngrid) :: wmaxa(ngrid) |
66 |
|
|
|
67 |
|
|
INTEGER ig,l,k,lt,it,lm |
68 |
|
|
integer nbpb |
69 |
|
|
|
70 |
|
576 |
real,dimension(ngrid,nlay) :: detr |
71 |
|
576 |
real,dimension(ngrid,nlay) :: entr |
72 |
|
576 |
real,dimension(ngrid,nlay+1) :: wa_moy |
73 |
|
576 |
real,dimension(ngrid,nlay) :: ztv_est |
74 |
|
576 |
real,dimension(ngrid) :: ztemp,zqsat |
75 |
|
576 |
real,dimension(ngrid,nlay) :: zqla_est |
76 |
|
576 |
real,dimension(ngrid,nlay) :: zta_est |
77 |
|
|
|
78 |
|
576 |
real,dimension(ngrid,nlay) :: zbuoy,gamma,zdqt |
79 |
|
|
real zdz,zalpha,zw2m |
80 |
|
576 |
real,dimension(ngrid,nlay) :: zbuoyjam,zdqtjam |
81 |
|
|
real zbuoybis,zdz2,zdz3,lmel,entrbis,zdzbis |
82 |
|
576 |
real, dimension(ngrid) :: d_temp |
83 |
|
|
real ztv1,ztv2,factinv,zinv,zlmel |
84 |
|
|
real zlmelup,zlmeldwn,zlt,zltdwn,zltup |
85 |
|
|
real atv1,atv2,btv1,btv2 |
86 |
|
|
real ztv_est1,ztv_est2 |
87 |
|
|
real zcor,zdelta,zcvm5,qlbef |
88 |
|
|
real zbetalpha, coefzlmel |
89 |
|
|
real eps |
90 |
|
|
logical Zsat |
91 |
|
576 |
LOGICAL,dimension(ngrid) :: active,activetmp |
92 |
|
|
REAL fact_gamma,fact_gamma2,fact_epsilon2 |
93 |
|
|
REAL coefc |
94 |
|
576 |
REAL,dimension(ngrid,nlay) :: c2 |
95 |
|
|
|
96 |
✗✓ |
288 |
if (ngrid==1) print*,'THERMCELL PLUME MODIFIE 2014/07/11' |
97 |
|
|
Zsat=.false. |
98 |
|
|
! Initialisation |
99 |
|
|
|
100 |
|
|
|
101 |
|
288 |
zbetalpha=betalpha/(1.+betalpha) |
102 |
|
|
|
103 |
|
|
|
104 |
|
|
! Initialisations des variables r?elles |
105 |
|
|
if (1==1) then |
106 |
✓✓✓✓
|
11176128 |
ztva(:,:)=ztv(:,:) |
107 |
✓✓✓✓
|
11176128 |
ztva_est(:,:)=ztva(:,:) |
108 |
✓✓✓✓
|
11176128 |
ztv_est(:,:)=ztv(:,:) |
109 |
✓✓✓✓
|
11176128 |
ztla(:,:)=zthl(:,:) |
110 |
✓✓✓✓
|
11176128 |
zqta(:,:)=po(:,:) |
111 |
✓✓✓✓
|
11176128 |
zqla(:,:)=0. |
112 |
✓✓✓✓
|
11176128 |
zha(:,:) = ztva(:,:) |
113 |
|
|
else |
114 |
|
|
ztva(:,:)=0. |
115 |
|
|
ztv_est(:,:)=0. |
116 |
|
|
ztva_est(:,:)=0. |
117 |
|
|
ztla(:,:)=0. |
118 |
|
|
zqta(:,:)=0. |
119 |
|
|
zha(:,:) =0. |
120 |
|
|
endif |
121 |
|
|
|
122 |
✓✓✓✓
|
11176128 |
zqla_est(:,:)=0. |
123 |
✓✓✓✓
|
11176128 |
zqsatth(:,:)=0. |
124 |
✓✓✓✓
|
11176128 |
zqla(:,:)=0. |
125 |
✓✓✓✓
|
11176128 |
detr_star(:,:)=0. |
126 |
✓✓✓✓
|
11176128 |
entr_star(:,:)=0. |
127 |
✓✓✓✓
|
11176128 |
alim_star(:,:)=0. |
128 |
✓✓ |
286560 |
alim_star_tot(:)=0. |
129 |
✓✓✓✓
|
11176128 |
csc(:,:)=0. |
130 |
✓✓✓✓
|
11176128 |
detr(:,:)=0. |
131 |
✓✓✓✓
|
11176128 |
entr(:,:)=0. |
132 |
✓✓✓✓
|
11462688 |
zw2(:,:)=0. |
133 |
✓✓✓✓
|
11176128 |
zbuoy(:,:)=0. |
134 |
✓✓✓✓
|
11176128 |
zbuoyjam(:,:)=0. |
135 |
✓✓✓✓
|
11176128 |
gamma(:,:)=0. |
136 |
✓✓✓✓
|
11176128 |
zeps(:,:)=0. |
137 |
✓✓✓✓
|
11462688 |
w_est(:,:)=0. |
138 |
✓✓✓✓
|
11462688 |
f_star(:,:)=0. |
139 |
✓✓✓✓
|
11462688 |
wa_moy(:,:)=0. |
140 |
✓✓ |
286560 |
linter(:)=1. |
141 |
|
|
! linter(:)=1. |
142 |
|
|
! Initialisation des variables entieres |
143 |
✓✓ |
286560 |
lmix(:)=1 |
144 |
✓✓ |
286560 |
lmix_bis(:)=2 |
145 |
✓✓ |
286560 |
wmaxa(:)=0. |
146 |
|
|
|
147 |
|
|
! Initialisation a 0 en cas de sortie dans replay |
148 |
✓✓ |
286560 |
zqsat(:)=0. |
149 |
✓✓✓✓
|
11176128 |
zta_est(:,:)=0. |
150 |
✓✓✓✓
|
11176128 |
zdqt(:,:)=0. |
151 |
✓✓✓✓
|
11176128 |
zdqtjam(:,:)=0. |
152 |
✓✓✓✓
|
11176128 |
c2(:,:)=0. |
153 |
|
|
|
154 |
|
|
|
155 |
|
|
!------------------------------------------------------------------------- |
156 |
|
|
! On ne considere comme actif que les colonnes dont les deux premieres |
157 |
|
|
! couches sont instables. |
158 |
|
|
!------------------------------------------------------------------------- |
159 |
|
|
|
160 |
✓✓ |
286560 |
active(:)=ztv(:,1)>ztv(:,2) |
161 |
✓✓ |
286560 |
d_temp(:)=0. ! Pour activer un contraste de temperature a la base |
162 |
|
|
! du panache |
163 |
|
|
! Cet appel pourrait ĂȘtre fait avant thermcell_plume dans thermcell_main |
164 |
|
288 |
CALL thermcell_alim(thermals_flag_alim,ngrid,nlay,ztv,d_temp,zlev,alim_star,lalim) |
165 |
|
|
|
166 |
|
|
!------------------------------------------------------------------------------ |
167 |
|
|
! Calcul dans la premiere couche |
168 |
|
|
! On decide dans cette version que le thermique n'est actif que si la premiere |
169 |
|
|
! couche est instable. |
170 |
|
|
! Pourrait etre change si on veut que le thermiques puisse se d??clencher |
171 |
|
|
! dans une couche l>1 |
172 |
|
|
!------------------------------------------------------------------------------ |
173 |
✓✓ |
286560 |
do ig=1,ngrid |
174 |
|
|
! Le panache va prendre au debut les caracteristiques de l'air contenu |
175 |
|
|
! dans cette couche. |
176 |
✓✓ |
286560 |
if (active(ig)) then |
177 |
|
137337 |
ztla(ig,1)=zthl(ig,1) |
178 |
|
137337 |
zqta(ig,1)=po(ig,1) |
179 |
|
137337 |
zqla(ig,1)=zl(ig,1) |
180 |
|
|
!cr: attention, prise en compte de f*(1)=1 |
181 |
|
137337 |
f_star(ig,2)=alim_star(ig,1) |
182 |
|
|
zw2(ig,2)=2.*RG*(ztv(ig,1)-ztv(ig,2))/ztv(ig,2) & |
183 |
|
|
& *(zlev(ig,2)-zlev(ig,1)) & |
184 |
|
137337 |
& *0.4*pphi(ig,1)/(pphi(ig,2)-pphi(ig,1)) |
185 |
|
137337 |
w_est(ig,2)=zw2(ig,2) |
186 |
|
|
endif |
187 |
|
|
enddo |
188 |
|
|
! |
189 |
|
|
|
190 |
|
|
!============================================================================== |
191 |
|
|
!boucle de calcul de la vitesse verticale dans le thermique |
192 |
|
|
!============================================================================== |
193 |
✓✓ |
10944 |
do l=2,nlay-1 |
194 |
|
|
!============================================================================== |
195 |
|
|
|
196 |
|
|
|
197 |
|
|
! On decide si le thermique est encore actif ou non |
198 |
|
|
! AFaire : Il faut sans doute ajouter entr_star a alim_star dans ce test |
199 |
✓✓ |
10602720 |
do ig=1,ngrid |
200 |
|
|
active(ig)=active(ig) & |
201 |
|
|
& .and. zw2(ig,l)>1.e-10 & |
202 |
✓✓✓✓ ✗✓ |
20453429 |
& .and. f_star(ig,l)+alim_star(ig,l)>1.e-10 |
203 |
|
|
enddo |
204 |
|
|
|
205 |
|
|
|
206 |
|
|
|
207 |
|
|
!--------------------------------------------------------------------------- |
208 |
|
|
! calcul des proprietes thermodynamiques et de la vitesse de la couche l |
209 |
|
|
! sans tenir compte du detrainement et de l'entrainement dans cette |
210 |
|
|
! couche |
211 |
|
|
! C'est a dire qu'on suppose |
212 |
|
|
! ztla(l)=ztla(l-1) et zqta(l)=zqta(l-1) |
213 |
|
|
! Ici encore, on doit pouvoir ajouter entr_star (qui peut etre calculer |
214 |
|
|
! avant) a l'alimentation pour avoir un calcul plus propre |
215 |
|
|
!--------------------------------------------------------------------------- |
216 |
|
|
|
217 |
✓✓ |
10602720 |
ztemp(:)=zpspsk(:,l)*ztla(:,l-1) |
218 |
|
10656 |
call thermcell_qsat(ngrid,active,pplev(:,l),ztemp,zqta(:,l-1),zqsat(:)) |
219 |
✓✓ |
10602720 |
do ig=1,ngrid |
220 |
|
|
! print*,'active',active(ig),ig,l |
221 |
✓✓ |
10602720 |
if(active(ig)) then |
222 |
|
741355 |
zqla_est(ig,l)=max(0.,zqta(ig,l-1)-zqsat(ig)) |
223 |
|
741355 |
ztva_est(ig,l) = ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*zqla_est(ig,l) |
224 |
|
741355 |
zta_est(ig,l)=ztva_est(ig,l) |
225 |
|
741355 |
ztva_est(ig,l) = ztva_est(ig,l)/zpspsk(ig,l) |
226 |
|
|
ztva_est(ig,l) = ztva_est(ig,l)*(1.+RETV*(zqta(ig,l-1) & |
227 |
|
741355 |
& -zqla_est(ig,l))-zqla_est(ig,l)) |
228 |
|
|
|
229 |
|
|
|
230 |
|
|
!Modif AJAM |
231 |
|
|
|
232 |
|
741355 |
zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) |
233 |
|
741355 |
zdz=zlev(ig,l+1)-zlev(ig,l) |
234 |
|
741355 |
lmel=fact_thermals_ed_dz*zlev(ig,l) |
235 |
|
|
! lmel=0.09*zlev(ig,l) |
236 |
|
741355 |
zlmel=zlev(ig,l)+lmel |
237 |
|
741355 |
zlmelup=zlmel+(zdz/2) |
238 |
|
741355 |
zlmeldwn=zlmel-(zdz/2) |
239 |
|
|
|
240 |
|
|
lt=l+1 |
241 |
|
|
zlt=zlev(ig,lt) |
242 |
|
741355 |
zdz3=zlev(ig,lt+1)-zlt |
243 |
|
741355 |
zltdwn=zlt-zdz3/2 |
244 |
|
741355 |
zltup=zlt+zdz3/2 |
245 |
|
|
|
246 |
|
|
!========================================================================= |
247 |
|
|
! 3. Calcul de la flotabilite modifie par melange avec l'air au dessus |
248 |
|
|
!========================================================================= |
249 |
|
|
|
250 |
|
|
!-------------------------------------------------- |
251 |
✗✓ |
741355 |
if (iflag_thermals_ed.lt.8) then |
252 |
|
|
!-------------------------------------------------- |
253 |
|
|
!AJ052014: J'ai remplac?? la boucle do par un do while |
254 |
|
|
! afin de faire moins de calcul dans la boucle |
255 |
|
|
!-------------------------------------------------- |
256 |
|
|
do while (zlmelup.gt.zltup) |
257 |
|
|
lt=lt+1 |
258 |
|
|
zlt=zlev(ig,lt) |
259 |
|
|
zdz3=zlev(ig,lt+1)-zlt |
260 |
|
|
zltdwn=zlt-zdz3/2 |
261 |
|
|
zltup=zlt+zdz3/2 |
262 |
|
|
enddo |
263 |
|
|
!-------------------------------------------------- |
264 |
|
|
!AJ052014: Si iflag_thermals_ed<8 (par ex 6), alors |
265 |
|
|
! on cherche o?? se trouve l'altitude d'inversion |
266 |
|
|
! en calculant ztv1 (interpolation de la valeur de |
267 |
|
|
! theta au niveau lt en utilisant les niveaux lt-1 et |
268 |
|
|
! lt-2) et ztv2 (interpolation avec les niveaux lt+1 |
269 |
|
|
! et lt+2). Si theta r??ellement calcul??e au niveau lt |
270 |
|
|
! comprise entre ztv1 et ztv2, alors il y a inversion |
271 |
|
|
! et on calcule son altitude zinv en supposant que ztv(lt) |
272 |
|
|
! est une combinaison lineaire de ztv1 et ztv2. |
273 |
|
|
! Ensuite, on calcule la flottabilite en comparant |
274 |
|
|
! la temperature de la couche l a celle de l'air situe |
275 |
|
|
! l+lmel plus haut, ce qui necessite de savoir quel fraction |
276 |
|
|
! de cet air est au-dessus ou en-dessous de l'inversion |
277 |
|
|
!-------------------------------------------------- |
278 |
|
|
atv1=(ztv(ig,lt-1)-ztv(ig,lt-2))/(zlev(ig,lt-1)-zlev(ig,lt-2)) |
279 |
|
|
btv1=(ztv(ig,lt-2)*zlev(ig,lt-1)-ztv(ig,lt-1)*zlev(ig,lt-2)) & |
280 |
|
|
& /(zlev(ig,lt-1)-zlev(ig,lt-2)) |
281 |
|
|
atv2=(ztv(ig,lt+2)-ztv(ig,lt+1))/(zlev(ig,lt+2)-zlev(ig,lt+1)) |
282 |
|
|
btv2=(ztv(ig,lt+1)*zlev(ig,lt+2)-ztv(ig,lt+2)*zlev(ig,lt+1)) & |
283 |
|
|
& /(zlev(ig,lt+2)-zlev(ig,lt+1)) |
284 |
|
|
|
285 |
|
|
ztv1=atv1*zlt+btv1 |
286 |
|
|
ztv2=atv2*zlt+btv2 |
287 |
|
|
|
288 |
|
|
if (ztv(ig,lt).gt.ztv1.and.ztv(ig,lt).lt.ztv2) then |
289 |
|
|
|
290 |
|
|
!-------------------------------------------------- |
291 |
|
|
!AJ052014: D??calage de zinv qui est entre le haut |
292 |
|
|
! et le bas de la couche lt |
293 |
|
|
!-------------------------------------------------- |
294 |
|
|
factinv=(ztv2-ztv(ig,lt))/(ztv2-ztv1) |
295 |
|
|
zinv=zltdwn+zdz3*factinv |
296 |
|
|
|
297 |
|
|
|
298 |
|
|
if (zlmeldwn.ge.zinv) then |
299 |
|
|
ztv_est(ig,l)=atv2*zlmel+btv2 |
300 |
|
|
zbuoyjam(ig,l)=fact_shell*RG*(ztva_est(ig,l)-ztv_est(ig,l))/ztv_est(ig,l) & |
301 |
|
|
& +(1.-fact_shell)*zbuoy(ig,l) |
302 |
|
|
elseif (zlmelup.ge.zinv) then |
303 |
|
|
ztv_est2=atv2*0.5*(zlmelup+zinv)+btv2 |
304 |
|
|
ztv_est1=atv1*0.5*(zinv+zlmeldwn)+btv1 |
305 |
|
|
ztv_est(ig,l)=((zlmelup-zinv)/zdz)*ztv_est2+((zinv-zlmeldwn)/zdz)*ztv_est1 |
306 |
|
|
|
307 |
|
|
zbuoyjam(ig,l)=fact_shell*RG*(((zlmelup-zinv)/zdz)*(ztva_est(ig,l)- & |
308 |
|
|
& ztv_est2)/ztv_est2+((zinv-zlmeldwn)/zdz)*(ztva_est(ig,l)- & |
309 |
|
|
& ztv_est1)/ztv_est1)+(1.-fact_shell)*zbuoy(ig,l) |
310 |
|
|
|
311 |
|
|
else |
312 |
|
|
ztv_est(ig,l)=atv1*zlmel+btv1 |
313 |
|
|
zbuoyjam(ig,l)=fact_shell*RG*(ztva_est(ig,l)-ztv_est(ig,l))/ztv_est(ig,l) & |
314 |
|
|
& +(1.-fact_shell)*zbuoy(ig,l) |
315 |
|
|
endif |
316 |
|
|
|
317 |
|
|
else ! if (ztv(ig,lt).gt.ztv1.and.ztv(ig,lt).lt.ztv2) then |
318 |
|
|
|
319 |
|
|
if (zlmeldwn.gt.zltdwn) then |
320 |
|
|
zbuoyjam(ig,l)=fact_shell*RG*((ztva_est(ig,l)- & |
321 |
|
|
& ztv(ig,lt))/ztv(ig,lt))+(1.-fact_shell)*zbuoy(ig,l) |
322 |
|
|
else |
323 |
|
|
zbuoyjam(ig,l)=fact_shell*RG*(((zlmelup-zltdwn)/zdz)*(ztva_est(ig,l)- & |
324 |
|
|
& ztv(ig,lt))/ztv(ig,lt)+((zltdwn-zlmeldwn)/zdz)*(ztva_est(ig,l)- & |
325 |
|
|
& ztv(ig,lt-1))/ztv(ig,lt-1))+(1.-fact_shell)*zbuoy(ig,l) |
326 |
|
|
|
327 |
|
|
endif |
328 |
|
|
|
329 |
|
|
! zbuoyjam(ig,l)=fact_shell*RG*(((zlmelup-zltdwn)/zdz)*(ztva_est(ig,l)- & |
330 |
|
|
! & ztv1)/ztv1+((zltdwn-zlmeldwn)/zdz)*(ztva_est(ig,l)- & |
331 |
|
|
! & ztv(ig,lt-1))/ztv(ig,lt-1))+(1.-fact_shell)*zbuoy(ig,l) |
332 |
|
|
! zdqt(ig,l)=Max(0.,((lmel+zdz3-zdz2)/zdz3)*(zqta(ig,l-1)- & |
333 |
|
|
! & po(ig,lt))/po(ig,lt)+((zdz2-lmel)/zdz3)*(zqta(ig,l-1)- & |
334 |
|
|
! & po(ig,lt-1))/po(ig,lt-1)) |
335 |
|
|
endif ! if (ztv(ig,lt).gt.ztv1.and.ztv(ig,lt).lt.ztv2) then |
336 |
|
|
|
337 |
|
|
else ! if (iflag_thermals_ed.lt.8) then |
338 |
|
|
lt=l+1 |
339 |
|
|
zlt=zlev(ig,lt) |
340 |
|
|
zdz2=zlev(ig,lt)-zlev(ig,l) |
341 |
|
|
|
342 |
✗✓ |
741355 |
do while (lmel.gt.zdz2) |
343 |
|
|
lt=lt+1 |
344 |
|
|
zlt=zlev(ig,lt) |
345 |
|
|
zdz2=zlt-zlev(ig,l) |
346 |
|
|
enddo |
347 |
|
741355 |
zdz3=zlev(ig,lt+1)-zlt |
348 |
|
741355 |
zltdwn=zlev(ig,lt)-zdz3/2 |
349 |
|
|
zlmelup=zlmel+(zdz/2) |
350 |
|
741355 |
coefzlmel=Min(1.,(zlmelup-zltdwn)/zdz) |
351 |
|
|
zbuoyjam(ig,l)=1.*RG*(coefzlmel*(ztva_est(ig,l)- & |
352 |
|
|
& ztv(ig,lt))/ztv(ig,lt)+(1.-coefzlmel)*(ztva_est(ig,l)- & |
353 |
|
741355 |
& ztv(ig,lt-1))/ztv(ig,lt-1))+0.*zbuoy(ig,l) |
354 |
|
|
endif ! if (iflag_thermals_ed.lt.8) then |
355 |
|
|
|
356 |
|
|
!------------------------------------------------ |
357 |
|
|
!AJAM:nouveau calcul de w? |
358 |
|
|
!------------------------------------------------ |
359 |
|
|
zdz=zlev(ig,l+1)-zlev(ig,l) |
360 |
|
|
zdzbis=zlev(ig,l)-zlev(ig,l-1) |
361 |
|
|
zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) |
362 |
|
|
|
363 |
|
741355 |
zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) |
364 |
|
|
zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha) |
365 |
|
741355 |
zdw2=afact*zbuoy(ig,l)/fact_epsilon |
366 |
|
741355 |
zdw2bis=afact*zbuoy(ig,l-1)/fact_epsilon |
367 |
|
|
! zdw2bis=0.5*(zdw2+zdw2bis) |
368 |
|
|
lm=Max(1,l-2) |
369 |
|
|
! zdw2=(afact/fact_epsilon)*((zdz/zdzbis)*zbuoy(ig,l) & |
370 |
|
|
! & +((zdzbis-zdz)/zdzbis)*zbuoy(ig,l-1)) |
371 |
|
|
! zdw2bis=(afact/fact_epsilon)*((zdz/zdzbis)*zbuoy(ig,l-1) & |
372 |
|
|
! & +((zdzbis-zdz)/zdzbis)*zbuoy(ig,l-1)) |
373 |
|
|
! w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2)+zdw2) |
374 |
|
|
! w_est(ig,l+1)=(zdz/zdzbis)*Max(0.0001,exp(-zw2fact)* & |
375 |
|
|
! & (w_est(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & |
376 |
|
|
! & Max(0.0001,exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2) |
377 |
|
|
! w_est(ig,l+1)=Max(0.0001,(1-exp(-zw2fact))*zdw2+w_est(ig,l)*exp(-zw2fact)) |
378 |
|
|
|
379 |
|
|
!-------------------------------------------------- |
380 |
|
|
!AJ052014: J'ai remplac? w_est(ig,l) par zw2(ig,l) |
381 |
|
|
!-------------------------------------------------- |
382 |
✓✗ |
741355 |
if (iflag_thermals_ed==8) then |
383 |
|
|
! Ancienne version |
384 |
|
|
! w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & |
385 |
|
|
! & (w_est(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & |
386 |
|
|
! & (exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2)) |
387 |
|
|
|
388 |
|
741355 |
w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2)+zdw2) |
389 |
|
|
|
390 |
|
|
! Nouvelle version Arnaud |
391 |
|
|
else |
392 |
|
|
! w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & |
393 |
|
|
! & (w_est(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & |
394 |
|
|
! & (exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2)) |
395 |
|
|
|
396 |
|
|
w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2bis)+zdw2) |
397 |
|
|
|
398 |
|
|
! w_est(ig,l+1)=Max(0.0001,(zdz/(zdzbis+zdz))*(exp(-zw2fact)* & |
399 |
|
|
! & (w_est(ig,l)-zdw2bis)+zdw2)+(zdzbis/(zdzbis+zdz))* & |
400 |
|
|
! & (exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2bis)) |
401 |
|
|
|
402 |
|
|
|
403 |
|
|
|
404 |
|
|
! w_est(ig,l+1)=Max(0.0001,(w_est(ig,l)+zdw2bis*zw2fact)*exp(-zw2fact)) |
405 |
|
|
|
406 |
|
|
! w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)+ & |
407 |
|
|
! & (zdzbis-zdz)/zdzbis*(zw2(ig,l-1)+zdw2bis*zw2factbis)*exp(-zw2factbis)) |
408 |
|
|
|
409 |
|
|
! w_est(ig,l+1)=Max(0.0001,exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2) |
410 |
|
|
|
411 |
|
|
endif |
412 |
|
|
|
413 |
|
|
|
414 |
✗✓ |
741355 |
if (iflag_thermals_ed<6) then |
415 |
|
|
zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l+1))/rhobarz(ig,l) |
416 |
|
|
! fact_epsilon=0.0005/(zalpha+0.025)**0.5 |
417 |
|
|
! fact_epsilon=Min(0.003,0.0004/(zalpha)**0.5) |
418 |
|
|
fact_epsilon=0.0002/(zalpha+0.1) |
419 |
|
|
zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) |
420 |
|
|
zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha) |
421 |
|
|
zdw2=afact*zbuoy(ig,l)/fact_epsilon |
422 |
|
|
zdw2bis=afact*zbuoy(ig,l-1)/fact_epsilon |
423 |
|
|
! w_est(ig,l+1)=Max(0.0001,(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)) |
424 |
|
|
|
425 |
|
|
! w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & |
426 |
|
|
! & (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & |
427 |
|
|
! & (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2)) |
428 |
|
|
|
429 |
|
|
w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2bis)+zdw2) |
430 |
|
|
|
431 |
|
|
|
432 |
|
|
endif |
433 |
|
|
!-------------------------------------------------- |
434 |
|
|
!AJ052014: J'ai comment? ce if plus n?cessaire puisqu' |
435 |
|
|
!on fait max(0.0001,.....) |
436 |
|
|
!-------------------------------------------------- |
437 |
|
|
|
438 |
|
|
! if (w_est(ig,l+1).lt.0.) then |
439 |
|
|
! w_est(ig,l+1)=zw2(ig,l) |
440 |
|
|
! w_est(ig,l+1)=0.0001 |
441 |
|
|
! endif |
442 |
|
|
|
443 |
|
|
endif |
444 |
|
|
enddo |
445 |
|
|
|
446 |
|
|
|
447 |
|
|
!------------------------------------------------- |
448 |
|
|
!calcul des taux d'entrainement et de detrainement |
449 |
|
|
!------------------------------------------------- |
450 |
|
|
|
451 |
✓✓ |
10602720 |
do ig=1,ngrid |
452 |
✓✓ |
10602720 |
if (active(ig)) then |
453 |
|
|
|
454 |
|
|
! zw2m=max(0.5*(w_est(ig,l)+w_est(ig,l+1)),0.1) |
455 |
|
741355 |
zw2m=w_est(ig,l+1) |
456 |
|
|
! zw2m=zw2(ig,l) |
457 |
|
741355 |
zdz=zlev(ig,l+1)-zlev(ig,l) |
458 |
|
741355 |
zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) |
459 |
|
|
! zbuoybis=zbuoy(ig,l)+RG*0.1/300. |
460 |
|
|
zbuoybis=zbuoy(ig,l) |
461 |
|
741355 |
zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l+1))/rhobarz(ig,l) |
462 |
|
741355 |
zdqt(ig,l)=max(zqta(ig,l-1)-po(ig,l),0.)/po(ig,l) |
463 |
|
|
|
464 |
|
|
|
465 |
|
|
! entr_star(ig,l)=f_star(ig,l)*zdz*zbetalpha*MAX(0., & |
466 |
|
|
! & afact*zbuoybis/zw2m - fact_epsilon ) |
467 |
|
|
|
468 |
|
|
! entr_star(ig,l)=MAX(0.,f_star(ig,l)*zdz*zbetalpha* & |
469 |
|
|
! & afact*zbuoybis/zw2m - fact_epsilon ) |
470 |
|
|
|
471 |
|
|
|
472 |
|
|
|
473 |
|
|
! zbuoyjam(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) |
474 |
|
|
|
475 |
|
|
!========================================================================= |
476 |
|
|
! 4. Calcul de l'entrainement et du detrainement |
477 |
|
|
!========================================================================= |
478 |
|
|
|
479 |
|
|
! entr_star(ig,l)=f_star(ig,l)*zdz*zbetalpha*MAX(0., & |
480 |
|
|
! & afact*zbuoyjam(ig,l)/zw2m - fact_epsilon ) |
481 |
|
|
! entrbis=entr_star(ig,l) |
482 |
|
|
|
483 |
✗✓ |
741355 |
if (iflag_thermals_ed.lt.6) then |
484 |
|
|
fact_epsilon=0.0002/(zalpha+0.1) |
485 |
|
|
endif |
486 |
|
|
|
487 |
|
|
|
488 |
|
|
|
489 |
|
|
detr_star(ig,l)=f_star(ig,l)*zdz & |
490 |
|
|
& *( mix0 * 0.1 / (zalpha+0.001) & |
491 |
|
|
& + MAX(detr_min, -afact*zbetalpha*zbuoyjam(ig,l)/zw2m & |
492 |
|
741355 |
& + detr_q_coef*(zdqt(ig,l)/zw2m)**detr_q_power)) |
493 |
|
|
|
494 |
|
|
! detr_star(ig,l)=(zdz/zdzbis)*detr_star(ig,l)+ & |
495 |
|
|
! & ((zdzbis-zdz)/zdzbis)*detr_star(ig,l-1) |
496 |
|
|
|
497 |
|
|
zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) |
498 |
|
|
|
499 |
|
|
entr_star(ig,l)=f_star(ig,l)*zdz* ( & |
500 |
|
|
& mix0 * 0.1 / (zalpha+0.001) & |
501 |
|
|
& + zbetalpha*MAX(entr_min, & |
502 |
|
741355 |
& afact*zbuoyjam(ig,l)/zw2m - fact_epsilon)) |
503 |
|
|
|
504 |
|
|
|
505 |
|
|
! entr_star(ig,l)=f_star(ig,l)*zdz* ( & |
506 |
|
|
! & mix0 * 0.1 / (zalpha+0.001) & |
507 |
|
|
! & + MAX(entr_min, & |
508 |
|
|
! & zbetalpha*afact*zbuoyjam(ig,l)/zw2m - fact_epsilon + & |
509 |
|
|
! & detr_q_coef*(zdqt(ig,l)/zw2m)**detr_q_power)) |
510 |
|
|
|
511 |
|
|
|
512 |
|
|
! entr_star(ig,l)=(zdz/zdzbis)*entr_star(ig,l)+ & |
513 |
|
|
! & ((zdzbis-zdz)/zdzbis)*entr_star(ig,l-1) |
514 |
|
|
|
515 |
|
|
! entr_star(ig,l)=Max(0.,f_star(ig,l)*zdz*zbetalpha* & |
516 |
|
|
! & afact*zbuoy(ig,l)/zw2m & |
517 |
|
|
! & - 1.*fact_epsilon) |
518 |
|
|
|
519 |
|
|
|
520 |
|
|
! En dessous de lalim, on prend le max de alim_star et entr_star pour |
521 |
|
|
! alim_star et 0 sinon |
522 |
✓✓ |
741355 |
if (l.lt.lalim(ig)) then |
523 |
|
203435 |
alim_star(ig,l)=max(alim_star(ig,l),entr_star(ig,l)) |
524 |
|
203435 |
entr_star(ig,l)=0. |
525 |
|
|
endif |
526 |
|
|
! if (l.lt.lalim(ig).and.alim_star(ig,l)>alim_star(ig,l-1)) then |
527 |
|
|
! alim_star(ig,l)=entrbis |
528 |
|
|
! endif |
529 |
|
|
|
530 |
|
|
! print*,'alim0',zlev(ig,l),entr_star(ig,l),detr_star(ig,l),zw2m,zbuoy(ig,l),f_star(ig,l) |
531 |
|
|
! Calcul du flux montant normalise |
532 |
|
|
f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) & |
533 |
|
741355 |
& -detr_star(ig,l) |
534 |
|
|
|
535 |
|
|
endif |
536 |
|
|
enddo |
537 |
|
|
|
538 |
|
|
|
539 |
|
|
!============================================================================ |
540 |
|
|
! 5. calcul de la vitesse verticale en melangeant Tl et qt du thermique |
541 |
|
|
!=========================================================================== |
542 |
|
|
|
543 |
✓✓✓✓ ✓✓ |
10602720 |
activetmp(:)=active(:) .and. f_star(:,l+1)>1.e-10 |
544 |
✓✓ |
10602720 |
do ig=1,ngrid |
545 |
✓✓ |
10602720 |
if (activetmp(ig)) then |
546 |
|
|
Zsat=.false. |
547 |
|
|
ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & |
548 |
|
|
& (alim_star(ig,l)+entr_star(ig,l))*zthl(ig,l)) & |
549 |
|
604018 |
& /(f_star(ig,l+1)+detr_star(ig,l)) |
550 |
|
|
zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & |
551 |
|
|
& (alim_star(ig,l)+entr_star(ig,l))*po(ig,l)) & |
552 |
|
604018 |
& /(f_star(ig,l+1)+detr_star(ig,l)) |
553 |
|
|
|
554 |
|
|
endif |
555 |
|
|
enddo |
556 |
|
|
|
557 |
✓✓ |
10602720 |
ztemp(:)=zpspsk(:,l)*ztla(:,l) |
558 |
|
10656 |
call thermcell_qsat(ngrid,activetmp,pplev(:,l),ztemp,zqta(:,l),zqsatth(:,l)) |
559 |
✓✓ |
10602720 |
do ig=1,ngrid |
560 |
✓✓ |
10602720 |
if (activetmp(ig)) then |
561 |
|
|
! on ecrit de maniere conservative (sat ou non) |
562 |
|
|
! T = Tl +Lv/Cp ql |
563 |
|
604018 |
zqla(ig,l)=max(0.,zqta(ig,l)-zqsatth(ig,l)) |
564 |
|
604018 |
ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l) |
565 |
|
604018 |
ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l) |
566 |
|
|
!on rajoute le calcul de zha pour diagnostiques (temp potentielle) |
567 |
|
604018 |
zha(ig,l) = ztva(ig,l) |
568 |
|
|
ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) & |
569 |
|
604018 |
& -zqla(ig,l))-zqla(ig,l)) |
570 |
|
604018 |
zbuoy(ig,l)=RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) |
571 |
|
604018 |
zdz=zlev(ig,l+1)-zlev(ig,l) |
572 |
|
604018 |
zdzbis=zlev(ig,l)-zlev(ig,l-1) |
573 |
|
604018 |
zeps(ig,l)=(entr_star(ig,l)+alim_star(ig,l))/(f_star(ig,l)*zdz) |
574 |
|
|
!!!!!!! fact_epsilon=0.002 |
575 |
|
604018 |
zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) |
576 |
|
|
zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha) |
577 |
|
604018 |
zdw2= afact*zbuoy(ig,l)/(fact_epsilon) |
578 |
|
604018 |
zdw2bis= afact*zbuoy(ig,l-1)/(fact_epsilon) |
579 |
|
|
! zdw2=(afact/fact_epsilon)*((zdz/zdzbis)*zbuoy(ig,l) & |
580 |
|
|
! & +((zdzbis-zdz)/zdzbis)*zbuoy(ig,l-1)) |
581 |
|
|
! lm=Max(1,l-2) |
582 |
|
|
! zdw2bis=(afact/fact_epsilon)*((zdz/zdzbis)*zbuoy(ig,l-1) & |
583 |
|
|
! & +((zdzbis-zdz)/zdzbis)*zbuoy(ig,l-1)) |
584 |
|
|
! zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2bis)+zdw2) |
585 |
|
|
! zw2(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)+ & |
586 |
|
|
! & (zdzbis-zdz)/zdzbis*(zw2(ig,l-1)+zdw2bis*zw2factbis)*exp(-zw2factbis)) |
587 |
|
|
! zw2(ig,l+1)=Max(0.0001,(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)) |
588 |
|
|
! zw2(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & |
589 |
|
|
! & (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & |
590 |
|
|
! & (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2)) |
591 |
✓✗ |
604018 |
if (iflag_thermals_ed==8) then |
592 |
|
604018 |
zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2)+zdw2) |
593 |
|
|
else |
594 |
|
|
zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2bis)+zdw2) |
595 |
|
|
endif |
596 |
|
|
! zw2(ig,l+1)=Max(0.0001,(zdz/(zdz+zdzbis))*(exp(-zw2fact)* & |
597 |
|
|
! & (zw2(ig,l)-zdw2)+zdw2bis)+(zdzbis/(zdz+zdzbis))* & |
598 |
|
|
! & (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2bis)) |
599 |
|
|
|
600 |
|
|
|
601 |
✗✓ |
604018 |
if (iflag_thermals_ed.lt.6) then |
602 |
|
|
zalpha=f0(ig)*f_star(ig,l)/sqrt(zw2(ig,l+1))/rhobarz(ig,l) |
603 |
|
|
! fact_epsilon=0.0005/(zalpha+0.025)**0.5 |
604 |
|
|
! fact_epsilon=Min(0.003,0.0004/(zalpha)**0.5) |
605 |
|
|
fact_epsilon=0.0002/(zalpha+0.1)**1 |
606 |
|
|
zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) |
607 |
|
|
zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha) |
608 |
|
|
zdw2= afact*zbuoy(ig,l)/(fact_epsilon) |
609 |
|
|
zdw2bis= afact*zbuoy(ig,l-1)/(fact_epsilon) |
610 |
|
|
|
611 |
|
|
! zw2(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & |
612 |
|
|
! & (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & |
613 |
|
|
! & (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2)) |
614 |
|
|
! zw2(ig,l+1)=Max(0.0001,(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)) |
615 |
|
|
zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2bis)+zdw2) |
616 |
|
|
|
617 |
|
|
endif |
618 |
|
|
|
619 |
|
|
|
620 |
|
|
endif |
621 |
|
|
enddo |
622 |
|
|
|
623 |
✗✓ |
10656 |
if (prt_level.ge.20) print*,'coucou calcul detr 460: ig, l',ig, l |
624 |
|
|
! |
625 |
|
|
!=========================================================================== |
626 |
|
|
! 6. initialisations pour le calcul de la hauteur du thermique, de l'inversion et de la vitesse verticale max |
627 |
|
|
!=========================================================================== |
628 |
|
|
|
629 |
|
10656 |
nbpb=0 |
630 |
✓✓ |
10602720 |
do ig=1,ngrid |
631 |
✓✓✗✓
|
10592064 |
if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then |
632 |
|
|
! stop'On tombe sur le cas particulier de thermcell_dry' |
633 |
|
|
! print*,'On tombe sur le cas particulier de thermcell_plume' |
634 |
|
|
nbpb=nbpb+1 |
635 |
|
|
zw2(ig,l+1)=0. |
636 |
|
|
linter(ig)=l+1 |
637 |
|
|
endif |
638 |
|
|
|
639 |
✗✓ |
10592064 |
if (zw2(ig,l+1).lt.0.) then |
640 |
|
|
linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) & |
641 |
|
|
& -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) |
642 |
|
|
zw2(ig,l+1)=0. |
643 |
|
|
!+CR:04/05/12:correction calcul linter pour calcul de zmax continu |
644 |
✓✓ |
10592064 |
elseif (f_star(ig,l+1).lt.0.) then |
645 |
|
|
linter(ig)=(l*(f_star(ig,l+1)-f_star(ig,l)) & |
646 |
|
137337 |
& -f_star(ig,l))/(f_star(ig,l+1)-f_star(ig,l)) |
647 |
|
137337 |
zw2(ig,l+1)=0. |
648 |
|
|
!fin CR:04/05/12 |
649 |
|
|
endif |
650 |
|
|
|
651 |
|
10592064 |
wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) |
652 |
|
|
|
653 |
✓✓ |
10602720 |
if (wa_moy(ig,l+1).gt.wmaxa(ig)) then |
654 |
|
|
! lmix est le niveau de la couche ou w (wa_moy) est maximum |
655 |
|
|
!on rajoute le calcul de lmix_bis |
656 |
✓✓ |
568355 |
if (zqla(ig,l).lt.1.e-10) then |
657 |
|
370846 |
lmix_bis(ig)=l+1 |
658 |
|
|
endif |
659 |
|
568355 |
lmix(ig)=l+1 |
660 |
|
568355 |
wmaxa(ig)=wa_moy(ig,l+1) |
661 |
|
|
endif |
662 |
|
|
enddo |
663 |
|
|
|
664 |
✗✓ |
10944 |
if (nbpb>0) then |
665 |
|
|
print*,'WARNING on tombe ',nbpb,' x sur un pb pour l=',l,' dans thermcell_plume' |
666 |
|
|
endif |
667 |
|
|
|
668 |
|
|
!========================================================================= |
669 |
|
|
! FIN DE LA BOUCLE VERTICALE |
670 |
|
|
enddo |
671 |
|
|
!========================================================================= |
672 |
|
|
|
673 |
|
|
!on recalcule alim_star_tot |
674 |
✓✓ |
286560 |
do ig=1,ngrid |
675 |
|
286560 |
alim_star_tot(ig)=0. |
676 |
|
|
enddo |
677 |
✓✓ |
286560 |
do ig=1,ngrid |
678 |
✓✓ |
628030 |
do l=1,lalim(ig)-1 |
679 |
|
627742 |
alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) |
680 |
|
|
enddo |
681 |
|
|
enddo |
682 |
|
|
|
683 |
|
|
|
684 |
✗✓ |
288 |
if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l |
685 |
|
|
|
686 |
|
|
#undef wrgrads_thermcell |
687 |
|
|
#ifdef wrgrads_thermcell |
688 |
|
|
call wrgradsfi(1,nlay,entr_star(igout,1:nlay),'esta ','esta ') |
689 |
|
|
call wrgradsfi(1,nlay,detr_star(igout,1:nlay),'dsta ','dsta ') |
690 |
|
|
call wrgradsfi(1,nlay,zbuoy(igout,1:nlay),'buoy ','buoy ') |
691 |
|
|
call wrgradsfi(1,nlay,zdqt(igout,1:nlay),'dqt ','dqt ') |
692 |
|
|
call wrgradsfi(1,nlay,w_est(igout,1:nlay),'w_est ','w_est ') |
693 |
|
|
call wrgradsfi(1,nlay,w_est(igout,2:nlay+1),'w_es2 ','w_es2 ') |
694 |
|
|
call wrgradsfi(1,nlay,zw2(igout,1:nlay),'zw2A ','zw2A ') |
695 |
|
|
#endif |
696 |
|
|
|
697 |
|
|
|
698 |
|
288 |
RETURN |
699 |
|
|
end |
700 |
|
|
|
701 |
|
|
|
702 |
|
|
|
703 |
|
|
|
704 |
|
|
|
705 |
|
|
|
706 |
|
|
|
707 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
708 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
709 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
710 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
711 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
712 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
713 |
|
|
SUBROUTINE thermcell_plume_5B(itap,ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & |
714 |
|
|
& zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & |
715 |
|
|
& lalim,f0,detr_star,entr_star,f_star,csc,ztva, & |
716 |
|
|
& ztla,zqla,zqta,zha,zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis,linter & |
717 |
|
|
& ,lev_out,lunout1,igout) |
718 |
|
|
!& ,lev_out,lunout1,igout,zbuoy,zbuoyjam) |
719 |
|
|
|
720 |
|
|
!-------------------------------------------------------------------------- |
721 |
|
|
!thermcell_plume: calcule les valeurs de qt, thetal et w dans l ascendance |
722 |
|
|
! Version conforme a l'article de Rio et al. 2010. |
723 |
|
|
! Code ecrit par Catherine Rio, Arnaud Jam et Frederic Hourdin |
724 |
|
|
!-------------------------------------------------------------------------- |
725 |
|
|
|
726 |
|
|
USE lmdz_thermcell_ini, ONLY: prt_level,fact_thermals_ed_dz,iflag_thermals_ed,RLvCP,RETV,RG |
727 |
|
|
USE lmdz_thermcell_qsat, ONLY : thermcell_qsat |
728 |
|
|
IMPLICIT NONE |
729 |
|
|
|
730 |
|
|
INTEGER itap |
731 |
|
|
INTEGER lunout1,igout |
732 |
|
|
INTEGER ngrid,nlay |
733 |
|
|
REAL ptimestep |
734 |
|
|
REAL ztv(ngrid,nlay) |
735 |
|
|
REAL zthl(ngrid,nlay) |
736 |
|
|
REAL po(ngrid,nlay) |
737 |
|
|
REAL zl(ngrid,nlay) |
738 |
|
|
REAL rhobarz(ngrid,nlay) |
739 |
|
|
REAL zlev(ngrid,nlay+1) |
740 |
|
|
REAL pplev(ngrid,nlay+1) |
741 |
|
|
REAL pphi(ngrid,nlay) |
742 |
|
|
REAL zpspsk(ngrid,nlay) |
743 |
|
|
REAL alim_star(ngrid,nlay) |
744 |
|
|
REAL f0(ngrid) |
745 |
|
|
INTEGER lalim(ngrid) |
746 |
|
|
integer lev_out ! niveau pour les print |
747 |
|
|
integer nbpb |
748 |
|
|
|
749 |
|
|
real alim_star_tot(ngrid) |
750 |
|
|
|
751 |
|
|
REAL ztva(ngrid,nlay) |
752 |
|
|
REAL ztla(ngrid,nlay) |
753 |
|
|
REAL zqla(ngrid,nlay) |
754 |
|
|
REAL zqta(ngrid,nlay) |
755 |
|
|
REAL zha(ngrid,nlay) |
756 |
|
|
|
757 |
|
|
REAL detr_star(ngrid,nlay) |
758 |
|
|
REAL coefc |
759 |
|
|
REAL entr_star(ngrid,nlay) |
760 |
|
|
REAL detr(ngrid,nlay) |
761 |
|
|
REAL entr(ngrid,nlay) |
762 |
|
|
|
763 |
|
|
REAL csc(ngrid,nlay) |
764 |
|
|
|
765 |
|
|
REAL zw2(ngrid,nlay+1) |
766 |
|
|
REAL w_est(ngrid,nlay+1) |
767 |
|
|
REAL f_star(ngrid,nlay+1) |
768 |
|
|
REAL wa_moy(ngrid,nlay+1) |
769 |
|
|
|
770 |
|
|
REAL ztva_est(ngrid,nlay) |
771 |
|
|
REAL zqla_est(ngrid,nlay) |
772 |
|
|
REAL zqsatth(ngrid,nlay) |
773 |
|
|
REAL zta_est(ngrid,nlay) |
774 |
|
|
REAL zbuoyjam(ngrid,nlay) |
775 |
|
|
REAL ztemp(ngrid),zqsat(ngrid) |
776 |
|
|
REAL zdw2 |
777 |
|
|
REAL zw2modif |
778 |
|
|
REAL zw2fact |
779 |
|
|
REAL zeps(ngrid,nlay) |
780 |
|
|
|
781 |
|
|
REAL linter(ngrid) |
782 |
|
|
INTEGER lmix(ngrid) |
783 |
|
|
INTEGER lmix_bis(ngrid) |
784 |
|
|
REAL wmaxa(ngrid) |
785 |
|
|
|
786 |
|
|
INTEGER ig,l,k |
787 |
|
|
|
788 |
|
|
real zdz,zbuoy(ngrid,nlay),zalpha,gamma(ngrid,nlay),zdqt(ngrid,nlay),zw2m |
789 |
|
|
real zbuoybis |
790 |
|
|
real zcor,zdelta,zcvm5,qlbef,zdz2 |
791 |
|
|
real betalpha,zbetalpha |
792 |
|
|
real eps, afact |
793 |
|
|
logical Zsat |
794 |
|
|
LOGICAL active(ngrid),activetmp(ngrid) |
795 |
|
|
REAL fact_gamma,fact_epsilon,fact_gamma2,fact_epsilon2 |
796 |
|
|
REAL c2(ngrid,nlay) |
797 |
|
|
Zsat=.false. |
798 |
|
|
! Initialisation |
799 |
|
|
|
800 |
|
|
fact_epsilon=0.002 |
801 |
|
|
betalpha=0.9 |
802 |
|
|
afact=2./3. |
803 |
|
|
|
804 |
|
|
zbetalpha=betalpha/(1.+betalpha) |
805 |
|
|
|
806 |
|
|
|
807 |
|
|
! Initialisations des variables reeles |
808 |
|
|
if (1==1) then |
809 |
|
|
ztva(:,:)=ztv(:,:) |
810 |
|
|
ztva_est(:,:)=ztva(:,:) |
811 |
|
|
ztla(:,:)=zthl(:,:) |
812 |
|
|
zqta(:,:)=po(:,:) |
813 |
|
|
zha(:,:) = ztva(:,:) |
814 |
|
|
else |
815 |
|
|
ztva(:,:)=0. |
816 |
|
|
ztva_est(:,:)=0. |
817 |
|
|
ztla(:,:)=0. |
818 |
|
|
zqta(:,:)=0. |
819 |
|
|
zha(:,:) =0. |
820 |
|
|
endif |
821 |
|
|
|
822 |
|
|
zqla_est(:,:)=0. |
823 |
|
|
zqsatth(:,:)=0. |
824 |
|
|
zqla(:,:)=0. |
825 |
|
|
detr_star(:,:)=0. |
826 |
|
|
entr_star(:,:)=0. |
827 |
|
|
alim_star(:,:)=0. |
828 |
|
|
alim_star_tot(:)=0. |
829 |
|
|
csc(:,:)=0. |
830 |
|
|
detr(:,:)=0. |
831 |
|
|
entr(:,:)=0. |
832 |
|
|
zw2(:,:)=0. |
833 |
|
|
zbuoy(:,:)=0. |
834 |
|
|
zbuoyjam(:,:)=0. |
835 |
|
|
gamma(:,:)=0. |
836 |
|
|
zeps(:,:)=0. |
837 |
|
|
w_est(:,:)=0. |
838 |
|
|
f_star(:,:)=0. |
839 |
|
|
wa_moy(:,:)=0. |
840 |
|
|
linter(:)=1. |
841 |
|
|
! linter(:)=1. |
842 |
|
|
! Initialisation des variables entieres |
843 |
|
|
lmix(:)=1 |
844 |
|
|
lmix_bis(:)=2 |
845 |
|
|
wmaxa(:)=0. |
846 |
|
|
lalim(:)=1 |
847 |
|
|
|
848 |
|
|
|
849 |
|
|
!------------------------------------------------------------------------- |
850 |
|
|
! On ne considere comme actif que les colonnes dont les deux premieres |
851 |
|
|
! couches sont instables. |
852 |
|
|
!------------------------------------------------------------------------- |
853 |
|
|
active(:)=ztv(:,1)>ztv(:,2) |
854 |
|
|
|
855 |
|
|
!------------------------------------------------------------------------- |
856 |
|
|
! Definition de l'alimentation |
857 |
|
|
!------------------------------------------------------------------------- |
858 |
|
|
do l=1,nlay-1 |
859 |
|
|
do ig=1,ngrid |
860 |
|
|
if (ztv(ig,l)> ztv(ig,l+1) .and. ztv(ig,1)>=ztv(ig,l) ) then |
861 |
|
|
alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & |
862 |
|
|
& *sqrt(zlev(ig,l+1)) |
863 |
|
|
lalim(ig)=l+1 |
864 |
|
|
alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) |
865 |
|
|
endif |
866 |
|
|
enddo |
867 |
|
|
enddo |
868 |
|
|
do l=1,nlay |
869 |
|
|
do ig=1,ngrid |
870 |
|
|
if (alim_star_tot(ig) > 1.e-10 ) then |
871 |
|
|
alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig) |
872 |
|
|
endif |
873 |
|
|
enddo |
874 |
|
|
enddo |
875 |
|
|
alim_star_tot(:)=1. |
876 |
|
|
|
877 |
|
|
|
878 |
|
|
|
879 |
|
|
!------------------------------------------------------------------------------ |
880 |
|
|
! Calcul dans la premiere couche |
881 |
|
|
! On decide dans cette version que le thermique n'est actif que si la premiere |
882 |
|
|
! couche est instable. |
883 |
|
|
! Pourrait etre change si on veut que le thermiques puisse se d??clencher |
884 |
|
|
! dans une couche l>1 |
885 |
|
|
!------------------------------------------------------------------------------ |
886 |
|
|
do ig=1,ngrid |
887 |
|
|
! Le panache va prendre au debut les caracteristiques de l'air contenu |
888 |
|
|
! dans cette couche. |
889 |
|
|
if (active(ig)) then |
890 |
|
|
ztla(ig,1)=zthl(ig,1) |
891 |
|
|
zqta(ig,1)=po(ig,1) |
892 |
|
|
zqla(ig,1)=zl(ig,1) |
893 |
|
|
!cr: attention, prise en compte de f*(1)=1 |
894 |
|
|
f_star(ig,2)=alim_star(ig,1) |
895 |
|
|
zw2(ig,2)=2.*RG*(ztv(ig,1)-ztv(ig,2))/ztv(ig,2) & |
896 |
|
|
& *(zlev(ig,2)-zlev(ig,1)) & |
897 |
|
|
& *0.4*pphi(ig,1)/(pphi(ig,2)-pphi(ig,1)) |
898 |
|
|
w_est(ig,2)=zw2(ig,2) |
899 |
|
|
endif |
900 |
|
|
enddo |
901 |
|
|
! |
902 |
|
|
|
903 |
|
|
!============================================================================== |
904 |
|
|
!boucle de calcul de la vitesse verticale dans le thermique |
905 |
|
|
!============================================================================== |
906 |
|
|
do l=2,nlay-1 |
907 |
|
|
!============================================================================== |
908 |
|
|
|
909 |
|
|
|
910 |
|
|
! On decide si le thermique est encore actif ou non |
911 |
|
|
! AFaire : Il faut sans doute ajouter entr_star a alim_star dans ce test |
912 |
|
|
do ig=1,ngrid |
913 |
|
|
active(ig)=active(ig) & |
914 |
|
|
& .and. zw2(ig,l)>1.e-10 & |
915 |
|
|
& .and. f_star(ig,l)+alim_star(ig,l)>1.e-10 |
916 |
|
|
enddo |
917 |
|
|
|
918 |
|
|
|
919 |
|
|
|
920 |
|
|
!--------------------------------------------------------------------------- |
921 |
|
|
! calcul des proprietes thermodynamiques et de la vitesse de la couche l |
922 |
|
|
! sans tenir compte du detrainement et de l'entrainement dans cette |
923 |
|
|
! couche |
924 |
|
|
! C'est a dire qu'on suppose |
925 |
|
|
! ztla(l)=ztla(l-1) et zqta(l)=zqta(l-1) |
926 |
|
|
! Ici encore, on doit pouvoir ajouter entr_star (qui peut etre calculer |
927 |
|
|
! avant) a l'alimentation pour avoir un calcul plus propre |
928 |
|
|
!--------------------------------------------------------------------------- |
929 |
|
|
|
930 |
|
|
ztemp(:)=zpspsk(:,l)*ztla(:,l-1) |
931 |
|
|
call thermcell_qsat(ngrid,active,pplev(:,l),ztemp,zqta(:,l-1),zqsat(:)) |
932 |
|
|
|
933 |
|
|
do ig=1,ngrid |
934 |
|
|
! print*,'active',active(ig),ig,l |
935 |
|
|
if(active(ig)) then |
936 |
|
|
zqla_est(ig,l)=max(0.,zqta(ig,l-1)-zqsat(ig)) |
937 |
|
|
ztva_est(ig,l) = ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*zqla_est(ig,l) |
938 |
|
|
zta_est(ig,l)=ztva_est(ig,l) |
939 |
|
|
ztva_est(ig,l) = ztva_est(ig,l)/zpspsk(ig,l) |
940 |
|
|
ztva_est(ig,l) = ztva_est(ig,l)*(1.+RETV*(zqta(ig,l-1) & |
941 |
|
|
& -zqla_est(ig,l))-zqla_est(ig,l)) |
942 |
|
|
|
943 |
|
|
!------------------------------------------------ |
944 |
|
|
!AJAM:nouveau calcul de w? |
945 |
|
|
!------------------------------------------------ |
946 |
|
|
zdz=zlev(ig,l+1)-zlev(ig,l) |
947 |
|
|
zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) |
948 |
|
|
|
949 |
|
|
zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) |
950 |
|
|
zdw2=(afact)*zbuoy(ig,l)/(fact_epsilon) |
951 |
|
|
w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2)+zdw2) |
952 |
|
|
|
953 |
|
|
|
954 |
|
|
if (w_est(ig,l+1).lt.0.) then |
955 |
|
|
w_est(ig,l+1)=zw2(ig,l) |
956 |
|
|
endif |
957 |
|
|
endif |
958 |
|
|
enddo |
959 |
|
|
|
960 |
|
|
|
961 |
|
|
!------------------------------------------------- |
962 |
|
|
!calcul des taux d'entrainement et de detrainement |
963 |
|
|
!------------------------------------------------- |
964 |
|
|
|
965 |
|
|
do ig=1,ngrid |
966 |
|
|
if (active(ig)) then |
967 |
|
|
|
968 |
|
|
zw2m=max(0.5*(w_est(ig,l)+w_est(ig,l+1)),0.1) |
969 |
|
|
zw2m=w_est(ig,l+1) |
970 |
|
|
zdz=zlev(ig,l+1)-zlev(ig,l) |
971 |
|
|
zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) |
972 |
|
|
! zbuoybis=zbuoy(ig,l)+RG*0.1/300. |
973 |
|
|
zbuoybis=zbuoy(ig,l) |
974 |
|
|
zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l+1))/rhobarz(ig,l) |
975 |
|
|
zdqt(ig,l)=max(zqta(ig,l-1)-po(ig,l),0.)/po(ig,l) |
976 |
|
|
|
977 |
|
|
|
978 |
|
|
entr_star(ig,l)=f_star(ig,l)*zdz* zbetalpha*MAX(0., & |
979 |
|
|
& afact*zbuoybis/zw2m - fact_epsilon ) |
980 |
|
|
|
981 |
|
|
|
982 |
|
|
detr_star(ig,l)=f_star(ig,l)*zdz & |
983 |
|
|
& *MAX(1.e-3, -afact*zbetalpha*zbuoy(ig,l)/zw2m & |
984 |
|
|
& + 0.012*(zdqt(ig,l)/zw2m)**0.5 ) |
985 |
|
|
|
986 |
|
|
! En dessous de lalim, on prend le max de alim_star et entr_star pour |
987 |
|
|
! alim_star et 0 sinon |
988 |
|
|
if (l.lt.lalim(ig)) then |
989 |
|
|
alim_star(ig,l)=max(alim_star(ig,l),entr_star(ig,l)) |
990 |
|
|
entr_star(ig,l)=0. |
991 |
|
|
endif |
992 |
|
|
|
993 |
|
|
! Calcul du flux montant normalise |
994 |
|
|
f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) & |
995 |
|
|
& -detr_star(ig,l) |
996 |
|
|
|
997 |
|
|
endif |
998 |
|
|
enddo |
999 |
|
|
|
1000 |
|
|
|
1001 |
|
|
!---------------------------------------------------------------------------- |
1002 |
|
|
!calcul de la vitesse verticale en melangeant Tl et qt du thermique |
1003 |
|
|
!--------------------------------------------------------------------------- |
1004 |
|
|
activetmp(:)=active(:) .and. f_star(:,l+1)>1.e-10 |
1005 |
|
|
do ig=1,ngrid |
1006 |
|
|
if (activetmp(ig)) then |
1007 |
|
|
Zsat=.false. |
1008 |
|
|
ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & |
1009 |
|
|
& (alim_star(ig,l)+entr_star(ig,l))*zthl(ig,l)) & |
1010 |
|
|
& /(f_star(ig,l+1)+detr_star(ig,l)) |
1011 |
|
|
zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & |
1012 |
|
|
& (alim_star(ig,l)+entr_star(ig,l))*po(ig,l)) & |
1013 |
|
|
& /(f_star(ig,l+1)+detr_star(ig,l)) |
1014 |
|
|
|
1015 |
|
|
endif |
1016 |
|
|
enddo |
1017 |
|
|
|
1018 |
|
|
ztemp(:)=zpspsk(:,l)*ztla(:,l) |
1019 |
|
|
call thermcell_qsat(ngrid,activetmp,pplev(:,l),ztemp,zqta(:,l),zqsatth(:,l)) |
1020 |
|
|
|
1021 |
|
|
do ig=1,ngrid |
1022 |
|
|
if (activetmp(ig)) then |
1023 |
|
|
! on ecrit de maniere conservative (sat ou non) |
1024 |
|
|
! T = Tl +Lv/Cp ql |
1025 |
|
|
zqla(ig,l)=max(0.,zqta(ig,l)-zqsatth(ig,l)) |
1026 |
|
|
ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l) |
1027 |
|
|
ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l) |
1028 |
|
|
!on rajoute le calcul de zha pour diagnostiques (temp potentielle) |
1029 |
|
|
zha(ig,l) = ztva(ig,l) |
1030 |
|
|
ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) & |
1031 |
|
|
& -zqla(ig,l))-zqla(ig,l)) |
1032 |
|
|
zbuoy(ig,l)=RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) |
1033 |
|
|
zdz=zlev(ig,l+1)-zlev(ig,l) |
1034 |
|
|
zeps(ig,l)=(entr_star(ig,l)+alim_star(ig,l))/(f_star(ig,l)*zdz) |
1035 |
|
|
|
1036 |
|
|
zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) |
1037 |
|
|
zdw2=afact*zbuoy(ig,l)/(fact_epsilon) |
1038 |
|
|
zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2)+zdw2) |
1039 |
|
|
endif |
1040 |
|
|
enddo |
1041 |
|
|
|
1042 |
|
|
if (prt_level.ge.20) print*,'coucou calcul detr 460: ig, l',ig, l |
1043 |
|
|
! |
1044 |
|
|
!--------------------------------------------------------------------------- |
1045 |
|
|
!initialisations pour le calcul de la hauteur du thermique, de l'inversion et de la vitesse verticale max |
1046 |
|
|
!--------------------------------------------------------------------------- |
1047 |
|
|
|
1048 |
|
|
nbpb=0 |
1049 |
|
|
do ig=1,ngrid |
1050 |
|
|
if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then |
1051 |
|
|
! stop'On tombe sur le cas particulier de thermcell_dry' |
1052 |
|
|
! print*,'On tombe sur le cas particulier de thermcell_plume' |
1053 |
|
|
nbpb=nbpb+1 |
1054 |
|
|
zw2(ig,l+1)=0. |
1055 |
|
|
linter(ig)=l+1 |
1056 |
|
|
endif |
1057 |
|
|
|
1058 |
|
|
if (zw2(ig,l+1).lt.0.) then |
1059 |
|
|
linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) & |
1060 |
|
|
& -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) |
1061 |
|
|
zw2(ig,l+1)=0. |
1062 |
|
|
elseif (f_star(ig,l+1).lt.0.) then |
1063 |
|
|
linter(ig)=(l*(f_star(ig,l+1)-f_star(ig,l)) & |
1064 |
|
|
& -f_star(ig,l))/(f_star(ig,l+1)-f_star(ig,l)) |
1065 |
|
|
! print*,"linter plume", linter(ig) |
1066 |
|
|
zw2(ig,l+1)=0. |
1067 |
|
|
endif |
1068 |
|
|
|
1069 |
|
|
wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) |
1070 |
|
|
|
1071 |
|
|
if (wa_moy(ig,l+1).gt.wmaxa(ig)) then |
1072 |
|
|
! lmix est le niveau de la couche ou w (wa_moy) est maximum |
1073 |
|
|
!on rajoute le calcul de lmix_bis |
1074 |
|
|
if (zqla(ig,l).lt.1.e-10) then |
1075 |
|
|
lmix_bis(ig)=l+1 |
1076 |
|
|
endif |
1077 |
|
|
lmix(ig)=l+1 |
1078 |
|
|
wmaxa(ig)=wa_moy(ig,l+1) |
1079 |
|
|
endif |
1080 |
|
|
enddo |
1081 |
|
|
|
1082 |
|
|
if (nbpb>0) then |
1083 |
|
|
print*,'WARNING on tombe ',nbpb,' x sur un pb pour l=',l,' dans thermcell_plume' |
1084 |
|
|
endif |
1085 |
|
|
|
1086 |
|
|
!========================================================================= |
1087 |
|
|
! FIN DE LA BOUCLE VERTICALE |
1088 |
|
|
enddo |
1089 |
|
|
!========================================================================= |
1090 |
|
|
|
1091 |
|
|
!on recalcule alim_star_tot |
1092 |
|
|
do ig=1,ngrid |
1093 |
|
|
alim_star_tot(ig)=0. |
1094 |
|
|
enddo |
1095 |
|
|
do ig=1,ngrid |
1096 |
|
|
do l=1,lalim(ig)-1 |
1097 |
|
|
alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) |
1098 |
|
|
enddo |
1099 |
|
|
enddo |
1100 |
|
|
|
1101 |
|
|
|
1102 |
|
|
if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l |
1103 |
|
|
|
1104 |
|
|
#undef wrgrads_thermcell |
1105 |
|
|
#ifdef wrgrads_thermcell |
1106 |
|
|
call wrgradsfi(1,nlay,entr_star(igout,1:nlay),'esta ','esta ') |
1107 |
|
|
call wrgradsfi(1,nlay,detr_star(igout,1:nlay),'dsta ','dsta ') |
1108 |
|
|
call wrgradsfi(1,nlay,zbuoy(igout,1:nlay),'buoy ','buoy ') |
1109 |
|
|
call wrgradsfi(1,nlay,zdqt(igout,1:nlay),'dqt ','dqt ') |
1110 |
|
|
call wrgradsfi(1,nlay,w_est(igout,1:nlay),'w_est ','w_est ') |
1111 |
|
|
call wrgradsfi(1,nlay,w_est(igout,2:nlay+1),'w_es2 ','w_es2 ') |
1112 |
|
|
call wrgradsfi(1,nlay,zw2(igout,1:nlay),'zw2A ','zw2A ') |
1113 |
|
|
#endif |
1114 |
|
|
|
1115 |
|
|
|
1116 |
|
|
return |
1117 |
|
|
end |
1118 |
|
|
END MODULE lmdz_thermcell_plume_6A |