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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21