/[lmdze]/trunk/Sources/phylmd/Thermcell/thermcell.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/Thermcell/thermcell.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/phylmd/Thermcell/thermcell.f90 revision 47 by guez, Fri Jul 1 15:00:48 2011 UTC trunk/phylmd/Thermcell/thermcell.f revision 91 by guez, Wed Mar 26 17:18:58 2014 UTC
# Line 1  Line 1 
1  SUBROUTINE thermcell(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv, pt, &  module thermcell_m
      po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, r_aspect, l_mix, w2di, tho)  
   
   use dimens_m  
   use dimphy  
   use SUPHEC_M  
2    
3    IMPLICIT NONE    IMPLICIT NONE
4    
5    !   Calcul du transport verticale dans la couche limite en presence  contains
   !   de "thermiques" explicitement representes  
6    
7    !   Réécriture à partir d'un listing papier à Habas, le 14/02/00    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    
11        ! 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    
23        USE dimphy, ONLY : klev, klon
24        USE suphec_m, ONLY : rd, rg, rkappa
25    
26        ! arguments:
27    
28        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        REAL, intent(in):: pu(ngrid, nlay)
34        real pduadj(ngrid, nlay)
35        REAL, intent(in):: pv(ngrid, nlay)
36        real pdvadj(ngrid, nlay)
37        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    
42        integer idetr
43        save idetr
44        data idetr/3/
45    
46        ! local:
47    
48        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    
55        real zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz
56    
57        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    
72        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    
80        real count_time
81        integer isplit, nsplit, ialt
82        parameter (nsplit=10)
83        data isplit/0/
84        save isplit
85    
86        logical sorties
87        real rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev)
88        real zpspsk(klon, klev)
89    
90        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    
103        !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    
112        character*2 str2
113        character*10 str10
114    
115        LOGICAL vtest(klon), down
116    
117        EXTERNAL SCOPY
118    
119        integer ncorrec, ll
120        save ncorrec
121        data ncorrec/0/
122    
123        !-----------------------------------------------------------------------
124    
125        ! initialisation:
126    
127        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    
135        ! incrementation eventuelle de tendances precedentes:
136    
137        print *, '0 OK convect8'
138    
139        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    
150        print *, '1 OK convect8'
151    
152        ! See notes, "thermcell.txt"
153        ! Calcul des altitudes des couches
154    
155        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    
170        ! Calcul des densites
171    
172        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    
178        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    
184        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    
192        ! Calcul de w2, quarre de w a partir de la cape
193        ! a partir de w2, on calcule wa, vitesse de l'ascendance
194    
195        ! ATTENTION: Dans cette version, pour cause d'economie de memoire,
196        ! w2 est stoke dans wa
197    
198        ! 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    
202        ! 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    
207        !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    
219        !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    
229        ! 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    
241        ! 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    
269        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    
276        do k=1, klev+1
277           do ig=1, ngrid
278              zw2(ig, k)=0.
279              fmc(ig, k)=0.
280    
281              f_star(ig, k)=0.
282    
283              larg_cons(ig, k)=0.
284              larg_detr(ig, k)=0.
285              wa_moy(ig, k)=0.
286           enddo
287        enddo
288    
289        do ig=1, ngrid
290           linter(ig)=1.
291           lmaxa(ig)=1
292           lmix(ig)=1
293           wmaxa(ig)=0.
294        enddo
295    
296        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    
340        ! 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    
359        ! Determination de zw2 max
360        do ig=1, ngrid
361           wmax(ig)=0.
362        enddo
363    
364        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    
378        ! 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    
391        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    
411        ! 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    
424        ! determination de l'indice du debut de la mixed layer ou w decroit
425    
426        ! 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    
432        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    
442        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    
453        ! calcul de la fraction de la maille concernée par l'ascendance en tenant
454        ! compte de l'epluchage du thermique.
455    
456        !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    
465                 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    
481           if ((zmax(ig)-zmix(ig)).lt.0.) then
482              zmix(ig)=0.99*zmax(ig)
483           endif
484        enddo
485    
486        ! 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    
496        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    
520        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    
547        print *, 'fin calcul fraca'
548    
549        ! Calcul de fracd, wd
550        ! somme wa - wd = 0
551    
552        do ig=1, ngrid
553           fm(ig, 1)=0.
554           fm(ig, nlay+1)=0.
555        enddo
556    
557        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    
575        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    
581        print *, '12 OK convect8'
582    
583        ! calcul du transport vertical
584    
585        !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    
596        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    
604        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    
616        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    
627        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    
636        do l=1, nlay
637           do ig=1, ngrid
638              pdtadj(ig, l)=zdhadj(ig, l)*zpspsk(ig, l)
639           enddo
640        enddo
641    
642        print *, '14 OK convect8'
643    
644        ! Calculs pour les sorties
645    
646        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    
656    !   le thermique est supposé homogène et dissipé par mélange avec         isplit=isplit+1
657    !   son environnement. la longueur l_mix contrôle l'efficacité du      endif
   !   mélange  
   
   !   Le calcul du transport des différentes espèces se fait en prenant  
   !   en compte:  
   !     1. un flux de masse montant  
   !     2. un flux de masse descendant  
   !     3. un entrainement  
   !     4. un detrainement  
   
   !   arguments:  
   
   INTEGER ngrid, nlay, w2di, tho  
   real ptimestep, l_mix, r_aspect  
   REAL pt(ngrid, nlay), pdtadj(ngrid, nlay)  
   REAL pu(ngrid, nlay), pduadj(ngrid, nlay)  
   REAL pv(ngrid, nlay), pdvadj(ngrid, nlay)  
   REAL po(ngrid, nlay), pdoadj(ngrid, nlay)  
   REAL, intent(in):: pplay(ngrid, nlay)  
   real, intent(in):: pplev(ngrid, nlay+1)  
   real, intent(in):: pphi(ngrid, nlay)  
   
   integer idetr  
   save idetr  
   data idetr/3/  
   
   !   local:  
   
   INTEGER ig, k, l, lmaxa(klon), lmix(klon)  
   real zsortie1d(klon)  
   ! CR: on remplace lmax(klon, klev+1)  
   INTEGER lmax(klon), lmin(klon), lentr(klon)  
   real linter(klon)  
   real zmix(klon), fracazmix(klon)  
   
   real zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz  
   
   real zlev(klon, klev+1), zlay(klon, klev)  
   REAL zh(klon, klev), zdhadj(klon, klev)  
   REAL ztv(klon, klev)  
   real zu(klon, klev), zv(klon, klev), zo(klon, klev)  
   REAL wh(klon, klev+1)  
   real wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1)  
   real zla(klon, klev+1)  
   real zwa(klon, klev+1)  
   real zld(klon, klev+1)  
   real zwd(klon, klev+1)  
   real zsortie(klon, klev)  
   real zva(klon, klev)  
   real zua(klon, klev)  
   real zoa(klon, klev)  
   
   real zha(klon, klev)  
   real wa_moy(klon, klev+1)  
   real fraca(klon, klev+1)  
   real fracc(klon, klev+1)  
   real zf, zf2  
   real thetath2(klon, klev), wth2(klon, klev)  
   common/comtherm/thetath2, wth2  
   
   real count_time  
   integer isplit, nsplit, ialt  
   parameter (nsplit=10)  
   data isplit/0/  
   save isplit  
   
   logical sorties  
   real rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev)  
   real zpspsk(klon, klev)  
   
   real wmax(klon), wmaxa(klon)  
   real wa(klon, klev, klev+1)  
   real wd(klon, klev+1)  
   real larg_part(klon, klev, klev+1)  
   real fracd(klon, klev+1)  
   real xxx(klon, klev+1)  
   real larg_cons(klon, klev+1)  
   real larg_detr(klon, klev+1)  
   real fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev)  
   real pu_therm(klon, klev), pv_therm(klon, klev)  
   real fm(klon, klev+1), entr(klon, klev)  
   real fmc(klon, klev+1)  
   
   !CR:nouvelles variables  
   real f_star(klon, klev+1), entr_star(klon, klev)  
   real entr_star_tot(klon), entr_star2(klon)  
   real f(klon), f0(klon)  
   real zlevinter(klon)  
   logical first  
   data first /.false./  
   save first  
   
   character*2 str2  
   character*10 str10  
   
   LOGICAL vtest(klon), down  
   
   EXTERNAL SCOPY  
   
   integer ncorrec, ll  
   save ncorrec  
   data ncorrec/0/  
   
   !-----------------------------------------------------------------------  
   
   !   initialisation:  
   
   sorties=.true.  
   IF(ngrid.NE.klon) THEN  
      PRINT *  
      PRINT *, 'STOP dans convadj'  
      PRINT *, 'ngrid    =', ngrid  
      PRINT *, 'klon  =', klon  
   ENDIF  
   
   !   incrementation eventuelle de tendances precedentes:  
   
   print *, '0 OK convect8'  
   
   DO l=1, nlay  
      DO ig=1, ngrid  
         zpspsk(ig, l)=(pplay(ig, l)/pplev(ig, 1))**RKAPPA  
         zh(ig, l)=pt(ig, l)/zpspsk(ig, l)  
         zu(ig, l)=pu(ig, l)  
         zv(ig, l)=pv(ig, l)  
         zo(ig, l)=po(ig, l)  
         ztv(ig, l)=zh(ig, l)*(1.+0.61*zo(ig, l))  
      end DO  
   end DO  
   
   print *, '1 OK convect8'  
   
   !                       + + + + + + + + + + +  
   
   !  wa, fraca, wd, fracd --------------------   zlev(2), rhobarz  
   !  wh, wt, wo ...  
   
   !                       + + + + + + + + + + +  zh, zu, zv, zo, rho  
   
   !                       --------------------   zlev(1)  
   !                       \\\\\\\\\\\\\\\\\\\\  
   
   !   Calcul des altitudes des couches  
   
   do l=2, nlay  
      do ig=1, ngrid  
         zlev(ig, l)=0.5*(pphi(ig, l)+pphi(ig, l-1))/RG  
      enddo  
   enddo  
   do ig=1, ngrid  
      zlev(ig, 1)=0.  
      zlev(ig, nlay+1)=(2.*pphi(ig, klev)-pphi(ig, klev-1))/RG  
   enddo  
   do l=1, nlay  
      do ig=1, ngrid  
         zlay(ig, l)=pphi(ig, l)/RG  
      enddo  
   enddo  
   
   !   Calcul des densites  
   
   do l=1, nlay  
      do ig=1, ngrid  
         rho(ig, l)=pplay(ig, l)/(zpspsk(ig, l)*RD*zh(ig, l))  
      enddo  
   enddo  
   
   do l=2, nlay  
      do ig=1, ngrid  
         rhobarz(ig, l)=0.5*(rho(ig, l)+rho(ig, l-1))  
      enddo  
   enddo  
   
   do k=1, nlay  
      do l=1, nlay+1  
         do ig=1, ngrid  
            wa(ig, k, l)=0.  
         enddo  
      enddo  
   enddo  
   
   !   Calcul de w2, quarre de w a partir de la cape  
   !   a partir de w2, on calcule wa, vitesse de l'ascendance  
   
   !   ATTENTION: Dans cette version, pour cause d'economie de memoire,  
   !   w2 est stoke dans wa  
   
   !   ATTENTION: dans convect8, on n'utilise le calcule des wa  
   !   independants par couches que pour calculer l'entrainement  
   !   a la base et la hauteur max de l'ascendance.  
   
   !   Indicages:  
   !   l'ascendance provenant du niveau k traverse l'interface l avec  
   !   une vitesse wa(k, l).  
   
   !                       --------------------  
   
   !                       + + + + + + + + + +  
   
   !  wa(k, l)   ----       --------------------    l  
   !             /\  
   !            /||\       + + + + + + + + + +  
   !             ||  
   !             ||        --------------------  
   !             ||  
   !             ||        + + + + + + + + + +  
   !             ||  
   !             ||        --------------------  
   !             ||__  
   !             |___      + + + + + + + + + +     k  
   
   !                       --------------------  
   
   !CR: ponderation entrainement des couches instables  
   !def des entr_star tels que entr=f*entr_star  
   do l=1, klev  
      do ig=1, ngrid  
         entr_star(ig, l)=0.  
      enddo  
   enddo  
   ! determination de la longueur de la couche d entrainement  
   do ig=1, ngrid  
      lentr(ig)=1  
   enddo  
   
   !on ne considere que les premieres couches instables  
   do k=nlay-2, 1, -1  
      do ig=1, ngrid  
         if (ztv(ig, k).gt.ztv(ig, k+1).and. &  
              ztv(ig, k+1).le.ztv(ig, k+2)) then  
            lentr(ig)=k  
         endif  
      enddo  
   enddo  
   
   ! determination du lmin: couche d ou provient le thermique  
   do ig=1, ngrid  
      lmin(ig)=1  
   enddo  
   do ig=1, ngrid  
      do l=nlay, 2, -1  
         if (ztv(ig, l-1).gt.ztv(ig, l)) then  
            lmin(ig)=l-1  
         endif  
      enddo  
   enddo  
   
   ! definition de l'entrainement des couches  
   do l=1, klev-1  
      do ig=1, ngrid  
         if (ztv(ig, l).gt.ztv(ig, l+1).and. &  
              l.ge.lmin(ig).and.l.le.lentr(ig)) then  
            entr_star(ig, l)=(ztv(ig, l)-ztv(ig, l+1))* &  
                 (zlev(ig, l+1)-zlev(ig, l))  
         endif  
      enddo  
   enddo  
   ! pas de thermique si couches 1->5 stables  
   do ig=1, ngrid  
      if (lmin(ig).gt.5) then  
         do l=1, klev  
            entr_star(ig, l)=0.  
         enddo  
      endif  
   enddo  
   ! calcul de l entrainement total  
   do ig=1, ngrid  
      entr_star_tot(ig)=0.  
   enddo  
   do ig=1, ngrid  
      do k=1, klev  
         entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig, k)  
      enddo  
   enddo  
   
   print *, 'fin calcul entr_star'  
   do k=1, klev  
      do ig=1, ngrid  
         ztva(ig, k)=ztv(ig, k)  
      enddo  
   enddo  
   
   do k=1, klev+1  
      do ig=1, ngrid  
         zw2(ig, k)=0.  
         fmc(ig, k)=0.  
   
         f_star(ig, k)=0.  
   
         larg_cons(ig, k)=0.  
         larg_detr(ig, k)=0.  
         wa_moy(ig, k)=0.  
      enddo  
   enddo  
   
   do ig=1, ngrid  
      linter(ig)=1.  
      lmaxa(ig)=1  
      lmix(ig)=1  
      wmaxa(ig)=0.  
   enddo  
   
   do l=1, nlay-2  
      do ig=1, ngrid  
         if (ztv(ig, l).gt.ztv(ig, l+1) &  
              .and.entr_star(ig, l).gt.1.e-10 &  
              .and.zw2(ig, l).lt.1e-10) then  
            f_star(ig, l+1)=entr_star(ig, l)  
            !test:calcul de dteta  
            zw2(ig, l+1)=2.*RG*(ztv(ig, l)-ztv(ig, l+1))/ztv(ig, l+1) &  
                 *(zlev(ig, l+1)-zlev(ig, l)) &  
                 *0.4*pphi(ig, l)/(pphi(ig, l+1)-pphi(ig, l))  
            larg_detr(ig, l)=0.  
         else if ((zw2(ig, l).ge.1e-10).and. &  
              (f_star(ig, l)+entr_star(ig, l).gt.1.e-10)) then  
            f_star(ig, l+1)=f_star(ig, l)+entr_star(ig, l)  
            ztva(ig, l)=(f_star(ig, l)*ztva(ig, l-1)+entr_star(ig, l) &  
                 *ztv(ig, l))/f_star(ig, l+1)  
            zw2(ig, l+1)=zw2(ig, l)*(f_star(ig, l)/f_star(ig, l+1))**2+ &  
                 2.*RG*(ztva(ig, l)-ztv(ig, l))/ztv(ig, l) &  
                 *(zlev(ig, l+1)-zlev(ig, l))  
         endif  
         ! determination de zmax continu par interpolation lineaire  
         if (zw2(ig, l+1).lt.0.) then  
            if (abs(zw2(ig, l+1)-zw2(ig, l)).lt.1e-10) then  
               print *, 'pb linter'  
            endif  
            linter(ig)=(l*(zw2(ig, l+1)-zw2(ig, l)) &  
                 -zw2(ig, l))/(zw2(ig, l+1)-zw2(ig, l))  
            zw2(ig, l+1)=0.  
            lmaxa(ig)=l  
         else  
            if (zw2(ig, l+1).lt.0.) then  
               print *, 'pb1 zw2<0'  
            endif  
            wa_moy(ig, l+1)=sqrt(zw2(ig, l+1))  
         endif  
         if (wa_moy(ig, l+1).gt.wmaxa(ig)) then  
            !   lmix est le niveau de la couche ou w (wa_moy) est maximum  
            lmix(ig)=l+1  
            wmaxa(ig)=wa_moy(ig, l+1)  
         endif  
      enddo  
   enddo  
   print *, 'fin calcul zw2'  
   
   ! Calcul de la couche correspondant a la hauteur du thermique  
   do ig=1, ngrid  
      lmax(ig)=lentr(ig)  
   enddo  
   do ig=1, ngrid  
      do l=nlay, lentr(ig)+1, -1  
         if (zw2(ig, l).le.1.e-10) then  
            lmax(ig)=l-1  
         endif  
      enddo  
   enddo  
   ! pas de thermique si couches 1->5 stables  
   do ig=1, ngrid  
      if (lmin(ig).gt.5) then  
         lmax(ig)=1  
         lmin(ig)=1  
      endif  
   enddo  
   
   ! Determination de zw2 max  
   do ig=1, ngrid  
      wmax(ig)=0.  
   enddo  
   
   do l=1, nlay  
      do ig=1, ngrid  
         if (l.le.lmax(ig)) then  
            if (zw2(ig, l).lt.0.)then  
               print *, 'pb2 zw2<0'  
            endif  
            zw2(ig, l)=sqrt(zw2(ig, l))  
            wmax(ig)=max(wmax(ig), zw2(ig, l))  
         else  
            zw2(ig, l)=0.  
         endif  
      enddo  
   enddo  
   
   !   Longueur caracteristique correspondant a la hauteur des thermiques.  
   do  ig=1, ngrid  
      zmax(ig)=0.  
      zlevinter(ig)=zlev(ig, 1)  
   enddo  
   do  ig=1, ngrid  
      ! calcul de zlevinter  
      zlevinter(ig)=(zlev(ig, lmax(ig)+1)-zlev(ig, lmax(ig)))* &  
           linter(ig)+zlev(ig, lmax(ig))-lmax(ig)*(zlev(ig, lmax(ig)+1) &  
           -zlev(ig, lmax(ig)))  
      zmax(ig)=max(zmax(ig), zlevinter(ig)-zlev(ig, lmin(ig)))  
   enddo  
   
   print *, 'avant fermeture'  
   ! Fermeture, determination de f  
   do ig=1, ngrid  
      entr_star2(ig)=0.  
   enddo  
   do ig=1, ngrid  
      if (entr_star_tot(ig).LT.1.e-10) then  
         f(ig)=0.  
      else  
         do k=lmin(ig), lentr(ig)  
            entr_star2(ig)=entr_star2(ig)+entr_star(ig, k)**2 &  
                 /(rho(ig, k)*(zlev(ig, k+1)-zlev(ig, k)))  
         enddo  
         ! Nouvelle fermeture  
         f(ig)=wmax(ig)/(max(500., zmax(ig))*r_aspect &  
              *entr_star2(ig))*entr_star_tot(ig)  
      endif  
   enddo  
   print *, 'apres fermeture'  
   
   ! Calcul de l'entrainement  
   do k=1, klev  
      do ig=1, ngrid  
         entr(ig, k)=f(ig)*entr_star(ig, k)  
      enddo  
   enddo  
   ! Calcul des flux  
   do ig=1, ngrid  
      do l=1, lmax(ig)-1  
         fmc(ig, l+1)=fmc(ig, l)+entr(ig, l)  
      enddo  
   enddo  
   
   !   determination de l'indice du debut de la mixed layer ou w decroit  
   
   !   calcul de la largeur de chaque ascendance dans le cas conservatif.  
   !   dans ce cas simple, on suppose que la largeur de l'ascendance provenant  
   !   d'une couche est égale à la hauteur de la couche alimentante.  
   !   La vitesse maximale dans l'ascendance est aussi prise comme estimation  
   !   de la vitesse d'entrainement horizontal dans la couche alimentante.  
   
   do l=2, nlay  
      do ig=1, ngrid  
         if (l.le.lmaxa(ig)) then  
            zw=max(wa_moy(ig, l), 1.e-10)  
            larg_cons(ig, l)=zmax(ig)*r_aspect &  
                 *fmc(ig, l)/(rhobarz(ig, l)*zw)  
         endif  
      enddo  
   enddo  
   
   do l=2, nlay  
      do ig=1, ngrid  
         if (l.le.lmaxa(ig)) then  
            if ((l_mix*zlev(ig, l)).lt.0.)then  
               print *, 'pb l_mix*zlev<0'  
            endif  
            larg_detr(ig, l)=sqrt(l_mix*zlev(ig, l))  
         endif  
      enddo  
   enddo  
   
   !   calcul de la fraction de la maille concernée par l'ascendance en tenant  
   !   compte de l'epluchage du thermique.  
   
   !CR def de  zmix continu (profil parabolique des vitesses)  
   do ig=1, ngrid  
      if (lmix(ig).gt.1.) then  
         if (((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) &  
              *((zlev(ig, lmix(ig)))-(zlev(ig, lmix(ig)+1))) &  
              -(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) &  
              *((zlev(ig, lmix(ig)-1))-(zlev(ig, lmix(ig))))).gt.1e-10) &  
              then  
   
            zmix(ig)=((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) &  
                 *((zlev(ig, lmix(ig)))**2-(zlev(ig, lmix(ig)+1))**2) &  
                 -(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) &  
                 *((zlev(ig, lmix(ig)-1))**2-(zlev(ig, lmix(ig)))**2)) &  
                 /(2.*((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) &  
                 *((zlev(ig, lmix(ig)))-(zlev(ig, lmix(ig)+1))) &  
                 -(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) &  
                 *((zlev(ig, lmix(ig)-1))-(zlev(ig, lmix(ig))))))  
         else  
            zmix(ig)=zlev(ig, lmix(ig))  
            print *, 'pb zmix'  
         endif  
      else  
         zmix(ig)=0.  
      endif  
   
      if ((zmax(ig)-zmix(ig)).lt.0.) then  
         zmix(ig)=0.99*zmax(ig)  
      endif  
   enddo  
   
   ! calcul du nouveau lmix correspondant  
   do ig=1, ngrid  
      do l=1, klev  
         if (zmix(ig).ge.zlev(ig, l).and. &  
              zmix(ig).lt.zlev(ig, l+1)) then  
            lmix(ig)=l  
         endif  
      enddo  
   enddo  
   
   do l=2, nlay  
      do ig=1, ngrid  
         if(larg_cons(ig, l).gt.1.) then  
            fraca(ig, l)=(larg_cons(ig, l)-larg_detr(ig, l)) &  
                 /(r_aspect*zmax(ig))  
            fraca(ig, l)=max(fraca(ig, l), 0.)  
            fraca(ig, l)=min(fraca(ig, l), 0.5)  
            fracd(ig, l)=1.-fraca(ig, l)  
            fracc(ig, l)=larg_cons(ig, l)/(r_aspect*zmax(ig))  
         else  
            fraca(ig, l)=0.  
            fracc(ig, l)=0.  
            fracd(ig, l)=1.  
         endif  
      enddo  
   enddo  
   !CR: calcul de fracazmix  
   do ig=1, ngrid  
      fracazmix(ig)=(fraca(ig, lmix(ig)+1)-fraca(ig, lmix(ig)))/ &  
           (zlev(ig, lmix(ig)+1)-zlev(ig, lmix(ig)))*zmix(ig) &  
           +fraca(ig, lmix(ig))-zlev(ig, lmix(ig))*(fraca(ig, lmix(ig)+1) &  
           -fraca(ig, lmix(ig)))/(zlev(ig, lmix(ig)+1)-zlev(ig, lmix(ig)))  
   enddo  
   
   do l=2, nlay  
      do ig=1, ngrid  
         if(larg_cons(ig, l).gt.1.) then  
            if (l.gt.lmix(ig)) then  
               if (zmax(ig)-zmix(ig).lt.1.e-10) then  
                  xxx(ig, l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig))  
               else  
                  xxx(ig, l)=(zmax(ig)-zlev(ig, l))/(zmax(ig)-zmix(ig))  
               endif  
               if (idetr.eq.0) then  
                  fraca(ig, l)=fracazmix(ig)  
               else if (idetr.eq.1) then  
                  fraca(ig, l)=fracazmix(ig)*xxx(ig, l)  
               else if (idetr.eq.2) then  
                  fraca(ig, l)=fracazmix(ig)*(1.-(1.-xxx(ig, l))**2)  
               else  
                  fraca(ig, l)=fracazmix(ig)*xxx(ig, l)**2  
               endif  
               fraca(ig, l)=max(fraca(ig, l), 0.)  
               fraca(ig, l)=min(fraca(ig, l), 0.5)  
               fracd(ig, l)=1.-fraca(ig, l)  
               fracc(ig, l)=larg_cons(ig, l)/(r_aspect*zmax(ig))  
            endif  
         endif  
      enddo  
   enddo  
   
   print *, 'fin calcul fraca'  
   
   !   Calcul de fracd, wd  
   !   somme wa - wd = 0  
   
   do ig=1, ngrid  
      fm(ig, 1)=0.  
      fm(ig, nlay+1)=0.  
   enddo  
   
   do l=2, nlay  
      do ig=1, ngrid  
         fm(ig, l)=fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l)  
         if (entr(ig, l-1).lt.1e-10.and.fm(ig, l).gt.fm(ig, l-1) &  
              .and.l.gt.lmix(ig)) then  
            fm(ig, l)=fm(ig, l-1)  
         endif  
      enddo  
      do ig=1, ngrid  
         if(fracd(ig, l).lt.0.1) then  
            stop'fracd trop petit'  
         else  
            !    vitesse descendante "diagnostique"  
            wd(ig, l)=fm(ig, l)/(fracd(ig, l)*rhobarz(ig, l))  
         endif  
      enddo  
   enddo  
   
   do l=1, nlay  
      do ig=1, ngrid  
         masse(ig, l)=(pplev(ig, l)-pplev(ig, l+1))/RG  
      enddo  
   enddo  
   
   print *, '12 OK convect8'  
   
   !   calcul du transport vertical  
   
   !CR:redefinition du entr  
   do l=1, nlay  
      do ig=1, ngrid  
         detr(ig, l)=fm(ig, l)+entr(ig, l)-fm(ig, l+1)  
         if (detr(ig, l).lt.0.) then  
            entr(ig, l)=entr(ig, l)-detr(ig, l)  
            detr(ig, l)=0.  
         endif  
      enddo  
   enddo  
   
   if (w2di.eq.1) then  
      fm0=fm0+ptimestep*(fm-fm0)/float(tho)  
      entr0=entr0+ptimestep*(entr-entr0)/float(tho)  
   else  
      fm0=fm  
      entr0=entr  
   endif  
   
   if (1.eq.1) then  
      call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse &  
           , zh, zdhadj, zha)  
      call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse &  
           , zo, pdoadj, zoa)  
   else  
      call dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca &  
           , zh, zdhadj, zha)  
      call dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca &  
           , zo, pdoadj, zoa)  
   endif  
   
   if (1.eq.0) then  
      call dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse &  
           , fraca, zmax &  
           , zu, zv, pduadj, pdvadj, zua, zva)  
   else  
      call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse &  
           , zu, pduadj, zua)  
      call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse &  
           , zv, pdvadj, zva)  
   endif  
   
   do l=1, nlay  
      do ig=1, ngrid  
         zf=0.5*(fracc(ig, l)+fracc(ig, l+1))  
         zf2=zf/(1.-zf)  
         thetath2(ig, l)=zf2*(zha(ig, l)-zh(ig, l))**2  
         wth2(ig, l)=zf2*(0.5*(wa_moy(ig, l)+wa_moy(ig, l+1)))**2  
      enddo  
   enddo  
   
   do l=1, nlay  
      do ig=1, ngrid  
         pdtadj(ig, l)=zdhadj(ig, l)*zpspsk(ig, l)  
      enddo  
   enddo  
   
   print *, '14 OK convect8'  
   
   !   Calculs pour les sorties  
   
   if(sorties) then  
      do l=1, nlay  
         do ig=1, ngrid  
            zla(ig, l)=(1.-fracd(ig, l))*zmax(ig)  
            zld(ig, l)=fracd(ig, l)*zmax(ig)  
            if(1.-fracd(ig, l).gt.1.e-10) &  
                 zwa(ig, l)=wd(ig, l)*fracd(ig, l)/(1.-fracd(ig, l))  
         enddo  
      enddo  
658    
659       isplit=isplit+1      print *, '19 OK convect8'
   endif  
660    
661    print *, '19 OK convect8'    end SUBROUTINE thermcell
662    
663  end SUBROUTINE thermcell  end module thermcell_m

Legend:
Removed from v.47  
changed lines
  Added in v.91

  ViewVC Help
Powered by ViewVC 1.1.21