/[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 52 - (show annotations)
Fri Sep 23 12:28:01 2011 UTC (12 years, 7 months ago) by guez
File size: 18553 byte(s)
Split "conflx.f" into single-procedure files in directory "Conflx".

Split "cv_routines.f" into single-procedure files in directory
"CV_routines". Made module "cvparam" from included file
"cvparam.h". No included file other than "netcdf.inc" left in LMDZE.

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21