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

Last change on this file since 5411 was 5153, checked in by abarral, 5 months ago

Revert FCTTRE to INCLUDE to assess impact of inlining

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