/[lmdze]/trunk/libf/phylmd/Thermcell/thermcell.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/Thermcell/thermcell.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 71 - (show annotations)
Mon Jul 8 18:12:18 2013 UTC (10 years, 9 months ago) by guez
File size: 18892 byte(s)
No reason to call inidissip in ce0l.

In inidissip, set random seed to 1 beacuse PGI compiler does not
accept all zeros.

dq was computed needlessly in caladvtrac. Arguments masse and dq of
calfis not used.

Replaced real*8 by double precision.

Pass arrays with inverted order of vertical levels to conflx instead
of creating local variables for this inside conflx.

1 module thermcell_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE thermcell(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv, pt, &
8 po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, r_aspect, l_mix, w2di, &
9 tho)
10
11 ! Calcul du transport vertical dans la couche limite en présence
12 ! de "thermiques" explicitement représentés. Récriture à partir
13 ! d'un listing papier à Habas, le 14/02/00. Le thermique est
14 ! supposé homogène et dissipé par mélange avec son
15 ! environnement. La longueur "l_mix" contrôle l'efficacité du
16 ! mélange. Le calcul du transport des différentes espèces se fait
17 ! en prenant en compte :
18 ! 1. un flux de masse montant
19 ! 2. un flux de masse descendant
20 ! 3. un entraînement
21 ! 4. un détraînement
22
23 USE dimphy, ONLY : klev, klon
24 USE suphec_m, ONLY : rd, rg, rkappa
25
26 ! arguments:
27
28 INTEGER ngrid, nlay, w2di
29 real tho
30 real ptimestep, l_mix, r_aspect
31 REAL, intent(in):: pt(ngrid, nlay)
32 real pdtadj(ngrid, nlay)
33 REAL pu(ngrid, nlay), pduadj(ngrid, nlay)
34 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay)
35 REAL po(ngrid, nlay), pdoadj(ngrid, nlay)
36 REAL, intent(in):: pplay(ngrid, nlay)
37 real, intent(in):: pplev(ngrid, nlay+1)
38 real, intent(in):: pphi(ngrid, nlay)
39
40 integer idetr
41 save idetr
42 data idetr/3/
43
44 ! local:
45
46 INTEGER ig, k, l, lmaxa(klon), lmix(klon)
47 real zsortie1d(klon)
48 ! CR: on remplace lmax(klon, klev+1)
49 INTEGER lmax(klon), lmin(klon), lentr(klon)
50 real linter(klon)
51 real zmix(klon), fracazmix(klon)
52
53 real zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz
54
55 real zlev(klon, klev+1), zlay(klon, klev)
56 REAL zh(klon, klev), zdhadj(klon, klev)
57 REAL ztv(klon, klev)
58 real zu(klon, klev), zv(klon, klev), zo(klon, klev)
59 REAL wh(klon, klev+1)
60 real wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1)
61 real zla(klon, klev+1)
62 real zwa(klon, klev+1)
63 real zld(klon, klev+1)
64 real zwd(klon, klev+1)
65 real zsortie(klon, klev)
66 real zva(klon, klev)
67 real zua(klon, klev)
68 real zoa(klon, klev)
69
70 real zha(klon, klev)
71 real wa_moy(klon, klev+1)
72 real fraca(klon, klev+1)
73 real fracc(klon, klev+1)
74 real zf, zf2
75 real thetath2(klon, klev), wth2(klon, klev)
76 common/comtherm/thetath2, wth2
77
78 real count_time
79 integer isplit, nsplit, ialt
80 parameter (nsplit=10)
81 data isplit/0/
82 save isplit
83
84 logical sorties
85 real rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev)
86 real zpspsk(klon, klev)
87
88 real wmax(klon), wmaxa(klon)
89 real wa(klon, klev, klev+1)
90 real wd(klon, klev+1)
91 real larg_part(klon, klev, klev+1)
92 real fracd(klon, klev+1)
93 real xxx(klon, klev+1)
94 real larg_cons(klon, klev+1)
95 real larg_detr(klon, klev+1)
96 real fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev)
97 real pu_therm(klon, klev), pv_therm(klon, klev)
98 real fm(klon, klev+1), entr(klon, klev)
99 real fmc(klon, klev+1)
100
101 !CR:nouvelles variables
102 real f_star(klon, klev+1), entr_star(klon, klev)
103 real entr_star_tot(klon), entr_star2(klon)
104 real f(klon), f0(klon)
105 real zlevinter(klon)
106 logical first
107 data first /.false./
108 save first
109
110 character*2 str2
111 character*10 str10
112
113 LOGICAL vtest(klon), down
114
115 EXTERNAL SCOPY
116
117 integer ncorrec, ll
118 save ncorrec
119 data ncorrec/0/
120
121 !-----------------------------------------------------------------------
122
123 ! initialisation:
124
125 sorties=.true.
126 IF(ngrid.NE.klon) THEN
127 PRINT *
128 PRINT *, 'STOP dans convadj'
129 PRINT *, 'ngrid =', ngrid
130 PRINT *, 'klon =', klon
131 ENDIF
132
133 ! incrementation eventuelle de tendances precedentes:
134
135 print *, '0 OK convect8'
136
137 DO l=1, nlay
138 DO ig=1, ngrid
139 zpspsk(ig, l)=(pplay(ig, l)/pplev(ig, 1))**RKAPPA
140 zh(ig, l)=pt(ig, l)/zpspsk(ig, l)
141 zu(ig, l)=pu(ig, l)
142 zv(ig, l)=pv(ig, l)
143 zo(ig, l)=po(ig, l)
144 ztv(ig, l)=zh(ig, l)*(1.+0.61*zo(ig, l))
145 end DO
146 end DO
147
148 print *, '1 OK convect8'
149
150 ! See notes, "thermcell.txt"
151 ! Calcul des altitudes des couches
152
153 do l=2, nlay
154 do ig=1, ngrid
155 zlev(ig, l)=0.5*(pphi(ig, l)+pphi(ig, l-1))/RG
156 enddo
157 enddo
158 do ig=1, ngrid
159 zlev(ig, 1)=0.
160 zlev(ig, nlay+1)=(2.*pphi(ig, klev)-pphi(ig, klev-1))/RG
161 enddo
162 do l=1, nlay
163 do ig=1, ngrid
164 zlay(ig, l)=pphi(ig, l)/RG
165 enddo
166 enddo
167
168 ! Calcul des densites
169
170 do l=1, nlay
171 do ig=1, ngrid
172 rho(ig, l)=pplay(ig, l)/(zpspsk(ig, l)*RD*zh(ig, l))
173 enddo
174 enddo
175
176 do l=2, nlay
177 do ig=1, ngrid
178 rhobarz(ig, l)=0.5*(rho(ig, l)+rho(ig, l-1))
179 enddo
180 enddo
181
182 do k=1, nlay
183 do l=1, nlay+1
184 do ig=1, ngrid
185 wa(ig, k, l)=0.
186 enddo
187 enddo
188 enddo
189
190 ! Calcul de w2, quarre de w a partir de la cape
191 ! a partir de w2, on calcule wa, vitesse de l'ascendance
192
193 ! ATTENTION: Dans cette version, pour cause d'economie de memoire,
194 ! w2 est stoke dans wa
195
196 ! ATTENTION: dans convect8, on n'utilise le calcule des wa
197 ! independants par couches que pour calculer l'entrainement
198 ! a la base et la hauteur max de l'ascendance.
199
200 ! Indicages:
201 ! l'ascendance provenant du niveau k traverse l'interface l avec
202 ! une vitesse wa(k, l).
203 ! See notes, "thermcell.txt".
204
205 !CR: ponderation entrainement des couches instables
206 !def des entr_star tels que entr=f*entr_star
207 do l=1, klev
208 do ig=1, ngrid
209 entr_star(ig, l)=0.
210 enddo
211 enddo
212 ! determination de la longueur de la couche d entrainement
213 do ig=1, ngrid
214 lentr(ig)=1
215 enddo
216
217 !on ne considere que les premieres couches instables
218 do k=nlay-2, 1, -1
219 do ig=1, ngrid
220 if (ztv(ig, k).gt.ztv(ig, k+1).and. &
221 ztv(ig, k+1).le.ztv(ig, k+2)) then
222 lentr(ig)=k
223 endif
224 enddo
225 enddo
226
227 ! determination du lmin: couche d ou provient le thermique
228 do ig=1, ngrid
229 lmin(ig)=1
230 enddo
231 do ig=1, ngrid
232 do l=nlay, 2, -1
233 if (ztv(ig, l-1).gt.ztv(ig, l)) then
234 lmin(ig)=l-1
235 endif
236 enddo
237 enddo
238
239 ! definition de l'entrainement des couches
240 do l=1, klev-1
241 do ig=1, ngrid
242 if (ztv(ig, l).gt.ztv(ig, l+1).and. &
243 l.ge.lmin(ig).and.l.le.lentr(ig)) then
244 entr_star(ig, l)=(ztv(ig, l)-ztv(ig, l+1))* &
245 (zlev(ig, l+1)-zlev(ig, l))
246 endif
247 enddo
248 enddo
249 ! pas de thermique si couches 1->5 stables
250 do ig=1, ngrid
251 if (lmin(ig).gt.5) then
252 do l=1, klev
253 entr_star(ig, l)=0.
254 enddo
255 endif
256 enddo
257 ! calcul de l entrainement total
258 do ig=1, ngrid
259 entr_star_tot(ig)=0.
260 enddo
261 do ig=1, ngrid
262 do k=1, klev
263 entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig, k)
264 enddo
265 enddo
266
267 print *, 'fin calcul entr_star'
268 do k=1, klev
269 do ig=1, ngrid
270 ztva(ig, k)=ztv(ig, k)
271 enddo
272 enddo
273
274 do k=1, klev+1
275 do ig=1, ngrid
276 zw2(ig, k)=0.
277 fmc(ig, k)=0.
278
279 f_star(ig, k)=0.
280
281 larg_cons(ig, k)=0.
282 larg_detr(ig, k)=0.
283 wa_moy(ig, k)=0.
284 enddo
285 enddo
286
287 do ig=1, ngrid
288 linter(ig)=1.
289 lmaxa(ig)=1
290 lmix(ig)=1
291 wmaxa(ig)=0.
292 enddo
293
294 do l=1, nlay-2
295 do ig=1, ngrid
296 if (ztv(ig, l).gt.ztv(ig, l+1) &
297 .and.entr_star(ig, l).gt.1.e-10 &
298 .and.zw2(ig, l).lt.1e-10) then
299 f_star(ig, l+1)=entr_star(ig, l)
300 !test:calcul de dteta
301 zw2(ig, l+1)=2.*RG*(ztv(ig, l)-ztv(ig, l+1))/ztv(ig, l+1) &
302 *(zlev(ig, l+1)-zlev(ig, l)) &
303 *0.4*pphi(ig, l)/(pphi(ig, l+1)-pphi(ig, l))
304 larg_detr(ig, l)=0.
305 else if ((zw2(ig, l).ge.1e-10).and. &
306 (f_star(ig, l)+entr_star(ig, l).gt.1.e-10)) then
307 f_star(ig, l+1)=f_star(ig, l)+entr_star(ig, l)
308 ztva(ig, l)=(f_star(ig, l)*ztva(ig, l-1)+entr_star(ig, l) &
309 *ztv(ig, l))/f_star(ig, l+1)
310 zw2(ig, l+1)=zw2(ig, l)*(f_star(ig, l)/f_star(ig, l+1))**2+ &
311 2.*RG*(ztva(ig, l)-ztv(ig, l))/ztv(ig, l) &
312 *(zlev(ig, l+1)-zlev(ig, l))
313 endif
314 ! determination de zmax continu par interpolation lineaire
315 if (zw2(ig, l+1).lt.0.) then
316 if (abs(zw2(ig, l+1)-zw2(ig, l)).lt.1e-10) then
317 print *, 'pb linter'
318 endif
319 linter(ig)=(l*(zw2(ig, l+1)-zw2(ig, l)) &
320 -zw2(ig, l))/(zw2(ig, l+1)-zw2(ig, l))
321 zw2(ig, l+1)=0.
322 lmaxa(ig)=l
323 else
324 if (zw2(ig, l+1).lt.0.) then
325 print *, 'pb1 zw2<0'
326 endif
327 wa_moy(ig, l+1)=sqrt(zw2(ig, l+1))
328 endif
329 if (wa_moy(ig, l+1).gt.wmaxa(ig)) then
330 ! lmix est le niveau de la couche ou w (wa_moy) est maximum
331 lmix(ig)=l+1
332 wmaxa(ig)=wa_moy(ig, l+1)
333 endif
334 enddo
335 enddo
336 print *, 'fin calcul zw2'
337
338 ! Calcul de la couche correspondant a la hauteur du thermique
339 do ig=1, ngrid
340 lmax(ig)=lentr(ig)
341 enddo
342 do ig=1, ngrid
343 do l=nlay, lentr(ig)+1, -1
344 if (zw2(ig, l).le.1.e-10) then
345 lmax(ig)=l-1
346 endif
347 enddo
348 enddo
349 ! pas de thermique si couches 1->5 stables
350 do ig=1, ngrid
351 if (lmin(ig).gt.5) then
352 lmax(ig)=1
353 lmin(ig)=1
354 endif
355 enddo
356
357 ! Determination de zw2 max
358 do ig=1, ngrid
359 wmax(ig)=0.
360 enddo
361
362 do l=1, nlay
363 do ig=1, ngrid
364 if (l.le.lmax(ig)) then
365 if (zw2(ig, l).lt.0.)then
366 print *, 'pb2 zw2<0'
367 endif
368 zw2(ig, l)=sqrt(zw2(ig, l))
369 wmax(ig)=max(wmax(ig), zw2(ig, l))
370 else
371 zw2(ig, l)=0.
372 endif
373 enddo
374 enddo
375
376 ! Longueur caracteristique correspondant a la hauteur des thermiques.
377 do ig=1, ngrid
378 zmax(ig)=0.
379 zlevinter(ig)=zlev(ig, 1)
380 enddo
381 do ig=1, ngrid
382 ! calcul de zlevinter
383 zlevinter(ig)=(zlev(ig, lmax(ig)+1)-zlev(ig, lmax(ig)))* &
384 linter(ig)+zlev(ig, lmax(ig))-lmax(ig)*(zlev(ig, lmax(ig)+1) &
385 -zlev(ig, lmax(ig)))
386 zmax(ig)=max(zmax(ig), zlevinter(ig)-zlev(ig, lmin(ig)))
387 enddo
388
389 print *, 'avant fermeture'
390 ! Fermeture, determination de f
391 do ig=1, ngrid
392 entr_star2(ig)=0.
393 enddo
394 do ig=1, ngrid
395 if (entr_star_tot(ig).LT.1.e-10) then
396 f(ig)=0.
397 else
398 do k=lmin(ig), lentr(ig)
399 entr_star2(ig)=entr_star2(ig)+entr_star(ig, k)**2 &
400 /(rho(ig, k)*(zlev(ig, k+1)-zlev(ig, k)))
401 enddo
402 ! Nouvelle fermeture
403 f(ig)=wmax(ig)/(max(500., zmax(ig))*r_aspect &
404 *entr_star2(ig))*entr_star_tot(ig)
405 endif
406 enddo
407 print *, 'apres fermeture'
408
409 ! Calcul de l'entrainement
410 do k=1, klev
411 do ig=1, ngrid
412 entr(ig, k)=f(ig)*entr_star(ig, k)
413 enddo
414 enddo
415 ! Calcul des flux
416 do ig=1, ngrid
417 do l=1, lmax(ig)-1
418 fmc(ig, l+1)=fmc(ig, l)+entr(ig, l)
419 enddo
420 enddo
421
422 ! determination de l'indice du debut de la mixed layer ou w decroit
423
424 ! calcul de la largeur de chaque ascendance dans le cas conservatif.
425 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant
426 ! d'une couche est égale à la hauteur de la couche alimentante.
427 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation
428 ! de la vitesse d'entrainement horizontal dans la couche alimentante.
429
430 do l=2, nlay
431 do ig=1, ngrid
432 if (l.le.lmaxa(ig)) then
433 zw=max(wa_moy(ig, l), 1.e-10)
434 larg_cons(ig, l)=zmax(ig)*r_aspect &
435 *fmc(ig, l)/(rhobarz(ig, l)*zw)
436 endif
437 enddo
438 enddo
439
440 do l=2, nlay
441 do ig=1, ngrid
442 if (l.le.lmaxa(ig)) then
443 if ((l_mix*zlev(ig, l)).lt.0.)then
444 print *, 'pb l_mix*zlev<0'
445 endif
446 larg_detr(ig, l)=sqrt(l_mix*zlev(ig, l))
447 endif
448 enddo
449 enddo
450
451 ! calcul de la fraction de la maille concernée par l'ascendance en tenant
452 ! compte de l'epluchage du thermique.
453
454 !CR def de zmix continu (profil parabolique des vitesses)
455 do ig=1, ngrid
456 if (lmix(ig).gt.1.) then
457 if (((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) &
458 *((zlev(ig, lmix(ig)))-(zlev(ig, lmix(ig)+1))) &
459 -(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) &
460 *((zlev(ig, lmix(ig)-1))-(zlev(ig, lmix(ig))))).gt.1e-10) &
461 then
462
463 zmix(ig)=((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) &
464 *((zlev(ig, lmix(ig)))**2-(zlev(ig, lmix(ig)+1))**2) &
465 -(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) &
466 *((zlev(ig, lmix(ig)-1))**2-(zlev(ig, lmix(ig)))**2)) &
467 /(2.*((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) &
468 *((zlev(ig, lmix(ig)))-(zlev(ig, lmix(ig)+1))) &
469 -(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) &
470 *((zlev(ig, lmix(ig)-1))-(zlev(ig, lmix(ig))))))
471 else
472 zmix(ig)=zlev(ig, lmix(ig))
473 print *, 'pb zmix'
474 endif
475 else
476 zmix(ig)=0.
477 endif
478
479 if ((zmax(ig)-zmix(ig)).lt.0.) then
480 zmix(ig)=0.99*zmax(ig)
481 endif
482 enddo
483
484 ! calcul du nouveau lmix correspondant
485 do ig=1, ngrid
486 do l=1, klev
487 if (zmix(ig).ge.zlev(ig, l).and. &
488 zmix(ig).lt.zlev(ig, l+1)) then
489 lmix(ig)=l
490 endif
491 enddo
492 enddo
493
494 do l=2, nlay
495 do ig=1, ngrid
496 if(larg_cons(ig, l).gt.1.) then
497 fraca(ig, l)=(larg_cons(ig, l)-larg_detr(ig, l)) &
498 /(r_aspect*zmax(ig))
499 fraca(ig, l)=max(fraca(ig, l), 0.)
500 fraca(ig, l)=min(fraca(ig, l), 0.5)
501 fracd(ig, l)=1.-fraca(ig, l)
502 fracc(ig, l)=larg_cons(ig, l)/(r_aspect*zmax(ig))
503 else
504 fraca(ig, l)=0.
505 fracc(ig, l)=0.
506 fracd(ig, l)=1.
507 endif
508 enddo
509 enddo
510 !CR: calcul de fracazmix
511 do ig=1, ngrid
512 fracazmix(ig)=(fraca(ig, lmix(ig)+1)-fraca(ig, lmix(ig)))/ &
513 (zlev(ig, lmix(ig)+1)-zlev(ig, lmix(ig)))*zmix(ig) &
514 +fraca(ig, lmix(ig))-zlev(ig, lmix(ig))*(fraca(ig, lmix(ig)+1) &
515 -fraca(ig, lmix(ig)))/(zlev(ig, lmix(ig)+1)-zlev(ig, lmix(ig)))
516 enddo
517
518 do l=2, nlay
519 do ig=1, ngrid
520 if(larg_cons(ig, l).gt.1.) then
521 if (l.gt.lmix(ig)) then
522 if (zmax(ig)-zmix(ig).lt.1.e-10) then
523 xxx(ig, l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig))
524 else
525 xxx(ig, l)=(zmax(ig)-zlev(ig, l))/(zmax(ig)-zmix(ig))
526 endif
527 if (idetr.eq.0) then
528 fraca(ig, l)=fracazmix(ig)
529 else if (idetr.eq.1) then
530 fraca(ig, l)=fracazmix(ig)*xxx(ig, l)
531 else if (idetr.eq.2) then
532 fraca(ig, l)=fracazmix(ig)*(1.-(1.-xxx(ig, l))**2)
533 else
534 fraca(ig, l)=fracazmix(ig)*xxx(ig, l)**2
535 endif
536 fraca(ig, l)=max(fraca(ig, l), 0.)
537 fraca(ig, l)=min(fraca(ig, l), 0.5)
538 fracd(ig, l)=1.-fraca(ig, l)
539 fracc(ig, l)=larg_cons(ig, l)/(r_aspect*zmax(ig))
540 endif
541 endif
542 enddo
543 enddo
544
545 print *, 'fin calcul fraca'
546
547 ! Calcul de fracd, wd
548 ! somme wa - wd = 0
549
550 do ig=1, ngrid
551 fm(ig, 1)=0.
552 fm(ig, nlay+1)=0.
553 enddo
554
555 do l=2, nlay
556 do ig=1, ngrid
557 fm(ig, l)=fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l)
558 if (entr(ig, l-1).lt.1e-10.and.fm(ig, l).gt.fm(ig, l-1) &
559 .and.l.gt.lmix(ig)) then
560 fm(ig, l)=fm(ig, l-1)
561 endif
562 enddo
563 do ig=1, ngrid
564 if(fracd(ig, l).lt.0.1) then
565 stop'fracd trop petit'
566 else
567 ! vitesse descendante "diagnostique"
568 wd(ig, l)=fm(ig, l)/(fracd(ig, l)*rhobarz(ig, l))
569 endif
570 enddo
571 enddo
572
573 do l=1, nlay
574 do ig=1, ngrid
575 masse(ig, l)=(pplev(ig, l)-pplev(ig, l+1))/RG
576 enddo
577 enddo
578
579 print *, '12 OK convect8'
580
581 ! calcul du transport vertical
582
583 !CR:redefinition du entr
584 do l=1, nlay
585 do ig=1, ngrid
586 detr(ig, l)=fm(ig, l)+entr(ig, l)-fm(ig, l+1)
587 if (detr(ig, l).lt.0.) then
588 entr(ig, l)=entr(ig, l)-detr(ig, l)
589 detr(ig, l)=0.
590 endif
591 enddo
592 enddo
593
594 if (w2di.eq.1) then
595 fm0=fm0+ptimestep*(fm-fm0)/tho
596 entr0=entr0+ptimestep*(entr-entr0)/tho
597 else
598 fm0=fm
599 entr0=entr
600 endif
601
602 if (1.eq.1) then
603 call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse &
604 , zh, zdhadj, zha)
605 call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse &
606 , zo, pdoadj, zoa)
607 else
608 call dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca &
609 , zh, zdhadj, zha)
610 call dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca &
611 , zo, pdoadj, zoa)
612 endif
613
614 if (1.eq.0) then
615 call dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse &
616 , fraca, zmax &
617 , zu, zv, pduadj, pdvadj, zua, zva)
618 else
619 call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse &
620 , zu, pduadj, zua)
621 call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse &
622 , zv, pdvadj, zva)
623 endif
624
625 do l=1, nlay
626 do ig=1, ngrid
627 zf=0.5*(fracc(ig, l)+fracc(ig, l+1))
628 zf2=zf/(1.-zf)
629 thetath2(ig, l)=zf2*(zha(ig, l)-zh(ig, l))**2
630 wth2(ig, l)=zf2*(0.5*(wa_moy(ig, l)+wa_moy(ig, l+1)))**2
631 enddo
632 enddo
633
634 do l=1, nlay
635 do ig=1, ngrid
636 pdtadj(ig, l)=zdhadj(ig, l)*zpspsk(ig, l)
637 enddo
638 enddo
639
640 print *, '14 OK convect8'
641
642 ! Calculs pour les sorties
643
644 if(sorties) then
645 do l=1, nlay
646 do ig=1, ngrid
647 zla(ig, l)=(1.-fracd(ig, l))*zmax(ig)
648 zld(ig, l)=fracd(ig, l)*zmax(ig)
649 if(1.-fracd(ig, l).gt.1.e-10) &
650 zwa(ig, l)=wd(ig, l)*fracd(ig, l)/(1.-fracd(ig, l))
651 enddo
652 enddo
653
654 isplit=isplit+1
655 endif
656
657 print *, '19 OK convect8'
658
659 end SUBROUTINE thermcell
660
661 end module thermcell_m

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21