/[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 47 - (show annotations)
Fri Jul 1 15:00:48 2011 UTC (12 years, 10 months ago) by guez
File size: 18533 byte(s)
Split "thermcell.f" and "cv3_routines.f".
Removed copies of files that are now in "L_util".
Moved "mva9" and "diagetpq" to their own files.
Unified variable names across procedures.

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21