1 |
SUBROUTINE thermcell(ngrid,nlay,ptimestep |
2 |
s ,pplay,pplev,pphi |
3 |
s ,pu,pv,pt,po |
4 |
s ,pduadj,pdvadj,pdtadj,pdoadj |
5 |
s ,fm0,entr0 |
6 |
c s ,pu_therm,pv_therm |
7 |
s ,r_aspect,l_mix,w2di,tho) |
8 |
|
9 |
use dimens_m |
10 |
use dimphy |
11 |
use YOMCST |
12 |
IMPLICIT NONE |
13 |
|
14 |
c======================================================================= |
15 |
c |
16 |
c Calcul du transport verticale dans la couche limite en presence |
17 |
c de "thermiques" explicitement representes |
18 |
c |
19 |
c Réécriture à partir d'un listing papier à Habas, le 14/02/00 |
20 |
c |
21 |
c le thermique est supposé homogène et dissipé par mélange avec |
22 |
c son environnement. la longueur l_mix contrôle l'efficacité du |
23 |
c mélange |
24 |
c |
25 |
c Le calcul du transport des différentes espèces se fait en prenant |
26 |
c en compte: |
27 |
c 1. un flux de masse montant |
28 |
c 2. un flux de masse descendant |
29 |
c 3. un entrainement |
30 |
c 4. un detrainement |
31 |
c |
32 |
c======================================================================= |
33 |
|
34 |
c----------------------------------------------------------------------- |
35 |
c declarations: |
36 |
c ------------- |
37 |
|
38 |
|
39 |
c arguments: |
40 |
c ---------- |
41 |
|
42 |
INTEGER ngrid,nlay,w2di,tho |
43 |
real ptimestep,l_mix,r_aspect |
44 |
REAL pt(ngrid,nlay),pdtadj(ngrid,nlay) |
45 |
REAL pu(ngrid,nlay),pduadj(ngrid,nlay) |
46 |
REAL pv(ngrid,nlay),pdvadj(ngrid,nlay) |
47 |
REAL po(ngrid,nlay),pdoadj(ngrid,nlay) |
48 |
REAL, intent(in):: pplay(ngrid,nlay) |
49 |
real, intent(in):: pplev(ngrid,nlay+1) |
50 |
real pphi(ngrid,nlay) |
51 |
|
52 |
integer idetr |
53 |
save idetr |
54 |
data idetr/3/ |
55 |
|
56 |
c local: |
57 |
c ------ |
58 |
|
59 |
INTEGER ig,k,l,lmaxa(klon),lmix(klon) |
60 |
real zsortie1d(klon) |
61 |
c CR: on remplace lmax(klon,klev+1) |
62 |
INTEGER lmax(klon),lmin(klon),lentr(klon) |
63 |
real linter(klon) |
64 |
real zmix(klon), fracazmix(klon) |
65 |
c RC |
66 |
real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz |
67 |
|
68 |
real zlev(klon,klev+1),zlay(klon,klev) |
69 |
REAL zh(klon,klev),zdhadj(klon,klev) |
70 |
REAL ztv(klon,klev) |
71 |
real zu(klon,klev),zv(klon,klev),zo(klon,klev) |
72 |
REAL wh(klon,klev+1) |
73 |
real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1) |
74 |
real zla(klon,klev+1) |
75 |
real zwa(klon,klev+1) |
76 |
real zld(klon,klev+1) |
77 |
real zwd(klon,klev+1) |
78 |
real zsortie(klon,klev) |
79 |
real zva(klon,klev) |
80 |
real zua(klon,klev) |
81 |
real zoa(klon,klev) |
82 |
|
83 |
real zha(klon,klev) |
84 |
real wa_moy(klon,klev+1) |
85 |
real fraca(klon,klev+1) |
86 |
real fracc(klon,klev+1) |
87 |
real zf,zf2 |
88 |
real thetath2(klon,klev),wth2(klon,klev) |
89 |
common/comtherm/thetath2,wth2 |
90 |
|
91 |
real count_time |
92 |
integer isplit,nsplit,ialt |
93 |
parameter (nsplit=10) |
94 |
data isplit/0/ |
95 |
save isplit |
96 |
|
97 |
logical sorties |
98 |
real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev) |
99 |
real zpspsk(klon,klev) |
100 |
|
101 |
c real wmax(klon,klev),wmaxa(klon) |
102 |
real wmax(klon),wmaxa(klon) |
103 |
real wa(klon,klev,klev+1) |
104 |
real wd(klon,klev+1) |
105 |
real larg_part(klon,klev,klev+1) |
106 |
real fracd(klon,klev+1) |
107 |
real xxx(klon,klev+1) |
108 |
real larg_cons(klon,klev+1) |
109 |
real larg_detr(klon,klev+1) |
110 |
real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev) |
111 |
real pu_therm(klon,klev),pv_therm(klon,klev) |
112 |
real fm(klon,klev+1),entr(klon,klev) |
113 |
real fmc(klon,klev+1) |
114 |
|
115 |
cCR:nouvelles variables |
116 |
real f_star(klon,klev+1),entr_star(klon,klev) |
117 |
real entr_star_tot(klon),entr_star2(klon) |
118 |
real f(klon), f0(klon) |
119 |
real zlevinter(klon) |
120 |
logical first |
121 |
data first /.false./ |
122 |
save first |
123 |
cRC |
124 |
|
125 |
character*2 str2 |
126 |
character*10 str10 |
127 |
|
128 |
LOGICAL vtest(klon),down |
129 |
|
130 |
EXTERNAL SCOPY |
131 |
|
132 |
integer ncorrec,ll |
133 |
save ncorrec |
134 |
data ncorrec/0/ |
135 |
|
136 |
c |
137 |
c----------------------------------------------------------------------- |
138 |
c initialisation: |
139 |
c --------------- |
140 |
c |
141 |
sorties=.true. |
142 |
IF(ngrid.NE.klon) THEN |
143 |
PRINT* |
144 |
PRINT*,'STOP dans convadj' |
145 |
PRINT*,'ngrid =',ngrid |
146 |
PRINT*,'klon =',klon |
147 |
ENDIF |
148 |
c |
149 |
c----------------------------------------------------------------------- |
150 |
c incrementation eventuelle de tendances precedentes: |
151 |
c --------------------------------------------------- |
152 |
|
153 |
print*,'0 OK convect8' |
154 |
|
155 |
DO 1010 l=1,nlay |
156 |
DO 1015 ig=1,ngrid |
157 |
zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA |
158 |
zh(ig,l)=pt(ig,l)/zpspsk(ig,l) |
159 |
zu(ig,l)=pu(ig,l) |
160 |
zv(ig,l)=pv(ig,l) |
161 |
zo(ig,l)=po(ig,l) |
162 |
ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l)) |
163 |
1015 CONTINUE |
164 |
1010 CONTINUE |
165 |
|
166 |
print*,'1 OK convect8' |
167 |
c -------------------- |
168 |
c |
169 |
c |
170 |
c + + + + + + + + + + + |
171 |
c |
172 |
c |
173 |
c wa, fraca, wd, fracd -------------------- zlev(2), rhobarz |
174 |
c wh,wt,wo ... |
175 |
c |
176 |
c + + + + + + + + + + + zh,zu,zv,zo,rho |
177 |
c |
178 |
c |
179 |
c -------------------- zlev(1) |
180 |
c \\\\\\\\\\\\\\\\\\\\ |
181 |
c |
182 |
c |
183 |
|
184 |
c----------------------------------------------------------------------- |
185 |
c Calcul des altitudes des couches |
186 |
c----------------------------------------------------------------------- |
187 |
|
188 |
do l=2,nlay |
189 |
do ig=1,ngrid |
190 |
zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG |
191 |
enddo |
192 |
enddo |
193 |
do ig=1,ngrid |
194 |
zlev(ig,1)=0. |
195 |
zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG |
196 |
enddo |
197 |
do l=1,nlay |
198 |
do ig=1,ngrid |
199 |
zlay(ig,l)=pphi(ig,l)/RG |
200 |
enddo |
201 |
enddo |
202 |
|
203 |
c print*,'2 OK convect8' |
204 |
c----------------------------------------------------------------------- |
205 |
c Calcul des densites |
206 |
c----------------------------------------------------------------------- |
207 |
|
208 |
do l=1,nlay |
209 |
do ig=1,ngrid |
210 |
rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l)) |
211 |
enddo |
212 |
enddo |
213 |
|
214 |
do l=2,nlay |
215 |
do ig=1,ngrid |
216 |
rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1)) |
217 |
enddo |
218 |
enddo |
219 |
|
220 |
do k=1,nlay |
221 |
do l=1,nlay+1 |
222 |
do ig=1,ngrid |
223 |
wa(ig,k,l)=0. |
224 |
enddo |
225 |
enddo |
226 |
enddo |
227 |
|
228 |
c print*,'3 OK convect8' |
229 |
c------------------------------------------------------------------ |
230 |
c Calcul de w2, quarre de w a partir de la cape |
231 |
c a partir de w2, on calcule wa, vitesse de l'ascendance |
232 |
c |
233 |
c ATTENTION: Dans cette version, pour cause d'economie de memoire, |
234 |
c w2 est stoke dans wa |
235 |
c |
236 |
c ATTENTION: dans convect8, on n'utilise le calcule des wa |
237 |
c independants par couches que pour calculer l'entrainement |
238 |
c a la base et la hauteur max de l'ascendance. |
239 |
c |
240 |
c Indicages: |
241 |
c l'ascendance provenant du niveau k traverse l'interface l avec |
242 |
c une vitesse wa(k,l). |
243 |
c |
244 |
c -------------------- |
245 |
c |
246 |
c + + + + + + + + + + |
247 |
c |
248 |
c wa(k,l) ---- -------------------- l |
249 |
c /\ |
250 |
c /||\ + + + + + + + + + + |
251 |
c || |
252 |
c || -------------------- |
253 |
c || |
254 |
c || + + + + + + + + + + |
255 |
c || |
256 |
c || -------------------- |
257 |
c ||__ |
258 |
c |___ + + + + + + + + + + k |
259 |
c |
260 |
c -------------------- |
261 |
c |
262 |
c |
263 |
c |
264 |
c------------------------------------------------------------------ |
265 |
|
266 |
cCR: ponderation entrainement des couches instables |
267 |
cdef des entr_star tels que entr=f*entr_star |
268 |
do l=1,klev |
269 |
do ig=1,ngrid |
270 |
entr_star(ig,l)=0. |
271 |
enddo |
272 |
enddo |
273 |
c determination de la longueur de la couche d entrainement |
274 |
do ig=1,ngrid |
275 |
lentr(ig)=1 |
276 |
enddo |
277 |
|
278 |
con ne considere que les premieres couches instables |
279 |
do k=nlay-2,1,-1 |
280 |
do ig=1,ngrid |
281 |
if (ztv(ig,k).gt.ztv(ig,k+1).and. |
282 |
s ztv(ig,k+1).le.ztv(ig,k+2)) then |
283 |
lentr(ig)=k |
284 |
endif |
285 |
enddo |
286 |
enddo |
287 |
|
288 |
c determination du lmin: couche d ou provient le thermique |
289 |
do ig=1,ngrid |
290 |
lmin(ig)=1 |
291 |
enddo |
292 |
do ig=1,ngrid |
293 |
do l=nlay,2,-1 |
294 |
if (ztv(ig,l-1).gt.ztv(ig,l)) then |
295 |
lmin(ig)=l-1 |
296 |
endif |
297 |
enddo |
298 |
enddo |
299 |
c |
300 |
c definition de l'entrainement des couches |
301 |
do l=1,klev-1 |
302 |
do ig=1,ngrid |
303 |
if (ztv(ig,l).gt.ztv(ig,l+1).and. |
304 |
s l.ge.lmin(ig).and.l.le.lentr(ig)) then |
305 |
entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))* |
306 |
s (zlev(ig,l+1)-zlev(ig,l)) |
307 |
endif |
308 |
enddo |
309 |
enddo |
310 |
c pas de thermique si couches 1->5 stables |
311 |
do ig=1,ngrid |
312 |
if (lmin(ig).gt.5) then |
313 |
do l=1,klev |
314 |
entr_star(ig,l)=0. |
315 |
enddo |
316 |
endif |
317 |
enddo |
318 |
c calcul de l entrainement total |
319 |
do ig=1,ngrid |
320 |
entr_star_tot(ig)=0. |
321 |
enddo |
322 |
do ig=1,ngrid |
323 |
do k=1,klev |
324 |
entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,k) |
325 |
enddo |
326 |
enddo |
327 |
c |
328 |
print*,'fin calcul entr_star' |
329 |
do k=1,klev |
330 |
do ig=1,ngrid |
331 |
ztva(ig,k)=ztv(ig,k) |
332 |
enddo |
333 |
enddo |
334 |
cRC |
335 |
c print*,'7 OK convect8' |
336 |
do k=1,klev+1 |
337 |
do ig=1,ngrid |
338 |
zw2(ig,k)=0. |
339 |
fmc(ig,k)=0. |
340 |
cCR |
341 |
f_star(ig,k)=0. |
342 |
cRC |
343 |
larg_cons(ig,k)=0. |
344 |
larg_detr(ig,k)=0. |
345 |
wa_moy(ig,k)=0. |
346 |
enddo |
347 |
enddo |
348 |
|
349 |
c print*,'8 OK convect8' |
350 |
do ig=1,ngrid |
351 |
linter(ig)=1. |
352 |
lmaxa(ig)=1 |
353 |
lmix(ig)=1 |
354 |
wmaxa(ig)=0. |
355 |
enddo |
356 |
|
357 |
cCR: |
358 |
do l=1,nlay-2 |
359 |
do ig=1,ngrid |
360 |
if (ztv(ig,l).gt.ztv(ig,l+1) |
361 |
s .and.entr_star(ig,l).gt.1.e-10 |
362 |
s .and.zw2(ig,l).lt.1e-10) then |
363 |
f_star(ig,l+1)=entr_star(ig,l) |
364 |
ctest:calcul de dteta |
365 |
zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) |
366 |
s *(zlev(ig,l+1)-zlev(ig,l)) |
367 |
s *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l)) |
368 |
larg_detr(ig,l)=0. |
369 |
else if ((zw2(ig,l).ge.1e-10).and. |
370 |
s (f_star(ig,l)+entr_star(ig,l).gt.1.e-10)) then |
371 |
f_star(ig,l+1)=f_star(ig,l)+entr_star(ig,l) |
372 |
ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l) |
373 |
s *ztv(ig,l))/f_star(ig,l+1) |
374 |
zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+ |
375 |
s 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) |
376 |
s *(zlev(ig,l+1)-zlev(ig,l)) |
377 |
endif |
378 |
c determination de zmax continu par interpolation lineaire |
379 |
if (zw2(ig,l+1).lt.0.) then |
380 |
ctest |
381 |
if (abs(zw2(ig,l+1)-zw2(ig,l)).lt.1e-10) then |
382 |
print*,'pb linter' |
383 |
endif |
384 |
linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) |
385 |
s -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) |
386 |
zw2(ig,l+1)=0. |
387 |
lmaxa(ig)=l |
388 |
else |
389 |
if (zw2(ig,l+1).lt.0.) then |
390 |
print*,'pb1 zw2<0' |
391 |
endif |
392 |
wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) |
393 |
endif |
394 |
if (wa_moy(ig,l+1).gt.wmaxa(ig)) then |
395 |
c lmix est le niveau de la couche ou w (wa_moy) est maximum |
396 |
lmix(ig)=l+1 |
397 |
wmaxa(ig)=wa_moy(ig,l+1) |
398 |
endif |
399 |
enddo |
400 |
enddo |
401 |
print*,'fin calcul zw2' |
402 |
c |
403 |
c Calcul de la couche correspondant a la hauteur du thermique |
404 |
do ig=1,ngrid |
405 |
lmax(ig)=lentr(ig) |
406 |
enddo |
407 |
do ig=1,ngrid |
408 |
do l=nlay,lentr(ig)+1,-1 |
409 |
if (zw2(ig,l).le.1.e-10) then |
410 |
lmax(ig)=l-1 |
411 |
endif |
412 |
enddo |
413 |
enddo |
414 |
c pas de thermique si couches 1->5 stables |
415 |
do ig=1,ngrid |
416 |
if (lmin(ig).gt.5) then |
417 |
lmax(ig)=1 |
418 |
lmin(ig)=1 |
419 |
endif |
420 |
enddo |
421 |
c |
422 |
c Determination de zw2 max |
423 |
do ig=1,ngrid |
424 |
wmax(ig)=0. |
425 |
enddo |
426 |
|
427 |
do l=1,nlay |
428 |
do ig=1,ngrid |
429 |
if (l.le.lmax(ig)) then |
430 |
if (zw2(ig,l).lt.0.)then |
431 |
print*,'pb2 zw2<0' |
432 |
endif |
433 |
zw2(ig,l)=sqrt(zw2(ig,l)) |
434 |
wmax(ig)=max(wmax(ig),zw2(ig,l)) |
435 |
else |
436 |
zw2(ig,l)=0. |
437 |
endif |
438 |
enddo |
439 |
enddo |
440 |
|
441 |
c Longueur caracteristique correspondant a la hauteur des thermiques. |
442 |
do ig=1,ngrid |
443 |
zmax(ig)=0. |
444 |
zlevinter(ig)=zlev(ig,1) |
445 |
enddo |
446 |
do ig=1,ngrid |
447 |
c calcul de zlevinter |
448 |
zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))* |
449 |
s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1) |
450 |
s -zlev(ig,lmax(ig))) |
451 |
zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) |
452 |
enddo |
453 |
|
454 |
print*,'avant fermeture' |
455 |
c Fermeture,determination de f |
456 |
do ig=1,ngrid |
457 |
entr_star2(ig)=0. |
458 |
enddo |
459 |
do ig=1,ngrid |
460 |
if (entr_star_tot(ig).LT.1.e-10) then |
461 |
f(ig)=0. |
462 |
else |
463 |
do k=lmin(ig),lentr(ig) |
464 |
entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2 |
465 |
s /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) |
466 |
enddo |
467 |
c Nouvelle fermeture |
468 |
f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect |
469 |
s *entr_star2(ig))*entr_star_tot(ig) |
470 |
ctest |
471 |
c if (first) then |
472 |
c f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig) |
473 |
c s *wmax(ig)) |
474 |
c endif |
475 |
endif |
476 |
c f0(ig)=f(ig) |
477 |
c first=.true. |
478 |
enddo |
479 |
print*,'apres fermeture' |
480 |
|
481 |
c Calcul de l'entrainement |
482 |
do k=1,klev |
483 |
do ig=1,ngrid |
484 |
entr(ig,k)=f(ig)*entr_star(ig,k) |
485 |
enddo |
486 |
enddo |
487 |
c Calcul des flux |
488 |
do ig=1,ngrid |
489 |
do l=1,lmax(ig)-1 |
490 |
fmc(ig,l+1)=fmc(ig,l)+entr(ig,l) |
491 |
enddo |
492 |
enddo |
493 |
|
494 |
cRC |
495 |
|
496 |
|
497 |
c print*,'9 OK convect8' |
498 |
c print*,'WA1 ',wa_moy |
499 |
|
500 |
c determination de l'indice du debut de la mixed layer ou w decroit |
501 |
|
502 |
c calcul de la largeur de chaque ascendance dans le cas conservatif. |
503 |
c dans ce cas simple, on suppose que la largeur de l'ascendance provenant |
504 |
c d'une couche est égale à la hauteur de la couche alimentante. |
505 |
c La vitesse maximale dans l'ascendance est aussi prise comme estimation |
506 |
c de la vitesse d'entrainement horizontal dans la couche alimentante. |
507 |
|
508 |
do l=2,nlay |
509 |
do ig=1,ngrid |
510 |
if (l.le.lmaxa(ig)) then |
511 |
zw=max(wa_moy(ig,l),1.e-10) |
512 |
larg_cons(ig,l)=zmax(ig)*r_aspect |
513 |
s *fmc(ig,l)/(rhobarz(ig,l)*zw) |
514 |
endif |
515 |
enddo |
516 |
enddo |
517 |
|
518 |
do l=2,nlay |
519 |
do ig=1,ngrid |
520 |
if (l.le.lmaxa(ig)) then |
521 |
c if (idetr.eq.0) then |
522 |
c cette option est finalement en dur. |
523 |
if ((l_mix*zlev(ig,l)).lt.0.)then |
524 |
print*,'pb l_mix*zlev<0' |
525 |
endif |
526 |
larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
527 |
c else if (idetr.eq.1) then |
528 |
c larg_detr(ig,l)=larg_cons(ig,l) |
529 |
c s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) |
530 |
c else if (idetr.eq.2) then |
531 |
c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
532 |
c s *sqrt(wa_moy(ig,l)) |
533 |
c else if (idetr.eq.4) then |
534 |
c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
535 |
c s *wa_moy(ig,l) |
536 |
c endif |
537 |
endif |
538 |
enddo |
539 |
enddo |
540 |
|
541 |
c print*,'10 OK convect8' |
542 |
c print*,'WA2 ',wa_moy |
543 |
c calcul de la fraction de la maille concernée par l'ascendance en tenant |
544 |
c compte de l'epluchage du thermique. |
545 |
c |
546 |
cCR def de zmix continu (profil parabolique des vitesses) |
547 |
do ig=1,ngrid |
548 |
if (lmix(ig).gt.1.) then |
549 |
c test |
550 |
if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
551 |
s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1))) |
552 |
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
553 |
s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10) |
554 |
s then |
555 |
c |
556 |
zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
557 |
s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2) |
558 |
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
559 |
s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2)) |
560 |
s /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
561 |
s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1))) |
562 |
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
563 |
s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) |
564 |
else |
565 |
zmix(ig)=zlev(ig,lmix(ig)) |
566 |
print*,'pb zmix' |
567 |
endif |
568 |
else |
569 |
zmix(ig)=0. |
570 |
endif |
571 |
ctest |
572 |
if ((zmax(ig)-zmix(ig)).lt.0.) then |
573 |
zmix(ig)=0.99*zmax(ig) |
574 |
c print*,'pb zmix>zmax' |
575 |
endif |
576 |
enddo |
577 |
c |
578 |
c calcul du nouveau lmix correspondant |
579 |
do ig=1,ngrid |
580 |
do l=1,klev |
581 |
if (zmix(ig).ge.zlev(ig,l).and. |
582 |
s zmix(ig).lt.zlev(ig,l+1)) then |
583 |
lmix(ig)=l |
584 |
endif |
585 |
enddo |
586 |
enddo |
587 |
c |
588 |
do l=2,nlay |
589 |
do ig=1,ngrid |
590 |
if(larg_cons(ig,l).gt.1.) then |
591 |
c print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' |
592 |
fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l)) |
593 |
s /(r_aspect*zmax(ig)) |
594 |
c test |
595 |
fraca(ig,l)=max(fraca(ig,l),0.) |
596 |
fraca(ig,l)=min(fraca(ig,l),0.5) |
597 |
fracd(ig,l)=1.-fraca(ig,l) |
598 |
fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig)) |
599 |
else |
600 |
c wa_moy(ig,l)=0. |
601 |
fraca(ig,l)=0. |
602 |
fracc(ig,l)=0. |
603 |
fracd(ig,l)=1. |
604 |
endif |
605 |
enddo |
606 |
enddo |
607 |
cCR: calcul de fracazmix |
608 |
do ig=1,ngrid |
609 |
fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ |
610 |
s (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) |
611 |
s +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1) |
612 |
s -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig))) |
613 |
enddo |
614 |
c |
615 |
do l=2,nlay |
616 |
do ig=1,ngrid |
617 |
if(larg_cons(ig,l).gt.1.) then |
618 |
if (l.gt.lmix(ig)) then |
619 |
ctest |
620 |
if (zmax(ig)-zmix(ig).lt.1.e-10) then |
621 |
c print*,'pb xxx' |
622 |
xxx(ig,l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig)) |
623 |
else |
624 |
xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig)) |
625 |
endif |
626 |
if (idetr.eq.0) then |
627 |
fraca(ig,l)=fracazmix(ig) |
628 |
else if (idetr.eq.1) then |
629 |
fraca(ig,l)=fracazmix(ig)*xxx(ig,l) |
630 |
else if (idetr.eq.2) then |
631 |
fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2) |
632 |
else |
633 |
fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2 |
634 |
endif |
635 |
c print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' |
636 |
fraca(ig,l)=max(fraca(ig,l),0.) |
637 |
fraca(ig,l)=min(fraca(ig,l),0.5) |
638 |
fracd(ig,l)=1.-fraca(ig,l) |
639 |
fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig)) |
640 |
endif |
641 |
endif |
642 |
enddo |
643 |
enddo |
644 |
|
645 |
print*,'fin calcul fraca' |
646 |
c print*,'11 OK convect8' |
647 |
c print*,'Ea3 ',wa_moy |
648 |
c------------------------------------------------------------------ |
649 |
c Calcul de fracd, wd |
650 |
c somme wa - wd = 0 |
651 |
c------------------------------------------------------------------ |
652 |
|
653 |
|
654 |
do ig=1,ngrid |
655 |
fm(ig,1)=0. |
656 |
fm(ig,nlay+1)=0. |
657 |
enddo |
658 |
|
659 |
do l=2,nlay |
660 |
do ig=1,ngrid |
661 |
fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l) |
662 |
cCR:test |
663 |
if (entr(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1) |
664 |
s .and.l.gt.lmix(ig)) then |
665 |
fm(ig,l)=fm(ig,l-1) |
666 |
c write(1,*)'ajustement fm, l',l |
667 |
endif |
668 |
c write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) |
669 |
cRC |
670 |
enddo |
671 |
do ig=1,ngrid |
672 |
if(fracd(ig,l).lt.0.1) then |
673 |
stop'fracd trop petit' |
674 |
else |
675 |
c vitesse descendante "diagnostique" |
676 |
wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l)) |
677 |
endif |
678 |
enddo |
679 |
enddo |
680 |
|
681 |
do l=1,nlay |
682 |
do ig=1,ngrid |
683 |
c masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) |
684 |
masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG |
685 |
enddo |
686 |
enddo |
687 |
|
688 |
print*,'12 OK convect8' |
689 |
c print*,'WA4 ',wa_moy |
690 |
cc------------------------------------------------------------------ |
691 |
c calcul du transport vertical |
692 |
c------------------------------------------------------------------ |
693 |
|
694 |
go to 4444 |
695 |
c print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep |
696 |
do l=2,nlay-1 |
697 |
do ig=1,ngrid |
698 |
if(fm(ig,l+1)*ptimestep.gt.masse(ig,l) |
699 |
s .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then |
700 |
c print*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' |
701 |
c s ,fm(ig,l+1)*ptimestep |
702 |
c s ,' M=',masse(ig,l),masse(ig,l+1) |
703 |
endif |
704 |
enddo |
705 |
enddo |
706 |
|
707 |
do l=1,nlay |
708 |
do ig=1,ngrid |
709 |
if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then |
710 |
c print*,'WARN!!! E>M ig=',ig,' l=',l,' E==' |
711 |
c s ,entr(ig,l)*ptimestep |
712 |
c s ,' M=',masse(ig,l) |
713 |
endif |
714 |
enddo |
715 |
enddo |
716 |
|
717 |
do l=1,nlay |
718 |
do ig=1,ngrid |
719 |
if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then |
720 |
c print*,'WARN!!! fm exagere ig=',ig,' l=',l |
721 |
c s ,' FM=',fm(ig,l) |
722 |
endif |
723 |
if(.not.masse(ig,l).ge.1.e-10 |
724 |
s .or..not.masse(ig,l).le.1.e4) then |
725 |
endif |
726 |
if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then |
727 |
c print*,'WARN!!! entr exagere ig=',ig,' l=',l |
728 |
c s ,' E=',entr(ig,l) |
729 |
endif |
730 |
enddo |
731 |
enddo |
732 |
|
733 |
4444 continue |
734 |
|
735 |
cCR:redefinition du entr |
736 |
do l=1,nlay |
737 |
do ig=1,ngrid |
738 |
detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) |
739 |
if (detr(ig,l).lt.0.) then |
740 |
entr(ig,l)=entr(ig,l)-detr(ig,l) |
741 |
detr(ig,l)=0. |
742 |
c print*,'WARNING !!! detrainement negatif ',ig,l |
743 |
endif |
744 |
enddo |
745 |
enddo |
746 |
cRC |
747 |
if (w2di.eq.1) then |
748 |
fm0=fm0+ptimestep*(fm-fm0)/float(tho) |
749 |
entr0=entr0+ptimestep*(entr-entr0)/float(tho) |
750 |
else |
751 |
fm0=fm |
752 |
entr0=entr |
753 |
endif |
754 |
|
755 |
if (1.eq.1) then |
756 |
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
757 |
. ,zh,zdhadj,zha) |
758 |
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
759 |
. ,zo,pdoadj,zoa) |
760 |
else |
761 |
call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca |
762 |
. ,zh,zdhadj,zha) |
763 |
call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca |
764 |
. ,zo,pdoadj,zoa) |
765 |
endif |
766 |
|
767 |
if (1.eq.0) then |
768 |
call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse |
769 |
. ,fraca,zmax |
770 |
. ,zu,zv,pduadj,pdvadj,zua,zva) |
771 |
else |
772 |
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
773 |
. ,zu,pduadj,zua) |
774 |
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
775 |
. ,zv,pdvadj,zva) |
776 |
endif |
777 |
|
778 |
do l=1,nlay |
779 |
do ig=1,ngrid |
780 |
zf=0.5*(fracc(ig,l)+fracc(ig,l+1)) |
781 |
zf2=zf/(1.-zf) |
782 |
thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2 |
783 |
wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 |
784 |
enddo |
785 |
enddo |
786 |
|
787 |
|
788 |
|
789 |
c print*,'13 OK convect8' |
790 |
c print*,'WA5 ',wa_moy |
791 |
do l=1,nlay |
792 |
do ig=1,ngrid |
793 |
pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l) |
794 |
enddo |
795 |
enddo |
796 |
|
797 |
|
798 |
c do l=1,nlay |
799 |
c do ig=1,ngrid |
800 |
c if(abs(pdtadj(ig,l))*86400..gt.500.) then |
801 |
c print*,'WARN!!! ig=',ig,' l=',l |
802 |
c s ,' pdtadj=',pdtadj(ig,l) |
803 |
c endif |
804 |
c if(abs(pdoadj(ig,l))*86400..gt.1.) then |
805 |
c print*,'WARN!!! ig=',ig,' l=',l |
806 |
c s ,' pdoadj=',pdoadj(ig,l) |
807 |
c endif |
808 |
c enddo |
809 |
c enddo |
810 |
|
811 |
print*,'14 OK convect8' |
812 |
c------------------------------------------------------------------ |
813 |
c Calculs pour les sorties |
814 |
c------------------------------------------------------------------ |
815 |
|
816 |
if(sorties) then |
817 |
do l=1,nlay |
818 |
do ig=1,ngrid |
819 |
zla(ig,l)=(1.-fracd(ig,l))*zmax(ig) |
820 |
zld(ig,l)=fracd(ig,l)*zmax(ig) |
821 |
if(1.-fracd(ig,l).gt.1.e-10) |
822 |
s zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l)) |
823 |
enddo |
824 |
enddo |
825 |
|
826 |
cdeja fait |
827 |
c do l=1,nlay |
828 |
c do ig=1,ngrid |
829 |
c detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) |
830 |
c if (detr(ig,l).lt.0.) then |
831 |
c entr(ig,l)=entr(ig,l)-detr(ig,l) |
832 |
c detr(ig,l)=0. |
833 |
c print*,'WARNING !!! detrainement negatif ',ig,l |
834 |
c endif |
835 |
c enddo |
836 |
c enddo |
837 |
|
838 |
c print*,'15 OK convect8' |
839 |
|
840 |
isplit=isplit+1 |
841 |
|
842 |
|
843 |
goto 123 |
844 |
123 continue |
845 |
|
846 |
endif |
847 |
|
848 |
c if(wa_moy(1,4).gt.1.e-10) stop |
849 |
|
850 |
print*,'19 OK convect8' |
851 |
return |
852 |
end |
853 |
|
854 |
subroutine dqthermcell(ngrid,nlay,ptimestep,fm,entr,masse |
855 |
. ,q,dq,qa) |
856 |
use dimens_m |
857 |
use dimphy |
858 |
implicit none |
859 |
|
860 |
c======================================================================= |
861 |
c |
862 |
c Calcul du transport verticale dans la couche limite en presence |
863 |
c de "thermiques" explicitement representes |
864 |
c calcul du dq/dt une fois qu'on connait les ascendances |
865 |
c |
866 |
c======================================================================= |
867 |
|
868 |
|
869 |
integer ngrid,nlay |
870 |
|
871 |
real ptimestep |
872 |
real, intent(in):: masse(ngrid,nlay) |
873 |
real fm(ngrid,nlay+1) |
874 |
real entr(ngrid,nlay) |
875 |
real q(ngrid,nlay) |
876 |
real dq(ngrid,nlay) |
877 |
|
878 |
real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1) |
879 |
|
880 |
integer ig,k |
881 |
|
882 |
c calcul du detrainement |
883 |
|
884 |
do k=1,nlay |
885 |
do ig=1,ngrid |
886 |
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
887 |
enddo |
888 |
enddo |
889 |
|
890 |
c calcul de la valeur dans les ascendances |
891 |
do ig=1,ngrid |
892 |
qa(ig,1)=q(ig,1) |
893 |
enddo |
894 |
|
895 |
do k=2,nlay |
896 |
do ig=1,ngrid |
897 |
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
898 |
s 1.e-5*masse(ig,k)) then |
899 |
qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k)) |
900 |
s /(fm(ig,k+1)+detr(ig,k)) |
901 |
else |
902 |
qa(ig,k)=q(ig,k) |
903 |
endif |
904 |
enddo |
905 |
enddo |
906 |
|
907 |
do k=2,nlay |
908 |
do ig=1,ngrid |
909 |
c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) |
910 |
wqd(ig,k)=fm(ig,k)*q(ig,k) |
911 |
enddo |
912 |
enddo |
913 |
do ig=1,ngrid |
914 |
wqd(ig,1)=0. |
915 |
wqd(ig,nlay+1)=0. |
916 |
enddo |
917 |
|
918 |
do k=1,nlay |
919 |
do ig=1,ngrid |
920 |
dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k) |
921 |
s -wqd(ig,k)+wqd(ig,k+1)) |
922 |
s /masse(ig,k) |
923 |
enddo |
924 |
enddo |
925 |
|
926 |
return |
927 |
end |
928 |
subroutine dvthermcell(ngrid,nlay,ptimestep,fm,entr,masse |
929 |
. ,fraca,larga |
930 |
. ,u,v,du,dv,ua,va) |
931 |
use dimens_m |
932 |
use dimphy |
933 |
implicit none |
934 |
|
935 |
c======================================================================= |
936 |
c |
937 |
c Calcul du transport verticale dans la couche limite en presence |
938 |
c de "thermiques" explicitement representes |
939 |
c calcul du dq/dt une fois qu'on connait les ascendances |
940 |
c |
941 |
c======================================================================= |
942 |
|
943 |
|
944 |
integer ngrid,nlay |
945 |
|
946 |
real ptimestep |
947 |
real masse(ngrid,nlay),fm(ngrid,nlay+1) |
948 |
real fraca(ngrid,nlay+1) |
949 |
real larga(ngrid) |
950 |
real entr(ngrid,nlay) |
951 |
real u(ngrid,nlay) |
952 |
real ua(ngrid,nlay) |
953 |
real du(ngrid,nlay) |
954 |
real v(ngrid,nlay) |
955 |
real va(ngrid,nlay) |
956 |
real dv(ngrid,nlay) |
957 |
|
958 |
real qa(klon,klev),detr(klon,klev) |
959 |
real wvd(klon,klev+1),wud(klon,klev+1) |
960 |
real gamma0,gamma(klon,klev+1) |
961 |
real dua,dva |
962 |
integer iter |
963 |
|
964 |
integer ig,k |
965 |
|
966 |
c calcul du detrainement |
967 |
|
968 |
do k=1,nlay |
969 |
do ig=1,ngrid |
970 |
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
971 |
enddo |
972 |
enddo |
973 |
|
974 |
c calcul de la valeur dans les ascendances |
975 |
do ig=1,ngrid |
976 |
ua(ig,1)=u(ig,1) |
977 |
va(ig,1)=v(ig,1) |
978 |
enddo |
979 |
|
980 |
do k=2,nlay |
981 |
do ig=1,ngrid |
982 |
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
983 |
s 1.e-5*masse(ig,k)) then |
984 |
c On itère sur la valeur du coeff de freinage. |
985 |
c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) |
986 |
gamma0=masse(ig,k) |
987 |
s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) ) |
988 |
s *0.5/larga(ig) |
989 |
c gamma0=0. |
990 |
c la première fois on multiplie le coefficient de freinage |
991 |
c par le module du vent dans la couche en dessous. |
992 |
dua=ua(ig,k-1)-u(ig,k-1) |
993 |
dva=va(ig,k-1)-v(ig,k-1) |
994 |
do iter=1,5 |
995 |
gamma(ig,k)=gamma0*sqrt(dua**2+dva**2) |
996 |
ua(ig,k)=(fm(ig,k)*ua(ig,k-1) |
997 |
s +(entr(ig,k)+gamma(ig,k))*u(ig,k)) |
998 |
s /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k)) |
999 |
va(ig,k)=(fm(ig,k)*va(ig,k-1) |
1000 |
s +(entr(ig,k)+gamma(ig,k))*v(ig,k)) |
1001 |
s /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k)) |
1002 |
c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva |
1003 |
dua=ua(ig,k)-u(ig,k) |
1004 |
dva=va(ig,k)-v(ig,k) |
1005 |
enddo |
1006 |
else |
1007 |
ua(ig,k)=u(ig,k) |
1008 |
va(ig,k)=v(ig,k) |
1009 |
gamma(ig,k)=0. |
1010 |
endif |
1011 |
enddo |
1012 |
enddo |
1013 |
|
1014 |
do k=2,nlay |
1015 |
do ig=1,ngrid |
1016 |
wud(ig,k)=fm(ig,k)*u(ig,k) |
1017 |
wvd(ig,k)=fm(ig,k)*v(ig,k) |
1018 |
enddo |
1019 |
enddo |
1020 |
do ig=1,ngrid |
1021 |
wud(ig,1)=0. |
1022 |
wud(ig,nlay+1)=0. |
1023 |
wvd(ig,1)=0. |
1024 |
wvd(ig,nlay+1)=0. |
1025 |
enddo |
1026 |
|
1027 |
do k=1,nlay |
1028 |
do ig=1,ngrid |
1029 |
du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k) |
1030 |
s -(entr(ig,k)+gamma(ig,k))*u(ig,k) |
1031 |
s -wud(ig,k)+wud(ig,k+1)) |
1032 |
s /masse(ig,k) |
1033 |
dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k) |
1034 |
s -(entr(ig,k)+gamma(ig,k))*v(ig,k) |
1035 |
s -wvd(ig,k)+wvd(ig,k+1)) |
1036 |
s /masse(ig,k) |
1037 |
enddo |
1038 |
enddo |
1039 |
|
1040 |
return |
1041 |
end |
1042 |
subroutine dqthermcell2(ngrid,nlay,ptimestep,fm,entr,masse,frac |
1043 |
. ,q,dq,qa) |
1044 |
use dimens_m |
1045 |
use dimphy |
1046 |
implicit none |
1047 |
|
1048 |
c======================================================================= |
1049 |
c |
1050 |
c Calcul du transport verticale dans la couche limite en presence |
1051 |
c de "thermiques" explicitement representes |
1052 |
c calcul du dq/dt une fois qu'on connait les ascendances |
1053 |
c |
1054 |
c======================================================================= |
1055 |
|
1056 |
|
1057 |
integer ngrid,nlay |
1058 |
|
1059 |
real ptimestep |
1060 |
real masse(ngrid,nlay),fm(ngrid,nlay+1) |
1061 |
real entr(ngrid,nlay),frac(ngrid,nlay) |
1062 |
real q(ngrid,nlay) |
1063 |
real dq(ngrid,nlay) |
1064 |
|
1065 |
real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1) |
1066 |
real qe(klon,klev),zf,zf2 |
1067 |
|
1068 |
integer ig,k |
1069 |
|
1070 |
c calcul du detrainement |
1071 |
|
1072 |
do k=1,nlay |
1073 |
do ig=1,ngrid |
1074 |
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
1075 |
enddo |
1076 |
enddo |
1077 |
|
1078 |
c calcul de la valeur dans les ascendances |
1079 |
do ig=1,ngrid |
1080 |
qa(ig,1)=q(ig,1) |
1081 |
qe(ig,1)=q(ig,1) |
1082 |
enddo |
1083 |
|
1084 |
do k=2,nlay |
1085 |
do ig=1,ngrid |
1086 |
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
1087 |
s 1.e-5*masse(ig,k)) then |
1088 |
zf=0.5*(frac(ig,k)+frac(ig,k+1)) |
1089 |
zf2=1./(1.-zf) |
1090 |
qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k)) |
1091 |
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2) |
1092 |
qe(ig,k)=(q(ig,k)-zf*qa(ig,k))*zf2 |
1093 |
else |
1094 |
qa(ig,k)=q(ig,k) |
1095 |
qe(ig,k)=q(ig,k) |
1096 |
endif |
1097 |
enddo |
1098 |
enddo |
1099 |
|
1100 |
do k=2,nlay |
1101 |
do ig=1,ngrid |
1102 |
c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) |
1103 |
wqd(ig,k)=fm(ig,k)*qe(ig,k) |
1104 |
enddo |
1105 |
enddo |
1106 |
do ig=1,ngrid |
1107 |
wqd(ig,1)=0. |
1108 |
wqd(ig,nlay+1)=0. |
1109 |
enddo |
1110 |
|
1111 |
do k=1,nlay |
1112 |
do ig=1,ngrid |
1113 |
dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k) |
1114 |
s -wqd(ig,k)+wqd(ig,k+1)) |
1115 |
s /masse(ig,k) |
1116 |
enddo |
1117 |
enddo |
1118 |
|
1119 |
return |
1120 |
end |
1121 |
subroutine dvthermcell2(ngrid,nlay,ptimestep,fm,entr,masse |
1122 |
. ,fraca,larga |
1123 |
. ,u,v,du,dv,ua,va) |
1124 |
use dimens_m |
1125 |
use dimphy |
1126 |
implicit none |
1127 |
|
1128 |
c======================================================================= |
1129 |
c |
1130 |
c Calcul du transport verticale dans la couche limite en presence |
1131 |
c de "thermiques" explicitement representes |
1132 |
c calcul du dq/dt une fois qu'on connait les ascendances |
1133 |
c |
1134 |
c======================================================================= |
1135 |
|
1136 |
|
1137 |
integer ngrid,nlay |
1138 |
|
1139 |
real ptimestep |
1140 |
real masse(ngrid,nlay),fm(ngrid,nlay+1) |
1141 |
real fraca(ngrid,nlay+1) |
1142 |
real larga(ngrid) |
1143 |
real entr(ngrid,nlay) |
1144 |
real u(ngrid,nlay) |
1145 |
real ua(ngrid,nlay) |
1146 |
real du(ngrid,nlay) |
1147 |
real v(ngrid,nlay) |
1148 |
real va(ngrid,nlay) |
1149 |
real dv(ngrid,nlay) |
1150 |
|
1151 |
real qa(klon,klev),detr(klon,klev),zf,zf2 |
1152 |
real wvd(klon,klev+1),wud(klon,klev+1) |
1153 |
real gamma0,gamma(klon,klev+1) |
1154 |
real ue(klon,klev),ve(klon,klev) |
1155 |
real dua,dva |
1156 |
integer iter |
1157 |
|
1158 |
integer ig,k |
1159 |
|
1160 |
c calcul du detrainement |
1161 |
|
1162 |
do k=1,nlay |
1163 |
do ig=1,ngrid |
1164 |
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
1165 |
enddo |
1166 |
enddo |
1167 |
|
1168 |
c calcul de la valeur dans les ascendances |
1169 |
do ig=1,ngrid |
1170 |
ua(ig,1)=u(ig,1) |
1171 |
va(ig,1)=v(ig,1) |
1172 |
ue(ig,1)=u(ig,1) |
1173 |
ve(ig,1)=v(ig,1) |
1174 |
enddo |
1175 |
|
1176 |
do k=2,nlay |
1177 |
do ig=1,ngrid |
1178 |
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
1179 |
s 1.e-5*masse(ig,k)) then |
1180 |
c On itère sur la valeur du coeff de freinage. |
1181 |
c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) |
1182 |
gamma0=masse(ig,k) |
1183 |
s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) ) |
1184 |
s *0.5/larga(ig) |
1185 |
s *1. |
1186 |
c s *0.5 |
1187 |
c gamma0=0. |
1188 |
zf=0.5*(fraca(ig,k)+fraca(ig,k+1)) |
1189 |
zf=0. |
1190 |
zf2=1./(1.-zf) |
1191 |
c la première fois on multiplie le coefficient de freinage |
1192 |
c par le module du vent dans la couche en dessous. |
1193 |
dua=ua(ig,k-1)-u(ig,k-1) |
1194 |
dva=va(ig,k-1)-v(ig,k-1) |
1195 |
do iter=1,5 |
1196 |
c On choisit une relaxation lineaire. |
1197 |
gamma(ig,k)=gamma0 |
1198 |
c On choisit une relaxation quadratique. |
1199 |
gamma(ig,k)=gamma0*sqrt(dua**2+dva**2) |
1200 |
ua(ig,k)=(fm(ig,k)*ua(ig,k-1) |
1201 |
s +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k)) |
1202 |
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 |
1203 |
s +gamma(ig,k)) |
1204 |
va(ig,k)=(fm(ig,k)*va(ig,k-1) |
1205 |
s +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k)) |
1206 |
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 |
1207 |
s +gamma(ig,k)) |
1208 |
c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva |
1209 |
dua=ua(ig,k)-u(ig,k) |
1210 |
dva=va(ig,k)-v(ig,k) |
1211 |
ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2 |
1212 |
ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2 |
1213 |
enddo |
1214 |
else |
1215 |
ua(ig,k)=u(ig,k) |
1216 |
va(ig,k)=v(ig,k) |
1217 |
ue(ig,k)=u(ig,k) |
1218 |
ve(ig,k)=v(ig,k) |
1219 |
gamma(ig,k)=0. |
1220 |
endif |
1221 |
enddo |
1222 |
enddo |
1223 |
|
1224 |
do k=2,nlay |
1225 |
do ig=1,ngrid |
1226 |
wud(ig,k)=fm(ig,k)*ue(ig,k) |
1227 |
wvd(ig,k)=fm(ig,k)*ve(ig,k) |
1228 |
enddo |
1229 |
enddo |
1230 |
do ig=1,ngrid |
1231 |
wud(ig,1)=0. |
1232 |
wud(ig,nlay+1)=0. |
1233 |
wvd(ig,1)=0. |
1234 |
wvd(ig,nlay+1)=0. |
1235 |
enddo |
1236 |
|
1237 |
do k=1,nlay |
1238 |
do ig=1,ngrid |
1239 |
du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k) |
1240 |
s -(entr(ig,k)+gamma(ig,k))*ue(ig,k) |
1241 |
s -wud(ig,k)+wud(ig,k+1)) |
1242 |
s /masse(ig,k) |
1243 |
dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k) |
1244 |
s -(entr(ig,k)+gamma(ig,k))*ve(ig,k) |
1245 |
s -wvd(ig,k)+wvd(ig,k+1)) |
1246 |
s /masse(ig,k) |
1247 |
enddo |
1248 |
enddo |
1249 |
|
1250 |
return |
1251 |
end |