source: LMDZ4/trunk/libf/phylmd/thermcell.F @ 776

Last change on this file since 776 was 776, checked in by Laurent Fairhead, 17 years ago

Suite du merge entre la version et la HEAD: quelques modifications
de Yann sur le

LF

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 41.3 KB
Line 
1!
2! $Header$
3!
4
5      SUBROUTINE thermcell(ngrid,nlay,ptimestep
6     s                  ,pplay,pplev,pphi
7     s                  ,pu,pv,pt,po
8     s                  ,pduadj,pdvadj,pdtadj,pdoadj
9     s                  ,fm0,entr0
10c    s                  ,pu_therm,pv_therm
11     s                  ,r_aspect,l_mix,w2di,tho)
12      USE dimphy
13      IMPLICIT NONE
14
15c=======================================================================
16c
17c   Calcul du transport verticale dans la couche limite en presence
18c   de "thermiques" explicitement representes
19c
20c   Reecriture a partir d'un listing papier à Habas, le 14/02/00
21c
22c   le thermique est suppose homogene et dissipe par melange avec
23c   son environnement. la longueur l_mix controle l'efficacite du
24c   melange
25c
26c   Le calcul du transport des differentes especes se fait en prenant
27c   en compte:
28c     1. un flux de masse montant
29c     2. un flux de masse descendant
30c     3. un entrainement
31c     4. un detrainement
32c
33c=======================================================================
34
35c-----------------------------------------------------------------------
36c   declarations:
37c   -------------
38
39cym#include "dimensions.h"
40cym#include "dimphy.h"
41#include "YOMCST.h"
42
43c   arguments:
44c   ----------
45
46      INTEGER ngrid,nlay,w2di,tho
47      real ptimestep,l_mix,r_aspect
48      REAL pt(ngrid,nlay),pdtadj(ngrid,nlay)
49      REAL pu(ngrid,nlay),pduadj(ngrid,nlay)
50      REAL pv(ngrid,nlay),pdvadj(ngrid,nlay)
51      REAL po(ngrid,nlay),pdoadj(ngrid,nlay)
52      REAL pplay(ngrid,nlay),pplev(ngrid,nlay+1)
53      real pphi(ngrid,nlay)
54
55      integer idetr
56      save idetr
57      data idetr/3/
58c$OMP THREADPRIVATE(idetr)
59c   local:
60c   ------
61
62      INTEGER ig,k,l,lmaxa(klon),lmix(klon)
63      real zsortie1d(klon)
64c CR: on remplace lmax(klon,klev+1)
65      INTEGER lmax(klon),lmin(klon),lentr(klon)
66      real linter(klon)
67      real zmix(klon), fracazmix(klon)
68c RC
69      real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz
70
71      real zlev(klon,klev+1),zlay(klon,klev)
72      REAL zh(klon,klev),zdhadj(klon,klev)
73      REAL ztv(klon,klev)
74      real zu(klon,klev),zv(klon,klev),zo(klon,klev)
75      REAL wh(klon,klev+1)
76      real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1)
77      real zla(klon,klev+1)
78      real zwa(klon,klev+1)
79      real zld(klon,klev+1)
80      real zwd(klon,klev+1)
81      real zsortie(klon,klev)
82      real zva(klon,klev)
83      real zua(klon,klev)
84      real zoa(klon,klev)
85
86      real zha(klon,klev)
87      real wa_moy(klon,klev+1)
88      real fraca(klon,klev+1)
89      real fracc(klon,klev+1)
90      real zf,zf2
91      real,allocatable,save :: thetath2(:,:),wth2(:,:)
92c$OMP THREADPRIVATE(thetath2,wth2)
93cym      common/comtherm/thetath2,wth2
94
95      real count_time
96      integer isplit,nsplit,ialt
97      parameter (nsplit=10)
98      data isplit/0/
99      save isplit
100c$OMP THREADPRIVATE(isplit)
101      logical sorties
102      real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev)
103      real zpspsk(klon,klev)
104
105c     real wmax(klon,klev),wmaxa(klon)
106      real wmax(klon),wmaxa(klon)
107      real wa(klon,klev,klev+1)
108      real wd(klon,klev+1)
109      real larg_part(klon,klev,klev+1)
110      real fracd(klon,klev+1)
111      real xxx(klon,klev+1)
112      real larg_cons(klon,klev+1)
113      real larg_detr(klon,klev+1)
114      real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev)
115      real pu_therm(klon,klev),pv_therm(klon,klev)
116      real fm(klon,klev+1),entr(klon,klev)
117      real fmc(klon,klev+1)
118
119cCR:nouvelles variables
120      real f_star(klon,klev+1),entr_star(klon,klev)
121      real entr_star_tot(klon),entr_star2(klon)
122      real f(klon), f0(klon)
123      real zlevinter(klon)
124      logical first
125      data first /.false./
126      save first
127c$OMP THREADPRIVATE(first)
128cRC
129
130      character*2 str2
131      character*10 str10
132
133      LOGICAL vtest(klon),down
134
135      EXTERNAL SCOPY
136
137      integer ncorrec,ll
138      save ncorrec
139      data ncorrec/0/
140c$OMP THREADPRIVATE(ncorrec)
141      logical,save :: firstCall=.true.
142c$OMP THREADPRIVATE(firstCall)
143c
144c-----------------------------------------------------------------------
145c   initialisation:
146c   ---------------
147c
148      if (firstcall) then
149        allocate(thetath2(klon,klev),wth2(klon,klev))
150        thetath2(:,:)=0.
151        wth2(:,:)=0.
152        firstcall=.false.
153      endif
154     
155       sorties=.true.
156      IF(ngrid.NE.klon) THEN
157         PRINT*
158         PRINT*,'STOP dans convadj'
159         PRINT*,'ngrid    =',ngrid
160         PRINT*,'klon  =',klon
161      ENDIF
162c
163c-----------------------------------------------------------------------
164c   incrementation eventuelle de tendances precedentes:
165c   ---------------------------------------------------
166
167       print*,'0 OK convect8'
168
169      DO 1010 l=1,nlay
170         DO 1015 ig=1,ngrid
171            zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA
172            zh(ig,l)=pt(ig,l)/zpspsk(ig,l)
173            zu(ig,l)=pu(ig,l)
174            zv(ig,l)=pv(ig,l)
175            zo(ig,l)=po(ig,l)
176            ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l))
1771015     CONTINUE
1781010  CONTINUE
179
180       print*,'1 OK convect8'
181c                       --------------------
182c
183c
184c                       + + + + + + + + + + +
185c
186c
187c  wa, fraca, wd, fracd --------------------   zlev(2), rhobarz
188c  wh,wt,wo ...
189c
190c                       + + + + + + + + + + +  zh,zu,zv,zo,rho
191c
192c
193c                       --------------------   zlev(1)
194c                       \\\\\\\\\\\\\\\\\\\\
195c
196c
197
198c-----------------------------------------------------------------------
199c   Calcul des altitudes des couches
200c-----------------------------------------------------------------------
201
202      do l=2,nlay
203         do ig=1,ngrid
204            zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG
205         enddo
206      enddo
207      do ig=1,ngrid
208         zlev(ig,1)=0.
209         zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG
210      enddo
211      do l=1,nlay
212         do ig=1,ngrid
213            zlay(ig,l)=pphi(ig,l)/RG
214         enddo
215      enddo
216
217c      print*,'2 OK convect8'
218c-----------------------------------------------------------------------
219c   Calcul des densites
220c-----------------------------------------------------------------------
221
222      do l=1,nlay
223         do ig=1,ngrid
224            rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l))
225         enddo
226      enddo
227
228      do l=2,nlay
229         do ig=1,ngrid
230            rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1))
231         enddo
232      enddo
233
234      do k=1,nlay
235         do l=1,nlay+1
236            do ig=1,ngrid
237               wa(ig,k,l)=0.
238            enddo
239         enddo
240      enddo
241
242c      print*,'3 OK convect8'
243c------------------------------------------------------------------
244c   Calcul de w2, quarre de w a partir de la cape
245c   a partir de w2, on calcule wa, vitesse de l'ascendance
246c
247c   ATTENTION: Dans cette version, pour cause d'economie de memoire,
248c   w2 est stoke dans wa
249c
250c   ATTENTION: dans convect8, on n'utilise le calcule des wa
251c   independants par couches que pour calculer l'entrainement
252c   a la base et la hauteur max de l'ascendance.
253c
254c   Indicages:
255c   l'ascendance provenant du niveau k traverse l'interface l avec
256c   une vitesse wa(k,l).
257c
258c                       --------------------
259c
260c                       + + + + + + + + + +
261c
262c  wa(k,l)   ----       --------------------    l
263c             /\
264c            /||\       + + + + + + + + + +
265c             ||
266c             ||        --------------------
267c             ||
268c             ||        + + + + + + + + + +
269c             ||
270c             ||        --------------------
271c             ||__
272c             |___      + + + + + + + + + +     k
273c
274c                       --------------------
275c
276c
277c
278c------------------------------------------------------------------
279
280cCR: ponderation entrainement des couches instables
281cdef des entr_star tels que entr=f*entr_star     
282      do l=1,klev
283         do ig=1,ngrid
284            entr_star(ig,l)=0.
285         enddo
286      enddo
287c determination de la longueur de la couche d entrainement
288      do ig=1,ngrid
289         lentr(ig)=1
290      enddo
291
292con ne considere que les premieres couches instables
293      do k=nlay-2,1,-1
294         do ig=1,ngrid
295            if (ztv(ig,k).gt.ztv(ig,k+1).and.
296     s          ztv(ig,k+1).le.ztv(ig,k+2)) then
297               lentr(ig)=k
298            endif
299          enddo
300      enddo
301   
302c determination du lmin: couche d ou provient le thermique
303      do ig=1,ngrid
304         lmin(ig)=1
305      enddo
306      do ig=1,ngrid
307         do l=nlay,2,-1
308            if (ztv(ig,l-1).gt.ztv(ig,l)) then
309               lmin(ig)=l-1
310            endif
311         enddo
312      enddo
313c
314c definition de l'entrainement des couches
315      do l=1,klev-1
316         do ig=1,ngrid
317            if (ztv(ig,l).gt.ztv(ig,l+1).and.
318     s          l.ge.lmin(ig).and.l.le.lentr(ig)) then
319                 entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))*
320     s                           (zlev(ig,l+1)-zlev(ig,l))
321            endif
322         enddo
323      enddo
324c pas de thermique si couches 1->5 stables
325      do ig=1,ngrid
326         if (lmin(ig).gt.5) then
327            do l=1,klev
328               entr_star(ig,l)=0.
329            enddo
330         endif
331      enddo
332c calcul de l entrainement total
333      do ig=1,ngrid
334         entr_star_tot(ig)=0.
335      enddo
336      do ig=1,ngrid
337         do k=1,klev
338            entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,k)
339         enddo
340      enddo
341c
342      print*,'fin calcul entr_star'
343      do k=1,klev
344         do ig=1,ngrid
345            ztva(ig,k)=ztv(ig,k)
346         enddo
347      enddo
348cRC
349c      print*,'7 OK convect8'
350      do k=1,klev+1
351         do ig=1,ngrid
352            zw2(ig,k)=0.
353            fmc(ig,k)=0.
354cCR
355            f_star(ig,k)=0.
356cRC
357            larg_cons(ig,k)=0.
358            larg_detr(ig,k)=0.
359            wa_moy(ig,k)=0.
360         enddo
361      enddo
362
363c      print*,'8 OK convect8'
364      do ig=1,ngrid
365         linter(ig)=1.
366         lmaxa(ig)=1
367         lmix(ig)=1
368         wmaxa(ig)=0.
369      enddo
370
371cCR:
372      do l=1,nlay-2
373         do ig=1,ngrid
374            if (ztv(ig,l).gt.ztv(ig,l+1)
375     s         .and.entr_star(ig,l).gt.1.e-10
376     s         .and.zw2(ig,l).lt.1e-10) then
377               f_star(ig,l+1)=entr_star(ig,l)
378ctest:calcul de dteta
379               zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1)
380     s                     *(zlev(ig,l+1)-zlev(ig,l))
381     s                     *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l))
382               larg_detr(ig,l)=0.
383            else if ((zw2(ig,l).ge.1e-10).and.
384     s               (f_star(ig,l)+entr_star(ig,l).gt.1.e-10)) then
385               f_star(ig,l+1)=f_star(ig,l)+entr_star(ig,l)
386               ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)
387     s                    *ztv(ig,l))/f_star(ig,l+1)
388               zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+
389     s                     2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)
390     s                     *(zlev(ig,l+1)-zlev(ig,l))
391            endif
392c determination de zmax continu par interpolation lineaire
393            if (zw2(ig,l+1).lt.0.) then
394ctest
395               if (abs(zw2(ig,l+1)-zw2(ig,l)).lt.1e-10) then
396                  print*,'pb linter'
397               endif
398               linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l))
399     s           -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
400               zw2(ig,l+1)=0.
401               lmaxa(ig)=l
402            else
403               if (zw2(ig,l+1).lt.0.) then
404                  print*,'pb1 zw2<0'
405               endif
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
413         enddo
414      enddo
415      print*,'fin calcul zw2'
416c
417c Calcul de la couche correspondant a la hauteur du thermique
418      do ig=1,ngrid
419         lmax(ig)=lentr(ig)
420      enddo
421      do ig=1,ngrid
422         do l=nlay,lentr(ig)+1,-1
423            if (zw2(ig,l).le.1.e-10) then
424               lmax(ig)=l-1
425            endif
426         enddo
427      enddo
428c pas de thermique si couches 1->5 stables
429      do ig=1,ngrid
430         if (lmin(ig).gt.5) then
431            lmax(ig)=1
432            lmin(ig)=1
433         endif
434      enddo
435c   
436c Determination de zw2 max
437      do ig=1,ngrid
438         wmax(ig)=0.
439      enddo
440
441      do l=1,nlay
442         do ig=1,ngrid
443            if (l.le.lmax(ig)) then
444                if (zw2(ig,l).lt.0.)then
445                  print*,'pb2 zw2<0'
446                endif
447                zw2(ig,l)=sqrt(zw2(ig,l))
448                wmax(ig)=max(wmax(ig),zw2(ig,l))
449            else
450                 zw2(ig,l)=0.
451            endif
452          enddo
453      enddo
454
455c   Longueur caracteristique correspondant a la hauteur des thermiques.
456      do  ig=1,ngrid
457         zmax(ig)=0.
458         zlevinter(ig)=zlev(ig,1)
459      enddo
460      do  ig=1,ngrid
461c calcul de zlevinter
462          zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
463     s    linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
464     s    -zlev(ig,lmax(ig)))
465       zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
466      enddo
467
468      print*,'avant fermeture'
469c Fermeture,determination de f
470      do ig=1,ngrid
471         entr_star2(ig)=0.
472      enddo
473      do ig=1,ngrid
474         if (entr_star_tot(ig).LT.1.e-10) then
475            f(ig)=0.
476         else
477             do k=lmin(ig),lentr(ig)
478                entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2
479     s                    /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)))
480             enddo
481c Nouvelle fermeture
482             f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect
483     s             *entr_star2(ig))*entr_star_tot(ig)
484ctest
485c             if (first) then
486c             f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)
487c     s             *wmax(ig))
488c             endif
489         endif
490c         f0(ig)=f(ig)
491c         first=.true.
492      enddo
493      print*,'apres fermeture'
494
495c Calcul de l'entrainement
496       do k=1,klev
497         do ig=1,ngrid
498            entr(ig,k)=f(ig)*entr_star(ig,k)
499         enddo
500      enddo
501c Calcul des flux
502      do ig=1,ngrid
503         do l=1,lmax(ig)-1
504            fmc(ig,l+1)=fmc(ig,l)+entr(ig,l)
505         enddo
506      enddo
507
508cRC
509
510
511c      print*,'9 OK convect8'
512c     print*,'WA1 ',wa_moy
513
514c   determination de l'indice du debut de la mixed layer ou w decroit
515
516c   calcul de la largeur de chaque ascendance dans le cas conservatif.
517c   dans ce cas simple, on suppose que la largeur de l'ascendance provenant
518c   d'une couche est egale a la hauteur de la couche alimentante.
519c   La vitesse maximale dans l'ascendance est aussi prise comme estimation
520c   de la vitesse d'entrainement horizontal dans la couche alimentante.
521
522      do l=2,nlay
523         do ig=1,ngrid
524            if (l.le.lmaxa(ig)) then
525               zw=max(wa_moy(ig,l),1.e-10)
526               larg_cons(ig,l)=zmax(ig)*r_aspect
527     s         *fmc(ig,l)/(rhobarz(ig,l)*zw)
528            endif
529         enddo
530      enddo
531
532      do l=2,nlay
533         do ig=1,ngrid
534            if (l.le.lmaxa(ig)) then
535c              if (idetr.eq.0) then
536c  cette option est finalement en dur.
537                  if ((l_mix*zlev(ig,l)).lt.0.)then
538                   print*,'pb l_mix*zlev<0'
539                  endif
540                  larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
541c              else if (idetr.eq.1) then
542c                 larg_detr(ig,l)=larg_cons(ig,l)
543c    s            *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig))
544c              else if (idetr.eq.2) then
545c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
546c    s            *sqrt(wa_moy(ig,l))
547c              else if (idetr.eq.4) then
548c                 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
549c    s            *wa_moy(ig,l)
550c              endif
551            endif
552         enddo
553       enddo
554
555c      print*,'10 OK convect8'
556c     print*,'WA2 ',wa_moy
557c   calcul de la fraction de la maille concerne  par l'ascendance en tenant
558c   compte de l'epluchage du thermique.
559c
560cCR def de  zmix continu (profil parabolique des vitesses)
561      do ig=1,ngrid
562           if (lmix(ig).gt.1.) then
563c test
564              if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
565     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
566     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
567     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
568     s        then
569c             
570            zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
571     s        *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
572     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
573     s        *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
574     s        /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))
575     s        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
576     s        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))
577     s        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
578            else
579            zmix(ig)=zlev(ig,lmix(ig))
580            print*,'pb zmix'
581            endif
582         else
583         zmix(ig)=0.
584         endif
585ctest
586         if ((zmax(ig)-zmix(ig)).lt.0.) then
587            zmix(ig)=0.99*zmax(ig)
588c            print*,'pb zmix>zmax'
589         endif
590      enddo
591c
592c calcul du nouveau lmix correspondant
593      do ig=1,ngrid
594         do l=1,klev
595            if (zmix(ig).ge.zlev(ig,l).and.
596     s          zmix(ig).lt.zlev(ig,l+1)) then
597              lmix(ig)=l
598             endif
599          enddo
600      enddo
601c
602      do l=2,nlay
603         do ig=1,ngrid
604            if(larg_cons(ig,l).gt.1.) then
605c     print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),'  KKK'
606               fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l))
607     s            /(r_aspect*zmax(ig))
608c test
609               fraca(ig,l)=max(fraca(ig,l),0.)
610               fraca(ig,l)=min(fraca(ig,l),0.5)
611               fracd(ig,l)=1.-fraca(ig,l)
612               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
613            else
614c              wa_moy(ig,l)=0.
615               fraca(ig,l)=0.
616               fracc(ig,l)=0.
617               fracd(ig,l)=1.
618            endif
619         enddo
620      enddo                 
621cCR: calcul de fracazmix
622       do ig=1,ngrid
623          fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/
624     s     (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig)
625     s    +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1)
626     s    -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
627       enddo
628c
629       do l=2,nlay
630          do ig=1,ngrid
631             if(larg_cons(ig,l).gt.1.) then
632               if (l.gt.lmix(ig)) then
633ctest
634                 if (zmax(ig)-zmix(ig).lt.1.e-10) then
635c                   print*,'pb xxx'
636                   xxx(ig,l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig))
637                 else
638                 xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig))
639                 endif
640           if (idetr.eq.0) then
641               fraca(ig,l)=fracazmix(ig)
642           else if (idetr.eq.1) then
643               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)
644           else if (idetr.eq.2) then
645               fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2)
646           else
647               fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2
648           endif
649c     print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL'
650               fraca(ig,l)=max(fraca(ig,l),0.)
651               fraca(ig,l)=min(fraca(ig,l),0.5)
652               fracd(ig,l)=1.-fraca(ig,l)
653               fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig))
654             endif
655            endif
656         enddo
657      enddo
658     
659      print*,'fin calcul fraca'
660c      print*,'11 OK convect8'
661c     print*,'Ea3 ',wa_moy
662c------------------------------------------------------------------
663c   Calcul de fracd, wd
664c   somme wa - wd = 0
665c------------------------------------------------------------------
666
667
668      do ig=1,ngrid
669         fm(ig,1)=0.
670         fm(ig,nlay+1)=0.
671      enddo
672
673      do l=2,nlay
674           do ig=1,ngrid
675              fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l)
676cCR:test
677              if (entr(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1)
678     s            .and.l.gt.lmix(ig)) then
679                 fm(ig,l)=fm(ig,l-1)
680c                 write(1,*)'ajustement fm, l',l
681              endif
682c              write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l)
683cRC
684           enddo
685         do ig=1,ngrid
686            if(fracd(ig,l).lt.0.1) then
687               stop'fracd trop petit'
688            else
689c    vitesse descendante "diagnostique"
690               wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l))
691            endif
692         enddo
693      enddo
694
695      do l=1,nlay
696         do ig=1,ngrid
697c           masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
698            masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG
699         enddo
700      enddo
701
702      print*,'12 OK convect8'
703c     print*,'WA4 ',wa_moy
704cc------------------------------------------------------------------
705c   calcul du transport vertical
706c------------------------------------------------------------------
707
708      go to 4444
709c     print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep
710      do l=2,nlay-1
711         do ig=1,ngrid
712            if(fm(ig,l+1)*ptimestep.gt.masse(ig,l)
713     s      .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then
714c     print*,'WARN!!! FM>M ig=',ig,' l=',l,'  FM='
715c    s         ,fm(ig,l+1)*ptimestep
716c    s         ,'   M=',masse(ig,l),masse(ig,l+1)
717             endif
718         enddo
719      enddo
720
721      do l=1,nlay
722         do ig=1,ngrid
723            if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then
724c     print*,'WARN!!! E>M ig=',ig,' l=',l,'  E=='
725c    s         ,entr(ig,l)*ptimestep
726c    s         ,'   M=',masse(ig,l)
727             endif
728         enddo
729      enddo
730
731      do l=1,nlay
732         do ig=1,ngrid
733            if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then
734c     print*,'WARN!!! fm exagere ig=',ig,'   l=',l
735c    s         ,'   FM=',fm(ig,l)
736            endif
737            if(.not.masse(ig,l).ge.1.e-10
738     s         .or..not.masse(ig,l).le.1.e4) then
739c     print*,'WARN!!! masse exagere ig=',ig,'   l=',l
740c    s         ,'   M=',masse(ig,l)
741c     print*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)',
742c    s                 rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)
743c     print*,'zlev(ig,l+1),zlev(ig,l)'
744c    s                ,zlev(ig,l+1),zlev(ig,l)
745c     print*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)'
746c    s                ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)
747            endif
748            if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then
749c     print*,'WARN!!! entr exagere ig=',ig,'   l=',l
750c    s         ,'   E=',entr(ig,l)
751            endif
752         enddo
753      enddo
754
7554444   continue
756
757cCR:redefinition du entr
758       do l=1,nlay
759         do ig=1,ngrid
760            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
761            if (detr(ig,l).lt.0.) then
762                entr(ig,l)=entr(ig,l)-detr(ig,l)
763                detr(ig,l)=0.
764c     print*,'WARNING !!! detrainement negatif ',ig,l
765            endif
766         enddo
767      enddo
768cRC
769      if (w2di.eq.1) then
770         fm0=fm0+ptimestep*(fm-fm0)/float(tho)
771         entr0=entr0+ptimestep*(entr-entr0)/float(tho)
772      else
773         fm0=fm
774         entr0=entr
775      endif
776
777      if (1.eq.1) then
778         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
779     .    ,zh,zdhadj,zha)
780         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
781     .    ,zo,pdoadj,zoa)
782      else
783         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
784     .    ,zh,zdhadj,zha)
785         call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
786     .    ,zo,pdoadj,zoa)
787      endif
788
789      if (1.eq.0) then
790         call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse
791     .    ,fraca,zmax
792     .    ,zu,zv,pduadj,pdvadj,zua,zva)
793      else
794         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
795     .    ,zu,pduadj,zua)
796         call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
797     .    ,zv,pdvadj,zva)
798      endif
799
800      do l=1,nlay
801         do ig=1,ngrid
802            zf=0.5*(fracc(ig,l)+fracc(ig,l+1))
803            zf2=zf/(1.-zf)
804            thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2
805            wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
806         enddo
807      enddo
808
809
810
811c     print*,'13 OK convect8'
812c     print*,'WA5 ',wa_moy
813      do l=1,nlay
814         do ig=1,ngrid
815            pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l)
816         enddo
817      enddo
818
819
820c     do l=1,nlay
821c        do ig=1,ngrid
822c           if(abs(pdtadj(ig,l))*86400..gt.500.) then
823c     print*,'WARN!!! ig=',ig,'  l=',l
824c    s         ,'   pdtadj=',pdtadj(ig,l)
825c           endif
826c           if(abs(pdoadj(ig,l))*86400..gt.1.) then
827c     print*,'WARN!!! ig=',ig,'  l=',l
828c    s         ,'   pdoadj=',pdoadj(ig,l)
829c           endif
830c        enddo
831c      enddo
832
833      print*,'14 OK convect8'
834c------------------------------------------------------------------
835c   Calculs pour les sorties
836c------------------------------------------------------------------
837
838      if(sorties) then
839      do l=1,nlay
840         do ig=1,ngrid
841            zla(ig,l)=(1.-fracd(ig,l))*zmax(ig)
842            zld(ig,l)=fracd(ig,l)*zmax(ig)
843            if(1.-fracd(ig,l).gt.1.e-10)
844     s      zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l))
845         enddo
846      enddo
847
848cdeja fait
849c      do l=1,nlay
850c         do ig=1,ngrid
851c            detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
852c            if (detr(ig,l).lt.0.) then
853c                entr(ig,l)=entr(ig,l)-detr(ig,l)
854c                detr(ig,l)=0.
855c     print*,'WARNING !!! detrainement negatif ',ig,l
856c            endif
857c         enddo
858c      enddo
859
860c     print*,'15 OK convect8'
861
862      isplit=isplit+1
863
864
865c #define und
866        goto 123
867#ifdef und
868      CALL writeg1d(1,nlay,wd,'wd      ','wd      ')
869      CALL writeg1d(1,nlay,zwa,'wa      ','wa      ')
870      CALL writeg1d(1,nlay,fracd,'fracd      ','fracd      ')
871      CALL writeg1d(1,nlay,fraca,'fraca      ','fraca      ')
872      CALL writeg1d(1,nlay,wa_moy,'wam         ','wam         ')
873      CALL writeg1d(1,nlay,zla,'la      ','la      ')
874      CALL writeg1d(1,nlay,zld,'ld      ','ld      ')
875      CALL writeg1d(1,nlay,pt,'pt      ','pt      ')
876      CALL writeg1d(1,nlay,zh,'zh      ','zh      ')
877      CALL writeg1d(1,nlay,zha,'zha      ','zha      ')
878      CALL writeg1d(1,nlay,zu,'zu      ','zu      ')
879      CALL writeg1d(1,nlay,zv,'zv      ','zv      ')
880      CALL writeg1d(1,nlay,zo,'zo      ','zo      ')
881      CALL writeg1d(1,nlay,wh,'wh      ','wh      ')
882      CALL writeg1d(1,nlay,wu,'wu      ','wu      ')
883      CALL writeg1d(1,nlay,wv,'wv      ','wv      ')
884      CALL writeg1d(1,nlay,wo,'w15uo     ','wXo     ')
885      CALL writeg1d(1,nlay,zdhadj,'zdhadj      ','zdhadj      ')
886      CALL writeg1d(1,nlay,pduadj,'pduadj      ','pduadj      ')
887      CALL writeg1d(1,nlay,pdvadj,'pdvadj      ','pdvadj      ')
888      CALL writeg1d(1,nlay,pdoadj,'pdoadj      ','pdoadj      ')
889      CALL writeg1d(1,nlay,entr  ,'entr        ','entr        ')
890      CALL writeg1d(1,nlay,detr  ,'detr        ','detr        ')
891      CALL writeg1d(1,nlay,fm    ,'fm          ','fm          ')
892
893      CALL writeg1d(1,nlay,pdtadj,'pdtadj    ','pdtadj    ')
894      CALL writeg1d(1,nlay,pplay,'pplay     ','pplay     ')
895      CALL writeg1d(1,nlay,pplev,'pplev     ','pplev     ')
896
897c   recalcul des flux en diagnostique...
898c     print*,'PAS DE TEMPS ',ptimestep
899       call dt2F(pplev,pplay,pt,pdtadj,wh)
900      CALL writeg1d(1,nlay,wh,'wh2     ','wh2     ')
901#endif
902123   continue
903c#define troisD
904#ifdef troisD
905c       if (sorties) then
906      print*,'Debut des wrgradsfi'
907
908c      print*,'16 OK convect8'
909         call wrgradsfi(1,nlay,wd,'wd        ','wd        ')
910         call wrgradsfi(1,nlay,zwa,'wa        ','wa        ')
911         call wrgradsfi(1,nlay,fracd,'fracd     ','fracd     ')
912         call wrgradsfi(1,nlay,fraca,'fraca     ','fraca     ')
913         call wrgradsfi(1,nlay,xxx,'xxx       ','xxx       ')
914         call wrgradsfi(1,nlay,wa_moy,'wam       ','wam       ')
915c      print*,'WA6 ',wa_moy
916         call wrgradsfi(1,nlay,zla,'la        ','la        ')
917         call wrgradsfi(1,nlay,zld,'ld        ','ld        ')
918         call wrgradsfi(1,nlay,pt,'pt        ','pt        ')
919         call wrgradsfi(1,nlay,zh,'zh        ','zh        ')
920         call wrgradsfi(1,nlay,zha,'zha        ','zha        ')
921         call wrgradsfi(1,nlay,zua,'zua        ','zua        ')
922         call wrgradsfi(1,nlay,zva,'zva        ','zva        ')
923         call wrgradsfi(1,nlay,zu,'zu        ','zu        ')
924         call wrgradsfi(1,nlay,zv,'zv        ','zv        ')
925         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
926         call wrgradsfi(1,nlay,wh,'wh        ','wh        ')
927         call wrgradsfi(1,nlay,wu,'wu        ','wu        ')
928         call wrgradsfi(1,nlay,wv,'wv        ','wv        ')
929         call wrgradsfi(1,nlay,wo,'wo        ','wo        ')
930         call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
931         call wrgradsfi(1,nlay,zdhadj,'zdhadj    ','zdhadj    ')
932         call wrgradsfi(1,nlay,pduadj,'pduadj    ','pduadj    ')
933         call wrgradsfi(1,nlay,pdvadj,'pdvadj    ','pdvadj    ')
934         call wrgradsfi(1,nlay,pdoadj,'pdoadj    ','pdoadj    ')
935         call wrgradsfi(1,nlay,entr,'entr      ','entr      ')
936         call wrgradsfi(1,nlay,detr,'detr      ','detr      ')
937         call wrgradsfi(1,nlay,fm,'fm        ','fm        ')
938         call wrgradsfi(1,nlay,fmc,'fmc       ','fmc       ')
939         call wrgradsfi(1,nlay,zw2,'zw2       ','zw2       ')
940         call wrgradsfi(1,nlay,ztva,'ztva      ','ztva      ')
941         call wrgradsfi(1,nlay,ztv,'ztv       ','ztv       ')
942
943         call wrgradsfi(1,nlay,zo,'zo        ','zo        ')
944         call wrgradsfi(1,nlay,larg_cons,'Lc        ','Lc        ')
945         call wrgradsfi(1,nlay,larg_detr,'Ldetr     ','Ldetr     ')
946
947cCR:nouveaux diagnostiques
948      call wrgradsfi(1,nlay,entr_star  ,'entr_star   ','entr_star   ')     
949      call wrgradsfi(1,nlay,f_star    ,'f_star   ','f_star   ')
950      call wrgradsfi(1,1,zmax,'zmax      ','zmax      ')
951      call wrgradsfi(1,1,zmix,'zmix      ','zmix      ')
952      zsortie1d(:)=lmax(:)
953      call wrgradsfi(1,1,zsortie1d,'lmax      ','lmax      ')
954      call wrgradsfi(1,1,wmax,'wmax      ','wmax      ')
955      zsortie1d(:)=lmix(:)
956      call wrgradsfi(1,1,zsortie1d,'lmix      ','lmix      ')
957      zsortie1d(:)=lentr(:)
958      call wrgradsfi(1,1,zsortie1d,'lentr      ','lentr     ')
959
960c      print*,'17 OK convect8'
961
962         do k=1,klev/10
963            write(str2,'(i2.2)') k
964            str10='wa'//str2
965            do l=1,nlay
966               do ig=1,ngrid
967                  zsortie(ig,l)=wa(ig,k,l)
968               enddo
969            enddo   
970            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
971            do l=1,nlay
972               do ig=1,ngrid
973                  zsortie(ig,l)=larg_part(ig,k,l)
974               enddo
975            enddo
976            str10='la'//str2
977            CALL wrgradsfi(1,nlay,zsortie,str10,str10)
978         enddo
979
980
981c     print*,'18 OK convect8'
982c      endif
983      print*,'Fin des wrgradsfi'
984#endif
985
986      endif
987
988c     if(wa_moy(1,4).gt.1.e-10) stop
989
990      print*,'19 OK convect8'
991      return
992      end
993
994      subroutine dqthermcell(ngrid,nlay,ptimestep,fm,entr,masse
995     .    ,q,dq,qa)
996      use dimphy
997      implicit none
998
999c=======================================================================
1000c
1001c   Calcul du transport verticale dans la couche limite en presence
1002c   de "thermiques" explicitement representes
1003c   calcul du dq/dt une fois qu'on connait les ascendances
1004c
1005c=======================================================================
1006
1007cym#include "dimensions.h"
1008cym#include "dimphy.h"
1009
1010      integer ngrid,nlay
1011
1012      real ptimestep
1013      real masse(ngrid,nlay),fm(ngrid,nlay+1)
1014      real entr(ngrid,nlay)
1015      real q(ngrid,nlay)
1016      real dq(ngrid,nlay)
1017
1018      real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1)
1019
1020      integer ig,k
1021
1022c   calcul du detrainement
1023
1024      do k=1,nlay
1025         do ig=1,ngrid
1026            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
1027         enddo
1028      enddo
1029
1030c   calcul de la valeur dans les ascendances
1031      do ig=1,ngrid
1032         qa(ig,1)=q(ig,1)
1033      enddo
1034
1035      do k=2,nlay
1036         do ig=1,ngrid
1037            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
1038     s         1.e-5*masse(ig,k)) then
1039               qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k))
1040     s         /(fm(ig,k+1)+detr(ig,k))
1041            else
1042               qa(ig,k)=q(ig,k)
1043            endif
1044         enddo
1045      enddo
1046
1047      do k=2,nlay
1048         do ig=1,ngrid
1049c             wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k))
1050            wqd(ig,k)=fm(ig,k)*q(ig,k)
1051         enddo
1052      enddo
1053      do ig=1,ngrid
1054         wqd(ig,1)=0.
1055         wqd(ig,nlay+1)=0.
1056      enddo
1057
1058      do k=1,nlay
1059         do ig=1,ngrid
1060            dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k)
1061     s               -wqd(ig,k)+wqd(ig,k+1))
1062     s               /masse(ig,k)
1063         enddo
1064      enddo
1065
1066      return
1067      end
1068      subroutine dvthermcell(ngrid,nlay,ptimestep,fm,entr,masse
1069     .    ,fraca,larga
1070     .    ,u,v,du,dv,ua,va)
1071       use dimphy
1072      implicit none
1073
1074c=======================================================================
1075c
1076c   Calcul du transport verticale dans la couche limite en presence
1077c   de "thermiques" explicitement representes
1078c   calcul du dq/dt une fois qu'on connait les ascendances
1079c
1080c=======================================================================
1081
1082cym#include "dimensions.h"
1083cym#include "dimphy.h"
1084
1085      integer ngrid,nlay
1086
1087      real ptimestep
1088      real masse(ngrid,nlay),fm(ngrid,nlay+1)
1089      real fraca(ngrid,nlay+1)
1090      real larga(ngrid)
1091      real entr(ngrid,nlay)
1092      real u(ngrid,nlay)
1093      real ua(ngrid,nlay)
1094      real du(ngrid,nlay)
1095      real v(ngrid,nlay)
1096      real va(ngrid,nlay)
1097      real dv(ngrid,nlay)
1098
1099      real qa(klon,klev),detr(klon,klev)
1100      real wvd(klon,klev+1),wud(klon,klev+1)
1101      real gamma0,gamma(klon,klev+1)
1102      real dua,dva
1103      integer iter
1104
1105      integer ig,k
1106
1107c   calcul du detrainement
1108
1109      do k=1,nlay
1110         do ig=1,ngrid
1111            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
1112         enddo
1113      enddo
1114
1115c   calcul de la valeur dans les ascendances
1116      do ig=1,ngrid
1117         ua(ig,1)=u(ig,1)
1118         va(ig,1)=v(ig,1)
1119      enddo
1120
1121      do k=2,nlay
1122         do ig=1,ngrid
1123            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
1124     s         1.e-5*masse(ig,k)) then
1125c   On itere sur la valeur du coeff de freinage.
1126c              gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))
1127               gamma0=masse(ig,k)
1128     s         *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )
1129     s         *0.5/larga(ig)
1130c              gamma0=0.
1131c   la premiere fois on multiplie le coefficient de freinage
1132c   par le module du vent dans la couche en dessous.
1133               dua=ua(ig,k-1)-u(ig,k-1)
1134               dva=va(ig,k-1)-v(ig,k-1)
1135               do iter=1,5
1136                  gamma(ig,k)=gamma0*sqrt(dua**2+dva**2)
1137                  ua(ig,k)=(fm(ig,k)*ua(ig,k-1)
1138     s               +(entr(ig,k)+gamma(ig,k))*u(ig,k))
1139     s               /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k))
1140                  va(ig,k)=(fm(ig,k)*va(ig,k-1)
1141     s               +(entr(ig,k)+gamma(ig,k))*v(ig,k))
1142     s               /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k))
1143c                 print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva
1144                  dua=ua(ig,k)-u(ig,k)
1145                  dva=va(ig,k)-v(ig,k)
1146               enddo
1147            else
1148               ua(ig,k)=u(ig,k)
1149               va(ig,k)=v(ig,k)
1150               gamma(ig,k)=0.
1151            endif
1152         enddo
1153      enddo
1154
1155      do k=2,nlay
1156         do ig=1,ngrid
1157            wud(ig,k)=fm(ig,k)*u(ig,k)
1158            wvd(ig,k)=fm(ig,k)*v(ig,k)
1159         enddo
1160      enddo
1161      do ig=1,ngrid
1162         wud(ig,1)=0.
1163         wud(ig,nlay+1)=0.
1164         wvd(ig,1)=0.
1165         wvd(ig,nlay+1)=0.
1166      enddo
1167
1168      do k=1,nlay
1169         do ig=1,ngrid
1170            du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)
1171     s               -(entr(ig,k)+gamma(ig,k))*u(ig,k)
1172     s               -wud(ig,k)+wud(ig,k+1))
1173     s               /masse(ig,k)
1174            dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)
1175     s               -(entr(ig,k)+gamma(ig,k))*v(ig,k)
1176     s               -wvd(ig,k)+wvd(ig,k+1))
1177     s               /masse(ig,k)
1178         enddo
1179      enddo
1180
1181      return
1182      end
1183      subroutine dqthermcell2(ngrid,nlay,ptimestep,fm,entr,masse,frac
1184     .    ,q,dq,qa)
1185      use dimphy
1186      implicit none
1187
1188c=======================================================================
1189c
1190c   Calcul du transport verticale dans la couche limite en presence
1191c   de "thermiques" explicitement representes
1192c   calcul du dq/dt une fois qu'on connait les ascendances
1193c
1194c=======================================================================
1195
1196cym#include "dimensions.h"
1197cym#include "dimphy.h"
1198
1199      integer ngrid,nlay
1200
1201      real ptimestep
1202      real masse(ngrid,nlay),fm(ngrid,nlay+1)
1203      real entr(ngrid,nlay),frac(ngrid,nlay)
1204      real q(ngrid,nlay)
1205      real dq(ngrid,nlay)
1206
1207      real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1)
1208      real qe(klon,klev),zf,zf2
1209
1210      integer ig,k
1211
1212c   calcul du detrainement
1213
1214      do k=1,nlay
1215         do ig=1,ngrid
1216            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
1217         enddo
1218      enddo
1219
1220c   calcul de la valeur dans les ascendances
1221      do ig=1,ngrid
1222         qa(ig,1)=q(ig,1)
1223         qe(ig,1)=q(ig,1)
1224      enddo
1225
1226      do k=2,nlay
1227         do ig=1,ngrid
1228            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
1229     s         1.e-5*masse(ig,k)) then
1230               zf=0.5*(frac(ig,k)+frac(ig,k+1))
1231               zf2=1./(1.-zf)
1232               qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k))
1233     s         /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2)
1234               qe(ig,k)=(q(ig,k)-zf*qa(ig,k))*zf2
1235            else
1236               qa(ig,k)=q(ig,k)
1237               qe(ig,k)=q(ig,k)
1238            endif
1239         enddo
1240      enddo
1241
1242      do k=2,nlay
1243         do ig=1,ngrid
1244c             wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k))
1245            wqd(ig,k)=fm(ig,k)*qe(ig,k)
1246         enddo
1247      enddo
1248      do ig=1,ngrid
1249         wqd(ig,1)=0.
1250         wqd(ig,nlay+1)=0.
1251      enddo
1252
1253      do k=1,nlay
1254         do ig=1,ngrid
1255            dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k)
1256     s               -wqd(ig,k)+wqd(ig,k+1))
1257     s               /masse(ig,k)
1258         enddo
1259      enddo
1260
1261      return
1262      end
1263      subroutine dvthermcell2(ngrid,nlay,ptimestep,fm,entr,masse
1264     .    ,fraca,larga
1265     .    ,u,v,du,dv,ua,va)
1266      use dimphy
1267      implicit none
1268
1269c=======================================================================
1270c
1271c   Calcul du transport verticale dans la couche limite en presence
1272c   de "thermiques" explicitement representes
1273c   calcul du dq/dt une fois qu'on connait les ascendances
1274c
1275c=======================================================================
1276
1277cym#include "dimensions.h"
1278cym#include "dimphy.h"
1279
1280      integer ngrid,nlay
1281
1282      real ptimestep
1283      real masse(ngrid,nlay),fm(ngrid,nlay+1)
1284      real fraca(ngrid,nlay+1)
1285      real larga(ngrid)
1286      real entr(ngrid,nlay)
1287      real u(ngrid,nlay)
1288      real ua(ngrid,nlay)
1289      real du(ngrid,nlay)
1290      real v(ngrid,nlay)
1291      real va(ngrid,nlay)
1292      real dv(ngrid,nlay)
1293
1294      real qa(klon,klev),detr(klon,klev),zf,zf2
1295      real wvd(klon,klev+1),wud(klon,klev+1)
1296      real gamma0,gamma(klon,klev+1)
1297      real ue(klon,klev),ve(klon,klev)
1298      real dua,dva
1299      integer iter
1300
1301      integer ig,k
1302
1303c   calcul du detrainement
1304
1305      do k=1,nlay
1306         do ig=1,ngrid
1307            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
1308         enddo
1309      enddo
1310
1311c   calcul de la valeur dans les ascendances
1312      do ig=1,ngrid
1313         ua(ig,1)=u(ig,1)
1314         va(ig,1)=v(ig,1)
1315         ue(ig,1)=u(ig,1)
1316         ve(ig,1)=v(ig,1)
1317      enddo
1318
1319      do k=2,nlay
1320         do ig=1,ngrid
1321            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
1322     s         1.e-5*masse(ig,k)) then
1323c   On itere sur la valeur du coeff de freinage.
1324c              gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))
1325               gamma0=masse(ig,k)
1326     s         *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )
1327     s         *0.5/larga(ig)
1328     s         *1.
1329c    s         *0.5
1330c              gamma0=0.
1331               zf=0.5*(fraca(ig,k)+fraca(ig,k+1))
1332               zf=0.
1333               zf2=1./(1.-zf)
1334c   la premiere fois on multiplie le coefficient de freinage
1335c   par le module du vent dans la couche en dessous.
1336               dua=ua(ig,k-1)-u(ig,k-1)
1337               dva=va(ig,k-1)-v(ig,k-1)
1338               do iter=1,5
1339c   On choisit une relaxation lineaire.
1340                  gamma(ig,k)=gamma0
1341c   On choisit une relaxation quadratique.
1342                  gamma(ig,k)=gamma0*sqrt(dua**2+dva**2)
1343                  ua(ig,k)=(fm(ig,k)*ua(ig,k-1)
1344     s               +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k))
1345     s               /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2
1346     s                 +gamma(ig,k))
1347                  va(ig,k)=(fm(ig,k)*va(ig,k-1)
1348     s               +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k))
1349     s               /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2
1350     s                 +gamma(ig,k))
1351c                 print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva
1352                  dua=ua(ig,k)-u(ig,k)
1353                  dva=va(ig,k)-v(ig,k)
1354                  ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2
1355                  ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2
1356               enddo
1357            else
1358               ua(ig,k)=u(ig,k)
1359               va(ig,k)=v(ig,k)
1360               ue(ig,k)=u(ig,k)
1361               ve(ig,k)=v(ig,k)
1362               gamma(ig,k)=0.
1363            endif
1364         enddo
1365      enddo
1366
1367      do k=2,nlay
1368         do ig=1,ngrid
1369            wud(ig,k)=fm(ig,k)*ue(ig,k)
1370            wvd(ig,k)=fm(ig,k)*ve(ig,k)
1371         enddo
1372      enddo
1373      do ig=1,ngrid
1374         wud(ig,1)=0.
1375         wud(ig,nlay+1)=0.
1376         wvd(ig,1)=0.
1377         wvd(ig,nlay+1)=0.
1378      enddo
1379
1380      do k=1,nlay
1381         do ig=1,ngrid
1382            du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)
1383     s               -(entr(ig,k)+gamma(ig,k))*ue(ig,k)
1384     s               -wud(ig,k)+wud(ig,k+1))
1385     s               /masse(ig,k)
1386            dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)
1387     s               -(entr(ig,k)+gamma(ig,k))*ve(ig,k)
1388     s               -wvd(ig,k)+wvd(ig,k+1))
1389     s               /masse(ig,k)
1390         enddo
1391      enddo
1392
1393      return
1394      end
Note: See TracBrowser for help on using the repository browser.