source: LMDZ4/trunk/libf/phylmd/thermcell_old.F @ 887

Last change on this file since 887 was 878, checked in by Laurent Fairhead, 16 years ago

Bascule de la physique du LMD vers la physique avec thermiques
LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 188.3 KB
Line 
1      SUBROUTINE thermcell_2002(ngrid,nlay,ptimestep
2     s                  ,pplay,pplev,pphi
3     s                  ,pu,pv,pt,po
4     s                  ,pduadj,pdvadj,pdtadj,pdoadj
5     s                  ,fm0,entr0
6c    s                  ,pu_therm,pv_therm
7     s                  ,r_aspect,l_mix,w2di,tho)
8
9      IMPLICIT NONE
10
11c=======================================================================
12c
13c   Calcul du transport verticale dans la couche limite en presence
14c   de "thermiques" explicitement representes
15c
16c   Réécriture à partir d'un listing papier à Habas, le 14/02/00
17c
18c   le thermique est supposé homogène et dissipé par mélange avec
19c   son environnement. la longueur l_mix contrôle l'efficacité du
20c   mélange
21c
22c   Le calcul du transport des différentes espèces se fait en prenant
23c   en compte:
24c     1. un flux de masse montant
25c     2. un flux de masse descendant
26c     3. un entrainement
27c     4. un detrainement
28c
29c=======================================================================
30
31c-----------------------------------------------------------------------
32c   declarations:
33c   -------------
34
35#include "dimensions.h"
36#include "dimphy.h"
37#include "YOMCST.h"
38
39c   arguments:
40c   ----------
41
42      INTEGER ngrid,nlay,w2di,tho
43      real ptimestep,l_mix,r_aspect
44      REAL pt(ngrid,nlay),pdtadj(ngrid,nlay)
45      REAL pu(ngrid,nlay),pduadj(ngrid,nlay)
46      REAL pv(ngrid,nlay),pdvadj(ngrid,nlay)
47      REAL po(ngrid,nlay),pdoadj(ngrid,nlay)
48      REAL pplay(ngrid,nlay),pplev(ngrid,nlay+1)
49      real pphi(ngrid,nlay)
50
51      integer idetr
52      save idetr
53      data idetr/3/
54
55c   local:
56c   ------
57
58      INTEGER ig,k,l,lmax(klon,klev+1),lmaxa(klon),lmix(klon)
59      real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz
60
61      real zlev(klon,klev+1),zlay(klon,klev)
62      REAL zh(klon,klev),zdhadj(klon,klev)
63      REAL ztv(klon,klev)
64      real zu(klon,klev),zv(klon,klev),zo(klon,klev)
65      REAL wh(klon,klev+1)
66      real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1)
67      real zla(klon,klev+1)
68      real zwa(klon,klev+1)
69      real zld(klon,klev+1)
70      real zwd(klon,klev+1)
71      real zsortie(klon,klev)
72      real zva(klon,klev)
73      real zua(klon,klev)
74      real zoa(klon,klev)
75
76      real zha(klon,klev)
77      real wa_moy(klon,klev+1)
78      real fraca(klon,klev+1)
79      real fracc(klon,klev+1)
80      real zf,zf2
81      real thetath2(klon,klev),wth2(klon,klev)
82      common/comtherm/thetath2,wth2
83
84      real count_time
85      integer isplit,nsplit,ialt
86      parameter (nsplit=10)
87      data isplit/0/
88      save isplit
89
90      logical sorties
91      real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev)
92      real zpspsk(klon,klev)
93
94      real wmax(klon,klev),wmaxa(klon)
95
96      real wa(klon,klev,klev+1)
97      real wd(klon,klev+1)
98      real larg_part(klon,klev,klev+1)
99      real fracd(klon,klev+1)
100      real xxx(klon,klev+1)
101      real larg_cons(klon,klev+1)
102      real larg_detr(klon,klev+1)
103      real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev)
104      real pu_therm(klon,klev),pv_therm(klon,klev)
105      real fm(klon,klev+1),entr(klon,klev)
106      real fmc(klon,klev+1)
107
108      character*2 str2
109      character*10 str10
110
111      LOGICAL vtest(klon),down
112
113      EXTERNAL SCOPY
114
115      integer ncorrec,ll
116      save ncorrec
117      data ncorrec/0/
118c
119c-----------------------------------------------------------------------
120c   initialisation:
121c   ---------------
122c
123       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
130c
131c-----------------------------------------------------------------------
132c   incrementation eventuelle de tendances precedentes:
133c   ---------------------------------------------------
134
135      print*,'0 OK convect8'
136
137      DO 1010 l=1,nlay
138         DO 1015 ig=1,ngrid
139            zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA
140            zh(ig,l)=pt(ig,l)/zpspsk(ig,l)
141            zu(ig,l)=pu(ig,l)
142            zv(ig,l)=pv(ig,l)
143            zo(ig,l)=po(ig,l)
144            ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l))
1451015     CONTINUE
1461010  CONTINUE
147
148c     print*,'1 OK convect8'
149c                       --------------------
150c
151c
152c                       + + + + + + + + + + +
153c
154c
155c  wa, fraca, wd, fracd --------------------   zlev(2), rhobarz
156c  wh,wt,wo ...
157c
158c                       + + + + + + + + + + +  zh,zu,zv,zo,rho
159c
160c
161c                       --------------------   zlev(1)
162c                       \\\\\\\\\\\\\\\\\\\\
163c
164c
165
166c-----------------------------------------------------------------------
167c   Calcul des altitudes des couches
168c-----------------------------------------------------------------------
169
170      do l=2,nlay
171         do ig=1,ngrid
172            zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG
173         enddo
174      enddo
175      do ig=1,ngrid
176         zlev(ig,1)=0.
177         zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG
178      enddo
179      do l=1,nlay
180         do ig=1,ngrid
181            zlay(ig,l)=pphi(ig,l)/RG
182         enddo
183      enddo
184
185c     print*,'2 OK convect8'
186c-----------------------------------------------------------------------
187c   Calcul des densites
188c-----------------------------------------------------------------------
189
190      do l=1,nlay
191         do ig=1,ngrid
192            rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l))
193         enddo
194      enddo
195
196      do l=2,nlay
197         do ig=1,ngrid
198            rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1))
199         enddo
200      enddo
201
202      do k=1,nlay
203         do l=1,nlay+1
204            do ig=1,ngrid
205               wa(ig,k,l)=0.
206            enddo
207         enddo
208      enddo
209
210c     print*,'3 OK convect8'
211c------------------------------------------------------------------
212c   Calcul de w2, quarre de w a partir de la cape
213c   a partir de w2, on calcule wa, vitesse de l'ascendance
214c
215c   ATTENTION: Dans cette version, pour cause d'economie de memoire,
216c   w2 est stoke dans wa
217c
218c   ATTENTION: dans convect8, on n'utilise le calcule des wa
219c   independants par couches que pour calculer l'entrainement
220c   a la base et la hauteur max de l'ascendance.
221c
222c   Indicages:
223c   l'ascendance provenant du niveau k traverse l'interface l avec
224c   une vitesse wa(k,l).
225c
226c                       --------------------
227c
228c                       + + + + + + + + + +
229c
230c  wa(k,l)   ----       --------------------    l
231c             /\
232c            /||\       + + + + + + + + + +
233c             ||
234c             ||        --------------------
235c             ||
236c             ||        + + + + + + + + + +
237c             ||
238c             ||        --------------------
239c             ||__
240c             |___      + + + + + + + + + +     k
241c
242c                       --------------------
243c
244c
245c
246c------------------------------------------------------------------
247
248
249      do k=1,nlay-1
250         do ig=1,ngrid
251            wa(ig,k,k)=0.
252            wa(ig,k,k+1)=2.*RG*(ztv(ig,k)-ztv(ig,k+1))/ztv(ig,k+1)
253     s      *(zlev(ig,k+1)-zlev(ig,k))
254         enddo
255         do l=k+1,nlay-1
256            do ig=1,ngrid
257               wa(ig,k,l+1)=wa(ig,k,l)+
258     s         2.*RG*(ztv(ig,k)-ztv(ig,l))/ztv(ig,l)
259     s         *(zlev(ig,l+1)-zlev(ig,l))
260            enddo
261         enddo
262         do ig=1,ngrid
263            wa(ig,k,nlay+1)=0.
264         enddo
265      enddo
266
267c     print*,'4 OK convect8'
268c Calcul de la couche correspondant a la hauteur du thermique
269      do k=1,nlay-1
270         do ig=1,ngrid
271            lmax(ig,k)=k
272         enddo
273         do l=nlay,k+1,-1
274            do ig=1,ngrid
275               if(wa(ig,k,l).le.1.e-10) lmax(ig,k)=l-1
276            enddo
277         enddo
278      enddo
279
280c     print*,'5 OK convect8'
281c   Calcule du w max du thermique
282      do k=1,nlay
283      do ig=1,ngrid
284         wmax(ig,k)=0.
285      enddo
286      enddo
287
288      do k=1,nlay-1
289         do l=k,nlay
290            do ig=1,ngrid
291               if (l.le.lmax(ig,k)) then
292                  wa(ig,k,l)=sqrt(wa(ig,k,l))
293                  wmax(ig,k)=max(wmax(ig,k),wa(ig,k,l))
294               else
295                  wa(ig,k,l)=0.
296               endif
297            enddo
298         enddo
299      enddo
300
301      do k=1,nlay-1
302         do ig=1,ngrid
303             pu_therm(ig,k)=sqrt(wmax(ig,k))
304             pv_therm(ig,k)=sqrt(wmax(ig,k))
305         enddo
306      enddo
307
308c     print*,'6 OK convect8'
309c   Longueur caracteristique correspondant a la hauteur des thermiques.
310      do  ig=1,ngrid
311         zmax(ig)=500.
312      enddo
313c     print*,'LMAX LMAX LMAX '
314      do k=1,nlay-1
315         do  ig=1,ngrid
316            zmax(ig)=max(zmax(ig),zlev(ig,lmax(ig,k))-zlev(ig,k))
317         enddo
318c     print*,k,lmax(1,k)
319      enddo
320c     print*,'ZMAX ZMAX ZMAX ',zmax
321c      call dump2d(iim,jjm-1,zmax(2:ngrid-1),'ZMAX      ')
322
323c   Calcul de l'entrainement.
324c   Le rapport d'aspect relie la largeur de l'ascendance a l'epaisseur
325c   de la couche d'alimentation en partant du principe que la vitesse
326c   maximum dans l'ascendance est la vitesse d'entrainement horizontale.
327      do k=1,nlay
328         do ig=1,ngrid
329            zzz=rho(ig,k)*wmax(ig,k)*(zlev(ig,k+1)-zlev(ig,k))
330     s    /(zmax(ig)*r_aspect)
331            if(w2di.eq.2) then
332               entr(ig,k)=entr(ig,k)+
333     s         ptimestep*(zzz-entr(ig,k))/float(tho)
334            else
335               entr(ig,k)=zzz
336            endif
337            ztva(ig,k)=ztv(ig,k)
338         enddo
339      enddo
340
341c     print*,'7 OK convect8'
342      do k=1,klev+1
343         do ig=1,ngrid
344            zw2(ig,k)=0.
345            fmc(ig,k)=0.
346            larg_cons(ig,k)=0.
347            larg_detr(ig,k)=0.
348            wa_moy(ig,k)=0.
349         enddo
350      enddo
351
352c     print*,'8 OK convect8'
353      do ig=1,ngrid
354         lmaxa(ig)=1
355         lmix(ig)=1
356         wmaxa(ig)=0.
357      enddo
358
359
360      do l=1,nlay-2
361         do ig=1,ngrid
362c           if (zw2(ig,l).lt.1.e-10.and.ztv(ig,l).gt.ztv(ig,l+1)) then
363c         print*,'COUCOU ',l,zw2(ig,l),ztv(ig,l),ztv(ig,l+1)
364            if (zw2(ig,l).lt.1.e-10.and.ztv(ig,l).gt.ztv(ig,l+1)
365     s       .and.entr(ig,l).gt.1.e-10) then
366c        print*,'COUCOU cas 1'
367c   Initialisation de l'ascendance
368c              lmix(ig)=1
369               ztva(ig,l)=ztv(ig,l)
370               fmc(ig,l)=0.
371               fmc(ig,l+1)=entr(ig,l)
372               zw2(ig,l)=0.
373c     if (.not.ztv(ig,l+1).gt.150.) then
374c     print*,'ig,l+1,ztv(ig,l+1)'
375c     print*, ig,l+1,ztv(ig,l+1)
376c        stop'dans thermiques'
377c     endif
378               zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1)
379     s         *(zlev(ig,l+1)-zlev(ig,l))
380               larg_detr(ig,l)=0.
381            else if (zw2(ig,l).ge.1.e-10.and.
382     .               fmc(ig,l)+entr(ig,l).gt.1.e-10) then
383c   Incrementation...
384               fmc(ig,l+1)=fmc(ig,l)+entr(ig,l)
385c     if (.not.fmc(ig,l+1).gt.1.e-15) then
386c     print*,'ig,l+1,fmc(ig,l+1)'
387c     print*, ig,l+1,fmc(ig,l+1)
388c     print*,'Fmc ',(fmc(ig,ll),ll=1,klev+1)
389c     print*,'W2 ',(zw2(ig,ll),ll=1,klev+1)
390c     print*,'Tv ',(ztv(ig,ll),ll=1,klev)
391c     print*,'Entr ',(entr(ig,ll),ll=1,klev)
392c        stop'dans thermiques'
393c     endif
394               ztva(ig,l)=(fmc(ig,l)*ztva(ig,l-1)+entr(ig,l)*ztv(ig,l))
395     s          /fmc(ig,l+1)
396c  mise a jour de la vitesse ascendante (l'air entraine de la couche
397c  consideree commence avec une vitesse nulle).
398               zw2(ig,l+1)=zw2(ig,l)*(fmc(ig,l)/fmc(ig,l+1))**2+
399     s         2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)
400     s         *(zlev(ig,l+1)-zlev(ig,l))
401            endif
402            if (zw2(ig,l+1).lt.0.) then
403               zw2(ig,l+1)=0.
404               lmaxa(ig)=l
405            else
406               wa_moy(ig,l+1)=sqrt(zw2(ig,l+1))
407            endif
408            if (wa_moy(ig,l+1).gt.wmaxa(ig)) then
409c   lmix est le niveau de la couche ou w (wa_moy) est maximum
410               lmix(ig)=l+1
411               wmaxa(ig)=wa_moy(ig,l+1)
412            endif
413c        print*,'COUCOU cas 2 LMIX=',lmix(ig),wa_moy(ig,l+1),wmaxa(ig)
414         enddo
415      enddo
416
417c     print*,'9 OK convect8'
418c     print*,'WA1 ',wa_moy
419
420c   determination de l'indice du debut de la mixed layer ou w decroit
421
422c   calcul de la largeur de chaque ascendance dans le cas conservatif.
423c   dans ce cas simple, on suppose que la largeur de l'ascendance provenant
424c   d'une couche est égale à la hauteur de la couche alimentante.
425c   La vitesse maximale dans l'ascendance est aussi prise comme estimation
426c   de la vitesse d'entrainement horizontal dans la couche alimentante.
427
428      do l=2,nlay
429         do ig=1,ngrid
430            if (l.le.lmaxa(ig)) then
431               zw=max(wa_moy(ig,l),1.e-10)
432               larg_cons(ig,l)=zmax(ig)*r_aspect
433     s         *fmc(ig,l)/(rhobarz(ig,l)*zw)
434            endif
435         enddo
436      enddo
437
438      do l=2,nlay
439         do ig=1,ngrid
440            if (l.le.lmaxa(ig)) then
441c              if (idetr.eq.0) then
442c  cette option est finalement en dur.
443                  larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
444c              else if (idetr.eq.1) then
445c                 larg_detr(ig,l)=larg_cons(ig,l)
446c    s            *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig))
447c              else if (idetr.eq.2) then
448c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
449c    s            *sqrt(wa_moy(ig,l))
450c              else if (idetr.eq.4) then
451c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
452c    s            *wa_moy(ig,l)
453c              endif
454            endif
455         enddo
456       enddo
457
458c     print*,'10 OK convect8'
459c     print*,'WA2 ',wa_moy
460c   calcul de la fraction de la maille concernée par l'ascendance en tenant
461c   compte de l'epluchage du thermique.
462
463      do l=2,nlay
464         do ig=1,ngrid
465            if(larg_cons(ig,l).gt.1.) then
466c     print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),'  KKK'
467               fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l))
468     s            /(r_aspect*zmax(ig))
469               if(l.gt.lmix(ig)) then
470                  xxx(ig,l)=(lmaxa(ig)+1.-l) / (lmaxa(ig)+1.-lmix(ig))
471           if (idetr.eq.0) then
472               fraca(ig,l)=fraca(ig,lmix(ig))
473           else if (idetr.eq.1) then
474               fraca(ig,l)=fraca(ig,lmix(ig))*xxx(ig,l)
475           else if (idetr.eq.2) then
476               fraca(ig,l)=fraca(ig,lmix(ig))*(1.-(1.-xxx(ig,l))**2)
477           else
478               fraca(ig,l)=fraca(ig,lmix(ig))*xxx(ig,l)**2
479           endif
480               endif
481c     print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL'
482               fraca(ig,l)=max(fraca(ig,l),0.)
483               fraca(ig,l)=min(fraca(ig,l),0.5)
484               fracd(ig,l)=1.-fraca(ig,l)
485               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
486            else
487c              wa_moy(ig,l)=0.
488               fraca(ig,l)=0.
489               fracc(ig,l)=0.
490               fracd(ig,l)=1.
491            endif
492         enddo
493      enddo
494
495c     print*,'11 OK convect8'
496c     print*,'Ea3 ',wa_moy
497c------------------------------------------------------------------
498c   Calcul de fracd, wd
499c   somme wa - wd = 0
500c------------------------------------------------------------------
501
502
503      do ig=1,ngrid
504         fm(ig,1)=0.
505         fm(ig,nlay+1)=0.
506      enddo
507
508      do l=2,nlay
509           do ig=1,ngrid
510              fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l)
511           enddo
512         do ig=1,ngrid
513            if(fracd(ig,l).lt.0.1) then
514               stop'fracd trop petit'
515            else
516c    vitesse descendante "diagnostique"
517               wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l))
518            endif
519         enddo
520      enddo
521
522      do l=1,nlay
523         do ig=1,ngrid
524c           masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
525            masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG
526         enddo
527      enddo
528
529c     print*,'12 OK convect8'
530c     print*,'WA4 ',wa_moy
531cc------------------------------------------------------------------
532c   calcul du transport vertical
533c------------------------------------------------------------------
534
535      go to 4444
536c     print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep
537      do l=2,nlay-1
538         do ig=1,ngrid
539            if(fm(ig,l+1)*ptimestep.gt.masse(ig,l)
540     s      .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then
541c     print*,'WARN!!! FM>M ig=',ig,' l=',l,'  FM='
542c    s         ,fm(ig,l+1)*ptimestep
543c    s         ,'   M=',masse(ig,l),masse(ig,l+1)
544             endif
545         enddo
546      enddo
547
548      do l=1,nlay
549         do ig=1,ngrid
550            if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then
551c     print*,'WARN!!! E>M ig=',ig,' l=',l,'  E=='
552c    s         ,entr(ig,l)*ptimestep
553c    s         ,'   M=',masse(ig,l)
554             endif
555         enddo
556      enddo
557
558      do l=1,nlay
559         do ig=1,ngrid
560            if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then
561c     print*,'WARN!!! fm exagere ig=',ig,'   l=',l
562c    s         ,'   FM=',fm(ig,l)
563            endif
564            if(.not.masse(ig,l).ge.1.e-10
565     s         .or..not.masse(ig,l).le.1.e4) then
566c     print*,'WARN!!! masse exagere ig=',ig,'   l=',l
567c    s         ,'   M=',masse(ig,l)
568c     print*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)',
569c    s                 rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)
570c     print*,'zlev(ig,l+1),zlev(ig,l)'
571c    s                ,zlev(ig,l+1),zlev(ig,l)
572c     print*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)'
573c    s                ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)
574            endif
575            if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then
576c     print*,'WARN!!! entr exagere ig=',ig,'   l=',l
577c    s         ,'   E=',entr(ig,l)
578            endif
579         enddo
580      enddo
581
5824444   continue
583
584      if (w2di.eq.1) then
585         fm0=fm0+ptimestep*(fm-fm0)/float(tho)
586         entr0=entr0+ptimestep*(entr-entr0)/float(tho)
587      else
588         fm0=fm
589         entr0=entr
590      endif
591
592      if (1.eq.1) then
593         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
594     .    ,zh,zdhadj,zha)
595         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
596     .    ,zo,pdoadj,zoa)
597      else
598         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
599     .    ,zh,zdhadj,zha)
600         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
601     .    ,zo,pdoadj,zoa)
602      endif
603
604      if (1.eq.0) then
605         call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse
606     .    ,fraca,zmax
607     .    ,zu,zv,pduadj,pdvadj,zua,zva)
608      else
609         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
610     .    ,zu,pduadj,zua)
611         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
612     .    ,zv,pdvadj,zva)
613      endif
614
615      do l=1,nlay
616         do ig=1,ngrid
617            zf=0.5*(fracc(ig,l)+fracc(ig,l+1))
618            zf2=zf/(1.-zf)
619            thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2
620            wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
621         enddo
622      enddo
623
624
625
626c     print*,'13 OK convect8'
627c     print*,'WA5 ',wa_moy
628      do l=1,nlay
629         do ig=1,ngrid
630            pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l)
631         enddo
632      enddo
633
634
635c     do l=1,nlay
636c        do ig=1,ngrid
637c           if(abs(pdtadj(ig,l))*86400..gt.500.) then
638c     print*,'WARN!!! ig=',ig,'  l=',l
639c    s         ,'   pdtadj=',pdtadj(ig,l)
640c           endif
641c           if(abs(pdoadj(ig,l))*86400..gt.1.) then
642c     print*,'WARN!!! ig=',ig,'  l=',l
643c    s         ,'   pdoadj=',pdoadj(ig,l)
644c           endif
645c        enddo
646c      enddo
647
648c     print*,'14 OK convect8'
649c------------------------------------------------------------------
650c   Calculs pour les sorties
651c------------------------------------------------------------------
652
653      if(sorties) then
654      do l=1,nlay
655         do ig=1,ngrid
656            zla(ig,l)=(1.-fracd(ig,l))*zmax(ig)
657            zld(ig,l)=fracd(ig,l)*zmax(ig)
658            if(1.-fracd(ig,l).gt.1.e-10)
659     s      zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l))
660         enddo
661      enddo
662
663      do l=1,nlay
664         do ig=1,ngrid
665            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
666            if (detr(ig,l).lt.0.) then
667                entr(ig,l)=entr(ig,l)-detr(ig,l)
668                detr(ig,l)=0.
669c     print*,'WARNING !!! detrainement negatif ',ig,l
670            endif
671         enddo
672      enddo
673
674c     print*,'15 OK convect8'
675
676      isplit=isplit+1
677
678
679c #define und
680        goto 123
681#ifdef und
682      CALL writeg1d(1,nlay,wd,'wd      ','wd      ')
683      CALL writeg1d(1,nlay,zwa,'wa      ','wa      ')
684      CALL writeg1d(1,nlay,fracd,'fracd      ','fracd      ')
685      CALL writeg1d(1,nlay,fraca,'fraca      ','fraca      ')
686      CALL writeg1d(1,nlay,wa_moy,'wam         ','wam         ')
687      CALL writeg1d(1,nlay,zla,'la      ','la      ')
688      CALL writeg1d(1,nlay,zld,'ld      ','ld      ')
689      CALL writeg1d(1,nlay,pt,'pt      ','pt      ')
690      CALL writeg1d(1,nlay,zh,'zh      ','zh      ')
691      CALL writeg1d(1,nlay,zha,'zha      ','zha      ')
692      CALL writeg1d(1,nlay,zu,'zu      ','zu      ')
693      CALL writeg1d(1,nlay,zv,'zv      ','zv      ')
694      CALL writeg1d(1,nlay,zo,'zo      ','zo      ')
695      CALL writeg1d(1,nlay,wh,'wh      ','wh      ')
696      CALL writeg1d(1,nlay,wu,'wu      ','wu      ')
697      CALL writeg1d(1,nlay,wv,'wv      ','wv      ')
698      CALL writeg1d(1,nlay,wo,'w15uo     ','wXo     ')
699      CALL writeg1d(1,nlay,zdhadj,'zdhadj      ','zdhadj      ')
700      CALL writeg1d(1,nlay,pduadj,'pduadj      ','pduadj      ')
701      CALL writeg1d(1,nlay,pdvadj,'pdvadj      ','pdvadj      ')
702      CALL writeg1d(1,nlay,pdoadj,'pdoadj      ','pdoadj      ')
703      CALL writeg1d(1,nlay,entr  ,'entr        ','entr        ')
704      CALL writeg1d(1,nlay,detr  ,'detr        ','detr        ')
705      CALL writeg1d(1,nlay,fm    ,'fm          ','fm          ')
706
707      CALL writeg1d(1,nlay,pdtadj,'pdtadj    ','pdtadj    ')
708      CALL writeg1d(1,nlay,pplay,'pplay     ','pplay     ')
709      CALL writeg1d(1,nlay,pplev,'pplev     ','pplev     ')
710c   recalcul des flux en diagnostique...
711c     print*,'PAS DE TEMPS ',ptimestep
712       call dt2F(pplev,pplay,pt,pdtadj,wh)
713      CALL writeg1d(1,nlay,wh,'wh2     ','wh2     ')
714#endif
715123   continue
716! #define troisD
717#ifdef troisD
718c       if (sorties) then
719      print*,'Debut des wrgradsfi'
720
721c      print*,'16 OK convect8'
722         call wrgradsfi(1,nlay,wd,'wd        ','wd        ')
723         call wrgradsfi(1,nlay,zwa,'wa        ','wa        ')
724         call wrgradsfi(1,nlay,fracd,'fracd     ','fracd     ')
725         call wrgradsfi(1,nlay,fraca,'fraca     ','fraca     ')
726         call wrgradsfi(1,nlay,xxx,'xxx       ','xxx       ')
727         call wrgradsfi(1,nlay,wa_moy,'wam       ','wam       ')
728c      print*,'WA6 ',wa_moy
729         call wrgradsfi(1,nlay,zla,'la        ','la        ')
730         call wrgradsfi(1,nlay,zld,'ld        ','ld        ')
731         call wrgradsfi(1,nlay,pt,'pt        ','pt        ')
732         call wrgradsfi(1,nlay,zh,'zh        ','zh        ')
733         call wrgradsfi(1,nlay,zha,'zha        ','zha        ')
734         call wrgradsfi(1,nlay,zua,'zua        ','zua        ')
735         call wrgradsfi(1,nlay,zva,'zva        ','zva        ')
736         call wrgradsfi(1,nlay,zu,'zu        ','zu        ')
737         call wrgradsfi(1,nlay,zv,'zv        ','zv        ')
738         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
739         call wrgradsfi(1,nlay,wh,'wh        ','wh        ')
740         call wrgradsfi(1,nlay,wu,'wu        ','wu        ')
741         call wrgradsfi(1,nlay,wv,'wv        ','wv        ')
742         call wrgradsfi(1,nlay,wo,'wo        ','wo        ')
743         call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
744         call wrgradsfi(1,nlay,zdhadj,'zdhadj    ','zdhadj    ')
745         call wrgradsfi(1,nlay,pduadj,'pduadj    ','pduadj    ')
746         call wrgradsfi(1,nlay,pdvadj,'pdvadj    ','pdvadj    ')
747         call wrgradsfi(1,nlay,pdoadj,'pdoadj    ','pdoadj    ')
748         call wrgradsfi(1,nlay,entr,'entr      ','entr      ')
749         call wrgradsfi(1,nlay,detr,'detr      ','detr      ')
750         call wrgradsfi(1,nlay,fm,'fm        ','fm        ')
751         call wrgradsfi(1,nlay,fmc,'fmc       ','fmc       ')
752         call wrgradsfi(1,nlay,zw2,'zw2       ','zw2       ')
753         call wrgradsfi(1,nlay,ztva,'ztva      ','ztva      ')
754         call wrgradsfi(1,nlay,ztv,'ztv       ','ztv       ')
755
756         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
757         call wrgradsfi(1,nlay,larg_cons,'Lc        ','Lc        ')
758         call wrgradsfi(1,nlay,larg_detr,'Ldetr     ','Ldetr     ')
759
760
761c      print*,'17 OK convect8'
762
763         do k=1,klev/10
764            write(str2,'(i2.2)') k
765            str10='wa'//str2
766            do l=1,nlay
767               do ig=1,ngrid
768                  zsortie(ig,l)=wa(ig,k,l)
769               enddo
770            enddo   
771            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
772            do l=1,nlay
773               do ig=1,ngrid
774                  zsortie(ig,l)=larg_part(ig,k,l)
775               enddo
776            enddo
777            str10='la'//str2
778            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
779         enddo
780
781
782c     print*,'18 OK convect8'
783c      endif
784      print*,'Fin des wrgradsfi'
785#endif
786
787      endif
788
789c     if(wa_moy(1,4).gt.1.e-10) stop
790
791c     print*,'19 OK convect8'
792      return
793      end
794
795      SUBROUTINE thermcell_cld(ngrid,nlay,ptimestep
796     s                  ,pplay,pplev,pphi,zlev,debut
797     s                  ,pu,pv,pt,po
798     s                  ,pduadj,pdvadj,pdtadj,pdoadj
799     s                  ,fm0,entr0,zqla,lmax
800     s                  ,zmax_sec,wmax_sec,zw_sec,lmix_sec
801     s                  ,ratqscth,ratqsdiff
802c    s                  ,pu_therm,pv_therm
803     s                  ,r_aspect,l_mix,w2di,tho)
804
805      IMPLICIT NONE
806
807c=======================================================================
808c
809c   Calcul du transport verticale dans la couche limite en presence
810c   de "thermiques" explicitement representes
811c
812c   Réécriture à partir d'un listing papier à Habas, le 14/02/00
813c
814c   le thermique est supposé homogène et dissipé par mélange avec
815c   son environnement. la longueur l_mix contrôle l'efficacité du
816c   mélange
817c
818c   Le calcul du transport des différentes espèces se fait en prenant
819c   en compte:
820c     1. un flux de masse montant
821c     2. un flux de masse descendant
822c     3. un entrainement
823c     4. un detrainement
824c
825c=======================================================================
826
827c-----------------------------------------------------------------------
828c   declarations:
829c   -------------
830
831#include "dimensions.h"
832#include "dimphy.h"
833#include "YOMCST.h"
834#include "YOETHF.h"
835#include "FCTTRE.h"
836
837c   arguments:
838c   ----------
839
840      INTEGER ngrid,nlay,w2di,tho
841      real ptimestep,l_mix,r_aspect
842      REAL pt(ngrid,nlay),pdtadj(ngrid,nlay)
843      REAL pu(ngrid,nlay),pduadj(ngrid,nlay)
844      REAL pv(ngrid,nlay),pdvadj(ngrid,nlay)
845      REAL po(ngrid,nlay),pdoadj(ngrid,nlay)
846      REAL pplay(ngrid,nlay),pplev(ngrid,nlay+1)
847      real pphi(ngrid,nlay)
848
849      integer idetr
850      save idetr
851      data idetr/3/
852
853c   local:
854c   ------
855
856      INTEGER ig,k,l,lmaxa(klon),lmix(klon)
857      real zsortie1d(klon)
858c CR: on remplace lmax(klon,klev+1)
859      INTEGER lmax(klon),lmin(klon),lentr(klon)
860      real linter(klon)
861      real zmix(klon), fracazmix(klon)
862      real alpha
863      save alpha
864      data alpha/1./
865c RC
866      real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz
867      real zmax_sec(klon)
868      real zmax_sec2(klon)
869      real zw_sec(klon,klev+1)
870      INTEGER lmix_sec(klon)
871      real w_est(klon,klev+1)
872con garde le zmax du pas de temps precedent
873      real zmax0(klon)
874      save zmax0
875      real zmix0(klon)
876      save zmix0
877
878      real zlev(klon,klev+1),zlay(klon,klev)
879      real deltaz(klon,klev)
880      REAL zh(klon,klev),zdhadj(klon,klev)
881      real zthl(klon,klev),zdthladj(klon,klev)
882      REAL ztv(klon,klev)
883      real zu(klon,klev),zv(klon,klev),zo(klon,klev)
884      real zl(klon,klev)
885      REAL wh(klon,klev+1)
886      real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1)
887      real zla(klon,klev+1)
888      real zwa(klon,klev+1)
889      real zld(klon,klev+1)
890      real zwd(klon,klev+1)
891      real zsortie(klon,klev)
892      real zva(klon,klev)
893      real zua(klon,klev)
894      real zoa(klon,klev)
895
896      real zta(klon,klev)
897      real zha(klon,klev)
898      real wa_moy(klon,klev+1)
899      real fraca(klon,klev+1)
900      real fracc(klon,klev+1)
901      real zf,zf2
902      real thetath2(klon,klev),wth2(klon,klev),wth3(klon,klev)
903      real q2(klon,klev)
904      real dtheta(klon,klev)
905      common/comtherm/thetath2,wth2
906   
907      real ratqscth(klon,klev)
908      real sum
909      real sumdiff
910      real ratqsdiff(klon,klev)
911      real count_time
912      integer isplit,nsplit,ialt
913      parameter (nsplit=10)
914      data isplit/0/
915      save isplit
916
917      logical sorties
918      real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev)
919      real zpspsk(klon,klev)
920
921c     real wmax(klon,klev),wmaxa(klon)
922      real wmax(klon),wmaxa(klon)
923      real wmax_sec(klon)
924      real wmax_sec2(klon)
925      real wa(klon,klev,klev+1)
926      real wd(klon,klev+1)
927      real larg_part(klon,klev,klev+1)
928      real fracd(klon,klev+1)
929      real xxx(klon,klev+1)
930      real larg_cons(klon,klev+1)
931      real larg_detr(klon,klev+1)
932      real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev)
933      real massetot(klon,klev)
934      real detr0(klon,klev)
935      real alim0(klon,klev)
936      real pu_therm(klon,klev),pv_therm(klon,klev)
937      real fm(klon,klev+1),entr(klon,klev)
938      real fmc(klon,klev+1)
939
940      real zcor,zdelta,zcvm5,qlbef
941      real Tbef(klon),qsatbef(klon)
942      real dqsat_dT,DT,num,denom
943      REAL REPS,RLvCp,DDT0
944      real ztla(klon,klev),zqla(klon,klev),zqta(klon,klev)
945cCR niveau de condensation
946      real nivcon(klon)
947      real zcon(klon)
948      real zqsat(klon,klev)
949      real zqsatth(klon,klev)
950      PARAMETER (DDT0=.01)
951
952
953cCR:nouvelles variables
954      real f_star(klon,klev+1),entr_star(klon,klev)
955      real detr_star(klon,klev)
956      real alim_star_tot(klon),alim_star2(klon)
957      real entr_star_tot(klon)
958      real detr_star_tot(klon)
959      real alim_star(klon,klev)
960      real alim(klon,klev)
961      real nu(klon,klev)
962      real nu_e(klon,klev)
963      real nu_min
964      real nu_max
965      real nu_r
966      real f(klon), f0(klon)
967      save f0
968      real f_old
969      real zlevinter(klon)
970      logical first
971c      data first /.false./
972c      save first
973      logical nuage
974c      save nuage
975      logical boucle
976      logical therm
977      logical debut
978      logical rale
979      integer test(klon)
980      integer signe_zw2
981cRC
982
983      character*2 str2
984      character*10 str10
985
986      LOGICAL vtest(klon),down
987      LOGICAL Zsat(klon)
988
989      EXTERNAL SCOPY
990
991      integer ncorrec,ll
992      save ncorrec
993      data ncorrec/0/
994c
995
996c-----------------------------------------------------------------------
997c   initialisation:
998c   ---------------
999c
1000       sorties=.false.
1001c     print*,'NOUVEAU DETR PLUIE '
1002      IF(ngrid.NE.klon) THEN
1003         PRINT*
1004         PRINT*,'STOP dans convadj'
1005         PRINT*,'ngrid    =',ngrid
1006         PRINT*,'klon  =',klon
1007      ENDIF
1008c
1009c Initialisation
1010      RLvCp = RLVTT/RCPD
1011      REPS  = RD/RV
1012cinitialisations de zqsat
1013      DO ll=1,nlay
1014         DO ig=1,ngrid
1015            zqsat(ig,ll)=0.
1016            zqsatth(ig,ll)=0.
1017         ENDDO
1018      ENDDO
1019c
1020con met le first a true pour le premier passage de la journée
1021      do ig=1,klon
1022            test(ig)=0
1023      enddo
1024      if (debut) then
1025         do ig=1,klon
1026            test(ig)=1
1027            f0(ig)=0.
1028            zmax0(ig)=0.
1029         enddo
1030      endif
1031      do ig=1,klon     
1032         if ((.not.debut).and.(f0(ig).lt.1.e-10)) then
1033            test(ig)=1
1034         endif
1035      enddo
1036c     do ig=1,klon
1037c        print*,'test(ig)',test(ig),zmax0(ig)
1038c     enddo
1039      nuage=.false.
1040c-----------------------------------------------------------------------
1041cAM Calcul de T,q,ql a partir de Tl et qT
1042c   ---------------------------------------------------
1043c
1044c Pr Tprec=Tl calcul de qsat
1045c Si qsat>qT T=Tl, q=qT
1046c Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt)
1047c On cherche DDT < DDT0
1048c
1049c defaut
1050       DO  ll=1,nlay
1051         DO ig=1,ngrid
1052            zo(ig,ll)=po(ig,ll)
1053            zl(ig,ll)=0.
1054            zh(ig,ll)=pt(ig,ll)
1055         EndDO
1056       EndDO
1057       do ig=1,ngrid
1058          Zsat(ig)=.false.
1059       enddo
1060c
1061c
1062       DO ll=1,nlay
1063c les points insatures sont definitifs
1064         DO ig=1,ngrid
1065            Tbef(ig)=pt(ig,ll)
1066            zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
1067            qsatbef(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig,ll)
1068            qsatbef(ig)=MIN(0.5,qsatbef(ig))
1069            zcor=1./(1.-retv*qsatbef(ig))
1070            qsatbef(ig)=qsatbef(ig)*zcor
1071            Zsat(ig) = (max(0.,po(ig,ll)-qsatbef(ig)) .gt. 1.e-10)
1072         EndDO
1073
1074         DO ig=1,ngrid
1075           if (Zsat(ig).and.(1.eq.1)) then
1076            qlbef=max(0.,po(ig,ll)-qsatbef(ig))
1077c si sature: ql est surestime, d'ou la sous-relax
1078            DT = 0.5*RLvCp*qlbef
1079c            write(18,*),'DT0=',DT
1080c on pourra enchainer 2 ou 3 calculs sans Do while
1081            do while (abs(DT).gt.DDT0)
1082c il faut verifier si c,a conserve quand on repasse en insature ...
1083              Tbef(ig)=Tbef(ig)+DT
1084              zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
1085              qsatbef(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig,ll)
1086              qsatbef(ig)=MIN(0.5,qsatbef(ig))
1087              zcor=1./(1.-retv*qsatbef(ig))
1088              qsatbef(ig)=qsatbef(ig)*zcor
1089c on veut le signe de qlbef
1090              qlbef=po(ig,ll)-qsatbef(ig)
1091              zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
1092              zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta
1093              zcor=1./(1.-retv*qsatbef(ig))
1094              dqsat_dT=FOEDE(Tbef(ig),zdelta,zcvm5,qsatbef(ig),zcor)
1095              num=-Tbef(ig)+pt(ig,ll)+RLvCp*qlbef
1096              denom=1.+RLvCp*dqsat_dT
1097              if (denom.lt.1.e-10) then
1098                  print*,'pb denom'
1099              endif
1100              DT=num/denom
1101            enddo
1102c on ecrit de maniere conservative (sat ou non)
1103            zl(ig,ll) = max(0.,qlbef)
1104c          T = Tl +Lv/Cp ql
1105            zh(ig,ll) = pt(ig,ll)+RLvCp*zl(ig,ll)
1106            zo(ig,ll) = po(ig,ll)-zl(ig,ll)
1107           endif
1108con ecrit zqsat
1109            zqsat(ig,ll)=qsatbef(ig)     
1110         EndDO
1111       EndDO
1112cAM fin
1113c
1114c-----------------------------------------------------------------------
1115c   incrementation eventuelle de tendances precedentes:
1116c   ---------------------------------------------------
1117
1118c     print*,'0 OK convect8'
1119
1120      DO 1010 l=1,nlay
1121         DO 1015 ig=1,ngrid
1122             zpspsk(ig,l)=(pplay(ig,l)/100000.)**RKAPPA
1123c            zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA
1124c            zh(ig,l)=pt(ig,l)/zpspsk(ig,l)
1125            zu(ig,l)=pu(ig,l)
1126            zv(ig,l)=pv(ig,l)
1127c            zo(ig,l)=po(ig,l)
1128c            ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l))
1129cAM attention zh est maintenant le profil de T et plus le profil de theta !
1130c
1131c   T-> Theta
1132            ztv(ig,l)=zh(ig,l)/zpspsk(ig,l)
1133cAM Theta_v
1134            ztv(ig,l)=ztv(ig,l)*(1.+RETV*(zo(ig,l))
1135     s           -zl(ig,l))
1136cAM Thetal
1137            zthl(ig,l)=pt(ig,l)/zpspsk(ig,l)
1138c           
11391015     CONTINUE
11401010  CONTINUE
1141
1142c     print*,'1 OK convect8'
1143c                       --------------------
1144c
1145c
1146c                       + + + + + + + + + + +
1147c
1148c
1149c  wa, fraca, wd, fracd --------------------   zlev(2), rhobarz
1150c  wh,wt,wo ...
1151c
1152c                       + + + + + + + + + + +  zh,zu,zv,zo,rho
1153c
1154c
1155c                       --------------------   zlev(1)
1156c                       \\\\\\\\\\\\\\\\\\\\
1157c
1158c
1159
1160c-----------------------------------------------------------------------
1161c   Calcul des altitudes des couches
1162c-----------------------------------------------------------------------
1163
1164      do l=2,nlay
1165         do ig=1,ngrid
1166            zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG
1167         enddo
1168      enddo
1169      do ig=1,ngrid
1170         zlev(ig,1)=0.
1171         zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG
1172      enddo
1173      do l=1,nlay
1174         do ig=1,ngrid
1175            zlay(ig,l)=pphi(ig,l)/RG
1176         enddo
1177      enddo
1178ccalcul de deltaz
1179      do l=1,nlay
1180         do ig=1,ngrid
1181            deltaz(ig,l)=zlev(ig,l+1)-zlev(ig,l)
1182         enddo
1183      enddo
1184
1185c     print*,'2 OK convect8'
1186c-----------------------------------------------------------------------
1187c   Calcul des densites
1188c-----------------------------------------------------------------------
1189
1190      do l=1,nlay
1191         do ig=1,ngrid
1192c            rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l))
1193             rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*ztv(ig,l))
1194         enddo
1195      enddo
1196
1197      do l=2,nlay
1198         do ig=1,ngrid
1199            rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1))
1200         enddo
1201      enddo
1202
1203      do k=1,nlay
1204         do l=1,nlay+1
1205            do ig=1,ngrid
1206               wa(ig,k,l)=0.
1207            enddo
1208         enddo
1209      enddo
1210cCr:ajout:calcul de la masse
1211      do l=1,nlay
1212         do ig=1,ngrid
1213c           masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
1214            masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG
1215         enddo
1216      enddo
1217c     print*,'3 OK convect8'
1218c------------------------------------------------------------------
1219c   Calcul de w2, quarre de w a partir de la cape
1220c   a partir de w2, on calcule wa, vitesse de l'ascendance
1221c
1222c   ATTENTION: Dans cette version, pour cause d'economie de memoire,
1223c   w2 est stoke dans wa
1224c
1225c   ATTENTION: dans convect8, on n'utilise le calcule des wa
1226c   independants par couches que pour calculer l'entrainement
1227c   a la base et la hauteur max de l'ascendance.
1228c
1229c   Indicages:
1230c   l'ascendance provenant du niveau k traverse l'interface l avec
1231c   une vitesse wa(k,l).
1232c
1233c                       --------------------
1234c
1235c                       + + + + + + + + + +
1236c
1237c  wa(k,l)   ----       --------------------    l
1238c             /\
1239c            /||\       + + + + + + + + + +
1240c             ||
1241c             ||        --------------------
1242c             ||
1243c             ||        + + + + + + + + + +
1244c             ||
1245c             ||        --------------------
1246c             ||__
1247c             |___      + + + + + + + + + +     k
1248c
1249c                       --------------------
1250c
1251c
1252c
1253c------------------------------------------------------------------
1254
1255cCR: ponderation entrainement des couches instables
1256cdef des alim_star tels que alim=f*alim_star     
1257      do l=1,klev
1258         do ig=1,ngrid
1259            alim_star(ig,l)=0.
1260            alim(ig,l)=0.
1261         enddo
1262      enddo
1263c determination de la longueur de la couche d entrainement
1264      do ig=1,ngrid
1265         lentr(ig)=1
1266      enddo
1267
1268con ne considere que les premieres couches instables
1269      therm=.false.
1270      do k=nlay-2,1,-1
1271         do ig=1,ngrid
1272            if (ztv(ig,k).gt.ztv(ig,k+1).and.
1273     s          ztv(ig,k+1).le.ztv(ig,k+2)) then
1274               lentr(ig)=k+1
1275               therm=.true.
1276            endif
1277          enddo
1278      enddo
1279c
1280c determination du lmin: couche d ou provient le thermique
1281      do ig=1,ngrid
1282         lmin(ig)=1
1283      enddo
1284      do ig=1,ngrid
1285         do l=nlay,2,-1
1286            if (ztv(ig,l-1).gt.ztv(ig,l)) then
1287               lmin(ig)=l-1
1288            endif
1289         enddo
1290      enddo
1291c
1292c definition de l'entrainement des couches
1293      do l=1,klev-1
1294         do ig=1,ngrid
1295            if (ztv(ig,l).gt.ztv(ig,l+1).and.
1296     s          l.ge.lmin(ig).and.l.lt.lentr(ig)) then
1297cdef possibles pour alim_star: zdthetadz, dthetadz, zdtheta
1298             alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.)
1299c     s                       *(zlev(ig,l+1)-zlev(ig,l))
1300     s                       *sqrt(zlev(ig,l+1))
1301c             alim_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1)
1302c     s                         /zlev(ig,lentr(ig)+2)))**(3./2.)
1303            endif
1304         enddo
1305      enddo
1306     
1307c pas de thermique si couche 1 stable
1308      do ig=1,ngrid
1309c         if (lmin(ig).gt.1) then
1310cCRnouveau test
1311        if (alim_star(ig,1).lt.1.e-10) then
1312            do l=1,klev
1313                alim_star(ig,l)=0.
1314            enddo
1315         endif
1316      enddo
1317c calcul de l entrainement total
1318      do ig=1,ngrid
1319         alim_star_tot(ig)=0.
1320         entr_star_tot(ig)=0.
1321         detr_star_tot(ig)=0.
1322      enddo
1323      do ig=1,ngrid
1324         do k=1,klev
1325            alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,k)
1326         enddo
1327      enddo
1328c
1329c Calcul entrainement normalise
1330      do ig=1,ngrid
1331         if (alim_star_tot(ig).gt.1.e-10) then
1332c         do l=1,lentr(ig)
1333          do l=1,klev
1334cdef possibles pour entr_star: zdthetadz, dthetadz, zdtheta
1335            alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig)
1336         enddo
1337         endif
1338      enddo
1339       
1340c     print*,'fin calcul alim_star'
1341
1342cAM:initialisations
1343      do k=1,nlay
1344         do ig=1,ngrid
1345            ztva(ig,k)=ztv(ig,k)
1346            ztla(ig,k)=zthl(ig,k)
1347            zqla(ig,k)=0.
1348            zqta(ig,k)=po(ig,k)
1349            Zsat(ig) =.false.
1350         enddo
1351      enddo
1352      do k=1,klev
1353        do ig=1,ngrid
1354           detr_star(ig,k)=0.
1355           entr_star(ig,k)=0.
1356           detr(ig,k)=0.
1357           entr(ig,k)=0.
1358        enddo
1359      enddo
1360c     print*,'7 OK convect8'
1361      do k=1,klev+1
1362         do ig=1,ngrid
1363            zw2(ig,k)=0.
1364            fmc(ig,k)=0.
1365cCR
1366            f_star(ig,k)=0.
1367cRC
1368            larg_cons(ig,k)=0.
1369            larg_detr(ig,k)=0.
1370            wa_moy(ig,k)=0.
1371         enddo
1372      enddo
1373
1374cn     print*,'8 OK convect8'
1375      do ig=1,ngrid
1376         linter(ig)=1.
1377         lmaxa(ig)=1
1378         lmix(ig)=1
1379         wmaxa(ig)=0.
1380      enddo
1381
1382      nu_min=l_mix
1383      nu_max=1000.
1384c      do ig=1,ngrid
1385c      nu_max=wmax_sec(ig)
1386c      enddo
1387      do ig=1,ngrid
1388         do k=1,klev
1389            nu(ig,k)=0.
1390            nu_e(ig,k)=0.
1391         enddo
1392      enddo
1393cCalcul de l'excès de température du à la diffusion turbulente
1394      do ig=1,ngrid
1395         do l=1,klev
1396            dtheta(ig,l)=0.
1397         enddo
1398       enddo
1399      do ig=1,ngrid
1400         do l=1,lentr(ig)-1
1401      dtheta(ig,l)=sqrt(10.*0.4*zlev(ig,l+1)**2*1.
1402     s          *((ztv(ig,l+1)-ztv(ig,l))/(zlev(ig,l+1)-zlev(ig,l)))**2)
1403         enddo
1404       enddo
1405c      do l=1,nlay-2
1406      do l=1,klev-1
1407         do ig=1,ngrid
1408            if (ztv(ig,l).gt.ztv(ig,l+1)
1409     s         .and.alim_star(ig,l).gt.1.e-10
1410     s         .and.zw2(ig,l).lt.1e-10) then
1411cAM
1412ctest:on rajoute un excès de T dans couche alim
1413c               ztla(ig,l)=zthl(ig,l)+dtheta(ig,l)
1414               ztla(ig,l)=zthl(ig,l)
1415ctest: on rajoute un excès de q dans la couche alim
1416c               zqta(ig,l)=po(ig,l)+0.001
1417               zqta(ig,l)=po(ig,l)
1418               zqla(ig,l)=zl(ig,l)
1419cAM
1420               f_star(ig,l+1)=alim_star(ig,l)
1421ctest:calcul de dteta
1422               zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1)
1423     s                     *(zlev(ig,l+1)-zlev(ig,l))
1424     s                     *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l))
1425               w_est(ig,l+1)=zw2(ig,l+1)
1426               larg_detr(ig,l)=0.
1427c     print*,'coucou boucle 1'
1428            else if ((zw2(ig,l).ge.1e-10).and.
1429     s         (f_star(ig,l)+alim_star(ig,l)).gt.1.e-10) then
1430c     print*,'coucou boucle 2'
1431cestimation du detrainement a partir de la geometrie du pas precedent
1432      if ((test(ig).eq.1).or.((.not.debut).and.(f0(ig).lt.1.e-10))) then
1433                  detr_star(ig,l)=0.
1434                  entr_star(ig,l)=0.
1435c     print*,'coucou test(ig)',test(ig),f0(ig),zmax0(ig)
1436             else
1437c     print*,'coucou debut detr'
1438ctests sur la definition du detr
1439        if (zqla(ig,l-1).gt.1.e-10) then
1440           nuage=.true.
1441        endif
1442
1443             w_est(ig,l+1)=zw2(ig,l)*
1444     s                   ((f_star(ig,l))**2)
1445     s                   /(f_star(ig,l)+alim_star(ig,l))**2+
1446     s                   2.*RG*(ztva(ig,l-1)-ztv(ig,l))/ztv(ig,l)
1447     s                   *(zlev(ig,l+1)-zlev(ig,l))
1448             if (w_est(ig,l+1).lt.0.) then
1449                w_est(ig,l+1)=zw2(ig,l)
1450             endif
1451      if (l.gt.2) then
1452             if ((w_est(ig,l+1).gt.w_est(ig,l)).and.
1453     s           (zlev(ig,l+1).lt.zmax_sec(ig)).and.
1454     s            (zqla(ig,l-1).lt.1.e-10)) then
1455             detr_star(ig,l)=MAX(0.,(rhobarz(ig,l+1)
1456     s                *sqrt(w_est(ig,l+1))*sqrt(nu(ig,l)*zlev(ig,l+1))
1457     s       -rhobarz(ig,l)*sqrt(w_est(ig,l))*sqrt(nu(ig,l)*zlev(ig,l)))
1458     s       /(r_aspect*zmax_sec(ig)))
1459             else if ((zlev(ig,l+1).lt.zmax_sec(ig)).and.
1460     s                (zqla(ig,l-1).lt.1.e-10)) then
1461       detr_star(ig,l)=-f0(ig)*f_star(ig,lmix(ig))
1462     s /(rhobarz(ig,lmix(ig))*wmaxa(ig))*
1463     s (rhobarz(ig,l+1)*sqrt(w_est(ig,l+1))
1464     s *((zmax_sec(ig)-zlev(ig,l+1))/((zmax_sec(ig)-zlev(ig,lmix(ig)))))
1465     s **2.
1466     s -rhobarz(ig,l)*sqrt(w_est(ig,l))
1467     s *((zmax_sec(ig)-zlev(ig,l))/((zmax_sec(ig)-zlev(ig,lmix(ig)))))
1468     s **2.)
1469             else
1470       detr_star(ig,l)=0.002*f0(ig)*f_star(ig,l)
1471     s                *(zlev(ig,l+1)-zlev(ig,l))
1472             
1473             endif
1474        else
1475        detr_star(ig,l)=0.
1476        endif
1477       
1478         detr_star(ig,l)=detr_star(ig,l)/f0(ig)
1479         if (nuage) then
1480         entr_star(ig,l)=0.4*detr_star(ig,l)
1481         else
1482         entr_star(ig,l)=0.4*detr_star(ig,l)
1483         endif
1484
1485             if ((detr_star(ig,l)).gt.f_star(ig,l)) then
1486              detr_star(ig,l)=f_star(ig,l)
1487c              entr_star(ig,l)=0.
1488              endif
1489
1490             if ((l.lt.lentr(ig))) then
1491                 entr_star(ig,l)=0.
1492c                 detr_star(ig,l)=0.
1493             endif 
1494
1495c           print*,'ok detr_star'
1496      endif
1497cprise en compte du detrainement dans le calcul du flux
1498             f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l)
1499     s                      -detr_star(ig,l)
1500ctest
1501c             if (f_star(ig,l+1).lt.0.) then
1502c                f_star(ig,l+1)=0.
1503c                entr_star(ig,l)=0.
1504c                detr_star(ig,l)=f_star(ig,l)+alim_star(ig,l)
1505c             endif
1506ctest sur le signe de f_star
1507       if (f_star(ig,l+1).gt.1.e-10) then
1508c                 then
1509ctest
1510c         if (((f_star(ig,l+1)+detr_star(ig,l)).gt.1.e-10)) then
1511cAM on melange Tl et qt du thermique
1512con rajoute un excès de T dans la couche alim
1513c               if (l.lt.lentr(ig)) then
1514c           ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+
1515c     s     (alim_star(ig,l)+entr_star(ig,l))*(zthl(ig,l)+dtheta(ig,l)))
1516c     s     /(f_star(ig,l+1)+detr_star(ig,l))
1517c               else
1518               ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+
1519     s                    (alim_star(ig,l)+entr_star(ig,l))*zthl(ig,l))
1520     s                 /(f_star(ig,l+1)+detr_star(ig,l))
1521c     s                    /(f_star(ig,l+1))
1522c               endif
1523con rajoute un excès de q dans la couche alim
1524c               if (l.lt.lentr(ig)) then
1525c               zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+
1526c     s           (alim_star(ig,l)+entr_star(ig,l))*(po(ig,l)+0.001))
1527c     s                 /(f_star(ig,l+1)+detr_star(ig,l))
1528c               else
1529               zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+
1530     s                    (alim_star(ig,l)+entr_star(ig,l))*po(ig,l))
1531     s                 /(f_star(ig,l+1)+detr_star(ig,l))
1532c     s                   /(f_star(ig,l+1))
1533c               endif
1534cAM on en deduit thetav et ql du thermique
1535cCR test
1536c               Tbef(ig)=ztla(ig,l)*zpspsk(ig,l)
1537               Tbef(ig)=ztla(ig,l)*zpspsk(ig,l)
1538               zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
1539               qsatbef(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig,l) 
1540               qsatbef(ig)=MIN(0.5,qsatbef(ig))
1541               zcor=1./(1.-retv*qsatbef(ig))
1542               qsatbef(ig)=qsatbef(ig)*zcor
1543             Zsat(ig) = (max(0.,zqta(ig,l)-qsatbef(ig)) .gt. 1.e-10)
1544
1545           if (Zsat(ig).and.(1.eq.1)) then
1546              qlbef=max(0.,zqta(ig,l)-qsatbef(ig))
1547              DT = 0.5*RLvCp*qlbef
1548c             write(17,*)'DT0=',DT
1549              do while (abs(DT).gt.DDT0)
1550c                 print*,'aie'
1551                 Tbef(ig)=Tbef(ig)+DT
1552                 zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
1553                 qsatbef(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig,l)
1554                 qsatbef(ig)=MIN(0.5,qsatbef(ig))
1555                 zcor=1./(1.-retv*qsatbef(ig))
1556                 qsatbef(ig)=qsatbef(ig)*zcor
1557                 qlbef=zqta(ig,l)-qsatbef(ig)
1558
1559                 zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
1560                 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta
1561                 zcor=1./(1.-retv*qsatbef(ig))
1562                 dqsat_dT=FOEDE(Tbef(ig),zdelta,zcvm5,qsatbef(ig),zcor)
1563                 num=-Tbef(ig)+ztla(ig,l)*zpspsk(ig,l)+RLvCp*qlbef
1564                 denom=1.+RLvCp*dqsat_dT
1565                 if (denom.lt.1.e-10) then
1566                    print*,'pb denom'
1567                 endif
1568                 DT=num/denom
1569c                 write(17,*)'DT=',DT
1570              enddo
1571              zqla(ig,l) = max(0.,zqta(ig,l)-qsatbef(ig))
1572              zqla(ig,l) = max(0.,qlbef)
1573c              zqla(ig,l)=0.
1574             endif
1575c             zqla(ig,l) = max(0.,zqta(ig,l)-qsatbef(ig))
1576c     
1577c on ecrit de maniere conservative (sat ou non)
1578c          T = Tl +Lv/Cp ql
1579cCR rq utilisation de humidite specifique ou rapport de melange?
1580           ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l)
1581           ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l)
1582con rajoute le calcul de zha pour diagnostiques (temp potentielle)
1583           zha(ig,l) = ztva(ig,l)
1584c           if (l.lt.lentr(ig)) then
1585c           ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l)
1586c     s              -zqla(ig,l))-zqla(ig,l)) + 0.1
1587c           else
1588           ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l)
1589     s              -zqla(ig,l))-zqla(ig,l))
1590c           endif
1591c           ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l)
1592c     s                 /(1.-retv*zqla(ig,l))
1593c           ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l)
1594c           ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l)
1595c     s                 /(1.-retv*zqta(ig,l))
1596c     s              -zqla(ig,l)/(1.-retv*zqla(ig,l)))
1597c     s              -zqla(ig,l)/(1.-retv*zqla(ig,l)))
1598c       write(13,*)zqla(ig,l),zqla(ig,l)/(1.-retv*zqla(ig,l))
1599con ecrit zqsat
1600           zqsatth(ig,l)=qsatbef(ig) 
1601c        enddo
1602c        DO ig=1,ngrid
1603c           if (zw2(ig,l).ge.1.e-10.and.
1604c     s               f_star(ig,l)+entr_star(ig,l).gt.1.e-10) then
1605c  mise a jour de la vitesse ascendante (l'air entraine de la couche
1606c  consideree commence avec une vitesse nulle).
1607c
1608c            if (f_star(ig,l+1).gt.1.e-10) then
1609            zw2(ig,l+1)=zw2(ig,l)*
1610c     s                  ((f_star(ig,l)-detr_star(ig,l))**2)
1611c     s                  /f_star(ig,l+1)**2+
1612     s                   ((f_star(ig,l))**2)
1613     s                   /(f_star(ig,l+1)+detr_star(ig,l))**2+
1614c     s                    /(f_star(ig,l+1))**2+           
1615     s                   2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)
1616     s                   *(zlev(ig,l+1)-zlev(ig,l))
1617c     s                   *(f_star(ig,l)/f_star(ig,l+1))**2
1618
1619            endif
1620        endif
1621c
1622            if (zw2(ig,l+1).lt.0.) then
1623               linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l))
1624     s           -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
1625               zw2(ig,l+1)=0.
1626c              print*,'linter=',linter(ig)
1627c          else if ((zw2(ig,l+1).lt.1.e-10).and.(zw2(ig,l+1).ge.0.)) then
1628c               linter(ig)=l+1
1629c               print*,'linter=l',zw2(ig,l),zw2(ig,l+1)
1630            else
1631               wa_moy(ig,l+1)=sqrt(zw2(ig,l+1))
1632c            wa_moy(ig,l+1)=zw2(ig,l+1)
1633            endif
1634            if (wa_moy(ig,l+1).gt.wmaxa(ig)) then
1635c   lmix est le niveau de la couche ou w (wa_moy) est maximum
1636               lmix(ig)=l+1
1637               wmaxa(ig)=wa_moy(ig,l+1)
1638            endif
1639         enddo
1640      enddo
1641      print*,'fin calcul zw2'
1642c
1643c Calcul de la couche correspondant a la hauteur du thermique
1644      do ig=1,ngrid
1645         lmax(ig)=lentr(ig)
1646      enddo
1647      do ig=1,ngrid
1648         do l=nlay,lentr(ig)+1,-1
1649            if (zw2(ig,l).le.1.e-10) then
1650               lmax(ig)=l-1
1651            endif
1652         enddo
1653      enddo
1654c pas de thermique si couche 1 stable
1655      do ig=1,ngrid
1656         if (lmin(ig).gt.1) then
1657            lmax(ig)=1
1658             lmin(ig)=1
1659             lentr(ig)=1
1660         endif
1661      enddo
1662c   
1663c Determination de zw2 max
1664      do ig=1,ngrid
1665         wmax(ig)=0.
1666      enddo
1667
1668      do l=1,nlay
1669         do ig=1,ngrid
1670            if (l.le.lmax(ig)) then
1671                if (zw2(ig,l).lt.0.)then
1672                  print*,'pb2 zw2<0'
1673                endif
1674                zw2(ig,l)=sqrt(zw2(ig,l))
1675                wmax(ig)=max(wmax(ig),zw2(ig,l))
1676            else
1677                 zw2(ig,l)=0.
1678            endif
1679          enddo
1680      enddo
1681
1682c   Longueur caracteristique correspondant a la hauteur des thermiques.
1683      do  ig=1,ngrid
1684         zmax(ig)=0.
1685         zlevinter(ig)=zlev(ig,1)
1686      enddo
1687      do  ig=1,ngrid
1688c calcul de zlevinter
1689          zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
1690     s    linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
1691     s    -zlev(ig,lmax(ig)))
1692cpour le cas ou on prend tjs lmin=1
1693c       zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
1694       zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,1))
1695       zmax0(ig)=zmax(ig)
1696       write(11,*)'ig,lmax,linter',ig,lmax(ig),linter(ig)
1697       write(12,*)'ig,zlevinter,zmax',ig,zmax(ig),zlevinter(ig)
1698      enddo
1699
1700cCalcul de zmax_sec et wmax_sec
1701      call fermeture_seche(ngrid,nlay
1702     s                  ,pplay,pplev,pphi,zlev,rhobarz,f0,zpspsk
1703     s                  ,alim,zh,zo,lentr,lmin,nu_min,nu_max,r_aspect
1704     s                  ,zmax_sec2,wmax_sec2)
1705
1706      print*,'avant fermeture'
1707c Fermeture,determination de f
1708c en lmax f=d-e
1709      do ig=1,ngrid
1710c      entr_star(ig,lmax(ig))=0.
1711c      f_star(ig,lmax(ig)+1)=0.
1712c      detr_star(ig,lmax(ig))=f_star(ig,lmax(ig))+entr_star(ig,lmax(ig))
1713c     s                       +alim_star(ig,lmax(ig))
1714      enddo
1715c
1716      do ig=1,ngrid
1717         alim_star2(ig)=0.
1718      enddo
1719ccalcul de entr_star_tot
1720      do ig=1,ngrid
1721         do k=1,lmix(ig)
1722            entr_star_tot(ig)=entr_star_tot(ig)
1723c     s                        +entr_star(ig,k)
1724     s                        +alim_star(ig,k)
1725c     s                        -detr_star(ig,k)
1726            detr_star_tot(ig)=detr_star_tot(ig)
1727c     s                        +alim_star(ig,k)
1728     s                        -detr_star(ig,k)
1729     s                        +entr_star(ig,k)
1730         enddo
1731      enddo
1732     
1733      do ig=1,ngrid
1734         if (alim_star_tot(ig).LT.1.e-10) then
1735            f(ig)=0.
1736         else   
1737c             do k=lmin(ig),lentr(ig)
1738             do k=1,lentr(ig)
1739                alim_star2(ig)=alim_star2(ig)+alim_star(ig,k)**2
1740     s                    /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)))
1741             enddo
1742             if ((zmax_sec(ig).gt.1.e-10).and.(1.eq.1)) then
1743             f(ig)=wmax_sec(ig)/(max(500.,zmax_sec(ig))*r_aspect
1744     s             *alim_star2(ig))
1745             f(ig)=f(ig)+(f0(ig)-f(ig))*exp((-ptimestep/
1746     s                     zmax_sec(ig))*wmax_sec(ig))
1747             else
1748             f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect*alim_star2(ig))
1749            f(ig)=f(ig)+(f0(ig)-f(ig))*exp((-ptimestep/
1750     s                     zmax(ig))*wmax(ig))
1751             endif
1752         endif
1753         f0(ig)=f(ig)
1754      enddo
1755      print*,'apres fermeture'
1756c Calcul de l'entrainement
1757         do ig=1,ngrid
1758            do k=1,klev
1759            alim(ig,k)=f(ig)*alim_star(ig,k)
1760         enddo
1761      enddo
1762cCR:test pour entrainer moins que la masse
1763c       do ig=1,ngrid
1764c          do l=1,lentr(ig)
1765c             if ((alim(ig,l)*ptimestep).gt.(0.9*masse(ig,l))) then
1766c                alim(ig,l+1)=alim(ig,l+1)+alim(ig,l)
1767c     s                       -0.9*masse(ig,l)/ptimestep
1768c                alim(ig,l)=0.9*masse(ig,l)/ptimestep
1769c             endif
1770c          enddo
1771c       enddo
1772c calcul du détrainement
1773         do ig=1,klon
1774             do k=1,klev
1775            detr(ig,k)=f(ig)*detr_star(ig,k)
1776            if (detr(ig,k).lt.0.) then
1777c               print*,'detr1<0!!!'
1778            endif
1779            enddo
1780            do k=1,klev
1781            entr(ig,k)=f(ig)*entr_star(ig,k)
1782            if (entr(ig,k).lt.0.) then
1783c               print*,'entr1<0!!!'
1784            endif
1785         enddo
1786      enddo
1787c
1788c       do ig=1,ngrid
1789c          do l=1,klev
1790c          if (((detr(ig,l)+entr(ig,l)+alim(ig,l))*ptimestep).gt.
1791c     s          (masse(ig,l))) then 
1792c      print*,'d2+e2+a2>m2','ig=',ig,'l=',l,'lmax(ig)=',lmax(ig),'d+e+a='
1793c     s,(detr(ig,l)+entr(ig,l)+alim(ig,l))*ptimestep,'m=',masse(ig,l)
1794c      endif
1795c      enddo
1796c      enddo
1797c Calcul des flux
1798
1799      do ig=1,ngrid
1800         do l=1,lmax(ig)
1801c         do l=1,klev
1802c             fmc(ig,l+1)=f(ig)*f_star(ig,l+1)
1803            fmc(ig,l+1)=fmc(ig,l)+alim(ig,l)+entr(ig,l)-detr(ig,l)
1804c        print*,'??!!','ig=',ig,'l=',l,'lmax=',lmax(ig),'lmix=',lmix(ig),
1805c     s  'e=',entr(ig,l),'d=',detr(ig,l),'a=',alim(ig,l),'f=',fmc(ig,l),
1806c     s  'f+1=',fmc(ig,l+1)
1807          if (fmc(ig,l+1).lt.0.) then
1808               print*,'fmc1<0',l+1,lmax(ig),fmc(ig,l+1)
1809               fmc(ig,l+1)=fmc(ig,l)
1810               detr(ig,l)=alim(ig,l)+entr(ig,l)
1811c               fmc(ig,l+1)=0.
1812c               print*,'fmc1<0',l+1,lmax(ig),fmc(ig,l+1)
1813            endif
1814c       if ((fmc(ig,l+1).gt.fmc(ig,l)).and.(l.gt.lentr(ig))) then
1815c          f_old=fmc(ig,l+1)
1816c          fmc(ig,l+1)=fmc(ig,l)
1817c          detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l+1)
1818c       endif
1819       
1820c        if ((fmc(ig,l+1).gt.fmc(ig,l)).and.(l.gt.lentr(ig))) then
1821c          f_old=fmc(ig,l+1)
1822c          fmc(ig,l+1)=fmc(ig,l)
1823c          detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l)
1824c       endif
1825crajout du test sur alpha croissant
1826cif test
1827c       if (1.eq.0) then
1828
1829       if (l.eq.klev) then
1830          print*,'THERMCELL PB ig=',ig,'   l=',l
1831          stop
1832       endif
1833!       if ((zw2(ig,l+1).gt.1.e-10).and.(zw2(ig,l).gt.1.e-10).and.
1834!     s     (l.ge.lentr(ig)).and.
1835       if ((zw2(ig,l+1).gt.1.e-10).and.(zw2(ig,l).gt.1.e-10).and.
1836     s         (l.ge.lentr(ig)) ) then
1837          if ( ((fmc(ig,l+1)/(rhobarz(ig,l+1)*zw2(ig,l+1))).gt.
1838     s     (fmc(ig,l)/(rhobarz(ig,l)*zw2(ig,l))))) then
1839           f_old=fmc(ig,l+1)
1840           fmc(ig,l+1)=fmc(ig,l)*rhobarz(ig,l+1)*zw2(ig,l+1)
1841     s                          /(rhobarz(ig,l)*zw2(ig,l))
1842           detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l+1)
1843c           detr(ig,l)=(fmc(ig,l+1)-fmc(ig,l))/(0.4-1.)
1844c           entr(ig,l)=0.4*detr(ig,l)
1845c           entr(ig,l)=fmc(ig,l+1)-fmc(ig,l)+detr(ig,l)
1846        endif
1847        endif
1848        if ((fmc(ig,l+1).gt.fmc(ig,l)).and.(l.gt.lentr(ig))) then
1849          f_old=fmc(ig,l+1)
1850          fmc(ig,l+1)=fmc(ig,l)
1851          detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l+1)
1852       endif
1853       if (detr(ig,l).gt.fmc(ig,l)) then
1854               detr(ig,l)=fmc(ig,l)
1855               entr(ig,l)=fmc(ig,l+1)-alim(ig,l)
1856        endif
1857       if (fmc(ig,l+1).lt.0.) then
1858               detr(ig,l)=detr(ig,l)+fmc(ig,l+1)
1859               fmc(ig,l+1)=0.
1860               print*,'fmc2<0',l+1,lmax(ig)
1861            endif
1862           
1863ctest pour ne pas avoir f=0 et d=e/=0
1864c       if (fmc(ig,l+1).lt.1.e-10) then
1865c          detr(ig,l+1)=0.
1866c          entr(ig,l+1)=0.
1867c          zqla(ig,l+1)=0.
1868c          zw2(ig,l+1)=0.
1869c          lmax(ig)=l+1
1870c          zmax(ig)=zlev(ig,lmax(ig))
1871c       endif
1872        if (zw2(ig,l+1).gt.1.e-10) then
1873       if ((((fmc(ig,l+1))/(rhobarz(ig,l+1)*zw2(ig,l+1))).gt.
1874     s      1.)) then
1875          f_old=fmc(ig,l+1)
1876          fmc(ig,l+1)=rhobarz(ig,l+1)*zw2(ig,l+1)
1877          zw2(ig,l+1)=0.
1878          zqla(ig,l+1)=0.
1879          detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l+1)
1880         lmax(ig)=l+1
1881          zmax(ig)=zlev(ig,lmax(ig))
1882          print*,'alpha>1',l+1,lmax(ig)
1883       endif
1884        endif
1885c              write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l)
1886cendif test
1887c      endif
1888      enddo
1889      enddo
1890      do ig=1,ngrid
1891c         if (fmc(ig,lmax(ig)+1).ne.0.) then
1892         fmc(ig,lmax(ig)+1)=0.
1893         entr(ig,lmax(ig))=0.
1894         detr(ig,lmax(ig))=fmc(ig,lmax(ig))+entr(ig,lmax(ig))
1895     s                     +alim(ig,lmax(ig))
1896c         endif
1897      enddo
1898ctest sur le signe de fmc
1899       do ig=1,ngrid
1900         do l=1,klev+1
1901            if (fmc(ig,l).lt.0.) then
1902         print*,'fm1<0!!!','ig=',ig,'l=',l,'a=',alim(ig,l-1),'e='
1903     s ,entr(ig,l-1),'f=',fmc(ig,l-1),'d=',detr(ig,l-1),'f+1=',fmc(ig,l)
1904            endif
1905         enddo
1906       enddo
1907ctest de verification
1908      do ig=1,ngrid
1909       do l=1,lmax(ig)
1910       if ((abs(fmc(ig,l+1)-fmc(ig,l)-alim(ig,l)-entr(ig,l)+detr(ig,l)))
1911     s           .gt.1.e-4) then
1912c      print*,'pbcm!!','ig=',ig,'l=',l,'lmax=',lmax(ig),'lmix=',lmix(ig),
1913c     s  'e=',entr(ig,l),'d=',detr(ig,l),'a=',alim(ig,l),'f=',fmc(ig,l),
1914c     s  'f+1=',fmc(ig,l+1)
1915       endif
1916       if (detr(ig,l).lt.0.) then
1917          print*,'detrdemi<0!!!'
1918       endif
1919         enddo
1920      enddo
1921c
1922cRC
1923cCR def de  zmix continu (profil parabolique des vitesses)
1924      do ig=1,ngrid
1925           if (lmix(ig).gt.1.) then
1926c test
1927              if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
1928     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
1929     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
1930     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
1931     s        then
1932c             
1933            zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
1934     s        *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
1935     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
1936     s        *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
1937     s        /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
1938     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
1939     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
1940     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
1941              else
1942              zmix(ig)=zlev(ig,lmix(ig))
1943              print*,'pb zmix'
1944              endif
1945          else
1946              zmix(ig)=0.
1947          endif
1948ctest
1949         if ((zmax(ig)-zmix(ig)).le.0.) then
1950            zmix(ig)=0.9*zmax(ig)
1951c            print*,'pb zmix>zmax'
1952         endif
1953      enddo
1954      do ig=1,klon
1955         zmix0(ig)=zmix(ig)
1956      enddo
1957c
1958c calcul du nouveau lmix correspondant
1959      do ig=1,ngrid
1960         do l=1,klev
1961            if (zmix(ig).ge.zlev(ig,l).and.
1962     s          zmix(ig).lt.zlev(ig,l+1)) then
1963              lmix(ig)=l
1964             endif
1965          enddo
1966      enddo
1967c
1968cne devrait pas arriver!!!!!
1969      do ig=1,ngrid
1970       do l=1,klev
1971          if (detr(ig,l).gt.(fmc(ig,l)+alim(ig,l))+entr(ig,l)) then
1972             print*,'detr2>fmc2!!!','ig=',ig,'l=',l,'d=',detr(ig,l),
1973     s             'f=',fmc(ig,l),'lmax=',lmax(ig)
1974c             detr(ig,l)=fmc(ig,l)+alim(ig,l)+entr(ig,l)
1975c             entr(ig,l)=0.
1976c             fmc(ig,l+1)=0.
1977c             zw2(ig,l+1)=0.     
1978c             zqla(ig,l+1)=0.
1979           print*,'pb!fm=0 et f_star>0',l,lmax(ig)       
1980c             lmax(ig)=l
1981          endif
1982       enddo
1983      enddo
1984      do ig=1,ngrid
1985         do l=lmax(ig)+1,klev+1
1986c            fmc(ig,l)=0.
1987c            detr(ig,l)=0.
1988c            entr(ig,l)=0.
1989c            zw2(ig,l)=0.
1990c            zqla(ig,l)=0.
1991         enddo
1992      enddo
1993
1994cCalcul du detrainement lors du premier passage
1995c     print*,'9 OK convect8'
1996c     print*,'WA1 ',wa_moy
1997
1998c   determination de l'indice du debut de la mixed layer ou w decroit
1999
2000c   calcul de la largeur de chaque ascendance dans le cas conservatif.
2001c   dans ce cas simple, on suppose que la largeur de l'ascendance provenant
2002c   d'une couche est égale à la hauteur de la couche alimentante.
2003c   La vitesse maximale dans l'ascendance est aussi prise comme estimation
2004c   de la vitesse d'entrainement horizontal dans la couche alimentante.
2005
2006      do l=2,nlay
2007         do ig=1,ngrid
2008            if (l.le.lmax(ig).and.(test(ig).eq.1)) then
2009               zw=max(wa_moy(ig,l),1.e-10)
2010               larg_cons(ig,l)=zmax(ig)*r_aspect
2011     s         *fmc(ig,l)/(rhobarz(ig,l)*zw)
2012            endif
2013         enddo
2014      enddo
2015
2016      do l=2,nlay
2017         do ig=1,ngrid
2018            if (l.le.lmax(ig).and.(test(ig).eq.1)) then
2019c              if (idetr.eq.0) then
2020c  cette option est finalement en dur.
2021                  if ((l_mix*zlev(ig,l)).lt.0.)then
2022                   print*,'pb l_mix*zlev<0'
2023                  endif
2024cCR: test: nouvelle def de lambda
2025c                  larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
2026                  if (zw2(ig,l).gt.1.e-10) then
2027                  larg_detr(ig,l)=sqrt((l_mix/zw2(ig,l))*zlev(ig,l))
2028                  else
2029                  larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
2030                  endif
2031c              else if (idetr.eq.1) then
2032c                 larg_detr(ig,l)=larg_cons(ig,l)
2033c    s            *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig))
2034c              else if (idetr.eq.2) then
2035c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
2036c    s            *sqrt(wa_moy(ig,l))
2037c              else if (idetr.eq.4) then
2038c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
2039c    s            *wa_moy(ig,l)
2040c              endif
2041         endif
2042         enddo
2043       enddo
2044
2045c     print*,'10 OK convect8'
2046c     print*,'WA2 ',wa_moy
2047c   cal1cul de la fraction de la maille concernée par l'ascendance en tenant
2048c   compte de l'epluchage du thermique.
2049c
2050c
2051      do l=2,nlay
2052         do ig=1,ngrid
2053            if(larg_cons(ig,l).gt.1..and.(test(ig).eq.1)) then
2054c     print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),'  KKK'
2055               fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l))
2056     s            /(r_aspect*zmax(ig))
2057c test
2058               fraca(ig,l)=max(fraca(ig,l),0.)
2059               fraca(ig,l)=min(fraca(ig,l),0.5)
2060               fracd(ig,l)=1.-fraca(ig,l)
2061               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
2062            else
2063c              wa_moy(ig,l)=0.
2064               fraca(ig,l)=0.
2065               fracc(ig,l)=0.
2066               fracd(ig,l)=1.
2067            endif
2068         enddo
2069      enddo                 
2070cCR: calcul de fracazmix
2071       do ig=1,ngrid
2072          if (test(ig).eq.1) then
2073          fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/
2074     s     (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig)
2075     s    +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1)
2076     s    -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
2077          endif
2078       enddo
2079c
2080       do l=2,nlay
2081          do ig=1,ngrid
2082             if(larg_cons(ig,l).gt.1..and.(test(ig).eq.1)) then
2083               if (l.gt.lmix(ig)) then
2084ctest
2085                 if (zmax(ig)-zmix(ig).lt.1.e-10) then
2086c                   print*,'pb xxx'
2087                    xxx(ig,l)=(lmax(ig)+1.-l)/(lmax(ig)+1.-lmix(ig))
2088                 else
2089                 xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig))
2090                 endif
2091           if (idetr.eq.0) then
2092               fraca(ig,l)=fracazmix(ig)
2093           else if (idetr.eq.1) then
2094               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)
2095           else if (idetr.eq.2) then
2096               fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2)
2097           else
2098               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2
2099           endif
2100c     print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL'
2101               fraca(ig,l)=max(fraca(ig,l),0.)
2102               fraca(ig,l)=min(fraca(ig,l),0.5)
2103               fracd(ig,l)=1.-fraca(ig,l)
2104               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
2105             endif
2106            endif
2107         enddo
2108      enddo
2109
2110      print*,'fin calcul fraca'
2111c     print*,'11 OK convect8'
2112c     print*,'Ea3 ',wa_moy
2113c------------------------------------------------------------------
2114c   Calcul de fracd, wd
2115c   somme wa - wd = 0
2116c------------------------------------------------------------------
2117
2118
2119      do ig=1,ngrid
2120         fm(ig,1)=0.
2121         fm(ig,nlay+1)=0.
2122      enddo
2123
2124      do l=2,nlay
2125           do ig=1,ngrid
2126              if (test(ig).eq.1) then
2127              fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l)
2128cCR:test
2129              if (alim(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1)
2130     s            .and.l.gt.lmix(ig)) then
2131                 fm(ig,l)=fm(ig,l-1)
2132c                 write(1,*)'ajustement fm, l',l
2133              endif
2134c              write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l)
2135cRC
2136              endif
2137           enddo
2138         do ig=1,ngrid
2139            if(fracd(ig,l).lt.0.1.and.(test(ig).eq.1)) then
2140               stop'fracd trop petit'
2141            else
2142c    vitesse descendante "diagnostique"
2143               wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l))
2144            endif
2145         enddo
2146      enddo
2147
2148      do l=1,nlay+1
2149         do ig=1,ngrid
2150            if (test(ig).eq.0) then
2151              fm(ig,l)=fmc(ig,l)
2152            endif
2153         enddo
2154      enddo
2155   
2156cfin du first
2157      do l=1,nlay
2158         do ig=1,ngrid
2159c           masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
2160            masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG
2161         enddo
2162      enddo
2163
2164      print*,'12 OK convect8'
2165c     print*,'WA4 ',wa_moy
2166cc------------------------------------------------------------------
2167c   calcul du transport vertical
2168c------------------------------------------------------------------
2169
2170      go to 4444
2171c     print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep
2172      do l=2,nlay-1
2173         do ig=1,ngrid
2174            if(fm(ig,l+1)*ptimestep.gt.masse(ig,l)
2175     s      .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then
2176      print*,'WARN!!! FM>M ig=',ig,' l=',l,'  FM='
2177     s         ,fm(ig,l+1)*ptimestep
2178     s         ,'   M=',masse(ig,l),masse(ig,l+1)
2179             endif
2180         enddo
2181      enddo
2182
2183      do l=1,nlay
2184         do ig=1,ngrid
2185            if((alim(ig,l)+entr(ig,l))*ptimestep.gt.masse(ig,l)) then
2186      print*,'WARN!!! E>M ig=',ig,' l=',l,'  E=='
2187     s         ,(entr(ig,l)+alim(ig,l))*ptimestep
2188     s         ,'   M=',masse(ig,l)
2189             endif
2190         enddo
2191      enddo
2192
2193      do l=1,nlay
2194         do ig=1,ngrid
2195            if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then
2196c     print*,'WARN!!! fm exagere ig=',ig,'   l=',l
2197c    s         ,'   FM=',fm(ig,l)
2198            endif
2199            if(.not.masse(ig,l).ge.1.e-10
2200     s         .or..not.masse(ig,l).le.1.e4) then
2201c     print*,'WARN!!! masse exagere ig=',ig,'   l=',l
2202c    s         ,'   M=',masse(ig,l)
2203c     print*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)',
2204c    s                 rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)
2205c     print*,'zlev(ig,l+1),zlev(ig,l)'
2206c    s                ,zlev(ig,l+1),zlev(ig,l)
2207c     print*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)'
2208c    s                ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)
2209            endif
2210            if(.not.alim(ig,l).ge.0..or..not.alim(ig,l).le.10.) then
2211c     print*,'WARN!!! entr exagere ig=',ig,'   l=',l
2212c    s         ,'   E=',entr(ig,l)
2213            endif
2214         enddo
2215      enddo
2216
22174444   continue
2218
2219cCR:redefinition du entr
2220cCR:test:on ne change pas la def du entr mais la def du fm
2221       do l=1,nlay
2222         do ig=1,ngrid
2223            if (test(ig).eq.1) then
2224            detr(ig,l)=fm(ig,l)+alim(ig,l)-fm(ig,l+1)
2225            if (detr(ig,l).lt.0.) then
2226c                entr(ig,l)=entr(ig,l)-detr(ig,l)
2227                fm(ig,l+1)=fm(ig,l)+alim(ig,l)
2228                detr(ig,l)=0.
2229c                write(11,*)'l,ig,entr',l,ig,entr(ig,l)
2230c     print*,'WARNING !!! detrainement negatif ',ig,l
2231            endif
2232            endif
2233         enddo
2234      enddo
2235cRC
2236
2237      if (w2di.eq.1) then
2238         fm0=fm0+ptimestep*(fm-fm0)/float(tho)
2239         entr0=entr0+ptimestep*(alim+entr-entr0)/float(tho)
2240      else
2241         fm0=fm
2242         entr0=alim+entr
2243         detr0=detr
2244         alim0=alim
2245c         zoa=zqta
2246c         entr0=alim
2247      endif
2248
2249      if (1.eq.1) then
2250c         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
2251c     .    ,zh,zdhadj,zha)
2252c         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
2253c     .    ,zo,pdoadj,zoa)
2254         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse,
2255     .                    zthl,zdthladj,zta)
2256         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse,
2257     .                   po,pdoadj,zoa)
2258      else
2259         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
2260     .    ,zh,zdhadj,zha)
2261         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
2262     .    ,zo,pdoadj,zoa)
2263      endif
2264
2265      if (1.eq.0) then
2266         call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse
2267     .    ,fraca,zmax
2268     .    ,zu,zv,pduadj,pdvadj,zua,zva)
2269      else
2270         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
2271     .    ,zu,pduadj,zua)
2272         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
2273     .    ,zv,pdvadj,zva)
2274      endif
2275
2276cCalcul des moments
2277c      do l=1,nlay
2278c         do ig=1,ngrid
2279c            zf=0.5*(fracc(ig,l)+fracc(ig,l+1))
2280c            zf2=zf/(1.-zf)
2281c            thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2
2282c            wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
2283c         enddo
2284c      enddo
2285
2286
2287
2288
2289
2290
2291c     print*,'13 OK convect8'
2292c     print*,'WA5 ',wa_moy
2293      do l=1,nlay
2294         do ig=1,ngrid
2295c            pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l)
2296           pdtadj(ig,l)=zdthladj(ig,l)*zpspsk(ig,l) 
2297         enddo
2298      enddo
2299
2300
2301c     do l=1,nlay
2302c        do ig=1,ngrid
2303c           if(abs(pdtadj(ig,l))*86400..gt.500.) then
2304c     print*,'WARN!!! ig=',ig,'  l=',l
2305c    s         ,'   pdtadj=',pdtadj(ig,l)
2306c           endif
2307c           if(abs(pdoadj(ig,l))*86400..gt.1.) then
2308c     print*,'WARN!!! ig=',ig,'  l=',l
2309c    s         ,'   pdoadj=',pdoadj(ig,l)
2310c           endif
2311c        enddo
2312c      enddo
2313
2314      print*,'14 OK convect8'
2315c------------------------------------------------------------------
2316c   Calculs pour les sorties
2317c------------------------------------------------------------------
2318ccalcul de fraca pour les sorties
2319      do l=2,klev
2320         do ig=1,klon
2321            if (zw2(ig,l).gt.1.e-10) then
2322            fraca(ig,l)=fm(ig,l)/(rhobarz(ig,l)*zw2(ig,l))
2323            else
2324            fraca(ig,l)=0.
2325            endif
2326         enddo
2327      enddo
2328      if(sorties) then
2329      do l=1,nlay
2330         do ig=1,ngrid
2331            zla(ig,l)=(1.-fracd(ig,l))*zmax(ig)
2332            zld(ig,l)=fracd(ig,l)*zmax(ig)
2333            if(1.-fracd(ig,l).gt.1.e-10)
2334     s      zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l))
2335         enddo
2336      enddo
2337c CR calcul du niveau de condensation
2338c initialisation
2339      do ig=1,ngrid
2340         nivcon(ig)=0.
2341         zcon(ig)=0.
2342      enddo
2343      do k=nlay,1,-1
2344         do ig=1,ngrid
2345            if (zqla(ig,k).gt.1e-10) then
2346               nivcon(ig)=k
2347               zcon(ig)=zlev(ig,k)
2348            endif
2349c            if (zcon(ig).gt.1.e-10) then
2350c               nuage=.true.
2351c            else
2352c               nuage=.false.
2353c            endif
2354         enddo
2355      enddo
2356     
2357      do l=1,nlay
2358         do ig=1,ngrid
2359            zf=fraca(ig,l)
2360            zf2=zf/(1.-zf)
2361            thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l)/zpspsk(ig,l))**2
2362            wth2(ig,l)=zf2*(zw2(ig,l))**2
2363c           print*,'wth2=',wth2(ig,l)
2364            wth3(ig,l)=zf2*(1-2.*fraca(ig,l))/(1-fraca(ig,l))
2365     s                *zw2(ig,l)*zw2(ig,l)*zw2(ig,l)
2366            q2(ig,l)=zf2*(zqta(ig,l)*1000.-po(ig,l)*1000.)**2
2367ctest: on calcul q2/po=ratqsc
2368c            if (nuage) then
2369            ratqscth(ig,l)=sqrt(q2(ig,l))/(po(ig,l)*1000.)
2370c            else
2371c            ratqscth(ig,l)=0.
2372c            endif
2373         enddo
2374      enddo
2375ccalcul du ratqscdiff
2376      sum=0.
2377      sumdiff=0.
2378      ratqsdiff(:,:)=0.
2379      do ig=1,ngrid
2380         do l=1,lentr(ig)
2381            sum=sum+alim_star(ig,l)*zqta(ig,l)*1000.
2382         enddo
2383      enddo
2384      do ig=1,ngrid
2385          do l=1,lentr(ig)
2386          zf=fraca(ig,l)
2387          zf2=zf/(1.-zf)
2388       sumdiff=sumdiff+alim_star(ig,l)
2389     s           *(zqta(ig,l)*1000.-sum)**2
2390c      ratqsdiff=ratqsdiff+alim_star(ig,l)*
2391c     s          (zqta(ig,l)*1000.-po(ig,l)*1000.)**2
2392          enddo
2393      enddo
2394      do l=1,klev
2395      do ig=1,ngrid
2396      ratqsdiff(ig,l)=sqrt(sumdiff)/(po(ig,l)*1000.)   
2397c      write(11,*)'ratqsdiff=',ratqsdiff(ig,l)
2398      enddo
2399      enddo     
2400cdeja fait
2401c      do l=1,nlay
2402c         do ig=1,ngrid
2403c            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
2404c            if (detr(ig,l).lt.0.) then
2405c                entr(ig,l)=entr(ig,l)-detr(ig,l)
2406c                detr(ig,l)=0.
2407c     print*,'WARNING !!! detrainement negatif ',ig,l
2408c            endif
2409c         enddo
2410c      enddo
2411
2412c     print*,'15 OK convect8'
2413
2414      isplit=isplit+1       
2415
2416
2417c #define und
2418        goto 123
2419#ifdef und
2420      CALL writeg1d(1,nlay,wd,'wd      ','wd      ')
2421      CALL writeg1d(1,nlay,zwa,'wa      ','wa      ')
2422      CALL writeg1d(1,nlay,fracd,'fracd      ','fracd      ')
2423      CALL writeg1d(1,nlay,fraca,'fraca      ','fraca      ')
2424      CALL writeg1d(1,nlay,wa_moy,'wam         ','wam         ')
2425      CALL writeg1d(1,nlay,zla,'la      ','la      ')
2426      CALL writeg1d(1,nlay,zld,'ld      ','ld      ')
2427      CALL writeg1d(1,nlay,pt,'pt      ','pt      ')
2428      CALL writeg1d(1,nlay,zh,'zh      ','zh      ')
2429      CALL writeg1d(1,nlay,zha,'zha      ','zha      ')
2430      CALL writeg1d(1,nlay,zu,'zu      ','zu      ')
2431      CALL writeg1d(1,nlay,zv,'zv      ','zv      ')
2432      CALL writeg1d(1,nlay,zo,'zo      ','zo      ')
2433      CALL writeg1d(1,nlay,wh,'wh      ','wh      ')
2434      CALL writeg1d(1,nlay,wu,'wu      ','wu      ')
2435      CALL writeg1d(1,nlay,wv,'wv      ','wv      ')
2436      CALL writeg1d(1,nlay,wo,'w15uo     ','wXo     ')
2437      CALL writeg1d(1,nlay,zdhadj,'zdhadj      ','zdhadj      ')
2438      CALL writeg1d(1,nlay,pduadj,'pduadj      ','pduadj      ')
2439      CALL writeg1d(1,nlay,pdvadj,'pdvadj      ','pdvadj      ')
2440      CALL writeg1d(1,nlay,pdoadj,'pdoadj      ','pdoadj      ')
2441      CALL writeg1d(1,nlay,entr  ,'entr        ','entr        ')
2442      CALL writeg1d(1,nlay,detr  ,'detr        ','detr        ')
2443      CALL writeg1d(1,nlay,fm    ,'fm          ','fm          ')
2444
2445      CALL writeg1d(1,nlay,pdtadj,'pdtadj    ','pdtadj    ')
2446      CALL writeg1d(1,nlay,pplay,'pplay     ','pplay     ')
2447      CALL writeg1d(1,nlay,pplev,'pplev     ','pplev     ')
2448
2449c   recalcul des flux en diagnostique...
2450c     print*,'PAS DE TEMPS ',ptimestep
2451       call dt2F(pplev,pplay,pt,pdtadj,wh)
2452      CALL writeg1d(1,nlay,wh,'wh2     ','wh2     ')
2453#endif
2454123   continue
2455! #define troisD
2456#ifdef troisD
2457c       if (sorties) then
2458      print*,'Debut des wrgradsfi'
2459
2460c      print*,'16 OK convect8'
2461c         call wrgradsfi(1,nlay,wd,'wd        ','wd        ')
2462c         call wrgradsfi(1,nlay,zwa,'wa        ','wa        ')
2463         call wrgradsfi(1,nlay,fracd,'fracd     ','fracd     ')
2464         call wrgradsfi(1,nlay,fraca,'fraca     ','fraca     ')
2465c         call wrgradsfi(1,nlay,xxx,'xxx       ','xxx       ')
2466c         call wrgradsfi(1,nlay,wa_moy,'wam       ','wam       ')
2467c      print*,'WA6 ',wa_moy
2468c         call wrgradsfi(1,nlay,zla,'la        ','la        ')
2469c         call wrgradsfi(1,nlay,zld,'ld        ','ld        ')
2470         call wrgradsfi(1,nlay,pt,'pt        ','pt        ')
2471         call wrgradsfi(1,nlay,zh,'zh        ','zh        ')
2472         call wrgradsfi(1,nlay,zha,'zha        ','zha        ')
2473         call wrgradsfi(1,nlay,zua,'zua        ','zua        ')
2474         call wrgradsfi(1,nlay,zva,'zva        ','zva        ')
2475         call wrgradsfi(1,nlay,zu,'zu        ','zu        ')
2476         call wrgradsfi(1,nlay,zv,'zv        ','zv        ')
2477         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
2478         call wrgradsfi(1,nlay,wh,'wh        ','wh        ')
2479         call wrgradsfi(1,nlay,wu,'wu        ','wu        ')
2480         call wrgradsfi(1,nlay,wv,'wv        ','wv        ')
2481         call wrgradsfi(1,nlay,wo,'wo        ','wo        ')
2482         call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
2483         call wrgradsfi(1,nlay,zdhadj,'zdhadj    ','zdhadj    ')
2484         call wrgradsfi(1,nlay,pduadj,'pduadj    ','pduadj    ')
2485         call wrgradsfi(1,nlay,pdvadj,'pdvadj    ','pdvadj    ')
2486         call wrgradsfi(1,nlay,pdoadj,'pdoadj    ','pdoadj    ')
2487         call wrgradsfi(1,nlay,entr,'entr      ','entr      ')
2488         call wrgradsfi(1,nlay,detr,'detr      ','detr      ')
2489         call wrgradsfi(1,nlay,fm,'fm        ','fm        ')
2490         call wrgradsfi(1,nlay,fmc,'fmc       ','fmc       ')
2491         call wrgradsfi(1,nlay,zw2,'zw2       ','zw2       ')
2492         call wrgradsfi(1,nlay,w_est,'w_est      ','w_est      ')
2493con sort les moments
2494         call wrgradsfi(1,nlay,thetath2,'zh2       ','zh2       ')
2495         call wrgradsfi(1,nlay,wth2,'w2       ','w2       ')
2496         call wrgradsfi(1,nlay,wth3,'w3       ','w3       ')
2497         call wrgradsfi(1,nlay,q2,'q2       ','q2       ')
2498         call wrgradsfi(1,nlay,dtheta,'dT       ','dT       ')
2499c
2500         call wrgradsfi(1,nlay,zw_sec,'zw_sec       ','zw_sec       ')
2501         call wrgradsfi(1,nlay,ztva,'ztva      ','ztva      ')
2502         call wrgradsfi(1,nlay,ztv,'ztv       ','ztv       ')
2503         call wrgradsfi(1,nlay,nu,'nu       ','nu       ')
2504
2505         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
2506         call wrgradsfi(1,nlay,zoa,'zoa        ','zoa        ')
2507c         call wrgradsfi(1,nlay,larg_cons,'Lc        ','Lc        ')
2508c         call wrgradsfi(1,nlay,larg_detr,'Ldetr     ','Ldetr     ')
2509
2510cAM:nouveaux diagnostiques
2511         call wrgradsfi(1,nlay,zthl,'zthl        ','zthl        ')
2512         call wrgradsfi(1,nlay,zta,'zta        ','zta        ')
2513         call wrgradsfi(1,nlay,zl,'zl        ','zl        ')
2514         call wrgradsfi(1,nlay,zdthladj,'zdthladj    ',
2515     s        'zdthladj    ')
2516         call wrgradsfi(1,nlay,ztla,'ztla      ','ztla      ')
2517         call wrgradsfi(1,nlay,zqta,'zqta      ','zqta      ')
2518         call wrgradsfi(1,nlay,zqla,'zqla      ','zqla      ')
2519         call wrgradsfi(1,nlay,deltaz,'deltaz      ','deltaz      ')
2520cCR:nouveaux diagnostiques
2521      call wrgradsfi(1,nlay,entr_star  ,'entr_star   ','entr_star   ')
2522      call wrgradsfi(1,nlay,detr_star  ,'detr_star   ','detr_star   ')     
2523      call wrgradsfi(1,nlay,f_star    ,'f_star   ','f_star   ')
2524      call wrgradsfi(1,nlay,zqsat    ,'zqsat   ','zqsat   ')
2525      call wrgradsfi(1,nlay,zqsatth    ,'qsath   ','qsath   ')
2526      call wrgradsfi(1,nlay,alim_star    ,'alim_star   ','alim_star   ')
2527      call wrgradsfi(1,nlay,alim    ,'alim   ','alim   ')
2528      call wrgradsfi(1,1,f,'f      ','f      ')
2529      call wrgradsfi(1,1,alim_star_tot,'a_s_t      ','a_s_t      ')
2530      call wrgradsfi(1,1,alim_star2,'a_2      ','a_2      ')
2531      call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
2532      call wrgradsfi(1,1,zmax_sec,'z_sec      ','z_sec      ')
2533c      call wrgradsfi(1,1,zmax_sec2,'zz_se      ','zz_se      ')
2534      call wrgradsfi(1,1,zmix,'zmix      ','zmix      ')
2535      call wrgradsfi(1,1,nivcon,'nivcon      ','nivcon      ')
2536      call wrgradsfi(1,1,zcon,'zcon      ','zcon      ')
2537      zsortie1d(:)=lmax(:)
2538      call wrgradsfi(1,1,zsortie1d,'lmax      ','lmax      ')
2539      call wrgradsfi(1,1,wmax,'wmax      ','wmax      ')
2540      call wrgradsfi(1,1,wmax_sec,'w_sec      ','w_sec      ')
2541      zsortie1d(:)=lmix(:)
2542      call wrgradsfi(1,1,zsortie1d,'lmix      ','lmix      ')
2543      zsortie1d(:)=lentr(:)
2544      call wrgradsfi(1,1,zsortie1d,'lentr      ','lentr     ')
2545
2546c      print*,'17 OK convect8'
2547
2548         do k=1,klev/10
2549            write(str2,'(i2.2)') k
2550            str10='wa'//str2
2551            do l=1,nlay
2552               do ig=1,ngrid
2553                  zsortie(ig,l)=wa(ig,k,l)
2554               enddo
2555            enddo   
2556            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
2557            do l=1,nlay
2558               do ig=1,ngrid
2559                  zsortie(ig,l)=larg_part(ig,k,l)
2560               enddo
2561            enddo
2562           str10='la'//str2
2563            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
2564         enddo
2565
2566
2567c     print*,'18 OK convect8'
2568c      endif
2569      print*,'Fin des wrgradsfi'
2570#endif
2571
2572      endif
2573
2574c     if(wa_moy(1,4).gt.1.e-10) stop
2575
2576      print*,'19 OK convect8'
2577      return
2578      end
2579      SUBROUTINE thermcell_eau(ngrid,nlay,ptimestep
2580     s                  ,pplay,pplev,pphi
2581     s                  ,pu,pv,pt,po
2582     s                  ,pduadj,pdvadj,pdtadj,pdoadj
2583     s                  ,fm0,entr0
2584c    s                  ,pu_therm,pv_therm
2585     s                  ,r_aspect,l_mix,w2di,tho)
2586
2587      IMPLICIT NONE
2588
2589c=======================================================================
2590c
2591c   Calcul du transport verticale dans la couche limite en presence
2592c   de "thermiques" explicitement representes
2593c
2594c   Réécriture à partir d'un listing papier à Habas, le 14/02/00
2595c
2596c   le thermique est supposé homogène et dissipé par mélange avec
2597c   son environnement. la longueur l_mix contrôle l'efficacité du
2598c   mélange
2599c
2600c   Le calcul du transport des différentes espèces se fait en prenant
2601c   en compte:
2602c     1. un flux de masse montant
2603c     2. un flux de masse descendant
2604c     3. un entrainement
2605c     4. un detrainement
2606c
2607c=======================================================================
2608
2609c-----------------------------------------------------------------------
2610c   declarations:
2611c   -------------
2612
2613#include "dimensions.h"
2614#include "dimphy.h"
2615#include "YOMCST.h"
2616#include "YOETHF.h"
2617#include "FCTTRE.h"
2618
2619c   arguments:
2620c   ----------
2621
2622      INTEGER ngrid,nlay,w2di,tho
2623      real ptimestep,l_mix,r_aspect
2624      REAL pt(ngrid,nlay),pdtadj(ngrid,nlay)
2625      REAL pu(ngrid,nlay),pduadj(ngrid,nlay)
2626      REAL pv(ngrid,nlay),pdvadj(ngrid,nlay)
2627      REAL po(ngrid,nlay),pdoadj(ngrid,nlay)
2628      REAL pplay(ngrid,nlay),pplev(ngrid,nlay+1)
2629      real pphi(ngrid,nlay)
2630
2631      integer idetr
2632      save idetr
2633      data idetr/3/
2634
2635c   local:
2636c   ------
2637
2638      INTEGER ig,k,l,lmaxa(klon),lmix(klon)
2639      real zsortie1d(klon)
2640c CR: on remplace lmax(klon,klev+1)
2641      INTEGER lmax(klon),lmin(klon),lentr(klon)
2642      real linter(klon)
2643      real zmix(klon), fracazmix(klon)
2644c RC
2645      real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz
2646
2647      real zlev(klon,klev+1),zlay(klon,klev)
2648      REAL zh(klon,klev),zdhadj(klon,klev)
2649      real zthl(klon,klev),zdthladj(klon,klev)
2650      REAL ztv(klon,klev)
2651      real zu(klon,klev),zv(klon,klev),zo(klon,klev)
2652      real zl(klon,klev)
2653      REAL wh(klon,klev+1)
2654      real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1)
2655      real zla(klon,klev+1)
2656      real zwa(klon,klev+1)
2657      real zld(klon,klev+1)
2658      real zwd(klon,klev+1)
2659      real zsortie(klon,klev)
2660      real zva(klon,klev)
2661      real zua(klon,klev)
2662      real zoa(klon,klev)
2663
2664      real zta(klon,klev)
2665      real zha(klon,klev)
2666      real wa_moy(klon,klev+1)
2667      real fraca(klon,klev+1)
2668      real fracc(klon,klev+1)
2669      real zf,zf2
2670      real thetath2(klon,klev),wth2(klon,klev)
2671      common/comtherm/thetath2,wth2
2672
2673      real count_time
2674      integer isplit,nsplit,ialt
2675      parameter (nsplit=10)
2676      data isplit/0/
2677      save isplit
2678
2679      logical sorties
2680      real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev)
2681      real zpspsk(klon,klev)
2682
2683c     real wmax(klon,klev),wmaxa(klon)
2684      real wmax(klon),wmaxa(klon)
2685      real wa(klon,klev,klev+1)
2686      real wd(klon,klev+1)
2687      real larg_part(klon,klev,klev+1)
2688      real fracd(klon,klev+1)
2689      real xxx(klon,klev+1)
2690      real larg_cons(klon,klev+1)
2691      real larg_detr(klon,klev+1)
2692      real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev)
2693      real pu_therm(klon,klev),pv_therm(klon,klev)
2694      real fm(klon,klev+1),entr(klon,klev)
2695      real fmc(klon,klev+1)
2696
2697      real zcor,zdelta,zcvm5,qlbef
2698      real Tbef(klon),qsatbef(klon)
2699      real dqsat_dT,DT,num,denom
2700      REAL REPS,RLvCp,DDT0
2701      real ztla(klon,klev),zqla(klon,klev),zqta(klon,klev)
2702 
2703      PARAMETER (DDT0=.01)
2704
2705cCR:nouvelles variables
2706      real f_star(klon,klev+1),entr_star(klon,klev)
2707      real entr_star_tot(klon),entr_star2(klon)
2708      real f(klon), f0(klon)
2709      real zlevinter(klon)
2710      logical first
2711      data first /.false./
2712      save first
2713cRC
2714
2715      character*2 str2
2716      character*10 str10
2717
2718      LOGICAL vtest(klon),down
2719      LOGICAL Zsat(klon)
2720
2721      EXTERNAL SCOPY
2722
2723      integer ncorrec,ll
2724      save ncorrec
2725      data ncorrec/0/
2726c
2727
2728c-----------------------------------------------------------------------
2729c   initialisation:
2730c   ---------------
2731c
2732       sorties=.true.
2733      IF(ngrid.NE.klon) THEN
2734         PRINT*
2735         PRINT*,'STOP dans convadj'
2736         PRINT*,'ngrid    =',ngrid
2737         PRINT*,'klon  =',klon
2738      ENDIF
2739c
2740c Initialisation
2741      RLvCp = RLVTT/RCPD
2742      REPS  = RD/RV
2743c
2744c-----------------------------------------------------------------------
2745cAM Calcul de T,q,ql a partir de Tl et qT
2746c   ---------------------------------------------------
2747c
2748c Pr Tprec=Tl calcul de qsat
2749c Si qsat>qT T=Tl, q=qT
2750c Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt)
2751c On cherche DDT < DDT0
2752c
2753c defaut
2754       DO  ll=1,nlay
2755         DO ig=1,ngrid
2756            zo(ig,ll)=po(ig,ll)
2757            zl(ig,ll)=0.
2758            zh(ig,ll)=pt(ig,ll)
2759         EndDO
2760       EndDO
2761       do ig=1,ngrid
2762          Zsat(ig)=.false.
2763       enddo
2764c
2765c
2766       DO ll=1,nlay
2767c les points insatures sont definitifs
2768         DO ig=1,ngrid
2769            Tbef(ig)=pt(ig,ll)
2770            zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
2771            qsatbef(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig,ll)
2772            qsatbef(ig)=MIN(0.5,qsatbef(ig))
2773            zcor=1./(1.-retv*qsatbef(ig))
2774            qsatbef(ig)=qsatbef(ig)*zcor
2775            Zsat(ig) = (max(0.,po(ig,ll)-qsatbef(ig)) .gt. 0.00001)
2776         EndDO
2777
2778         DO ig=1,ngrid
2779           if (Zsat(ig)) then
2780            qlbef=max(0.,po(ig,ll)-qsatbef(ig))
2781c si sature: ql est surestime, d'ou la sous-relax
2782            DT = 0.5*RLvCp*qlbef
2783c on pourra enchainer 2 ou 3 calculs sans Do while
2784            do while (DT.gt.DDT0)
2785c il faut verifier si c,a conserve quand on repasse en insature ...
2786              Tbef(ig)=Tbef(ig)+DT
2787              zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
2788              qsatbef(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig,ll)
2789              qsatbef(ig)=MIN(0.5,qsatbef(ig))
2790              zcor=1./(1.-retv*qsatbef(ig))
2791              qsatbef(ig)=qsatbef(ig)*zcor
2792c on veut le signe de qlbef
2793              qlbef=po(ig,ll)-qsatbef(ig)
2794c          dqsat_dT
2795              zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
2796              zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta
2797              zcor=1./(1.-retv*qsatbef(ig))
2798              dqsat_dT=FOEDE(Tbef(ig),zdelta,zcvm5,qsatbef(ig),zcor)
2799              num=-Tbef(ig)+pt(ig,ll)+RLvCp*qlbef
2800              denom=1.+RLvCp*dqsat_dT
2801              DT=num/denom
2802            enddo
2803c on ecrit de maniere conservative (sat ou non)
2804            zl(ig,ll) = max(0.,qlbef)
2805c          T = Tl +Lv/Cp ql
2806            zh(ig,ll) = pt(ig,ll)+RLvCp*zl(ig,ll)
2807            zo(ig,ll) = po(ig,ll)-zl(ig,ll)
2808           endif
2809         EndDO
2810       EndDO
2811cAM fin
2812c
2813c-----------------------------------------------------------------------
2814c   incrementation eventuelle de tendances precedentes:
2815c   ---------------------------------------------------
2816
2817      print*,'0 OK convect8'
2818
2819      DO 1010 l=1,nlay
2820         DO 1015 ig=1,ngrid
2821            zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA
2822c            zh(ig,l)=pt(ig,l)/zpspsk(ig,l)
2823            zu(ig,l)=pu(ig,l)
2824            zv(ig,l)=pv(ig,l)
2825c            zo(ig,l)=po(ig,l)
2826c            ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l))
2827cAM attention zh est maintenant le profil de T et plus le profil de theta !
2828c
2829c   T-> Theta
2830            ztv(ig,l)=zh(ig,l)/zpspsk(ig,l)
2831cAM Theta_v
2832            ztv(ig,l)=ztv(ig,l)*(1.+RETV*(zo(ig,l))
2833     s           -zl(ig,l))
2834cAM Thetal
2835            zthl(ig,l)=pt(ig,l)/zpspsk(ig,l)
2836c           
28371015     CONTINUE
28381010  CONTINUE
2839
2840c     print*,'1 OK convect8'
2841c                       --------------------
2842c
2843c
2844c                       + + + + + + + + + + +
2845c
2846c
2847c  wa, fraca, wd, fracd --------------------   zlev(2), rhobarz
2848c  wh,wt,wo ...
2849c
2850c                       + + + + + + + + + + +  zh,zu,zv,zo,rho
2851c
2852c
2853c                       --------------------   zlev(1)
2854c                       \\\\\\\\\\\\\\\\\\\\
2855c
2856c
2857
2858c-----------------------------------------------------------------------
2859c   Calcul des altitudes des couches
2860c-----------------------------------------------------------------------
2861
2862      do l=2,nlay
2863         do ig=1,ngrid
2864            zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG
2865         enddo
2866      enddo
2867      do ig=1,ngrid
2868         zlev(ig,1)=0.
2869         zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG
2870      enddo
2871      do l=1,nlay
2872         do ig=1,ngrid
2873            zlay(ig,l)=pphi(ig,l)/RG
2874         enddo
2875      enddo
2876
2877c     print*,'2 OK convect8'
2878c-----------------------------------------------------------------------
2879c   Calcul des densites
2880c-----------------------------------------------------------------------
2881
2882      do l=1,nlay
2883         do ig=1,ngrid
2884c            rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l))
2885             rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*ztv(ig,l))
2886         enddo
2887      enddo
2888
2889      do l=2,nlay
2890         do ig=1,ngrid
2891            rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1))
2892         enddo
2893      enddo
2894
2895      do k=1,nlay
2896         do l=1,nlay+1
2897            do ig=1,ngrid
2898               wa(ig,k,l)=0.
2899            enddo
2900         enddo
2901      enddo
2902
2903c     print*,'3 OK convect8'
2904c------------------------------------------------------------------
2905c   Calcul de w2, quarre de w a partir de la cape
2906c   a partir de w2, on calcule wa, vitesse de l'ascendance
2907c
2908c   ATTENTION: Dans cette version, pour cause d'economie de memoire,
2909c   w2 est stoke dans wa
2910c
2911c   ATTENTION: dans convect8, on n'utilise le calcule des wa
2912c   independants par couches que pour calculer l'entrainement
2913c   a la base et la hauteur max de l'ascendance.
2914c
2915c   Indicages:
2916c   l'ascendance provenant du niveau k traverse l'interface l avec
2917c   une vitesse wa(k,l).
2918c
2919c                       --------------------
2920c
2921c                       + + + + + + + + + +
2922c
2923c  wa(k,l)   ----       --------------------    l
2924c             /\
2925c            /||\       + + + + + + + + + +
2926c             ||
2927c             ||        --------------------
2928c             ||
2929c             ||        + + + + + + + + + +
2930c             ||
2931c             ||        --------------------
2932c             ||__
2933c             |___      + + + + + + + + + +     k
2934c
2935c                       --------------------
2936c
2937c
2938c
2939c------------------------------------------------------------------
2940
2941cCR: ponderation entrainement des couches instables
2942cdef des entr_star tels que entr=f*entr_star     
2943      do l=1,klev
2944         do ig=1,ngrid
2945            entr_star(ig,l)=0.
2946         enddo
2947      enddo
2948c determination de la longueur de la couche d entrainement
2949      do ig=1,ngrid
2950         lentr(ig)=1
2951      enddo
2952
2953con ne considere que les premieres couches instables
2954      do k=nlay-1,1,-1
2955         do ig=1,ngrid
2956            if (ztv(ig,k).gt.ztv(ig,k+1).and.
2957     s          ztv(ig,k+1).lt.ztv(ig,k+2)) then
2958               lentr(ig)=k
2959            endif
2960          enddo
2961      enddo
2962   
2963c determination du lmin: couche d ou provient le thermique
2964      do ig=1,ngrid
2965         lmin(ig)=1
2966      enddo
2967      do ig=1,ngrid
2968         do l=nlay,2,-1
2969            if (ztv(ig,l-1).gt.ztv(ig,l)) then
2970               lmin(ig)=l-1
2971            endif
2972         enddo
2973      enddo
2974c
2975c definition de l'entrainement des couches
2976      do l=1,klev-1
2977         do ig=1,ngrid
2978            if (ztv(ig,l).gt.ztv(ig,l+1).and.
2979     s          l.ge.lmin(ig).and.l.le.lentr(ig)) then
2980                 entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))*
2981     s                          (zlev(ig,l+1)-zlev(ig,l))
2982            endif
2983         enddo
2984      enddo
2985c pas de thermique si couche 1 stable
2986      do ig=1,ngrid
2987         if (lmin(ig).gt.1) then
2988            do l=1,klev
2989               entr_star(ig,l)=0.
2990            enddo
2991         endif
2992      enddo
2993c calcul de l entrainement total
2994      do ig=1,ngrid
2995         entr_star_tot(ig)=0.
2996      enddo
2997      do ig=1,ngrid
2998         do k=1,klev
2999            entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,k)
3000         enddo
3001      enddo
3002c
3003      do k=1,klev
3004         do ig=1,ngrid
3005            ztva(ig,k)=ztv(ig,k)
3006         enddo
3007      enddo
3008cRC
3009cAM:initialisations
3010      do k=1,nlay
3011         do ig=1,ngrid
3012            ztva(ig,k)=ztv(ig,k)
3013            ztla(ig,k)=zthl(ig,k)
3014            zqla(ig,k)=0.
3015            zqta(ig,k)=po(ig,k)
3016            Zsat(ig) =.false.
3017         enddo
3018      enddo
3019c
3020c     print*,'7 OK convect8'
3021      do k=1,klev+1
3022         do ig=1,ngrid
3023            zw2(ig,k)=0.
3024            fmc(ig,k)=0.
3025cCR
3026            f_star(ig,k)=0.
3027cRC
3028            larg_cons(ig,k)=0.
3029            larg_detr(ig,k)=0.
3030            wa_moy(ig,k)=0.
3031         enddo
3032      enddo
3033
3034c     print*,'8 OK convect8'
3035      do ig=1,ngrid
3036         linter(ig)=1.
3037         lmaxa(ig)=1
3038         lmix(ig)=1
3039         wmaxa(ig)=0.
3040      enddo
3041
3042cCR:
3043      do l=1,nlay-2
3044         do ig=1,ngrid
3045            if (ztv(ig,l).gt.ztv(ig,l+1)
3046     s         .and.entr_star(ig,l).gt.1.e-10
3047     s         .and.zw2(ig,l).lt.1e-10) then
3048cAM
3049               ztla(ig,l)=zthl(ig,l)
3050               zqta(ig,l)=po(ig,l)
3051               zqla(ig,l)=zl(ig,l)
3052cAM
3053               f_star(ig,l+1)=entr_star(ig,l)
3054ctest:calcul de dteta
3055               zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1)
3056     s                     *(zlev(ig,l+1)-zlev(ig,l))
3057     s                     *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l))
3058               larg_detr(ig,l)=0.
3059            else if ((zw2(ig,l).ge.1e-10).and.
3060     s               (f_star(ig,l)+entr_star(ig,l).gt.1.e-10)) then
3061               f_star(ig,l+1)=f_star(ig,l)+entr_star(ig,l)
3062c
3063cAM on melange Tl et qt du thermique
3064               ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+entr_star(ig,l)
3065     s                    *zthl(ig,l))/f_star(ig,l+1)
3066               zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+entr_star(ig,l)
3067     s                    *po(ig,l))/f_star(ig,l+1)
3068c
3069c               ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)
3070c     s                    *ztv(ig,l))/f_star(ig,l+1)
3071c
3072cAM on en deduit thetav et ql du thermique
3073               Tbef(ig)=ztla(ig,l)*zpspsk(ig,l)
3074               zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
3075               qsatbef(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig,l)
3076               qsatbef(ig)=MIN(0.5,qsatbef(ig))
3077               zcor=1./(1.-retv*qsatbef(ig))
3078               qsatbef(ig)=qsatbef(ig)*zcor
3079               Zsat(ig) = (max(0.,zqta(ig,l)-qsatbef(ig)) .gt. 0.00001)
3080            endif
3081         enddo
3082         DO ig=1,ngrid
3083           if (Zsat(ig)) then
3084              qlbef=max(0.,zqta(ig,l)-qsatbef(ig))
3085              DT = 0.5*RLvCp*qlbef
3086              do while (DT.gt.DDT0)
3087                 Tbef(ig)=Tbef(ig)+DT
3088                 zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
3089                 qsatbef(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig,l)
3090                 qsatbef(ig)=MIN(0.5,qsatbef(ig))
3091                 zcor=1./(1.-retv*qsatbef(ig))
3092                 qsatbef(ig)=qsatbef(ig)*zcor
3093                 qlbef=zqta(ig,l)-qsatbef(ig)
3094
3095                 zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
3096                 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta
3097                 zcor=1./(1.-retv*qsatbef(ig))
3098                 dqsat_dT=FOEDE(Tbef(ig),zdelta,zcvm5,qsatbef(ig),zcor)
3099                 num=-Tbef(ig)+ztla(ig,l)*zpspsk(ig,l)+RLvCp*qlbef
3100                 denom=1.+RLvCp*dqsat_dT
3101                 DT=num/denom
3102              enddo
3103              zqla(ig,l) = max(0.,zqta(ig,l)-qsatbef(ig))
3104           endif
3105c on ecrit de maniere conservative (sat ou non)
3106c          T = Tl +Lv/Cp ql
3107           ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l)
3108           ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l)
3109           ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l)
3110     s              -zqla(ig,l))-zqla(ig,l))
3111
3112        enddo
3113        DO ig=1,ngrid
3114           if (zw2(ig,l).ge.1.e-10.and.
3115     s               f_star(ig,l)+entr_star(ig,l).gt.1.e-10) then
3116c  mise a jour de la vitesse ascendante (l'air entraine de la couche
3117c  consideree commence avec une vitesse nulle).
3118c
3119               zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+
3120     s                     2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)
3121     s                     *(zlev(ig,l+1)-zlev(ig,l))
3122            endif
3123c determination de zmax continu par interpolation lineaire
3124            if (zw2(ig,l+1).lt.0.) then
3125               linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l))
3126     s           -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
3127               zw2(ig,l+1)=0.
3128               lmaxa(ig)=l
3129            else
3130               wa_moy(ig,l+1)=sqrt(zw2(ig,l+1))
3131            endif
3132            if (wa_moy(ig,l+1).gt.wmaxa(ig)) then
3133c   lmix est le niveau de la couche ou w (wa_moy) est maximum
3134               lmix(ig)=l+1
3135               wmaxa(ig)=wa_moy(ig,l+1)
3136            endif
3137         enddo
3138      enddo
3139c
3140c Calcul de la couche correspondant a la hauteur du thermique
3141      do ig=1,ngrid
3142         lmax(ig)=lentr(ig)
3143      enddo
3144      do ig=1,ngrid
3145         do l=nlay,lentr(ig)+1,-1
3146            if (zw2(ig,l).le.1.e-10) then
3147               lmax(ig)=l-1
3148            endif
3149         enddo
3150      enddo
3151c pas de thermique si couche 1 stable
3152      do ig=1,ngrid
3153         if (lmin(ig).gt.1) then
3154            lmax(ig)=1
3155            lmin(ig)=1
3156         endif
3157      enddo
3158c   
3159c Determination de zw2 max
3160      do ig=1,ngrid
3161         wmax(ig)=0.
3162      enddo
3163
3164      do l=1,nlay
3165         do ig=1,ngrid
3166            if (l.le.lmax(ig)) then
3167                zw2(ig,l)=sqrt(zw2(ig,l))
3168                wmax(ig)=max(wmax(ig),zw2(ig,l))
3169            else
3170                 zw2(ig,l)=0.
3171            endif
3172          enddo
3173      enddo
3174
3175c   Longueur caracteristique correspondant a la hauteur des thermiques.
3176      do  ig=1,ngrid
3177         zmax(ig)=500.
3178         zlevinter(ig)=zlev(ig,1)
3179      enddo
3180      do  ig=1,ngrid
3181c calcul de zlevinter
3182          zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
3183     s    linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
3184     s    -zlev(ig,lmax(ig)))
3185       zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
3186      enddo
3187
3188c Fermeture,determination de f
3189      do ig=1,ngrid
3190         entr_star2(ig)=0.
3191      enddo
3192      do ig=1,ngrid
3193         if (entr_star_tot(ig).LT.1.e-10) then
3194            f(ig)=0.
3195         else
3196             do k=lmin(ig),lentr(ig)
3197                entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2
3198     s                    /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)))
3199             enddo
3200c Nouvelle fermeture
3201             f(ig)=wmax(ig)/(zmax(ig)*r_aspect*entr_star2(ig))
3202     s             *entr_star_tot(ig)
3203ctest
3204             if (first) then
3205             f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)
3206     s             *wmax(ig))
3207             endif
3208         endif
3209         f0(ig)=f(ig)
3210         first=.true.
3211      enddo
3212
3213c Calcul de l'entrainement
3214       do k=1,klev
3215         do ig=1,ngrid
3216            entr(ig,k)=f(ig)*entr_star(ig,k)
3217         enddo
3218      enddo
3219c Calcul des flux
3220      do ig=1,ngrid
3221         do l=1,lmax(ig)-1
3222            fmc(ig,l+1)=fmc(ig,l)+entr(ig,l)
3223         enddo
3224      enddo
3225
3226cRC
3227
3228
3229c     print*,'9 OK convect8'
3230c     print*,'WA1 ',wa_moy
3231
3232c   determination de l'indice du debut de la mixed layer ou w decroit
3233
3234c   calcul de la largeur de chaque ascendance dans le cas conservatif.
3235c   dans ce cas simple, on suppose que la largeur de l'ascendance provenant
3236c   d'une couche est égale à la hauteur de la couche alimentante.
3237c   La vitesse maximale dans l'ascendance est aussi prise comme estimation
3238c   de la vitesse d'entrainement horizontal dans la couche alimentante.
3239
3240      do l=2,nlay
3241         do ig=1,ngrid
3242            if (l.le.lmaxa(ig)) then
3243               zw=max(wa_moy(ig,l),1.e-10)
3244               larg_cons(ig,l)=zmax(ig)*r_aspect
3245     s         *fmc(ig,l)/(rhobarz(ig,l)*zw)
3246            endif
3247         enddo
3248      enddo
3249
3250      do l=2,nlay
3251         do ig=1,ngrid
3252            if (l.le.lmaxa(ig)) then
3253c              if (idetr.eq.0) then
3254c  cette option est finalement en dur.
3255                  larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
3256c              else if (idetr.eq.1) then
3257c                 larg_detr(ig,l)=larg_cons(ig,l)
3258c    s            *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig))
3259c              else if (idetr.eq.2) then
3260c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
3261c    s            *sqrt(wa_moy(ig,l))
3262c              else if (idetr.eq.4) then
3263c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
3264c    s            *wa_moy(ig,l)
3265c              endif
3266            endif
3267         enddo
3268       enddo
3269
3270c     print*,'10 OK convect8'
3271c     print*,'WA2 ',wa_moy
3272c   calcul de la fraction de la maille concernée par l'ascendance en tenant
3273c   compte de l'epluchage du thermique.
3274c
3275cCR def de  zmix continu (profil parabolique des vitesses)
3276      do ig=1,ngrid
3277           if (lmix(ig).gt.1.) then
3278            zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
3279     s        *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
3280     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
3281     s        *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
3282     s        /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
3283     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
3284     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
3285     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
3286         else
3287         zmix(ig)=0.
3288         endif
3289      enddo
3290c
3291c calcul du nouveau lmix correspondant
3292      do ig=1,ngrid
3293         do l=1,klev
3294            if (zmix(ig).ge.zlev(ig,l).and.
3295     s          zmix(ig).lt.zlev(ig,l+1)) then
3296              lmix(ig)=l
3297             endif
3298          enddo
3299      enddo
3300c
3301      do l=2,nlay
3302         do ig=1,ngrid
3303            if(larg_cons(ig,l).gt.1.) then
3304c     print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),'  KKK'
3305               fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l))
3306     s            /(r_aspect*zmax(ig))
3307c test
3308               fraca(ig,l)=max(fraca(ig,l),0.)
3309               fraca(ig,l)=min(fraca(ig,l),0.5)
3310               fracd(ig,l)=1.-fraca(ig,l)
3311               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
3312            else
3313c              wa_moy(ig,l)=0.
3314               fraca(ig,l)=0.
3315               fracc(ig,l)=0.
3316               fracd(ig,l)=1.
3317            endif
3318         enddo
3319      enddo                 
3320cCR: calcul de fracazmix
3321       do ig=1,ngrid
3322          fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/
3323     s     (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig)
3324     s    +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1)
3325     s    -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
3326       enddo
3327c
3328       do l=2,nlay
3329          do ig=1,ngrid
3330             if(larg_cons(ig,l).gt.1.) then
3331               if (l.gt.lmix(ig)) then
3332                 xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig))
3333           if (idetr.eq.0) then
3334               fraca(ig,l)=fracazmix(ig)
3335           else if (idetr.eq.1) then
3336               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)
3337           else if (idetr.eq.2) then
3338               fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2)
3339           else
3340               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2
3341           endif
3342c     print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL'
3343               fraca(ig,l)=max(fraca(ig,l),0.)
3344               fraca(ig,l)=min(fraca(ig,l),0.5)
3345               fracd(ig,l)=1.-fraca(ig,l)
3346               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
3347             endif
3348            endif
3349         enddo
3350      enddo
3351
3352c     print*,'11 OK convect8'
3353c     print*,'Ea3 ',wa_moy
3354c------------------------------------------------------------------
3355c   Calcul de fracd, wd
3356c   somme wa - wd = 0
3357c------------------------------------------------------------------
3358
3359
3360      do ig=1,ngrid
3361         fm(ig,1)=0.
3362         fm(ig,nlay+1)=0.
3363      enddo
3364
3365      do l=2,nlay
3366           do ig=1,ngrid
3367              fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l)
3368cCR:test
3369              if (entr(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1)
3370     s            .and.l.gt.lmix(ig)) then
3371                 fm(ig,l)=fm(ig,l-1)
3372c                 write(1,*)'ajustement fm, l',l
3373              endif
3374c              write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l)
3375cRC
3376           enddo
3377         do ig=1,ngrid
3378            if(fracd(ig,l).lt.0.1) then
3379               stop'fracd trop petit'
3380            else
3381c    vitesse descendante "diagnostique"
3382               wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l))
3383            endif
3384         enddo
3385      enddo
3386
3387      do l=1,nlay
3388         do ig=1,ngrid
3389c           masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
3390            masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG
3391         enddo
3392      enddo
3393
3394c     print*,'12 OK convect8'
3395c     print*,'WA4 ',wa_moy
3396cc------------------------------------------------------------------
3397c   calcul du transport vertical
3398c------------------------------------------------------------------
3399
3400      go to 4444
3401c     print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep
3402      do l=2,nlay-1
3403         do ig=1,ngrid
3404            if(fm(ig,l+1)*ptimestep.gt.masse(ig,l)
3405     s      .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then
3406c     print*,'WARN!!! FM>M ig=',ig,' l=',l,'  FM='
3407c    s         ,fm(ig,l+1)*ptimestep
3408c    s         ,'   M=',masse(ig,l),masse(ig,l+1)
3409             endif
3410         enddo
3411      enddo
3412
3413      do l=1,nlay
3414         do ig=1,ngrid
3415            if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then
3416c     print*,'WARN!!! E>M ig=',ig,' l=',l,'  E=='
3417c    s         ,entr(ig,l)*ptimestep
3418c    s         ,'   M=',masse(ig,l)
3419             endif
3420         enddo
3421      enddo
3422
3423      do l=1,nlay
3424         do ig=1,ngrid
3425            if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then
3426c     print*,'WARN!!! fm exagere ig=',ig,'   l=',l
3427c    s         ,'   FM=',fm(ig,l)
3428            endif
3429            if(.not.masse(ig,l).ge.1.e-10
3430     s         .or..not.masse(ig,l).le.1.e4) then
3431c     print*,'WARN!!! masse exagere ig=',ig,'   l=',l
3432c    s         ,'   M=',masse(ig,l)
3433c     print*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)',
3434c    s                 rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)
3435c     print*,'zlev(ig,l+1),zlev(ig,l)'
3436c    s                ,zlev(ig,l+1),zlev(ig,l)
3437c     print*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)'
3438c    s                ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)
3439            endif
3440            if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then
3441c     print*,'WARN!!! entr exagere ig=',ig,'   l=',l
3442c    s         ,'   E=',entr(ig,l)
3443            endif
3444         enddo
3445      enddo
3446
34474444   continue
3448
3449      if (w2di.eq.1) then
3450         fm0=fm0+ptimestep*(fm-fm0)/float(tho)
3451         entr0=entr0+ptimestep*(entr-entr0)/float(tho)
3452      else
3453         fm0=fm
3454         entr0=entr
3455      endif
3456
3457      if (1.eq.1) then
3458c         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
3459c     .    ,zh,zdhadj,zha)
3460c         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
3461c     .    ,zo,pdoadj,zoa)
3462         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
3463     .    ,zthl,zdthladj,zta)
3464         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
3465     .    ,po,pdoadj,zoa)
3466      else
3467         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
3468     .    ,zh,zdhadj,zha)
3469         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
3470     .    ,zo,pdoadj,zoa)
3471      endif
3472
3473      if (1.eq.0) then
3474         call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse
3475     .    ,fraca,zmax
3476     .    ,zu,zv,pduadj,pdvadj,zua,zva)
3477      else
3478         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
3479     .    ,zu,pduadj,zua)
3480         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
3481     .    ,zv,pdvadj,zva)
3482      endif
3483
3484      do l=1,nlay
3485         do ig=1,ngrid
3486            zf=0.5*(fracc(ig,l)+fracc(ig,l+1))
3487            zf2=zf/(1.-zf)
3488            thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2
3489            wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
3490         enddo
3491      enddo
3492
3493
3494
3495c     print*,'13 OK convect8'
3496c     print*,'WA5 ',wa_moy
3497      do l=1,nlay
3498         do ig=1,ngrid
3499c            pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l)
3500           pdtadj(ig,l)=zdthladj(ig,l)*zpspsk(ig,l) 
3501         enddo
3502      enddo
3503
3504
3505c     do l=1,nlay
3506c        do ig=1,ngrid
3507c           if(abs(pdtadj(ig,l))*86400..gt.500.) then
3508c     print*,'WARN!!! ig=',ig,'  l=',l
3509c    s         ,'   pdtadj=',pdtadj(ig,l)
3510c           endif
3511c           if(abs(pdoadj(ig,l))*86400..gt.1.) then
3512c     print*,'WARN!!! ig=',ig,'  l=',l
3513c    s         ,'   pdoadj=',pdoadj(ig,l)
3514c           endif
3515c        enddo
3516c      enddo
3517
3518c     print*,'14 OK convect8'
3519c------------------------------------------------------------------
3520c   Calculs pour les sorties
3521c------------------------------------------------------------------
3522
3523      if(sorties) then
3524      do l=1,nlay
3525         do ig=1,ngrid
3526            zla(ig,l)=(1.-fracd(ig,l))*zmax(ig)
3527            zld(ig,l)=fracd(ig,l)*zmax(ig)
3528            if(1.-fracd(ig,l).gt.1.e-10)
3529     s      zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l))
3530         enddo
3531      enddo
3532
3533      do l=1,nlay
3534         do ig=1,ngrid
3535            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
3536            if (detr(ig,l).lt.0.) then
3537                entr(ig,l)=entr(ig,l)-detr(ig,l)
3538                detr(ig,l)=0.
3539c     print*,'WARNING !!! detrainement negatif ',ig,l
3540            endif
3541         enddo
3542      enddo
3543
3544c     print*,'15 OK convect8'
3545
3546      isplit=isplit+1
3547
3548
3549c #define und
3550        goto 123
3551#ifdef und
3552      CALL writeg1d(1,nlay,wd,'wd      ','wd      ')
3553      CALL writeg1d(1,nlay,zwa,'wa      ','wa      ')
3554      CALL writeg1d(1,nlay,fracd,'fracd      ','fracd      ')
3555      CALL writeg1d(1,nlay,fraca,'fraca      ','fraca      ')
3556      CALL writeg1d(1,nlay,wa_moy,'wam         ','wam         ')
3557      CALL writeg1d(1,nlay,zla,'la      ','la      ')
3558      CALL writeg1d(1,nlay,zld,'ld      ','ld      ')
3559      CALL writeg1d(1,nlay,pt,'pt      ','pt      ')
3560      CALL writeg1d(1,nlay,zh,'zh      ','zh      ')
3561      CALL writeg1d(1,nlay,zha,'zha      ','zha      ')
3562      CALL writeg1d(1,nlay,zu,'zu      ','zu      ')
3563      CALL writeg1d(1,nlay,zv,'zv      ','zv      ')
3564      CALL writeg1d(1,nlay,zo,'zo      ','zo      ')
3565      CALL writeg1d(1,nlay,wh,'wh      ','wh      ')
3566      CALL writeg1d(1,nlay,wu,'wu      ','wu      ')
3567      CALL writeg1d(1,nlay,wv,'wv      ','wv      ')
3568      CALL writeg1d(1,nlay,wo,'w15uo     ','wXo     ')
3569      CALL writeg1d(1,nlay,zdhadj,'zdhadj      ','zdhadj      ')
3570      CALL writeg1d(1,nlay,pduadj,'pduadj      ','pduadj      ')
3571      CALL writeg1d(1,nlay,pdvadj,'pdvadj      ','pdvadj      ')
3572      CALL writeg1d(1,nlay,pdoadj,'pdoadj      ','pdoadj      ')
3573      CALL writeg1d(1,nlay,entr  ,'entr        ','entr        ')
3574      CALL writeg1d(1,nlay,detr  ,'detr        ','detr        ')
3575      CALL writeg1d(1,nlay,fm    ,'fm          ','fm          ')
3576
3577      CALL writeg1d(1,nlay,pdtadj,'pdtadj    ','pdtadj    ')
3578      CALL writeg1d(1,nlay,pplay,'pplay     ','pplay     ')
3579      CALL writeg1d(1,nlay,pplev,'pplev     ','pplev     ')
3580
3581c   recalcul des flux en diagnostique...
3582c     print*,'PAS DE TEMPS ',ptimestep
3583       call dt2F(pplev,pplay,pt,pdtadj,wh)
3584      CALL writeg1d(1,nlay,wh,'wh2     ','wh2     ')
3585#endif
3586123   continue
3587! #define troisD
3588#ifdef troisD
3589c       if (sorties) then
3590      print*,'Debut des wrgradsfi'
3591
3592c      print*,'16 OK convect8'
3593         call wrgradsfi(1,nlay,wd,'wd        ','wd        ')
3594         call wrgradsfi(1,nlay,zwa,'wa        ','wa        ')
3595         call wrgradsfi(1,nlay,fracd,'fracd     ','fracd     ')
3596         call wrgradsfi(1,nlay,fraca,'fraca     ','fraca     ')
3597         call wrgradsfi(1,nlay,xxx,'xxx       ','xxx       ')
3598         call wrgradsfi(1,nlay,wa_moy,'wam       ','wam       ')
3599c      print*,'WA6 ',wa_moy
3600         call wrgradsfi(1,nlay,zla,'la        ','la        ')
3601         call wrgradsfi(1,nlay,zld,'ld        ','ld        ')
3602         call wrgradsfi(1,nlay,pt,'pt        ','pt        ')
3603         call wrgradsfi(1,nlay,zh,'zh        ','zh        ')
3604         call wrgradsfi(1,nlay,zha,'zha        ','zha        ')
3605         call wrgradsfi(1,nlay,zua,'zua        ','zua        ')
3606         call wrgradsfi(1,nlay,zva,'zva        ','zva        ')
3607         call wrgradsfi(1,nlay,zu,'zu        ','zu        ')
3608         call wrgradsfi(1,nlay,zv,'zv        ','zv        ')
3609         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
3610         call wrgradsfi(1,nlay,wh,'wh        ','wh        ')
3611         call wrgradsfi(1,nlay,wu,'wu        ','wu        ')
3612         call wrgradsfi(1,nlay,wv,'wv        ','wv        ')
3613         call wrgradsfi(1,nlay,wo,'wo        ','wo        ')
3614         call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
3615         call wrgradsfi(1,nlay,zdhadj,'zdhadj    ','zdhadj    ')
3616         call wrgradsfi(1,nlay,pduadj,'pduadj    ','pduadj    ')
3617         call wrgradsfi(1,nlay,pdvadj,'pdvadj    ','pdvadj    ')
3618         call wrgradsfi(1,nlay,pdoadj,'pdoadj    ','pdoadj    ')
3619         call wrgradsfi(1,nlay,entr,'entr      ','entr      ')
3620         call wrgradsfi(1,nlay,detr,'detr      ','detr      ')
3621         call wrgradsfi(1,nlay,fm,'fm        ','fm        ')
3622         call wrgradsfi(1,nlay,fmc,'fmc       ','fmc       ')
3623         call wrgradsfi(1,nlay,zw2,'zw2       ','zw2       ')
3624         call wrgradsfi(1,nlay,ztva,'ztva      ','ztva      ')
3625         call wrgradsfi(1,nlay,ztv,'ztv       ','ztv       ')
3626
3627         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
3628         call wrgradsfi(1,nlay,larg_cons,'Lc        ','Lc        ')
3629         call wrgradsfi(1,nlay,larg_detr,'Ldetr     ','Ldetr     ')
3630
3631cAM:nouveaux diagnostiques
3632         call wrgradsfi(1,nlay,zthl,'zthl        ','zthl        ')
3633         call wrgradsfi(1,nlay,zta,'zta        ','zta        ')
3634         call wrgradsfi(1,nlay,zl,'zl        ','zl        ')
3635         call wrgradsfi(1,nlay,zdthladj,'zdthladj    ',
3636     s        'zdthladj    ')
3637         call wrgradsfi(1,nlay,ztla,'ztla      ','ztla      ')
3638         call wrgradsfi(1,nlay,zqta,'zqta      ','zqta      ')
3639         call wrgradsfi(1,nlay,zqla,'zqla      ','zqla      ')
3640cCR:nouveaux diagnostiques
3641      call wrgradsfi(1,nlay,entr_star  ,'entr_star   ','entr_star   ')     
3642      call wrgradsfi(1,nlay,f_star    ,'f_star   ','f_star   ')
3643      call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
3644      call wrgradsfi(1,1,zmix,'zmix      ','zmix      ')
3645      zsortie1d(:)=lmax(:)
3646      call wrgradsfi(1,1,zsortie1d,'lmax      ','lmax      ')
3647      call wrgradsfi(1,1,wmax,'wmax      ','wmax      ')
3648      zsortie1d(:)=lmix(:)
3649      call wrgradsfi(1,1,zsortie1d,'lmix      ','lmix      ')
3650      zsortie1d(:)=lentr(:)
3651      call wrgradsfi(1,1,zsortie1d,'lentr      ','lentr     ')
3652
3653c      print*,'17 OK convect8'
3654
3655         do k=1,klev/10
3656            write(str2,'(i2.2)') k
3657            str10='wa'//str2
3658            do l=1,nlay
3659               do ig=1,ngrid
3660                  zsortie(ig,l)=wa(ig,k,l)
3661               enddo
3662            enddo   
3663            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
3664            do l=1,nlay
3665               do ig=1,ngrid
3666                  zsortie(ig,l)=larg_part(ig,k,l)
3667               enddo
3668            enddo
3669            str10='la'//str2
3670            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
3671         enddo
3672
3673
3674c     print*,'18 OK convect8'
3675c      endif
3676      print*,'Fin des wrgradsfi'
3677#endif
3678
3679      endif
3680
3681c     if(wa_moy(1,4).gt.1.e-10) stop
3682
3683c     print*,'19 OK convect8'
3684      return
3685      end
3686
3687      SUBROUTINE thermcell(ngrid,nlay,ptimestep
3688     s                  ,pplay,pplev,pphi
3689     s                  ,pu,pv,pt,po
3690     s                  ,pduadj,pdvadj,pdtadj,pdoadj
3691     s                  ,fm0,entr0
3692c    s                  ,pu_therm,pv_therm
3693     s                  ,r_aspect,l_mix,w2di,tho)
3694
3695      IMPLICIT NONE
3696
3697c=======================================================================
3698c
3699c   Calcul du transport verticale dans la couche limite en presence
3700c   de "thermiques" explicitement representes
3701c
3702c   Réécriture à partir d'un listing papier à Habas, le 14/02/00
3703c
3704c   le thermique est supposé homogène et dissipé par mélange avec
3705c   son environnement. la longueur l_mix contrôle l'efficacité du
3706c   mélange
3707c
3708c   Le calcul du transport des différentes espèces se fait en prenant
3709c   en compte:
3710c     1. un flux de masse montant
3711c     2. un flux de masse descendant
3712c     3. un entrainement
3713c     4. un detrainement
3714c
3715c=======================================================================
3716
3717c-----------------------------------------------------------------------
3718c   declarations:
3719c   -------------
3720
3721#include "dimensions.h"
3722#include "dimphy.h"
3723#include "YOMCST.h"
3724
3725c   arguments:
3726c   ----------
3727
3728      INTEGER ngrid,nlay,w2di,tho
3729      real ptimestep,l_mix,r_aspect
3730      REAL pt(ngrid,nlay),pdtadj(ngrid,nlay)
3731      REAL pu(ngrid,nlay),pduadj(ngrid,nlay)
3732      REAL pv(ngrid,nlay),pdvadj(ngrid,nlay)
3733      REAL po(ngrid,nlay),pdoadj(ngrid,nlay)
3734      REAL pplay(ngrid,nlay),pplev(ngrid,nlay+1)
3735      real pphi(ngrid,nlay)
3736
3737      integer idetr
3738      save idetr
3739      data idetr/3/
3740
3741c   local:
3742c   ------
3743
3744      INTEGER ig,k,l,lmaxa(klon),lmix(klon)
3745      real zsortie1d(klon)
3746c CR: on remplace lmax(klon,klev+1)
3747      INTEGER lmax(klon),lmin(klon),lentr(klon)
3748      real linter(klon)
3749      real zmix(klon), fracazmix(klon)
3750c RC
3751      real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz
3752
3753      real zlev(klon,klev+1),zlay(klon,klev)
3754      REAL zh(klon,klev),zdhadj(klon,klev)
3755      REAL ztv(klon,klev)
3756      real zu(klon,klev),zv(klon,klev),zo(klon,klev)
3757      REAL wh(klon,klev+1)
3758      real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1)
3759      real zla(klon,klev+1)
3760      real zwa(klon,klev+1)
3761      real zld(klon,klev+1)
3762      real zwd(klon,klev+1)
3763      real zsortie(klon,klev)
3764      real zva(klon,klev)
3765      real zua(klon,klev)
3766      real zoa(klon,klev)
3767
3768      real zha(klon,klev)
3769      real wa_moy(klon,klev+1)
3770      real fraca(klon,klev+1)
3771      real fracc(klon,klev+1)
3772      real zf,zf2
3773      real thetath2(klon,klev),wth2(klon,klev)
3774      common/comtherm/thetath2,wth2
3775
3776      real count_time
3777      integer isplit,nsplit,ialt
3778      parameter (nsplit=10)
3779      data isplit/0/
3780      save isplit
3781
3782      logical sorties
3783      real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev)
3784      real zpspsk(klon,klev)
3785
3786c     real wmax(klon,klev),wmaxa(klon)
3787      real wmax(klon),wmaxa(klon)
3788      real wa(klon,klev,klev+1)
3789      real wd(klon,klev+1)
3790      real larg_part(klon,klev,klev+1)
3791      real fracd(klon,klev+1)
3792      real xxx(klon,klev+1)
3793      real larg_cons(klon,klev+1)
3794      real larg_detr(klon,klev+1)
3795      real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev)
3796      real pu_therm(klon,klev),pv_therm(klon,klev)
3797      real fm(klon,klev+1),entr(klon,klev)
3798      real fmc(klon,klev+1)
3799
3800cCR:nouvelles variables
3801      real f_star(klon,klev+1),entr_star(klon,klev)
3802      real entr_star_tot(klon),entr_star2(klon)
3803      real f(klon), f0(klon)
3804      real zlevinter(klon)
3805      logical first
3806      data first /.false./
3807      save first
3808cRC
3809
3810      character*2 str2
3811      character*10 str10
3812
3813      LOGICAL vtest(klon),down
3814
3815      EXTERNAL SCOPY
3816
3817      integer ncorrec,ll
3818      save ncorrec
3819      data ncorrec/0/
3820     
3821c
3822c-----------------------------------------------------------------------
3823c   initialisation:
3824c   ---------------
3825c
3826       sorties=.true.
3827      IF(ngrid.NE.klon) THEN
3828         PRINT*
3829         PRINT*,'STOP dans convadj'
3830         PRINT*,'ngrid    =',ngrid
3831         PRINT*,'klon  =',klon
3832      ENDIF
3833c
3834c-----------------------------------------------------------------------
3835c   incrementation eventuelle de tendances precedentes:
3836c   ---------------------------------------------------
3837
3838       print*,'0 OK convect8'
3839
3840      DO 1010 l=1,nlay
3841         DO 1015 ig=1,ngrid
3842            zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA
3843            zh(ig,l)=pt(ig,l)/zpspsk(ig,l)
3844            zu(ig,l)=pu(ig,l)
3845            zv(ig,l)=pv(ig,l)
3846            zo(ig,l)=po(ig,l)
3847            ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l))
38481015     CONTINUE
38491010  CONTINUE
3850
3851       print*,'1 OK convect8'
3852c                       --------------------
3853c
3854c
3855c                       + + + + + + + + + + +
3856c
3857c
3858c  wa, fraca, wd, fracd --------------------   zlev(2), rhobarz
3859c  wh,wt,wo ...
3860c
3861c                       + + + + + + + + + + +  zh,zu,zv,zo,rho
3862c
3863c
3864c                       --------------------   zlev(1)
3865c                       \\\\\\\\\\\\\\\\\\\\
3866c
3867c
3868
3869c-----------------------------------------------------------------------
3870c   Calcul des altitudes des couches
3871c-----------------------------------------------------------------------
3872
3873      do l=2,nlay
3874         do ig=1,ngrid
3875            zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG
3876         enddo
3877      enddo
3878      do ig=1,ngrid
3879         zlev(ig,1)=0.
3880         zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG
3881      enddo
3882      do l=1,nlay
3883         do ig=1,ngrid
3884            zlay(ig,l)=pphi(ig,l)/RG
3885         enddo
3886      enddo
3887
3888c      print*,'2 OK convect8'
3889c-----------------------------------------------------------------------
3890c   Calcul des densites
3891c-----------------------------------------------------------------------
3892
3893      do l=1,nlay
3894         do ig=1,ngrid
3895            rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l))
3896         enddo
3897      enddo
3898
3899      do l=2,nlay
3900         do ig=1,ngrid
3901            rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1))
3902         enddo
3903      enddo
3904
3905      do k=1,nlay
3906         do l=1,nlay+1
3907            do ig=1,ngrid
3908               wa(ig,k,l)=0.
3909            enddo
3910         enddo
3911      enddo
3912
3913c      print*,'3 OK convect8'
3914c------------------------------------------------------------------
3915c   Calcul de w2, quarre de w a partir de la cape
3916c   a partir de w2, on calcule wa, vitesse de l'ascendance
3917c
3918c   ATTENTION: Dans cette version, pour cause d'economie de memoire,
3919c   w2 est stoke dans wa
3920c
3921c   ATTENTION: dans convect8, on n'utilise le calcule des wa
3922c   independants par couches que pour calculer l'entrainement
3923c   a la base et la hauteur max de l'ascendance.
3924c
3925c   Indicages:
3926c   l'ascendance provenant du niveau k traverse l'interface l avec
3927c   une vitesse wa(k,l).
3928c
3929c                       --------------------
3930c
3931c                       + + + + + + + + + +
3932c
3933c  wa(k,l)   ----       --------------------    l
3934c             /\
3935c            /||\       + + + + + + + + + +
3936c             ||
3937c             ||        --------------------
3938c             ||
3939c             ||        + + + + + + + + + +
3940c             ||
3941c             ||        --------------------
3942c             ||__
3943c             |___      + + + + + + + + + +     k
3944c
3945c                       --------------------
3946c
3947c
3948c
3949c------------------------------------------------------------------
3950
3951cCR: ponderation entrainement des couches instables
3952cdef des entr_star tels que entr=f*entr_star     
3953      do l=1,klev
3954         do ig=1,ngrid
3955            entr_star(ig,l)=0.
3956         enddo
3957      enddo
3958c determination de la longueur de la couche d entrainement
3959      do ig=1,ngrid
3960         lentr(ig)=1
3961      enddo
3962
3963con ne considere que les premieres couches instables
3964      do k=nlay-2,1,-1
3965         do ig=1,ngrid
3966            if (ztv(ig,k).gt.ztv(ig,k+1).and.
3967     s          ztv(ig,k+1).le.ztv(ig,k+2)) then
3968               lentr(ig)=k
3969            endif
3970          enddo
3971      enddo
3972   
3973c determination du lmin: couche d ou provient le thermique
3974      do ig=1,ngrid
3975         lmin(ig)=1
3976      enddo
3977      do ig=1,ngrid
3978         do l=nlay,2,-1
3979            if (ztv(ig,l-1).gt.ztv(ig,l)) then
3980               lmin(ig)=l-1
3981            endif
3982         enddo
3983      enddo
3984c
3985c definition de l'entrainement des couches
3986      do l=1,klev-1
3987         do ig=1,ngrid
3988            if (ztv(ig,l).gt.ztv(ig,l+1).and.
3989     s          l.ge.lmin(ig).and.l.le.lentr(ig)) then
3990                 entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))*
3991     s                           (zlev(ig,l+1)-zlev(ig,l))
3992            endif
3993         enddo
3994      enddo
3995c pas de thermique si couches 1->5 stables
3996      do ig=1,ngrid
3997         if (lmin(ig).gt.5) then
3998            do l=1,klev
3999               entr_star(ig,l)=0.
4000            enddo
4001         endif
4002      enddo
4003c calcul de l entrainement total
4004      do ig=1,ngrid
4005         entr_star_tot(ig)=0.
4006      enddo
4007      do ig=1,ngrid
4008         do k=1,klev
4009            entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,k)
4010         enddo
4011      enddo
4012c
4013      print*,'fin calcul entr_star'
4014      do k=1,klev
4015         do ig=1,ngrid
4016            ztva(ig,k)=ztv(ig,k)
4017         enddo
4018      enddo
4019cRC
4020c      print*,'7 OK convect8'
4021      do k=1,klev+1
4022         do ig=1,ngrid
4023            zw2(ig,k)=0.
4024            fmc(ig,k)=0.
4025cCR
4026            f_star(ig,k)=0.
4027cRC
4028            larg_cons(ig,k)=0.
4029            larg_detr(ig,k)=0.
4030            wa_moy(ig,k)=0.
4031         enddo
4032      enddo
4033
4034c      print*,'8 OK convect8'
4035      do ig=1,ngrid
4036         linter(ig)=1.
4037         lmaxa(ig)=1
4038         lmix(ig)=1
4039         wmaxa(ig)=0.
4040      enddo
4041
4042cCR:
4043      do l=1,nlay-2
4044         do ig=1,ngrid
4045            if (ztv(ig,l).gt.ztv(ig,l+1)
4046     s         .and.entr_star(ig,l).gt.1.e-10
4047     s         .and.zw2(ig,l).lt.1e-10) then
4048               f_star(ig,l+1)=entr_star(ig,l)
4049ctest:calcul de dteta
4050               zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1)
4051     s                     *(zlev(ig,l+1)-zlev(ig,l))
4052     s                     *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l))
4053               larg_detr(ig,l)=0.
4054            else if ((zw2(ig,l).ge.1e-10).and.
4055     s               (f_star(ig,l)+entr_star(ig,l).gt.1.e-10)) then
4056               f_star(ig,l+1)=f_star(ig,l)+entr_star(ig,l)
4057               ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)
4058     s                    *ztv(ig,l))/f_star(ig,l+1)
4059               zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+
4060     s                     2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)
4061     s                     *(zlev(ig,l+1)-zlev(ig,l))
4062            endif
4063c determination de zmax continu par interpolation lineaire
4064            if (zw2(ig,l+1).lt.0.) then
4065ctest
4066               if (abs(zw2(ig,l+1)-zw2(ig,l)).lt.1e-10) then
4067                  print*,'pb linter'
4068               endif
4069               linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l))
4070     s           -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
4071               zw2(ig,l+1)=0.
4072               lmaxa(ig)=l
4073            else
4074               if (zw2(ig,l+1).lt.0.) then
4075                  print*,'pb1 zw2<0'
4076               endif
4077               wa_moy(ig,l+1)=sqrt(zw2(ig,l+1))
4078            endif
4079            if (wa_moy(ig,l+1).gt.wmaxa(ig)) then
4080c   lmix est le niveau de la couche ou w (wa_moy) est maximum
4081               lmix(ig)=l+1
4082               wmaxa(ig)=wa_moy(ig,l+1)
4083            endif
4084         enddo
4085      enddo
4086      print*,'fin calcul zw2'
4087c
4088c Calcul de la couche correspondant a la hauteur du thermique
4089      do ig=1,ngrid
4090         lmax(ig)=lentr(ig)
4091      enddo
4092      do ig=1,ngrid
4093         do l=nlay,lentr(ig)+1,-1
4094            if (zw2(ig,l).le.1.e-10) then
4095               lmax(ig)=l-1
4096            endif
4097         enddo
4098      enddo
4099c pas de thermique si couches 1->5 stables
4100      do ig=1,ngrid
4101         if (lmin(ig).gt.5) then
4102            lmax(ig)=1
4103            lmin(ig)=1
4104         endif
4105      enddo
4106c   
4107c Determination de zw2 max
4108      do ig=1,ngrid
4109         wmax(ig)=0.
4110      enddo
4111
4112      do l=1,nlay
4113         do ig=1,ngrid
4114            if (l.le.lmax(ig)) then
4115                if (zw2(ig,l).lt.0.)then
4116                  print*,'pb2 zw2<0'
4117                endif
4118                zw2(ig,l)=sqrt(zw2(ig,l))
4119                wmax(ig)=max(wmax(ig),zw2(ig,l))
4120            else
4121                 zw2(ig,l)=0.
4122            endif
4123          enddo
4124      enddo
4125
4126c   Longueur caracteristique correspondant a la hauteur des thermiques.
4127      do  ig=1,ngrid
4128         zmax(ig)=0.
4129         zlevinter(ig)=zlev(ig,1)
4130      enddo
4131      do  ig=1,ngrid
4132c calcul de zlevinter
4133          zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
4134     s    linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
4135     s    -zlev(ig,lmax(ig)))
4136       zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
4137      enddo
4138
4139      print*,'avant fermeture'
4140c Fermeture,determination de f
4141      do ig=1,ngrid
4142         entr_star2(ig)=0.
4143      enddo
4144      do ig=1,ngrid
4145         if (entr_star_tot(ig).LT.1.e-10) then
4146            f(ig)=0.
4147         else
4148             do k=lmin(ig),lentr(ig)
4149                entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2
4150     s                    /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)))
4151             enddo
4152c Nouvelle fermeture
4153             f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect
4154     s             *entr_star2(ig))*entr_star_tot(ig)
4155ctest
4156c             if (first) then
4157c             f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)
4158c     s             *wmax(ig))
4159c             endif
4160         endif
4161c         f0(ig)=f(ig)
4162c         first=.true.
4163      enddo
4164      print*,'apres fermeture'
4165
4166c Calcul de l'entrainement
4167       do k=1,klev
4168         do ig=1,ngrid
4169            entr(ig,k)=f(ig)*entr_star(ig,k)
4170         enddo
4171      enddo
4172c Calcul des flux
4173      do ig=1,ngrid
4174         do l=1,lmax(ig)-1
4175            fmc(ig,l+1)=fmc(ig,l)+entr(ig,l)
4176         enddo
4177      enddo
4178
4179cRC
4180
4181
4182c      print*,'9 OK convect8'
4183c     print*,'WA1 ',wa_moy
4184
4185c   determination de l'indice du debut de la mixed layer ou w decroit
4186
4187c   calcul de la largeur de chaque ascendance dans le cas conservatif.
4188c   dans ce cas simple, on suppose que la largeur de l'ascendance provenant
4189c   d'une couche est égale à la hauteur de la couche alimentante.
4190c   La vitesse maximale dans l'ascendance est aussi prise comme estimation
4191c   de la vitesse d'entrainement horizontal dans la couche alimentante.
4192
4193      do l=2,nlay
4194         do ig=1,ngrid
4195            if (l.le.lmaxa(ig)) then
4196               zw=max(wa_moy(ig,l),1.e-10)
4197               larg_cons(ig,l)=zmax(ig)*r_aspect
4198     s         *fmc(ig,l)/(rhobarz(ig,l)*zw)
4199            endif
4200         enddo
4201      enddo
4202
4203      do l=2,nlay
4204         do ig=1,ngrid
4205            if (l.le.lmaxa(ig)) then
4206c              if (idetr.eq.0) then
4207c  cette option est finalement en dur.
4208                  if ((l_mix*zlev(ig,l)).lt.0.)then
4209                   print*,'pb l_mix*zlev<0'
4210                  endif
4211                  larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
4212c              else if (idetr.eq.1) then
4213c                 larg_detr(ig,l)=larg_cons(ig,l)
4214c    s            *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig))
4215c              else if (idetr.eq.2) then
4216c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
4217c    s            *sqrt(wa_moy(ig,l))
4218c              else if (idetr.eq.4) then
4219c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
4220c    s            *wa_moy(ig,l)
4221c              endif
4222            endif
4223         enddo
4224       enddo
4225
4226c      print*,'10 OK convect8'
4227c     print*,'WA2 ',wa_moy
4228c   calcul de la fraction de la maille concernée par l'ascendance en tenant
4229c   compte de l'epluchage du thermique.
4230c
4231cCR def de  zmix continu (profil parabolique des vitesses)
4232      do ig=1,ngrid
4233           if (lmix(ig).gt.1.) then
4234c test
4235              if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
4236     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
4237     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
4238     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
4239     s        then
4240c             
4241            zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
4242     s        *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
4243     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
4244     s        *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
4245     s        /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
4246     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
4247     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
4248     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
4249            else
4250            zmix(ig)=zlev(ig,lmix(ig))
4251            print*,'pb zmix'
4252            endif
4253         else
4254         zmix(ig)=0.
4255         endif
4256ctest
4257         if ((zmax(ig)-zmix(ig)).lt.0.) then
4258            zmix(ig)=0.99*zmax(ig)
4259c            print*,'pb zmix>zmax'
4260         endif
4261      enddo
4262c
4263c calcul du nouveau lmix correspondant
4264      do ig=1,ngrid
4265         do l=1,klev
4266            if (zmix(ig).ge.zlev(ig,l).and.
4267     s          zmix(ig).lt.zlev(ig,l+1)) then
4268              lmix(ig)=l
4269             endif
4270          enddo
4271      enddo
4272c
4273      do l=2,nlay
4274         do ig=1,ngrid
4275            if(larg_cons(ig,l).gt.1.) then
4276c     print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),'  KKK'
4277               fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l))
4278     s            /(r_aspect*zmax(ig))
4279c test
4280               fraca(ig,l)=max(fraca(ig,l),0.)
4281               fraca(ig,l)=min(fraca(ig,l),0.5)
4282               fracd(ig,l)=1.-fraca(ig,l)
4283               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
4284            else
4285c              wa_moy(ig,l)=0.
4286               fraca(ig,l)=0.
4287               fracc(ig,l)=0.
4288               fracd(ig,l)=1.
4289            endif
4290         enddo
4291      enddo                 
4292cCR: calcul de fracazmix
4293       do ig=1,ngrid
4294          fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/
4295     s     (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig)
4296     s    +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1)
4297     s    -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
4298       enddo
4299c
4300       do l=2,nlay
4301          do ig=1,ngrid
4302             if(larg_cons(ig,l).gt.1.) then
4303               if (l.gt.lmix(ig)) then
4304ctest
4305                 if (zmax(ig)-zmix(ig).lt.1.e-10) then
4306c                   print*,'pb xxx'
4307                   xxx(ig,l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig))
4308                 else
4309                 xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig))
4310                 endif
4311           if (idetr.eq.0) then
4312               fraca(ig,l)=fracazmix(ig)
4313           else if (idetr.eq.1) then
4314               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)
4315           else if (idetr.eq.2) then
4316               fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2)
4317           else
4318               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2
4319           endif
4320c     print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL'
4321               fraca(ig,l)=max(fraca(ig,l),0.)
4322               fraca(ig,l)=min(fraca(ig,l),0.5)
4323               fracd(ig,l)=1.-fraca(ig,l)
4324               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
4325             endif
4326            endif
4327         enddo
4328      enddo
4329     
4330      print*,'fin calcul fraca'
4331c      print*,'11 OK convect8'
4332c     print*,'Ea3 ',wa_moy
4333c------------------------------------------------------------------
4334c   Calcul de fracd, wd
4335c   somme wa - wd = 0
4336c------------------------------------------------------------------
4337
4338
4339      do ig=1,ngrid
4340         fm(ig,1)=0.
4341         fm(ig,nlay+1)=0.
4342      enddo
4343
4344      do l=2,nlay
4345           do ig=1,ngrid
4346              fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l)
4347cCR:test
4348              if (entr(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1)
4349     s            .and.l.gt.lmix(ig)) then
4350                 fm(ig,l)=fm(ig,l-1)
4351c                 write(1,*)'ajustement fm, l',l
4352              endif
4353c              write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l)
4354cRC
4355           enddo
4356         do ig=1,ngrid
4357            if(fracd(ig,l).lt.0.1) then
4358               stop'fracd trop petit'
4359            else
4360c    vitesse descendante "diagnostique"
4361               wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l))
4362            endif
4363         enddo
4364      enddo
4365
4366      do l=1,nlay
4367         do ig=1,ngrid
4368c           masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
4369            masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG
4370         enddo
4371      enddo
4372
4373      print*,'12 OK convect8'
4374c     print*,'WA4 ',wa_moy
4375cc------------------------------------------------------------------
4376c   calcul du transport vertical
4377c------------------------------------------------------------------
4378
4379      go to 4444
4380c     print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep
4381      do l=2,nlay-1
4382         do ig=1,ngrid
4383            if(fm(ig,l+1)*ptimestep.gt.masse(ig,l)
4384     s      .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then
4385c     print*,'WARN!!! FM>M ig=',ig,' l=',l,'  FM='
4386c    s         ,fm(ig,l+1)*ptimestep
4387c    s         ,'   M=',masse(ig,l),masse(ig,l+1)
4388             endif
4389         enddo
4390      enddo
4391
4392      do l=1,nlay
4393         do ig=1,ngrid
4394            if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then
4395c     print*,'WARN!!! E>M ig=',ig,' l=',l,'  E=='
4396c    s         ,entr(ig,l)*ptimestep
4397c    s         ,'   M=',masse(ig,l)
4398             endif
4399         enddo
4400      enddo
4401
4402      do l=1,nlay
4403         do ig=1,ngrid
4404            if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then
4405c     print*,'WARN!!! fm exagere ig=',ig,'   l=',l
4406c    s         ,'   FM=',fm(ig,l)
4407            endif
4408            if(.not.masse(ig,l).ge.1.e-10
4409     s         .or..not.masse(ig,l).le.1.e4) then
4410c     print*,'WARN!!! masse exagere ig=',ig,'   l=',l
4411c    s         ,'   M=',masse(ig,l)
4412c     print*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)',
4413c    s                 rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)
4414c     print*,'zlev(ig,l+1),zlev(ig,l)'
4415c    s                ,zlev(ig,l+1),zlev(ig,l)
4416c     print*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)'
4417c    s                ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)
4418            endif
4419            if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then
4420c     print*,'WARN!!! entr exagere ig=',ig,'   l=',l
4421c    s         ,'   E=',entr(ig,l)
4422            endif
4423         enddo
4424      enddo
4425
44264444   continue
4427
4428cCR:redefinition du entr
4429       do l=1,nlay
4430         do ig=1,ngrid
4431            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
4432            if (detr(ig,l).lt.0.) then
4433                entr(ig,l)=entr(ig,l)-detr(ig,l)
4434                detr(ig,l)=0.
4435c     print*,'WARNING !!! detrainement negatif ',ig,l
4436            endif
4437         enddo
4438      enddo
4439cRC
4440      if (w2di.eq.1) then
4441         fm0=fm0+ptimestep*(fm-fm0)/float(tho)
4442         entr0=entr0+ptimestep*(entr-entr0)/float(tho)
4443      else
4444         fm0=fm
4445         entr0=entr
4446      endif
4447
4448      if (1.eq.1) then
4449         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
4450     .    ,zh,zdhadj,zha)
4451         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
4452     .    ,zo,pdoadj,zoa)
4453      else
4454         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
4455     .    ,zh,zdhadj,zha)
4456         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
4457     .    ,zo,pdoadj,zoa)
4458      endif
4459
4460      if (1.eq.0) then
4461         call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse
4462     .    ,fraca,zmax
4463     .    ,zu,zv,pduadj,pdvadj,zua,zva)
4464      else
4465         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
4466     .    ,zu,pduadj,zua)
4467         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
4468     .    ,zv,pdvadj,zva)
4469      endif
4470
4471      do l=1,nlay
4472         do ig=1,ngrid
4473            zf=0.5*(fracc(ig,l)+fracc(ig,l+1))
4474            zf2=zf/(1.-zf)
4475            thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2
4476            wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
4477         enddo
4478      enddo
4479
4480
4481
4482c     print*,'13 OK convect8'
4483c     print*,'WA5 ',wa_moy
4484      do l=1,nlay
4485         do ig=1,ngrid
4486            pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l)
4487         enddo
4488      enddo
4489
4490
4491c     do l=1,nlay
4492c        do ig=1,ngrid
4493c           if(abs(pdtadj(ig,l))*86400..gt.500.) then
4494c     print*,'WARN!!! ig=',ig,'  l=',l
4495c    s         ,'   pdtadj=',pdtadj(ig,l)
4496c           endif
4497c           if(abs(pdoadj(ig,l))*86400..gt.1.) then
4498c     print*,'WARN!!! ig=',ig,'  l=',l
4499c    s         ,'   pdoadj=',pdoadj(ig,l)
4500c           endif
4501c        enddo
4502c      enddo
4503
4504      print*,'14 OK convect8'
4505c------------------------------------------------------------------
4506c   Calculs pour les sorties
4507c------------------------------------------------------------------
4508
4509      if(sorties) then
4510      do l=1,nlay
4511         do ig=1,ngrid
4512            zla(ig,l)=(1.-fracd(ig,l))*zmax(ig)
4513            zld(ig,l)=fracd(ig,l)*zmax(ig)
4514            if(1.-fracd(ig,l).gt.1.e-10)
4515     s      zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l))
4516         enddo
4517      enddo
4518
4519cdeja fait
4520c      do l=1,nlay
4521c         do ig=1,ngrid
4522c            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
4523c            if (detr(ig,l).lt.0.) then
4524c                entr(ig,l)=entr(ig,l)-detr(ig,l)
4525c                detr(ig,l)=0.
4526c     print*,'WARNING !!! detrainement negatif ',ig,l
4527c            endif
4528c         enddo
4529c      enddo
4530
4531c     print*,'15 OK convect8'
4532
4533      isplit=isplit+1
4534
4535
4536c #define und
4537        goto 123
4538#ifdef und
4539      CALL writeg1d(1,nlay,wd,'wd      ','wd      ')
4540      CALL writeg1d(1,nlay,zwa,'wa      ','wa      ')
4541      CALL writeg1d(1,nlay,fracd,'fracd      ','fracd      ')
4542      CALL writeg1d(1,nlay,fraca,'fraca      ','fraca      ')
4543      CALL writeg1d(1,nlay,wa_moy,'wam         ','wam         ')
4544      CALL writeg1d(1,nlay,zla,'la      ','la      ')
4545      CALL writeg1d(1,nlay,zld,'ld      ','ld      ')
4546      CALL writeg1d(1,nlay,pt,'pt      ','pt      ')
4547      CALL writeg1d(1,nlay,zh,'zh      ','zh      ')
4548      CALL writeg1d(1,nlay,zha,'zha      ','zha      ')
4549      CALL writeg1d(1,nlay,zu,'zu      ','zu      ')
4550      CALL writeg1d(1,nlay,zv,'zv      ','zv      ')
4551      CALL writeg1d(1,nlay,zo,'zo      ','zo      ')
4552      CALL writeg1d(1,nlay,wh,'wh      ','wh      ')
4553      CALL writeg1d(1,nlay,wu,'wu      ','wu      ')
4554      CALL writeg1d(1,nlay,wv,'wv      ','wv      ')
4555      CALL writeg1d(1,nlay,wo,'w15uo     ','wXo     ')
4556      CALL writeg1d(1,nlay,zdhadj,'zdhadj      ','zdhadj      ')
4557      CALL writeg1d(1,nlay,pduadj,'pduadj      ','pduadj      ')
4558      CALL writeg1d(1,nlay,pdvadj,'pdvadj      ','pdvadj      ')
4559      CALL writeg1d(1,nlay,pdoadj,'pdoadj      ','pdoadj      ')
4560      CALL writeg1d(1,nlay,entr  ,'entr        ','entr        ')
4561      CALL writeg1d(1,nlay,detr  ,'detr        ','detr        ')
4562      CALL writeg1d(1,nlay,fm    ,'fm          ','fm          ')
4563
4564      CALL writeg1d(1,nlay,pdtadj,'pdtadj    ','pdtadj    ')
4565      CALL writeg1d(1,nlay,pplay,'pplay     ','pplay     ')
4566      CALL writeg1d(1,nlay,pplev,'pplev     ','pplev     ')
4567
4568c   recalcul des flux en diagnostique...
4569c     print*,'PAS DE TEMPS ',ptimestep
4570       call dt2F(pplev,pplay,pt,pdtadj,wh)
4571      CALL writeg1d(1,nlay,wh,'wh2     ','wh2     ')
4572#endif
4573123   continue
4574#define troisD
4575#ifdef troisD
4576c       if (sorties) then
4577      print*,'Debut des wrgradsfi'
4578
4579c      print*,'16 OK convect8'
4580         call wrgradsfi(1,nlay,wd,'wd        ','wd        ')
4581         call wrgradsfi(1,nlay,zwa,'wa        ','wa        ')
4582         call wrgradsfi(1,nlay,fracd,'fracd     ','fracd     ')
4583         call wrgradsfi(1,nlay,fraca,'fraca     ','fraca     ')
4584         call wrgradsfi(1,nlay,xxx,'xxx       ','xxx       ')
4585         call wrgradsfi(1,nlay,wa_moy,'wam       ','wam       ')
4586c      print*,'WA6 ',wa_moy
4587         call wrgradsfi(1,nlay,zla,'la        ','la        ')
4588         call wrgradsfi(1,nlay,zld,'ld        ','ld        ')
4589         call wrgradsfi(1,nlay,pt,'pt        ','pt        ')
4590         call wrgradsfi(1,nlay,zh,'zh        ','zh        ')
4591         call wrgradsfi(1,nlay,zha,'zha        ','zha        ')
4592         call wrgradsfi(1,nlay,zua,'zua        ','zua        ')
4593         call wrgradsfi(1,nlay,zva,'zva        ','zva        ')
4594         call wrgradsfi(1,nlay,zu,'zu        ','zu        ')
4595         call wrgradsfi(1,nlay,zv,'zv        ','zv        ')
4596         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
4597         call wrgradsfi(1,nlay,wh,'wh        ','wh        ')
4598         call wrgradsfi(1,nlay,wu,'wu        ','wu        ')
4599         call wrgradsfi(1,nlay,wv,'wv        ','wv        ')
4600         call wrgradsfi(1,nlay,wo,'wo        ','wo        ')
4601         call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
4602         call wrgradsfi(1,nlay,zdhadj,'zdhadj    ','zdhadj    ')
4603         call wrgradsfi(1,nlay,pduadj,'pduadj    ','pduadj    ')
4604         call wrgradsfi(1,nlay,pdvadj,'pdvadj    ','pdvadj    ')
4605         call wrgradsfi(1,nlay,pdoadj,'pdoadj    ','pdoadj    ')
4606         call wrgradsfi(1,nlay,entr,'entr      ','entr      ')
4607         call wrgradsfi(1,nlay,detr,'detr      ','detr      ')
4608         call wrgradsfi(1,nlay,fm,'fm        ','fm        ')
4609         call wrgradsfi(1,nlay,fmc,'fmc       ','fmc       ')
4610         call wrgradsfi(1,nlay,zw2,'zw2       ','zw2       ')
4611         call wrgradsfi(1,nlay,ztva,'ztva      ','ztva      ')
4612         call wrgradsfi(1,nlay,ztv,'ztv       ','ztv       ')
4613
4614         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
4615         call wrgradsfi(1,nlay,larg_cons,'Lc        ','Lc        ')
4616         call wrgradsfi(1,nlay,larg_detr,'Ldetr     ','Ldetr     ')
4617
4618cCR:nouveaux diagnostiques
4619      call wrgradsfi(1,nlay,entr_star  ,'entr_star   ','entr_star   ')     
4620      call wrgradsfi(1,nlay,f_star    ,'f_star   ','f_star   ')
4621      call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
4622      call wrgradsfi(1,1,zmix,'zmix      ','zmix      ')
4623      zsortie1d(:)=lmax(:)
4624      call wrgradsfi(1,1,zsortie1d,'lmax      ','lmax      ')
4625      call wrgradsfi(1,1,wmax,'wmax      ','wmax      ')
4626      zsortie1d(:)=lmix(:)
4627      call wrgradsfi(1,1,zsortie1d,'lmix      ','lmix      ')
4628      zsortie1d(:)=lentr(:)
4629      call wrgradsfi(1,1,zsortie1d,'lentr      ','lentr     ')
4630
4631c      print*,'17 OK convect8'
4632
4633         do k=1,klev/10
4634            write(str2,'(i2.2)') k
4635            str10='wa'//str2
4636            do l=1,nlay
4637               do ig=1,ngrid
4638                  zsortie(ig,l)=wa(ig,k,l)
4639               enddo
4640            enddo   
4641            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
4642            do l=1,nlay
4643               do ig=1,ngrid
4644                  zsortie(ig,l)=larg_part(ig,k,l)
4645               enddo
4646            enddo
4647            str10='la'//str2
4648            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
4649         enddo
4650
4651
4652c     print*,'18 OK convect8'
4653c      endif
4654      print*,'Fin des wrgradsfi'
4655#endif
4656
4657      endif
4658
4659c     if(wa_moy(1,4).gt.1.e-10) stop
4660
4661      print*,'19 OK convect8'
4662      return
4663      end
4664
4665      subroutine dqthermcell(ngrid,nlay,ptimestep,fm,entr,
4666     .           masse,q,dq,qa)
4667      implicit none
4668
4669c=======================================================================
4670c
4671c   Calcul du transport verticale dans la couche limite en presence
4672c   de "thermiques" explicitement representes
4673c   calcul du dq/dt une fois qu'on connait les ascendances
4674c
4675c=======================================================================
4676
4677#include "dimensions.h"
4678#include "dimphy.h"
4679
4680      integer ngrid,nlay
4681
4682      real ptimestep
4683      real masse(ngrid,nlay),fm(ngrid,nlay+1)
4684      real entr(ngrid,nlay)
4685      real q(ngrid,nlay)
4686      real dq(ngrid,nlay)
4687
4688      real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1)
4689
4690      integer ig,k
4691
4692c   calcul du detrainement
4693
4694      do k=1,nlay
4695         do ig=1,ngrid
4696            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
4697ctest
4698            if (detr(ig,k).lt.0.) then
4699               entr(ig,k)=entr(ig,k)-detr(ig,k)
4700               detr(ig,k)=0.
4701c               print*,'detr2<0!!!','ig=',ig,'k=',k,'f=',fm(ig,k),
4702c     s         'f+1=',fm(ig,k+1),'e=',entr(ig,k),'d=',detr(ig,k)
4703            endif
4704            if (fm(ig,k+1).lt.0.) then
4705c               print*,'fm2<0!!!'
4706            endif
4707            if (entr(ig,k).lt.0.) then
4708c               print*,'entr2<0!!!'
4709            endif
4710         enddo
4711      enddo
4712
4713c   calcul de la valeur dans les ascendances
4714      do ig=1,ngrid
4715         qa(ig,1)=q(ig,1)
4716      enddo
4717
4718      do k=2,nlay
4719         do ig=1,ngrid
4720            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
4721     s         1.e-5*masse(ig,k)) then
4722         qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k))
4723     s         /(fm(ig,k+1)+detr(ig,k))
4724            else
4725               qa(ig,k)=q(ig,k)
4726            endif
4727            if (qa(ig,k).lt.0.) then
4728c               print*,'qa<0!!!'
4729            endif
4730            if (q(ig,k).lt.0.) then
4731c               print*,'q<0!!!'
4732            endif
4733         enddo
4734      enddo
4735
4736      do k=2,nlay
4737         do ig=1,ngrid
4738c             wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k))
4739            wqd(ig,k)=fm(ig,k)*q(ig,k)
4740            if (wqd(ig,k).lt.0.) then
4741c               print*,'wqd<0!!!'
4742            endif
4743         enddo
4744      enddo
4745      do ig=1,ngrid
4746         wqd(ig,1)=0.
4747         wqd(ig,nlay+1)=0.
4748      enddo
4749     
4750      do k=1,nlay
4751         do ig=1,ngrid
4752            dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k)
4753     s               -wqd(ig,k)+wqd(ig,k+1))
4754     s               /masse(ig,k)
4755c            if (dq(ig,k).lt.0.) then
4756c               print*,'dq<0!!!'
4757c            endif
4758         enddo
4759      enddo
4760
4761      return
4762      end
4763      subroutine dvthermcell(ngrid,nlay,ptimestep,fm,entr,masse
4764     .    ,fraca,larga
4765     .    ,u,v,du,dv,ua,va)
4766      implicit none
4767
4768c=======================================================================
4769c
4770c   Calcul du transport verticale dans la couche limite en presence
4771c   de "thermiques" explicitement representes
4772c   calcul du dq/dt une fois qu'on connait les ascendances
4773c
4774c=======================================================================
4775
4776#include "dimensions.h"
4777#include "dimphy.h"
4778
4779      integer ngrid,nlay
4780
4781      real ptimestep
4782      real masse(ngrid,nlay),fm(ngrid,nlay+1)
4783      real fraca(ngrid,nlay+1)
4784      real larga(ngrid)
4785      real entr(ngrid,nlay)
4786      real u(ngrid,nlay)
4787      real ua(ngrid,nlay)
4788      real du(ngrid,nlay)
4789      real v(ngrid,nlay)
4790      real va(ngrid,nlay)
4791      real dv(ngrid,nlay)
4792
4793      real qa(klon,klev),detr(klon,klev)
4794      real wvd(klon,klev+1),wud(klon,klev+1)
4795      real gamma0,gamma(klon,klev+1)
4796      real dua,dva
4797      integer iter
4798
4799      integer ig,k
4800
4801c   calcul du detrainement
4802
4803      do k=1,nlay
4804         do ig=1,ngrid
4805            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
4806         enddo
4807      enddo
4808
4809c   calcul de la valeur dans les ascendances
4810      do ig=1,ngrid
4811         ua(ig,1)=u(ig,1)
4812         va(ig,1)=v(ig,1)
4813      enddo
4814
4815      do k=2,nlay
4816         do ig=1,ngrid
4817            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
4818     s         1.e-5*masse(ig,k)) then
4819c   On itère sur la valeur du coeff de freinage.
4820c              gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))
4821               gamma0=masse(ig,k)
4822     s         *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )
4823     s         *0.5/larga(ig)
4824c              gamma0=0.
4825c   la première fois on multiplie le coefficient de freinage
4826c   par le module du vent dans la couche en dessous.
4827               dua=ua(ig,k-1)-u(ig,k-1)
4828               dva=va(ig,k-1)-v(ig,k-1)
4829               do iter=1,5
4830                  gamma(ig,k)=gamma0*sqrt(dua**2+dva**2)
4831                  ua(ig,k)=(fm(ig,k)*ua(ig,k-1)
4832     s               +(entr(ig,k)+gamma(ig,k))*u(ig,k))
4833     s               /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k))
4834                  va(ig,k)=(fm(ig,k)*va(ig,k-1)
4835     s               +(entr(ig,k)+gamma(ig,k))*v(ig,k))
4836     s               /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k))
4837c                 print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva
4838                  dua=ua(ig,k)-u(ig,k)
4839                  dva=va(ig,k)-v(ig,k)
4840               enddo
4841            else
4842               ua(ig,k)=u(ig,k)
4843               va(ig,k)=v(ig,k)
4844               gamma(ig,k)=0.
4845            endif
4846         enddo
4847      enddo
4848
4849      do k=2,nlay
4850         do ig=1,ngrid
4851            wud(ig,k)=fm(ig,k)*u(ig,k)
4852            wvd(ig,k)=fm(ig,k)*v(ig,k)
4853         enddo
4854      enddo
4855      do ig=1,ngrid
4856         wud(ig,1)=0.
4857         wud(ig,nlay+1)=0.
4858         wvd(ig,1)=0.
4859         wvd(ig,nlay+1)=0.
4860      enddo
4861
4862      do k=1,nlay
4863         do ig=1,ngrid
4864            du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)
4865     s               -(entr(ig,k)+gamma(ig,k))*u(ig,k)
4866     s               -wud(ig,k)+wud(ig,k+1))
4867     s               /masse(ig,k)
4868            dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)
4869     s               -(entr(ig,k)+gamma(ig,k))*v(ig,k)
4870     s               -wvd(ig,k)+wvd(ig,k+1))
4871     s               /masse(ig,k)
4872         enddo
4873      enddo
4874
4875      return
4876      end
4877      subroutine dqthermcell2(ngrid,nlay,ptimestep,fm,entr,masse,frac
4878     .    ,q,dq,qa)
4879      implicit none
4880
4881c=======================================================================
4882c
4883c   Calcul du transport verticale dans la couche limite en presence
4884c   de "thermiques" explicitement representes
4885c   calcul du dq/dt une fois qu'on connait les ascendances
4886c
4887c=======================================================================
4888
4889#include "dimensions.h"
4890#include "dimphy.h"
4891
4892      integer ngrid,nlay
4893
4894      real ptimestep
4895      real masse(ngrid,nlay),fm(ngrid,nlay+1)
4896      real entr(ngrid,nlay),frac(ngrid,nlay)
4897      real q(ngrid,nlay)
4898      real dq(ngrid,nlay)
4899
4900      real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1)
4901      real qe(klon,klev),zf,zf2
4902
4903      integer ig,k
4904
4905c   calcul du detrainement
4906
4907      do k=1,nlay
4908         do ig=1,ngrid
4909            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
4910         enddo
4911      enddo
4912
4913c   calcul de la valeur dans les ascendances
4914      do ig=1,ngrid
4915         qa(ig,1)=q(ig,1)
4916         qe(ig,1)=q(ig,1)
4917      enddo
4918
4919      do k=2,nlay
4920         do ig=1,ngrid
4921            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
4922     s         1.e-5*masse(ig,k)) then
4923               zf=0.5*(frac(ig,k)+frac(ig,k+1))
4924               zf2=1./(1.-zf)
4925               qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k))
4926     s         /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2)
4927               qe(ig,k)=(q(ig,k)-zf*qa(ig,k))*zf2
4928            else
4929               qa(ig,k)=q(ig,k)
4930               qe(ig,k)=q(ig,k)
4931            endif
4932         enddo
4933      enddo
4934
4935      do k=2,nlay
4936         do ig=1,ngrid
4937c             wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k))
4938            wqd(ig,k)=fm(ig,k)*qe(ig,k)
4939         enddo
4940      enddo
4941      do ig=1,ngrid
4942         wqd(ig,1)=0.
4943         wqd(ig,nlay+1)=0.
4944      enddo
4945
4946      do k=1,nlay
4947         do ig=1,ngrid
4948            dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k)
4949     s               -wqd(ig,k)+wqd(ig,k+1))
4950     s               /masse(ig,k)
4951         enddo
4952      enddo
4953
4954      return
4955      end
4956      subroutine dvthermcell2(ngrid,nlay,ptimestep,fm,entr,masse
4957     .    ,fraca,larga
4958     .    ,u,v,du,dv,ua,va)
4959      implicit none
4960
4961c=======================================================================
4962c
4963c   Calcul du transport verticale dans la couche limite en presence
4964c   de "thermiques" explicitement representes
4965c   calcul du dq/dt une fois qu'on connait les ascendances
4966c
4967c=======================================================================
4968
4969#include "dimensions.h"
4970#include "dimphy.h"
4971
4972      integer ngrid,nlay
4973
4974      real ptimestep
4975      real masse(ngrid,nlay),fm(ngrid,nlay+1)
4976      real fraca(ngrid,nlay+1)
4977      real larga(ngrid)
4978      real entr(ngrid,nlay)
4979      real u(ngrid,nlay)
4980      real ua(ngrid,nlay)
4981      real du(ngrid,nlay)
4982      real v(ngrid,nlay)
4983      real va(ngrid,nlay)
4984      real dv(ngrid,nlay)
4985
4986      real qa(klon,klev),detr(klon,klev),zf,zf2
4987      real wvd(klon,klev+1),wud(klon,klev+1)
4988      real gamma0,gamma(klon,klev+1)
4989      real ue(klon,klev),ve(klon,klev)
4990      real dua,dva
4991      integer iter
4992
4993      integer ig,k
4994
4995c   calcul du detrainement
4996
4997      do k=1,nlay
4998         do ig=1,ngrid
4999            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
5000         enddo
5001      enddo
5002
5003c   calcul de la valeur dans les ascendances
5004      do ig=1,ngrid
5005         ua(ig,1)=u(ig,1)
5006         va(ig,1)=v(ig,1)
5007         ue(ig,1)=u(ig,1)
5008         ve(ig,1)=v(ig,1)
5009      enddo
5010
5011      do k=2,nlay
5012         do ig=1,ngrid
5013            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
5014     s         1.e-5*masse(ig,k)) then
5015c   On itère sur la valeur du coeff de freinage.
5016c              gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))
5017               gamma0=masse(ig,k)
5018     s         *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )
5019     s         *0.5/larga(ig)
5020     s         *1.
5021c    s         *0.5
5022c              gamma0=0.
5023               zf=0.5*(fraca(ig,k)+fraca(ig,k+1))
5024               zf=0.
5025               zf2=1./(1.-zf)
5026c   la première fois on multiplie le coefficient de freinage
5027c   par le module du vent dans la couche en dessous.
5028               dua=ua(ig,k-1)-u(ig,k-1)
5029               dva=va(ig,k-1)-v(ig,k-1)
5030               do iter=1,5
5031c   On choisit une relaxation lineaire.
5032                  gamma(ig,k)=gamma0
5033c   On choisit une relaxation quadratique.
5034                  gamma(ig,k)=gamma0*sqrt(dua**2+dva**2)
5035                  ua(ig,k)=(fm(ig,k)*ua(ig,k-1)
5036     s               +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k))
5037     s               /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2
5038     s                 +gamma(ig,k))
5039                  va(ig,k)=(fm(ig,k)*va(ig,k-1)
5040     s               +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k))
5041     s               /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2
5042     s                 +gamma(ig,k))
5043c                 print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva
5044                  dua=ua(ig,k)-u(ig,k)
5045                  dva=va(ig,k)-v(ig,k)
5046                  ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2
5047                  ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2
5048               enddo
5049            else
5050               ua(ig,k)=u(ig,k)
5051               va(ig,k)=v(ig,k)
5052               ue(ig,k)=u(ig,k)
5053               ve(ig,k)=v(ig,k)
5054               gamma(ig,k)=0.
5055            endif
5056         enddo
5057      enddo
5058
5059      do k=2,nlay
5060         do ig=1,ngrid
5061            wud(ig,k)=fm(ig,k)*ue(ig,k)
5062            wvd(ig,k)=fm(ig,k)*ve(ig,k)
5063         enddo
5064      enddo
5065      do ig=1,ngrid
5066         wud(ig,1)=0.
5067         wud(ig,nlay+1)=0.
5068         wvd(ig,1)=0.
5069         wvd(ig,nlay+1)=0.
5070      enddo
5071
5072      do k=1,nlay
5073         do ig=1,ngrid
5074            du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)
5075     s               -(entr(ig,k)+gamma(ig,k))*ue(ig,k)
5076     s               -wud(ig,k)+wud(ig,k+1))
5077     s               /masse(ig,k)
5078            dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)
5079     s               -(entr(ig,k)+gamma(ig,k))*ve(ig,k)
5080     s               -wvd(ig,k)+wvd(ig,k+1))
5081     s               /masse(ig,k)
5082         enddo
5083      enddo
5084
5085      return
5086      end
5087      SUBROUTINE thermcell_sec(ngrid,nlay,ptimestep
5088     s                  ,pplay,pplev,pphi,zlev
5089     s                  ,pu,pv,pt,po
5090     s                  ,pduadj,pdvadj,pdtadj,pdoadj
5091     s                  ,fm0,entr0
5092c    s                  ,pu_therm,pv_therm
5093     s                  ,r_aspect,l_mix,w2di,tho)
5094
5095      IMPLICIT NONE
5096
5097c=======================================================================
5098c
5099c   Calcul du transport verticale dans la couche limite en presence
5100c   de "thermiques" explicitement representes
5101c
5102c   Réécriture à partir d'un listing papier à Habas, le 14/02/00
5103c
5104c   le thermique est supposé homogène et dissipé par mélange avec
5105c   son environnement. la longueur l_mix contrôle l'efficacité du
5106c   mélange
5107c
5108c   Le calcul du transport des différentes espèces se fait en prenant
5109c   en compte:
5110c     1. un flux de masse montant
5111c     2. un flux de masse descendant
5112c     3. un entrainement
5113c     4. un detrainement
5114c
5115c=======================================================================
5116
5117c-----------------------------------------------------------------------
5118c   declarations:
5119c   -------------
5120
5121#include "dimensions.h"
5122#include "dimphy.h"
5123#include "YOMCST.h"
5124
5125c   arguments:
5126c   ----------
5127
5128      INTEGER ngrid,nlay,w2di,tho
5129      real ptimestep,l_mix,r_aspect
5130      REAL pt(ngrid,nlay),pdtadj(ngrid,nlay)
5131      REAL pu(ngrid,nlay),pduadj(ngrid,nlay)
5132      REAL pv(ngrid,nlay),pdvadj(ngrid,nlay)
5133      REAL po(ngrid,nlay),pdoadj(ngrid,nlay)
5134      REAL pplay(ngrid,nlay),pplev(ngrid,nlay+1)
5135      real pphi(ngrid,nlay)
5136
5137      integer idetr
5138      save idetr
5139      data idetr/3/
5140
5141c   local:
5142c   ------
5143
5144      INTEGER ig,k,l,lmaxa(klon),lmix(klon)
5145      real zsortie1d(klon)
5146c CR: on remplace lmax(klon,klev+1)
5147      INTEGER lmax(klon),lmin(klon),lentr(klon)
5148      real linter(klon)
5149      real zmix(klon), fracazmix(klon)
5150c RC
5151      real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz
5152
5153      real zlev(klon,klev+1),zlay(klon,klev)
5154      REAL zh(klon,klev),zdhadj(klon,klev)
5155      REAL ztv(klon,klev)
5156      real zu(klon,klev),zv(klon,klev),zo(klon,klev)
5157      REAL wh(klon,klev+1)
5158      real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1)
5159      real zla(klon,klev+1)
5160      real zwa(klon,klev+1)
5161      real zld(klon,klev+1)
5162      real zwd(klon,klev+1)
5163      real zsortie(klon,klev)
5164      real zva(klon,klev)
5165      real zua(klon,klev)
5166      real zoa(klon,klev)
5167
5168      real zha(klon,klev)
5169      real wa_moy(klon,klev+1)
5170      real fraca(klon,klev+1)
5171      real fracc(klon,klev+1)
5172      real zf,zf2
5173      real thetath2(klon,klev),wth2(klon,klev)
5174      common/comtherm/thetath2,wth2
5175
5176      real count_time
5177      integer isplit,nsplit,ialt
5178      parameter (nsplit=10)
5179      data isplit/0/
5180      save isplit
5181
5182      logical sorties
5183      real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev)
5184      real zpspsk(klon,klev)
5185
5186c     real wmax(klon,klev),wmaxa(klon)
5187      real wmax(klon),wmaxa(klon)
5188      real wa(klon,klev,klev+1)
5189      real wd(klon,klev+1)
5190      real larg_part(klon,klev,klev+1)
5191      real fracd(klon,klev+1)
5192      real xxx(klon,klev+1)
5193      real larg_cons(klon,klev+1)
5194      real larg_detr(klon,klev+1)
5195      real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev)
5196      real pu_therm(klon,klev),pv_therm(klon,klev)
5197      real fm(klon,klev+1),entr(klon,klev)
5198      real fmc(klon,klev+1)
5199
5200cCR:nouvelles variables
5201      real f_star(klon,klev+1),entr_star(klon,klev)
5202      real entr_star_tot(klon),entr_star2(klon)
5203      real f(klon), f0(klon)
5204      real zlevinter(klon)
5205      logical first
5206      data first /.false./
5207      save first
5208cRC
5209
5210      character*2 str2
5211      character*10 str10
5212
5213      LOGICAL vtest(klon),down
5214
5215      EXTERNAL SCOPY
5216
5217      integer ncorrec,ll
5218      save ncorrec
5219      data ncorrec/0/
5220     
5221c
5222c-----------------------------------------------------------------------
5223c   initialisation:
5224c   ---------------
5225c
5226       sorties=.true.
5227      IF(ngrid.NE.klon) THEN
5228         PRINT*
5229         PRINT*,'STOP dans convadj'
5230         PRINT*,'ngrid    =',ngrid
5231         PRINT*,'klon  =',klon
5232      ENDIF
5233c
5234c-----------------------------------------------------------------------
5235c   incrementation eventuelle de tendances precedentes:
5236c   ---------------------------------------------------
5237
5238c       print*,'0 OK convect8'
5239
5240      DO 1010 l=1,nlay
5241         DO 1015 ig=1,ngrid
5242            zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA
5243            zh(ig,l)=pt(ig,l)/zpspsk(ig,l)
5244            zu(ig,l)=pu(ig,l)
5245            zv(ig,l)=pv(ig,l)
5246            zo(ig,l)=po(ig,l)
5247            ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l))
52481015     CONTINUE
52491010  CONTINUE
5250
5251c       print*,'1 OK convect8'
5252c                       --------------------
5253c
5254c
5255c                       + + + + + + + + + + +
5256c
5257c
5258c  wa, fraca, wd, fracd --------------------   zlev(2), rhobarz
5259c  wh,wt,wo ...
5260c
5261c                       + + + + + + + + + + +  zh,zu,zv,zo,rho
5262c
5263c
5264c                       --------------------   zlev(1)
5265c                       \\\\\\\\\\\\\\\\\\\\
5266c
5267c
5268
5269c-----------------------------------------------------------------------
5270c   Calcul des altitudes des couches
5271c-----------------------------------------------------------------------
5272
5273      do l=2,nlay
5274         do ig=1,ngrid
5275            zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG
5276         enddo
5277      enddo
5278      do ig=1,ngrid
5279         zlev(ig,1)=0.
5280         zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG
5281      enddo
5282      do l=1,nlay
5283         do ig=1,ngrid
5284            zlay(ig,l)=pphi(ig,l)/RG
5285         enddo
5286      enddo
5287
5288c      print*,'2 OK convect8'
5289c-----------------------------------------------------------------------
5290c   Calcul des densites
5291c-----------------------------------------------------------------------
5292
5293      do l=1,nlay
5294         do ig=1,ngrid
5295            rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l))
5296         enddo
5297      enddo
5298
5299      do l=2,nlay
5300         do ig=1,ngrid
5301            rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1))
5302         enddo
5303      enddo
5304
5305      do k=1,nlay
5306         do l=1,nlay+1
5307            do ig=1,ngrid
5308               wa(ig,k,l)=0.
5309            enddo
5310         enddo
5311      enddo
5312
5313c      print*,'3 OK convect8'
5314c------------------------------------------------------------------
5315c   Calcul de w2, quarre de w a partir de la cape
5316c   a partir de w2, on calcule wa, vitesse de l'ascendance
5317c
5318c   ATTENTION: Dans cette version, pour cause d'economie de memoire,
5319c   w2 est stoke dans wa
5320c
5321c   ATTENTION: dans convect8, on n'utilise le calcule des wa
5322c   independants par couches que pour calculer l'entrainement
5323c   a la base et la hauteur max de l'ascendance.
5324c
5325c   Indicages:
5326c   l'ascendance provenant du niveau k traverse l'interface l avec
5327c   une vitesse wa(k,l).
5328c
5329c                       --------------------
5330c
5331c                       + + + + + + + + + +
5332c
5333c  wa(k,l)   ----       --------------------    l
5334c             /\
5335c            /||\       + + + + + + + + + +
5336c             ||
5337c             ||        --------------------
5338c             ||
5339c             ||        + + + + + + + + + +
5340c             ||
5341c             ||        --------------------
5342c             ||__
5343c             |___      + + + + + + + + + +     k
5344c
5345c                       --------------------
5346c
5347c
5348c
5349c------------------------------------------------------------------
5350
5351cCR: ponderation entrainement des couches instables
5352cdef des entr_star tels que entr=f*entr_star     
5353      do l=1,klev
5354         do ig=1,ngrid
5355            entr_star(ig,l)=0.
5356         enddo
5357      enddo
5358c determination de la longueur de la couche d entrainement
5359      do ig=1,ngrid
5360         lentr(ig)=1
5361      enddo
5362
5363con ne considere que les premieres couches instables
5364      do k=nlay-2,1,-1
5365         do ig=1,ngrid
5366            if (ztv(ig,k).gt.ztv(ig,k+1).and.
5367     s          ztv(ig,k+1).le.ztv(ig,k+2)) then
5368               lentr(ig)=k
5369            endif
5370          enddo
5371      enddo
5372   
5373c determination du lmin: couche d ou provient le thermique
5374      do ig=1,ngrid
5375         lmin(ig)=1
5376      enddo
5377      do ig=1,ngrid
5378         do l=nlay,2,-1
5379            if (ztv(ig,l-1).gt.ztv(ig,l)) then
5380               lmin(ig)=l-1
5381            endif
5382         enddo
5383      enddo
5384c
5385c definition de l'entrainement des couches
5386      do l=1,klev-1
5387         do ig=1,ngrid
5388            if (ztv(ig,l).gt.ztv(ig,l+1).and.
5389     s          l.ge.lmin(ig).and.l.le.lentr(ig)) then
5390                 entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))*
5391c     s                           (zlev(ig,l+1)-zlev(ig,l))
5392     s                           *sqrt(zlev(ig,l+1))
5393            endif
5394         enddo
5395      enddo
5396c pas de thermique si couche 1 stable
5397      do ig=1,ngrid
5398         if (lmin(ig).gt.1) then
5399            do l=1,klev
5400               entr_star(ig,l)=0.
5401            enddo
5402         endif
5403      enddo
5404c calcul de l entrainement total
5405      do ig=1,ngrid
5406         entr_star_tot(ig)=0.
5407      enddo
5408      do ig=1,ngrid
5409         do k=1,klev
5410            entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,k)
5411         enddo
5412      enddo
5413c
5414c      print*,'fin calcul entr_star'
5415      do k=1,klev
5416         do ig=1,ngrid
5417            ztva(ig,k)=ztv(ig,k)
5418         enddo
5419      enddo
5420cRC
5421c      print*,'7 OK convect8'
5422      do k=1,klev+1
5423         do ig=1,ngrid
5424            zw2(ig,k)=0.
5425            fmc(ig,k)=0.
5426cCR
5427            f_star(ig,k)=0.
5428cRC
5429            larg_cons(ig,k)=0.
5430            larg_detr(ig,k)=0.
5431            wa_moy(ig,k)=0.
5432         enddo
5433      enddo
5434
5435c      print*,'8 OK convect8'
5436      do ig=1,ngrid
5437         linter(ig)=1.
5438         lmaxa(ig)=1
5439         lmix(ig)=1
5440         wmaxa(ig)=0.
5441      enddo
5442
5443cCR:
5444      do l=1,nlay-2
5445         do ig=1,ngrid
5446            if (ztv(ig,l).gt.ztv(ig,l+1)
5447     s         .and.entr_star(ig,l).gt.1.e-10
5448     s         .and.zw2(ig,l).lt.1e-10) then
5449               f_star(ig,l+1)=entr_star(ig,l)
5450ctest:calcul de dteta
5451               zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1)
5452     s                     *(zlev(ig,l+1)-zlev(ig,l))
5453     s                     *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l))
5454               larg_detr(ig,l)=0.
5455            else if ((zw2(ig,l).ge.1e-10).and.
5456     s               (f_star(ig,l)+entr_star(ig,l).gt.1.e-10)) then
5457               f_star(ig,l+1)=f_star(ig,l)+entr_star(ig,l)
5458               ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)
5459     s                    *ztv(ig,l))/f_star(ig,l+1)
5460               zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+
5461     s                     2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)
5462     s                     *(zlev(ig,l+1)-zlev(ig,l))
5463            endif
5464c determination de zmax continu par interpolation lineaire
5465            if (zw2(ig,l+1).lt.0.) then
5466ctest
5467               if (abs(zw2(ig,l+1)-zw2(ig,l)).lt.1e-10) then
5468c                  print*,'pb linter'
5469               endif
5470               linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l))
5471     s           -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
5472               zw2(ig,l+1)=0.
5473               lmaxa(ig)=l
5474            else
5475               if (zw2(ig,l+1).lt.0.) then
5476c                  print*,'pb1 zw2<0'
5477               endif
5478               wa_moy(ig,l+1)=sqrt(zw2(ig,l+1))
5479            endif
5480            if (wa_moy(ig,l+1).gt.wmaxa(ig)) then
5481c   lmix est le niveau de la couche ou w (wa_moy) est maximum
5482               lmix(ig)=l+1
5483               wmaxa(ig)=wa_moy(ig,l+1)
5484            endif
5485         enddo
5486      enddo
5487c      print*,'fin calcul zw2'
5488c
5489c Calcul de la couche correspondant a la hauteur du thermique
5490      do ig=1,ngrid
5491         lmax(ig)=lentr(ig)
5492      enddo
5493      do ig=1,ngrid
5494         do l=nlay,lentr(ig)+1,-1
5495            if (zw2(ig,l).le.1.e-10) then
5496               lmax(ig)=l-1
5497            endif
5498         enddo
5499      enddo
5500c pas de thermique si couche 1 stable
5501      do ig=1,ngrid
5502         if (lmin(ig).gt.1) then
5503            lmax(ig)=1
5504            lmin(ig)=1
5505         endif
5506      enddo
5507c   
5508c Determination de zw2 max
5509      do ig=1,ngrid
5510         wmax(ig)=0.
5511      enddo
5512
5513      do l=1,nlay
5514         do ig=1,ngrid
5515            if (l.le.lmax(ig)) then
5516                if (zw2(ig,l).lt.0.)then
5517c                  print*,'pb2 zw2<0'
5518                endif
5519                zw2(ig,l)=sqrt(zw2(ig,l))
5520                wmax(ig)=max(wmax(ig),zw2(ig,l))
5521            else
5522                 zw2(ig,l)=0.
5523            endif
5524          enddo
5525      enddo
5526
5527c   Longueur caracteristique correspondant a la hauteur des thermiques.
5528      do  ig=1,ngrid
5529         zmax(ig)=0.
5530         zlevinter(ig)=zlev(ig,1)
5531      enddo
5532      do  ig=1,ngrid
5533c calcul de zlevinter
5534          zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
5535     s    linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
5536     s    -zlev(ig,lmax(ig)))
5537       zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
5538      enddo
5539
5540c      print*,'avant fermeture'
5541c Fermeture,determination de f
5542      do ig=1,ngrid
5543         entr_star2(ig)=0.
5544      enddo
5545      do ig=1,ngrid
5546         if (entr_star_tot(ig).LT.1.e-10) then
5547            f(ig)=0.
5548         else
5549             do k=lmin(ig),lentr(ig)
5550                entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2
5551     s                    /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)))
5552             enddo
5553c Nouvelle fermeture
5554             f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect
5555     s             *entr_star2(ig))*entr_star_tot(ig)
5556ctest
5557c             if (first) then
5558c             f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)
5559c     s             *wmax(ig))
5560c             endif
5561         endif
5562c         f0(ig)=f(ig)
5563c         first=.true.
5564      enddo
5565c      print*,'apres fermeture'
5566
5567c Calcul de l'entrainement
5568       do k=1,klev
5569         do ig=1,ngrid
5570            entr(ig,k)=f(ig)*entr_star(ig,k)
5571         enddo
5572      enddo
5573cCR:test pour entrainer moins que la masse
5574       do ig=1,ngrid
5575          do l=1,lentr(ig)
5576             if ((entr(ig,l)*ptimestep).gt.(0.9*masse(ig,l))) then
5577                entr(ig,l+1)=entr(ig,l+1)+entr(ig,l)
5578     s                       -0.9*masse(ig,l)/ptimestep
5579                entr(ig,l)=0.9*masse(ig,l)/ptimestep
5580             endif
5581          enddo
5582       enddo
5583cCR: fin test
5584c Calcul des flux
5585      do ig=1,ngrid
5586         do l=1,lmax(ig)-1
5587            fmc(ig,l+1)=fmc(ig,l)+entr(ig,l)
5588         enddo
5589      enddo
5590
5591cRC
5592
5593
5594c      print*,'9 OK convect8'
5595c     print*,'WA1 ',wa_moy
5596
5597c   determination de l'indice du debut de la mixed layer ou w decroit
5598
5599c   calcul de la largeur de chaque ascendance dans le cas conservatif.
5600c   dans ce cas simple, on suppose que la largeur de l'ascendance provenant
5601c   d'une couche est égale à la hauteur de la couche alimentante.
5602c   La vitesse maximale dans l'ascendance est aussi prise comme estimation
5603c   de la vitesse d'entrainement horizontal dans la couche alimentante.
5604
5605      do l=2,nlay
5606         do ig=1,ngrid
5607            if (l.le.lmaxa(ig)) then
5608               zw=max(wa_moy(ig,l),1.e-10)
5609               larg_cons(ig,l)=zmax(ig)*r_aspect
5610     s         *fmc(ig,l)/(rhobarz(ig,l)*zw)
5611            endif
5612         enddo
5613      enddo
5614
5615      do l=2,nlay
5616         do ig=1,ngrid
5617            if (l.le.lmaxa(ig)) then
5618c              if (idetr.eq.0) then
5619c  cette option est finalement en dur.
5620                  if ((l_mix*zlev(ig,l)).lt.0.)then
5621c                   print*,'pb l_mix*zlev<0'
5622                  endif
5623cCR: test: nouvelle def de lambda
5624c                  larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
5625                  if (zw2(ig,l).gt.1.e-10) then
5626                  larg_detr(ig,l)=sqrt((l_mix/zw2(ig,l))*zlev(ig,l))
5627                  else
5628                  larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
5629                  endif
5630cRC
5631c              else if (idetr.eq.1) then
5632c                 larg_detr(ig,l)=larg_cons(ig,l)
5633c    s            *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig))
5634c              else if (idetr.eq.2) then
5635c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
5636c    s            *sqrt(wa_moy(ig,l))
5637c              else if (idetr.eq.4) then
5638c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
5639c    s            *wa_moy(ig,l)
5640c              endif
5641            endif
5642         enddo
5643       enddo
5644
5645c      print*,'10 OK convect8'
5646c     print*,'WA2 ',wa_moy
5647c   calcul de la fraction de la maille concernée par l'ascendance en tenant
5648c   compte de l'epluchage du thermique.
5649c
5650cCR def de  zmix continu (profil parabolique des vitesses)
5651      do ig=1,ngrid
5652           if (lmix(ig).gt.1.) then
5653c test
5654              if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
5655     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
5656     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
5657     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
5658     s        then
5659c             
5660            zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
5661     s        *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
5662     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
5663     s        *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
5664     s        /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
5665     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
5666     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
5667     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
5668            else
5669            zmix(ig)=zlev(ig,lmix(ig))
5670c            print*,'pb zmix'
5671            endif
5672         else
5673         zmix(ig)=0.
5674         endif
5675ctest
5676         if ((zmax(ig)-zmix(ig)).lt.0.) then
5677            zmix(ig)=0.99*zmax(ig)
5678c            print*,'pb zmix>zmax'
5679         endif
5680      enddo
5681c
5682c calcul du nouveau lmix correspondant
5683      do ig=1,ngrid
5684         do l=1,klev
5685            if (zmix(ig).ge.zlev(ig,l).and.
5686     s          zmix(ig).lt.zlev(ig,l+1)) then
5687              lmix(ig)=l
5688             endif
5689          enddo
5690      enddo
5691c
5692      do l=2,nlay
5693         do ig=1,ngrid
5694            if(larg_cons(ig,l).gt.1.) then
5695c     print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),'  KKK'
5696               fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l))
5697     s            /(r_aspect*zmax(ig))
5698c test
5699               fraca(ig,l)=max(fraca(ig,l),0.)
5700               fraca(ig,l)=min(fraca(ig,l),0.5)
5701               fracd(ig,l)=1.-fraca(ig,l)
5702               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
5703            else
5704c              wa_moy(ig,l)=0.
5705               fraca(ig,l)=0.
5706               fracc(ig,l)=0.
5707               fracd(ig,l)=1.
5708            endif
5709         enddo
5710      enddo                 
5711cCR: calcul de fracazmix
5712       do ig=1,ngrid
5713          fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/
5714     s     (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig)
5715     s    +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1)
5716     s    -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
5717       enddo
5718c
5719       do l=2,nlay
5720          do ig=1,ngrid
5721             if(larg_cons(ig,l).gt.1.) then
5722               if (l.gt.lmix(ig)) then
5723ctest
5724                 if (zmax(ig)-zmix(ig).lt.1.e-10) then
5725c                   print*,'pb xxx'
5726                   xxx(ig,l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig))
5727                 else
5728                 xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig))
5729                 endif
5730           if (idetr.eq.0) then
5731               fraca(ig,l)=fracazmix(ig)
5732           else if (idetr.eq.1) then
5733               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)
5734           else if (idetr.eq.2) then
5735               fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2)
5736           else
5737               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2
5738           endif
5739c     print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL'
5740               fraca(ig,l)=max(fraca(ig,l),0.)
5741               fraca(ig,l)=min(fraca(ig,l),0.5)
5742               fracd(ig,l)=1.-fraca(ig,l)
5743               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
5744             endif
5745            endif
5746         enddo
5747      enddo
5748     
5749c      print*,'fin calcul fraca'
5750c      print*,'11 OK convect8'
5751c     print*,'Ea3 ',wa_moy
5752c------------------------------------------------------------------
5753c   Calcul de fracd, wd
5754c   somme wa - wd = 0
5755c------------------------------------------------------------------
5756
5757
5758      do ig=1,ngrid
5759         fm(ig,1)=0.
5760         fm(ig,nlay+1)=0.
5761      enddo
5762
5763      do l=2,nlay
5764           do ig=1,ngrid
5765              fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l)
5766cCR:test
5767              if (entr(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1)
5768     s            .and.l.gt.lmix(ig)) then
5769                 fm(ig,l)=fm(ig,l-1)
5770c                 write(1,*)'ajustement fm, l',l
5771              endif
5772c              write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l)
5773cRC
5774           enddo
5775         do ig=1,ngrid
5776            if(fracd(ig,l).lt.0.1) then
5777               stop'fracd trop petit'
5778            else
5779c    vitesse descendante "diagnostique"
5780               wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l))
5781            endif
5782         enddo
5783      enddo
5784
5785      do l=1,nlay
5786         do ig=1,ngrid
5787c           masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
5788            masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG
5789         enddo
5790      enddo
5791
5792c      print*,'12 OK convect8'
5793c     print*,'WA4 ',wa_moy
5794cc------------------------------------------------------------------
5795c   calcul du transport vertical
5796c------------------------------------------------------------------
5797
5798      go to 4444
5799c     print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep
5800      do l=2,nlay-1
5801         do ig=1,ngrid
5802            if(fm(ig,l+1)*ptimestep.gt.masse(ig,l)
5803     s      .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then
5804c     print*,'WARN!!! FM>M ig=',ig,' l=',l,'  FM='
5805c    s         ,fm(ig,l+1)*ptimestep
5806c    s         ,'   M=',masse(ig,l),masse(ig,l+1)
5807             endif
5808         enddo
5809      enddo
5810
5811      do l=1,nlay
5812         do ig=1,ngrid
5813            if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then
5814c     print*,'WARN!!! E>M ig=',ig,' l=',l,'  E=='
5815c    s         ,entr(ig,l)*ptimestep
5816c    s         ,'   M=',masse(ig,l)
5817             endif
5818         enddo
5819      enddo
5820
5821      do l=1,nlay
5822         do ig=1,ngrid
5823            if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then
5824c     print*,'WARN!!! fm exagere ig=',ig,'   l=',l
5825c    s         ,'   FM=',fm(ig,l)
5826            endif
5827            if(.not.masse(ig,l).ge.1.e-10
5828     s         .or..not.masse(ig,l).le.1.e4) then
5829c     print*,'WARN!!! masse exagere ig=',ig,'   l=',l
5830c    s         ,'   M=',masse(ig,l)
5831c     print*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)',
5832c    s                 rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)
5833c     print*,'zlev(ig,l+1),zlev(ig,l)'
5834c    s                ,zlev(ig,l+1),zlev(ig,l)
5835c     print*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)'
5836c    s                ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)
5837            endif
5838            if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then
5839c     print*,'WARN!!! entr exagere ig=',ig,'   l=',l
5840c    s         ,'   E=',entr(ig,l)
5841            endif
5842         enddo
5843      enddo
5844
58454444   continue
5846
5847cCR:redefinition du entr
5848       do l=1,nlay
5849         do ig=1,ngrid
5850            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
5851            if (detr(ig,l).lt.0.) then
5852                entr(ig,l)=entr(ig,l)-detr(ig,l)
5853                detr(ig,l)=0.
5854c     print*,'WARNING !!! detrainement negatif ',ig,l
5855            endif
5856         enddo
5857      enddo
5858cRC
5859      if (w2di.eq.1) then
5860         fm0=fm0+ptimestep*(fm-fm0)/float(tho)
5861         entr0=entr0+ptimestep*(entr-entr0)/float(tho)
5862      else
5863         fm0=fm
5864         entr0=entr
5865      endif
5866
5867      if (1.eq.1) then
5868         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
5869     .    ,zh,zdhadj,zha)
5870         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
5871     .    ,zo,pdoadj,zoa)
5872      else
5873         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
5874     .    ,zh,zdhadj,zha)
5875         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
5876     .    ,zo,pdoadj,zoa)
5877      endif
5878
5879      if (1.eq.0) then
5880         call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse
5881     .    ,fraca,zmax
5882     .    ,zu,zv,pduadj,pdvadj,zua,zva)
5883      else
5884         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
5885     .    ,zu,pduadj,zua)
5886         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
5887     .    ,zv,pdvadj,zva)
5888      endif
5889
5890      do l=1,nlay
5891         do ig=1,ngrid
5892            zf=0.5*(fracc(ig,l)+fracc(ig,l+1))
5893            zf2=zf/(1.-zf)
5894            thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2
5895            wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
5896         enddo
5897      enddo
5898
5899
5900
5901c     print*,'13 OK convect8'
5902c     print*,'WA5 ',wa_moy
5903      do l=1,nlay
5904         do ig=1,ngrid
5905            pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l)
5906         enddo
5907      enddo
5908
5909
5910c     do l=1,nlay
5911c        do ig=1,ngrid
5912c           if(abs(pdtadj(ig,l))*86400..gt.500.) then
5913c     print*,'WARN!!! ig=',ig,'  l=',l
5914c    s         ,'   pdtadj=',pdtadj(ig,l)
5915c           endif
5916c           if(abs(pdoadj(ig,l))*86400..gt.1.) then
5917c     print*,'WARN!!! ig=',ig,'  l=',l
5918c    s         ,'   pdoadj=',pdoadj(ig,l)
5919c           endif
5920c        enddo
5921c      enddo
5922
5923c      print*,'14 OK convect8'
5924c------------------------------------------------------------------
5925c   Calculs pour les sorties
5926c------------------------------------------------------------------
5927
5928      if(sorties) then
5929      do l=1,nlay
5930         do ig=1,ngrid
5931            zla(ig,l)=(1.-fracd(ig,l))*zmax(ig)
5932            zld(ig,l)=fracd(ig,l)*zmax(ig)
5933            if(1.-fracd(ig,l).gt.1.e-10)
5934     s      zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l))
5935         enddo
5936      enddo
5937
5938cdeja fait
5939c      do l=1,nlay
5940c         do ig=1,ngrid
5941c            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
5942c            if (detr(ig,l).lt.0.) then
5943c                entr(ig,l)=entr(ig,l)-detr(ig,l)
5944c                detr(ig,l)=0.
5945c     print*,'WARNING !!! detrainement negatif ',ig,l
5946c            endif
5947c         enddo
5948c      enddo
5949
5950c     print*,'15 OK convect8'
5951
5952      isplit=isplit+1
5953
5954
5955c #define und
5956        goto 123
5957#ifdef und
5958      CALL writeg1d(1,nlay,wd,'wd      ','wd      ')
5959      CALL writeg1d(1,nlay,zwa,'wa      ','wa      ')
5960      CALL writeg1d(1,nlay,fracd,'fracd      ','fracd      ')
5961      CALL writeg1d(1,nlay,fraca,'fraca      ','fraca      ')
5962      CALL writeg1d(1,nlay,wa_moy,'wam         ','wam         ')
5963      CALL writeg1d(1,nlay,zla,'la      ','la      ')
5964      CALL writeg1d(1,nlay,zld,'ld      ','ld      ')
5965      CALL writeg1d(1,nlay,pt,'pt      ','pt      ')
5966      CALL writeg1d(1,nlay,zh,'zh      ','zh      ')
5967      CALL writeg1d(1,nlay,zha,'zha      ','zha      ')
5968      CALL writeg1d(1,nlay,zu,'zu      ','zu      ')
5969      CALL writeg1d(1,nlay,zv,'zv      ','zv      ')
5970      CALL writeg1d(1,nlay,zo,'zo      ','zo      ')
5971      CALL writeg1d(1,nlay,wh,'wh      ','wh      ')
5972      CALL writeg1d(1,nlay,wu,'wu      ','wu      ')
5973      CALL writeg1d(1,nlay,wv,'wv      ','wv      ')
5974      CALL writeg1d(1,nlay,wo,'w15uo     ','wXo     ')
5975      CALL writeg1d(1,nlay,zdhadj,'zdhadj      ','zdhadj      ')
5976      CALL writeg1d(1,nlay,pduadj,'pduadj      ','pduadj      ')
5977      CALL writeg1d(1,nlay,pdvadj,'pdvadj      ','pdvadj      ')
5978      CALL writeg1d(1,nlay,pdoadj,'pdoadj      ','pdoadj      ')
5979      CALL writeg1d(1,nlay,entr  ,'entr        ','entr        ')
5980      CALL writeg1d(1,nlay,detr  ,'detr        ','detr        ')
5981      CALL writeg1d(1,nlay,fm    ,'fm          ','fm          ')
5982
5983      CALL writeg1d(1,nlay,pdtadj,'pdtadj    ','pdtadj    ')
5984      CALL writeg1d(1,nlay,pplay,'pplay     ','pplay     ')
5985      CALL writeg1d(1,nlay,pplev,'pplev     ','pplev     ')
5986
5987c   recalcul des flux en diagnostique...
5988c     print*,'PAS DE TEMPS ',ptimestep
5989       call dt2F(pplev,pplay,pt,pdtadj,wh)
5990      CALL writeg1d(1,nlay,wh,'wh2     ','wh2     ')
5991#endif
5992123   continue
5993! #define troisD
5994#ifdef troisD
5995c       if (sorties) then
5996      print*,'Debut des wrgradsfi'
5997
5998c      print*,'16 OK convect8'
5999         call wrgradsfi(1,nlay,wd,'wd        ','wd        ')
6000         call wrgradsfi(1,nlay,zwa,'wa        ','wa        ')
6001         call wrgradsfi(1,nlay,fracd,'fracd     ','fracd     ')
6002         call wrgradsfi(1,nlay,fraca,'fraca     ','fraca     ')
6003         call wrgradsfi(1,nlay,xxx,'xxx       ','xxx       ')
6004         call wrgradsfi(1,nlay,wa_moy,'wam       ','wam       ')
6005c      print*,'WA6 ',wa_moy
6006         call wrgradsfi(1,nlay,zla,'la        ','la        ')
6007         call wrgradsfi(1,nlay,zld,'ld        ','ld        ')
6008         call wrgradsfi(1,nlay,pt,'pt        ','pt        ')
6009         call wrgradsfi(1,nlay,zh,'zh        ','zh        ')
6010         call wrgradsfi(1,nlay,zha,'zha        ','zha        ')
6011         call wrgradsfi(1,nlay,zua,'zua        ','zua        ')
6012         call wrgradsfi(1,nlay,zva,'zva        ','zva        ')
6013         call wrgradsfi(1,nlay,zu,'zu        ','zu        ')
6014         call wrgradsfi(1,nlay,zv,'zv        ','zv        ')
6015         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
6016         call wrgradsfi(1,nlay,wh,'wh        ','wh        ')
6017         call wrgradsfi(1,nlay,wu,'wu        ','wu        ')
6018         call wrgradsfi(1,nlay,wv,'wv        ','wv        ')
6019         call wrgradsfi(1,nlay,wo,'wo        ','wo        ')
6020         call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
6021         call wrgradsfi(1,nlay,zdhadj,'zdhadj    ','zdhadj    ')
6022         call wrgradsfi(1,nlay,pduadj,'pduadj    ','pduadj    ')
6023         call wrgradsfi(1,nlay,pdvadj,'pdvadj    ','pdvadj    ')
6024         call wrgradsfi(1,nlay,pdoadj,'pdoadj    ','pdoadj    ')
6025         call wrgradsfi(1,nlay,entr,'entr      ','entr      ')
6026         call wrgradsfi(1,nlay,detr,'detr      ','detr      ')
6027         call wrgradsfi(1,nlay,fm,'fm        ','fm        ')
6028         call wrgradsfi(1,nlay,fmc,'fmc       ','fmc       ')
6029         call wrgradsfi(1,nlay,zw2,'zw2       ','zw2       ')
6030         call wrgradsfi(1,nlay,ztva,'ztva      ','ztva      ')
6031         call wrgradsfi(1,nlay,ztv,'ztv       ','ztv       ')
6032
6033         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
6034         call wrgradsfi(1,nlay,larg_cons,'Lc        ','Lc        ')
6035         call wrgradsfi(1,nlay,larg_detr,'Ldetr     ','Ldetr     ')
6036
6037cCR:nouveaux diagnostiques
6038      call wrgradsfi(1,nlay,entr_star  ,'entr_star   ','entr_star   ')     
6039      call wrgradsfi(1,nlay,f_star    ,'f_star   ','f_star   ')
6040      call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
6041      call wrgradsfi(1,1,zmix,'zmix      ','zmix      ')
6042      zsortie1d(:)=lmax(:)
6043      call wrgradsfi(1,1,zsortie1d,'lmax      ','lmax      ')
6044      call wrgradsfi(1,1,wmax,'wmax      ','wmax      ')
6045      zsortie1d(:)=lmix(:)
6046      call wrgradsfi(1,1,zsortie1d,'lmix      ','lmix      ')
6047      zsortie1d(:)=lentr(:)
6048      call wrgradsfi(1,1,zsortie1d,'lentr      ','lentr     ')
6049
6050c      print*,'17 OK convect8'
6051
6052         do k=1,klev/10
6053            write(str2,'(i2.2)') k
6054            str10='wa'//str2
6055            do l=1,nlay
6056               do ig=1,ngrid
6057                  zsortie(ig,l)=wa(ig,k,l)
6058               enddo
6059            enddo   
6060            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
6061            do l=1,nlay
6062               do ig=1,ngrid
6063                  zsortie(ig,l)=larg_part(ig,k,l)
6064               enddo
6065            enddo
6066            str10='la'//str2
6067            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
6068         enddo
6069
6070
6071c     print*,'18 OK convect8'
6072c      endif
6073      print*,'Fin des wrgradsfi'
6074#endif
6075
6076      endif
6077
6078c     if(wa_moy(1,4).gt.1.e-10) stop
6079
6080c      print*,'19 OK convect8'
6081      return
6082      end
6083
Note: See TracBrowser for help on using the repository browser.