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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 71 - (hide annotations)
Mon Jul 8 18:12:18 2013 UTC (10 years, 10 months ago) by guez
Original Path: trunk/libf/phylmd/Thermcell/thermcell.f90
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 guez 54 module thermcell_m
2 guez 3
3 guez 47 IMPLICIT NONE
4 guez 3
5 guez 54 contains
6 guez 3
7 guez 54 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 guez 3
11 guez 54 ! 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 guez 3
23 guez 71 USE dimphy, ONLY : klev, klon
24 guez 54 USE suphec_m, ONLY : rd, rg, rkappa
25 guez 3
26 guez 54 ! arguments:
27 guez 3
28 guez 54 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 guez 3
40 guez 54 integer idetr
41     save idetr
42     data idetr/3/
43 guez 3
44 guez 54 ! local:
45 guez 3
46 guez 54 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 guez 3
53 guez 54 real zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz
54 guez 3
55 guez 54 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 guez 3
70 guez 54 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 guez 3
78 guez 54 real count_time
79     integer isplit, nsplit, ialt
80     parameter (nsplit=10)
81     data isplit/0/
82     save isplit
83 guez 3
84 guez 54 logical sorties
85     real rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev)
86     real zpspsk(klon, klev)
87 guez 3
88 guez 54 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 guez 3
101 guez 54 !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 guez 3
110 guez 54 character*2 str2
111     character*10 str10
112 guez 3
113 guez 54 LOGICAL vtest(klon), down
114 guez 3
115 guez 54 EXTERNAL SCOPY
116 guez 3
117 guez 54 integer ncorrec, ll
118     save ncorrec
119     data ncorrec/0/
120 guez 3
121 guez 54 !-----------------------------------------------------------------------
122 guez 3
123 guez 54 ! initialisation:
124 guez 3
125 guez 54 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 guez 3
133 guez 54 ! incrementation eventuelle de tendances precedentes:
134 guez 3
135 guez 54 print *, '0 OK convect8'
136 guez 3
137 guez 54 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 guez 3
148 guez 54 print *, '1 OK convect8'
149 guez 3
150 guez 54 ! See notes, "thermcell.txt"
151     ! Calcul des altitudes des couches
152 guez 3
153 guez 54 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 guez 3
168 guez 54 ! Calcul des densites
169 guez 3
170 guez 54 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 guez 3
176 guez 54 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 guez 3
182 guez 54 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 guez 3
190 guez 54 ! Calcul de w2, quarre de w a partir de la cape
191     ! a partir de w2, on calcule wa, vitesse de l'ascendance
192 guez 3
193 guez 54 ! ATTENTION: Dans cette version, pour cause d'economie de memoire,
194     ! w2 est stoke dans wa
195 guez 3
196 guez 54 ! 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 guez 3
200 guez 54 ! 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 guez 3
205 guez 54 !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 guez 3
217 guez 54 !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 guez 3
227 guez 54 ! 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 guez 3
239 guez 54 ! 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 guez 3
267 guez 54 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 guez 3
274 guez 54 do k=1, klev+1
275     do ig=1, ngrid
276     zw2(ig, k)=0.
277     fmc(ig, k)=0.
278 guez 3
279 guez 54 f_star(ig, k)=0.
280 guez 3
281 guez 54 larg_cons(ig, k)=0.
282     larg_detr(ig, k)=0.
283     wa_moy(ig, k)=0.
284     enddo
285     enddo
286 guez 3
287 guez 54 do ig=1, ngrid
288     linter(ig)=1.
289     lmaxa(ig)=1
290     lmix(ig)=1
291     wmaxa(ig)=0.
292     enddo
293 guez 3
294 guez 54 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 guez 3
338 guez 54 ! 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 guez 3
357 guez 54 ! Determination de zw2 max
358     do ig=1, ngrid
359     wmax(ig)=0.
360     enddo
361 guez 3
362 guez 54 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 guez 3
376 guez 54 ! 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 guez 3
389 guez 54 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 guez 3
409 guez 54 ! 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 guez 3
422 guez 54 ! determination de l'indice du debut de la mixed layer ou w decroit
423 guez 3
424 guez 54 ! 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 guez 3
430 guez 54 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 guez 3
440 guez 54 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 guez 3
451 guez 54 ! calcul de la fraction de la maille concernée par l'ascendance en tenant
452     ! compte de l'epluchage du thermique.
453 guez 3
454 guez 54 !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 guez 3
463 guez 54 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 guez 3
479 guez 54 if ((zmax(ig)-zmix(ig)).lt.0.) then
480     zmix(ig)=0.99*zmax(ig)
481     endif
482     enddo
483 guez 3
484 guez 54 ! 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 guez 3
494 guez 54 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 guez 3
518 guez 54 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 guez 3
545 guez 54 print *, 'fin calcul fraca'
546 guez 3
547 guez 54 ! Calcul de fracd, wd
548     ! somme wa - wd = 0
549 guez 3
550 guez 54 do ig=1, ngrid
551     fm(ig, 1)=0.
552     fm(ig, nlay+1)=0.
553     enddo
554 guez 3
555 guez 54 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 guez 3
573 guez 54 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 guez 3
579 guez 54 print *, '12 OK convect8'
580 guez 3
581 guez 54 ! calcul du transport vertical
582 guez 3
583 guez 54 !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 guez 3
594 guez 54 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 guez 3
602 guez 54 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 guez 3
614 guez 54 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 guez 3
625 guez 54 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 guez 3
634 guez 54 do l=1, nlay
635     do ig=1, ngrid
636     pdtadj(ig, l)=zdhadj(ig, l)*zpspsk(ig, l)
637     enddo
638     enddo
639 guez 3
640 guez 54 print *, '14 OK convect8'
641 guez 3
642 guez 54 ! Calculs pour les sorties
643 guez 3
644 guez 54 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 guez 3
654 guez 54 isplit=isplit+1
655     endif
656 guez 3
657 guez 54 print *, '19 OK convect8'
658 guez 3
659 guez 54 end SUBROUTINE thermcell
660 guez 3
661 guez 54 end module thermcell_m

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21