/[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 150 - (hide annotations)
Thu Jun 18 13:49:26 2015 UTC (8 years, 11 months ago) by guez
File size: 18591 byte(s)
Removed unused arguments of groupe, cv3_undilute2, cv_undilute2,
interfsur_lim, drag_noro, orodrag, gwprofil

Chickened out of revision 148: back to double precision in
invert_zoom_x (and overloaded rtsafe).

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21