source: LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_old.F90 @ 5151

Last change on this file since 5151 was 5144, checked in by abarral, 7 weeks ago

Put YOMCST.h into modules

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