/[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 91 - (hide 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 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 guez 91 REAL, intent(in):: pu(ngrid, nlay)
34     real pduadj(ngrid, nlay)
35     REAL, intent(in):: pv(ngrid, nlay)
36     real pdvadj(ngrid, nlay)
37 guez 54 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 guez 3
42 guez 54 integer idetr
43     save idetr
44     data idetr/3/
45 guez 3
46 guez 54 ! local:
47 guez 3
48 guez 54 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 guez 3
55 guez 54 real zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz
56 guez 3
57 guez 54 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 guez 3
72 guez 54 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 guez 3
80 guez 54 real count_time
81     integer isplit, nsplit, ialt
82     parameter (nsplit=10)
83     data isplit/0/
84     save isplit
85 guez 3
86 guez 54 logical sorties
87     real rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev)
88     real zpspsk(klon, klev)
89 guez 3
90 guez 54 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 guez 3
103 guez 54 !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 guez 3
112 guez 54 character*2 str2
113     character*10 str10
114 guez 3
115 guez 54 LOGICAL vtest(klon), down
116 guez 3
117 guez 54 EXTERNAL SCOPY
118 guez 3
119 guez 54 integer ncorrec, ll
120     save ncorrec
121     data ncorrec/0/
122 guez 3
123 guez 54 !-----------------------------------------------------------------------
124 guez 3
125 guez 54 ! initialisation:
126 guez 3
127 guez 54 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 guez 3
135 guez 54 ! incrementation eventuelle de tendances precedentes:
136 guez 3
137 guez 54 print *, '0 OK convect8'
138 guez 3
139 guez 54 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 guez 3
150 guez 54 print *, '1 OK convect8'
151 guez 3
152 guez 54 ! See notes, "thermcell.txt"
153     ! Calcul des altitudes des couches
154 guez 3
155 guez 54 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 guez 3
170 guez 54 ! Calcul des densites
171 guez 3
172 guez 54 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 guez 3
178 guez 54 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 guez 3
184 guez 54 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 guez 3
192 guez 54 ! Calcul de w2, quarre de w a partir de la cape
193     ! a partir de w2, on calcule wa, vitesse de l'ascendance
194 guez 3
195 guez 54 ! ATTENTION: Dans cette version, pour cause d'economie de memoire,
196     ! w2 est stoke dans wa
197 guez 3
198 guez 54 ! 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 guez 3
202 guez 54 ! 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 guez 3
207 guez 54 !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 guez 3
219 guez 54 !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 guez 3
229 guez 54 ! 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 guez 3
241 guez 54 ! 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 guez 3
269 guez 54 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 guez 3
276 guez 54 do k=1, klev+1
277     do ig=1, ngrid
278     zw2(ig, k)=0.
279     fmc(ig, k)=0.
280 guez 3
281 guez 54 f_star(ig, k)=0.
282 guez 3
283 guez 54 larg_cons(ig, k)=0.
284     larg_detr(ig, k)=0.
285     wa_moy(ig, k)=0.
286     enddo
287     enddo
288 guez 3
289 guez 54 do ig=1, ngrid
290     linter(ig)=1.
291     lmaxa(ig)=1
292     lmix(ig)=1
293     wmaxa(ig)=0.
294     enddo
295 guez 3
296 guez 54 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 guez 3
340 guez 54 ! 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 guez 3
359 guez 54 ! Determination de zw2 max
360     do ig=1, ngrid
361     wmax(ig)=0.
362     enddo
363 guez 3
364 guez 54 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 guez 3
378 guez 54 ! 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 guez 3
391 guez 54 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 guez 3
411 guez 54 ! 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 guez 3
424 guez 54 ! determination de l'indice du debut de la mixed layer ou w decroit
425 guez 3
426 guez 54 ! 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 guez 3
432 guez 54 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 guez 3
442 guez 54 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 guez 3
453 guez 54 ! calcul de la fraction de la maille concernée par l'ascendance en tenant
454     ! compte de l'epluchage du thermique.
455 guez 3
456 guez 54 !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 guez 3
465 guez 54 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 guez 3
481 guez 54 if ((zmax(ig)-zmix(ig)).lt.0.) then
482     zmix(ig)=0.99*zmax(ig)
483     endif
484     enddo
485 guez 3
486 guez 54 ! 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 guez 3
496 guez 54 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 guez 3
520 guez 54 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 guez 3
547 guez 54 print *, 'fin calcul fraca'
548 guez 3
549 guez 54 ! Calcul de fracd, wd
550     ! somme wa - wd = 0
551 guez 3
552 guez 54 do ig=1, ngrid
553     fm(ig, 1)=0.
554     fm(ig, nlay+1)=0.
555     enddo
556 guez 3
557 guez 54 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 guez 3
575 guez 54 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 guez 3
581 guez 54 print *, '12 OK convect8'
582 guez 3
583 guez 54 ! calcul du transport vertical
584 guez 3
585 guez 54 !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 guez 3
596 guez 54 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 guez 3
604 guez 54 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 guez 3
616 guez 54 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 guez 3
627 guez 54 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 guez 3
636 guez 54 do l=1, nlay
637     do ig=1, ngrid
638     pdtadj(ig, l)=zdhadj(ig, l)*zpspsk(ig, l)
639     enddo
640     enddo
641 guez 3
642 guez 54 print *, '14 OK convect8'
643 guez 3
644 guez 54 ! Calculs pour les sorties
645 guez 3
646 guez 54 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 guez 3
656 guez 54 isplit=isplit+1
657     endif
658 guez 3
659 guez 54 print *, '19 OK convect8'
660 guez 3
661 guez 54 end SUBROUTINE thermcell
662 guez 3
663 guez 54 end module thermcell_m

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21