/[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 47 - (hide annotations)
Fri Jul 1 15:00:48 2011 UTC (12 years, 11 months ago) by guez
Original Path: trunk/libf/phylmd/Thermcell/thermcell.f90
File size: 18533 byte(s)
Split "thermcell.f" and "cv3_routines.f".
Removed copies of files that are now in "L_util".
Moved "mva9" and "diagetpq" to their own files.
Unified variable names across procedures.

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21