/[lmdze]/trunk/Sources/phylmd/Thermcell/thermcell.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/Thermcell/thermcell.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 91 - (show annotations)
Wed Mar 26 17:18:58 2014 UTC (10 years, 1 month ago) by guez
Original Path: trunk/phylmd/Thermcell/thermcell.f
File size: 18936 byte(s)
Removed unused variables lock_startdate and time_stamp of module
calendar.

Noticed that physiq does not change the surface pressure. So removed
arguments ps and dpfi of subroutine addfi. dpfi was always 0. The
computation of ps in addfi included some averaging at the poles. In
principle, this does not change ps but in practice it does because of
finite numerical precision. So the results of the simulation are
changed. Removed arguments ps and dpfi of calfis. Removed argument
d_ps of physiq.

du at the poles is not computed by dudv1, so declare only the
corresponding latitudes in dudv1. caldyn passes only a section of the
array dudyn as argument.

Removed variable niadv of module iniadvtrac_m.

Declared arguments of exner_hyb as assumed-shape arrays and made all
other horizontal sizes in exner_hyb dynamic. This allows the external
program test_disvert to use exner_hyb at a single horizontal position.

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21