/[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 52 - (hide annotations)
Fri Sep 23 12:28:01 2011 UTC (12 years, 7 months ago) by guez
Original Path: trunk/libf/phylmd/Thermcell/thermcell.f90
File size: 18553 byte(s)
Split "conflx.f" into single-procedure files in directory "Conflx".

Split "cv_routines.f" into single-procedure files in directory
"CV_routines". Made module "cvparam" from included file
"cvparam.h". No included file other than "netcdf.inc" left in LMDZE.

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21