source: LMDZ5/branches/testing/libf/phylmd/cv3_routines.F90 @ 2687

Last change on this file since 2687 was 2641, checked in by Laurent Fairhead, 8 years ago

Merged trunk changes r2593:2640 into testing branch

  • 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: 148.1 KB
RevLine 
[1992]1
[1403]2! $Id: cv3_routines.F90 2641 2016-09-29 21:26:46Z musat $
[524]3
4
5
[2220]6
[2298]7SUBROUTINE cv3_param(nd, k_upper, delt)
[2160]8
[2488]9  USE ioipsl_getin_p_mod, ONLY : getin_p
[2160]10  use mod_phys_lmdz_para
[1992]11  IMPLICIT NONE
[524]12
[2056]13!------------------------------------------------------------
14!Set parameters for convectL for iflag_con = 3
15!------------------------------------------------------------
[524]16
[1516]17
[2056]18!***  PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE ***
19!***      PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO     ***
20!***  PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. ***
21!***            EFFICIENCY IS ASSUMED TO BE UNITY            ***
22!***  SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT  ***
23!***  SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***
24!***                        OF CLOUD                         ***
[1403]25
[2056]26![TAU: CHARACTERISTIC TIMESCALE USED TO COMPUTE ALPHA & BETA]
27!***    ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF ***
28!***                 APPROACH TO QUASI-EQUILIBRIUM           ***
29!***    (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) ***
30!***           (BETA MUST BE LESS THAN OR EQUAL TO 1)        ***
[1506]31
[2056]32!***    DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE ***
33!***                 APPROACH TO QUASI-EQUILIBRIUM           ***
34!***                     IT MUST BE LESS THAN 0              ***
[524]35
[1992]36  include "cv3param.h"
37  include "conema3.h"
[524]38
[2298]39  INTEGER, INTENT(IN)              :: nd
40  INTEGER, INTENT(IN)              :: k_upper
41  REAL, INTENT(IN)                 :: delt ! timestep (seconds)
[524]42
[2408]43! Local variables
[1992]44  CHARACTER (LEN=20) :: modname = 'cv3_param'
45  CHARACTER (LEN=80) :: abort_message
[524]46
[1992]47  LOGICAL, SAVE :: first = .TRUE.
[2056]48!$OMP THREADPRIVATE(first)
[524]49
[2056]50!glb  noff: integer limit for convection (nd-noff)
51! minorig: First level of convection
[524]52
[2056]53! -- limit levels for convection:
[524]54
[2298]55!jyg<
56!  noff is chosen such that nl = k_upper so that upmost loops end at about 22 km
57!
58  noff = min(max(nd-k_upper, 1), (nd+1)/2)
59!!  noff = 1
60!>jyg
[1992]61  minorig = 1
62  nl = nd - noff
63  nlp = nl + 1
64  nlm = nl - 1
[524]65
[1992]66  IF (first) THEN
[2056]67! -- "microphysical" parameters:
68! IM beg: ajout fis. reglage ep
[2488]69! CR+JYG: shedding coefficient (used when iflag_mix_adiab=1)
[2056]70! IM lu dans physiq.def via conf_phys.F90     epmax  = 0.993
[524]71
[1992]72    omtrain = 45.0 ! used also for snow (no disctinction rain/snow)
[2056]73! -- misc:
[1992]74    dtovsh = -0.2 ! dT for overshoot
[2056]75! cc      dttrig = 5.   ! (loose) condition for triggering
[1992]76    dttrig = 10. ! (loose) condition for triggering
77    dtcrit = -2.0
[2435]78! -- end of convection
[2056]79! -- interface cloud parameterization:
[1992]80    delta = 0.01 ! cld
[2056]81! -- interface with boundary-layer (gust factor): (sb)
[1992]82    betad = 10.0 ! original value (from convect 4.3)
[524]83
[2488]84! Var interm pour le getin
85     dpbase=-40.
86     CALL getin_p('dpbase',dpbase)
87     pbcrit=150.0
88     CALL getin_p('pbcrit',pbcrit)
89     ptcrit=500.0
90     CALL getin_p('ptcrit',ptcrit)
91     sigdz=0.01
92     CALL getin_p('sigdz',sigdz)
93     spfac=0.15
94     CALL getin_p('spfac',spfac)
95     tau=8000.
96     CALL getin_p('tau',tau)
97     flag_wb=1
98     CALL getin_p('flag_wb',flag_wb)
99     wbmax=6.
100     CALL getin_p('wbmax',wbmax)
101     ok_convstop=.False.
102     CALL getin_p('ok_convstop',ok_convstop)
103     tau_stop=15000.
104     CALL getin_p('tau_stop',tau_stop)
105     ok_intermittent=.False.
106     CALL getin_p('ok_intermittent',ok_intermittent)
[2542]107     ok_optim_yield=.False.
108     CALL getin_p('ok_optim_yield',ok_optim_yield)
[2488]109     coef_peel=0.25
110     CALL getin_p('coef_peel',coef_peel)
111
112     flag_epKEorig=1
113     CALL getin_p('flag_epKEorig',flag_epKEorig)
114     elcrit=0.0003
115     CALL getin_p('elcrit',elcrit)
116     tlcrit=-55.0
117     CALL getin_p('tlcrit',tlcrit)
118
[1992]119    WRITE (*, *) 'dpbase=', dpbase
120    WRITE (*, *) 'pbcrit=', pbcrit
121    WRITE (*, *) 'ptcrit=', ptcrit
122    WRITE (*, *) 'sigdz=', sigdz
123    WRITE (*, *) 'spfac=', spfac
124    WRITE (*, *) 'tau=', tau
[2488]125    WRITE (*, *) 'flag_wb=', flag_wb
126    WRITE (*, *) 'wbmax=', wbmax
127    WRITE (*, *) 'ok_convstop=', ok_convstop
128    WRITE (*, *) 'tau_stop=', tau_stop
129    WRITE (*, *) 'ok_intermittent=', ok_intermittent
[2542]130    WRITE (*, *) 'ok_optim_yield =', ok_optim_yield
[2488]131    WRITE (*, *) 'coef_peel=', coef_peel
[524]132
[2488]133    WRITE (*, *) 'flag_epKEorig=', flag_epKEorig
[1992]134    WRITE (*, *) 'elcrit=', elcrit
135    WRITE (*, *) 'tlcrit=', tlcrit
136    first = .FALSE.
[2056]137  END IF ! (first)
138
[1992]139  beta = 1.0 - delt/tau
140  alpha1 = 1.5E-3
[2056]141!JYG    Correction bug alpha
[1992]142  alpha1 = alpha1*1.5
143  alpha = alpha1*delt/tau
[2056]144!JYG    Bug
145! cc increase alpha to compensate W decrease:
146! c      alpha  = alpha*1.5
[524]147
[2435]148  noconv_stop = max(2.,tau_stop/delt)
149
[1992]150  RETURN
151END SUBROUTINE cv3_param
[524]152
[2435]153SUBROUTINE cv3_incrcount(len, nd, delt, sig)
154
155IMPLICIT NONE
156
157! =====================================================================
158!  Increment the counter sig(nd)
159! =====================================================================
160
161  include "cv3param.h"
162
163!inputs:
164  INTEGER, INTENT(IN)                     :: len
165  INTEGER, INTENT(IN)                     :: nd
166  REAL, INTENT(IN)                        :: delt ! timestep (seconds)
167
168!input/output
169  REAL, DIMENSION(len,nd), INTENT(INOUT)  :: sig
170
171!local variables
172  INTEGER il
173
174!    print *,'cv3_incrcount : noconv_stop ',noconv_stop
175!    print *,'cv3_incrcount in, sig(1,nd) ',sig(1,nd)
176    IF(ok_convstop) THEN
177      DO il = 1, len
178        sig(il, nd) = sig(il, nd) + 1.
179        sig(il, nd) = min(sig(il,nd), noconv_stop+0.1)
180      END DO
181    ELSE
182      DO il = 1, len
183        sig(il, nd) = sig(il, nd) + 1.
184        sig(il, nd) = min(sig(il,nd), 12.1)
185      END DO
186    ENDIF  ! (ok_convstop)
187!    print *,'cv3_incrcount out, sig(1,nd) ',sig(1,nd)
188
189  RETURN
190END SUBROUTINE cv3_incrcount
191
[2056]192SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, &
193                      lv, lf, cpn, tv, gz, h, hm, th)
[1992]194  IMPLICIT NONE
[524]195
[2056]196! =====================================================================
197! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY
198! "ori": from convect4.3 (vectorized)
199! "convect3": to be exactly consistent with convect3
200! =====================================================================
[524]201
[2056]202! inputs:
[1992]203  INTEGER len, nd, ndp1
204  REAL t(len, nd), q(len, nd), p(len, nd), ph(len, ndp1)
[524]205
[2056]206! outputs:
[1992]207  REAL lv(len, nd), lf(len, nd), cpn(len, nd), tv(len, nd)
208  REAL gz(len, nd), h(len, nd), hm(len, nd)
209  REAL th(len, nd)
[524]210
[2056]211! local variables:
[1992]212  INTEGER k, i
213  REAL rdcp
214  REAL tvx, tvy ! convect3
215  REAL cpx(len, nd)
[524]216
[1992]217  include "cvthermo.h"
218  include "cv3param.h"
[524]219
220
[2056]221! ori      do 110 k=1,nlp
222! abderr     do 110 k=1,nl ! convect3
[1992]223  DO k = 1, nlp
[524]224
[1992]225    DO i = 1, len
[2056]226! debug          lv(i,k)= lv0-clmcpv*(t(i,k)-t0)
[1992]227      lv(i, k) = lv0 - clmcpv*(t(i,k)-273.15)
228      lf(i, k) = lf0 - clmci*(t(i,k)-273.15)
229      cpn(i, k) = cpd*(1.0-q(i,k)) + cpv*q(i, k)
230      cpx(i, k) = cpd*(1.0-q(i,k)) + cl*q(i, k)
[2056]231! ori          tv(i,k)=t(i,k)*(1.0+q(i,k)*epsim1)
[1992]232      tv(i, k) = t(i, k)*(1.0+q(i,k)/eps-q(i,k))
233      rdcp = (rrd*(1.-q(i,k))+q(i,k)*rrv)/cpn(i, k)
234      th(i, k) = t(i, k)*(1000.0/p(i,k))**rdcp
235    END DO
236  END DO
[524]237
[2056]238! gz = phi at the full levels (same as p).
[524]239
[2641]240!!  DO i = 1, len                    !jyg
241!!    gz(i, 1) = 0.0                 !jyg
242!!  END DO                           !jyg
243    gz(:,:) = 0.                     !jyg: initialization of the whole array
[2056]244! ori      do 140 k=2,nlp
[1992]245  DO k = 2, nl ! convect3
246    DO i = 1, len
[2056]247      tvx = t(i, k)*(1.+q(i,k)/eps-q(i,k))         !convect3
248      tvy = t(i, k-1)*(1.+q(i,k-1)/eps-q(i,k-1))   !convect3
249      gz(i, k) = gz(i, k-1) + 0.5*rrd*(tvx+tvy)* & !convect3
250                 (p(i,k-1)-p(i,k))/ph(i, k)        !convect3
[879]251
[2056]252! c        print *,' gz(',k,')',gz(i,k),' tvx',tvx,' tvy ',tvy
[879]253
[2056]254! ori         gz(i,k)=gz(i,k-1)+hrd*(tv(i,k-1)+tv(i,k))
255! ori    &         *(p(i,k-1)-p(i,k))/ph(i,k)
[1992]256    END DO
257  END DO
[524]258
[2056]259! h  = phi + cpT (dry static energy).
260! hm = phi + cp(T-Tbase)+Lq
[524]261
[2056]262! ori      do 170 k=1,nlp
[1992]263  DO k = 1, nl ! convect3
264    DO i = 1, len
265      h(i, k) = gz(i, k) + cpn(i, k)*t(i, k)
266      hm(i, k) = gz(i, k) + cpx(i, k)*(t(i,k)-t(i,1)) + lv(i, k)*q(i, k)
267    END DO
268  END DO
[524]269
[1992]270  RETURN
271END SUBROUTINE cv3_prelim
[524]272
[2056]273SUBROUTINE cv3_feed(len, nd, ok_conserv_q, &
274                    t, q, u, v, p, ph, hm, gz, &
275                    p1feed, p2feed, wght, &
276                    wghti, tnk, thnk, qnk, qsnk, unk, vnk, &
277                    cpnk, hnk, nk, icb, icbmax, iflag, gznk, plcl)
[1992]278  IMPLICIT NONE
[524]279
[2056]280! ================================================================
281! Purpose: CONVECTIVE FEED
[524]282
[2056]283! Main differences with cv_feed:
284! - ph added in input
285! - here, nk(i)=minorig
286! - icb defined differently (plcl compared with ph instead of p)
[524]287
[2056]288! Main differences with convect3:
289! - we do not compute dplcldt and dplcldr of CLIFT anymore
290! - values iflag different (but tests identical)
291! - A,B explicitely defined (!...)
292! ================================================================
[524]293
[1992]294  include "cv3param.h"
295  include "cvthermo.h"
[524]296
[2056]297!inputs:
[2298]298  INTEGER, INTENT (IN)                               :: len, nd
299  LOGICAL, INTENT (IN)                               :: ok_conserv_q
300  REAL, DIMENSION (len, nd), INTENT (IN)             :: t, q, p
301  REAL, DIMENSION (len, nd), INTENT (IN)             :: u, v
302  REAL, DIMENSION (len, nd), INTENT (IN)             :: hm, gz
303  REAL, DIMENSION (len, nd+1), INTENT (IN)           :: ph
304  REAL, DIMENSION (len), INTENT (IN)                 :: p1feed
305  REAL, DIMENSION (nd), INTENT (IN)                  :: wght
[2056]306!input-output
[2298]307  REAL, DIMENSION (len), INTENT (INOUT)              :: p2feed
[2056]308!outputs:
[2298]309  INTEGER, INTENT (OUT)                              :: icbmax
310  INTEGER, DIMENSION (len), INTENT (OUT)             :: iflag, nk, icb
311  REAL, DIMENSION (len, nd), INTENT (OUT)            :: wghti
312  REAL, DIMENSION (len), INTENT (OUT)                :: tnk, thnk, qnk, qsnk
313  REAL, DIMENSION (len), INTENT (OUT)                :: unk, vnk
314  REAL, DIMENSION (len), INTENT (OUT)                :: cpnk, hnk, gznk
315  REAL, DIMENSION (len), INTENT (OUT)                :: plcl
[524]316
[2056]317!local variables:
[1992]318  INTEGER i, k, iter, niter
319  INTEGER ihmin(len)
320  REAL work(len)
321  REAL pup(len), plo(len), pfeed(len)
322  REAL plclup(len), plcllo(len), plclfeed(len)
[2056]323  REAL pfeedmin(len)
[1992]324  REAL posit(len)
325  LOGICAL nocond(len)
[524]326
[2056]327!jyg20140217<
328  INTEGER iostat
329  LOGICAL, SAVE :: first
330  LOGICAL, SAVE :: ok_new_feed
331  REAL, SAVE :: dp_lcl_feed
332!$OMP THREADPRIVATE (first,ok_new_feed,dp_lcl_feed)
333  DATA first/.TRUE./
334  DATA dp_lcl_feed/2./
[524]335
[2056]336  IF (first) THEN
337!$OMP MASTER
338    ok_new_feed = ok_conserv_q
339    OPEN (98, FILE='cv3feed_param.data', STATUS='old', FORM='formatted', IOSTAT=iostat)
340    IF (iostat==0) THEN
341      READ (98, *, END=998) ok_new_feed
342998   CONTINUE
343      CLOSE (98)
344    END IF
345    PRINT *, ' ok_new_feed: ', ok_new_feed
346    first = .FALSE.
347!$OMP END MASTER
348  END IF
349!jyg>
350! -------------------------------------------------------------------
351! --- Origin level of ascending parcels for convect3:
352! -------------------------------------------------------------------
353
[1992]354  DO i = 1, len
355    nk(i) = minorig
356    gznk(i) = gz(i, nk(i))
357  END DO
[524]358
[2056]359! -------------------------------------------------------------------
360! --- Adjust feeding layer thickness so that lifting up to the top of
361! --- the feeding layer does not induce condensation (i.e. so that
362! --- plcl < p2feed).
363! --- Method : iterative secant method.
364! -------------------------------------------------------------------
[524]365
[2056]366! 1- First bracketing of the solution : ph(nk+1), p2feed
[524]367
[2056]368! 1.a- LCL associated with p2feed
[1992]369  DO i = 1, len
370    pup(i) = p2feed(i)
371  END DO
[2056]372  CALL cv3_vertmix(len, nd, iflag, p1feed, pup, p, ph, &
373                   t, q, u, v, wght, &
374                   wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclup)
375! 1.b- LCL associated with ph(nk+1)
[1992]376  DO i = 1, len
377    plo(i) = ph(i, nk(i)+1)
378  END DO
[2056]379  CALL cv3_vertmix(len, nd, iflag, p1feed, plo, p, ph, &
380                   t, q, u, v, wght, &
381                   wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plcllo)
382! 2- Iterations
[1992]383  niter = 5
384  DO iter = 1, niter
385    DO i = 1, len
386      plcllo(i) = min(plo(i), plcllo(i))
387      plclup(i) = max(pup(i), plclup(i))
388      nocond(i) = plclup(i) <= pup(i)
389    END DO
390    DO i = 1, len
391      IF (nocond(i)) THEN
392        pfeed(i) = pup(i)
393      ELSE
[2056]394!JYG20140217<
395        IF (ok_new_feed) THEN
396          pfeed(i) = (pup(i)*(plo(i)-plcllo(i)-dp_lcl_feed)+  &
397                      plo(i)*(plclup(i)-pup(i)+dp_lcl_feed))/ &
398                     (plo(i)-plcllo(i)+plclup(i)-pup(i))
399        ELSE
400          pfeed(i) = (pup(i)*(plo(i)-plcllo(i))+  &
401                      plo(i)*(plclup(i)-pup(i)))/ &
402                     (plo(i)-plcllo(i)+plclup(i)-pup(i))
403        END IF
404!JYG>
[1992]405      END IF
406    END DO
[2056]407!jyg20140217<
408! For the last iteration, make sure that the top of the feeding layer
409! and LCL are not in the same layer:
410    IF (ok_new_feed) THEN
411      IF (iter==niter) THEN
[2641]412        DO i = 1,len                         !jyg
413          pfeedmin(i) = ph(i,minorig+1)      !jyg
414        ENDDO                                !jyg
415        DO k = minorig+1, nl                 !jyg
416!!        DO k = minorig, nl                 !jyg
[2056]417          DO i = 1, len
418            IF (ph(i,k)>=plclfeed(i)) pfeedmin(i) = ph(i, k)
419          END DO
420        END DO
421        DO i = 1, len
422          pfeed(i) = max(pfeedmin(i), pfeed(i))
423        END DO
424      END IF
425    END IF
426!jyg>
427
428    CALL cv3_vertmix(len, nd, iflag, p1feed, pfeed, p, ph, &
429                   t, q, u, v, wght, &
430                   wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclfeed)
431!jyg20140217<
432    IF (ok_new_feed) THEN
433      DO i = 1, len
434        posit(i) = (sign(1.,plclfeed(i)-pfeed(i)+dp_lcl_feed)+1.)*0.5
435        IF (plclfeed(i)-pfeed(i)+dp_lcl_feed==0.) posit(i) = 1.
436      END DO
437    ELSE
438      DO i = 1, len
439        posit(i) = (sign(1.,plclfeed(i)-pfeed(i))+1.)*0.5
440        IF (plclfeed(i)==pfeed(i)) posit(i) = 1.
441      END DO
442    END IF
443!jyg>
[1992]444    DO i = 1, len
[2056]445! - posit = 1 when lcl is below top of feeding layer (plclfeed>pfeed)
446! -               => pup=pfeed
447! - posit = 0 when lcl is above top of feeding layer (plclfeed<pfeed)
448! -               => plo=pfeed
[1992]449      pup(i) = posit(i)*pfeed(i) + (1.-posit(i))*pup(i)
450      plo(i) = (1.-posit(i))*pfeed(i) + posit(i)*plo(i)
451      plclup(i) = posit(i)*plclfeed(i) + (1.-posit(i))*plclup(i)
452      plcllo(i) = (1.-posit(i))*plclfeed(i) + posit(i)*plcllo(i)
453    END DO
454  END DO !  iter
455  DO i = 1, len
456    p2feed(i) = pfeed(i)
457    plcl(i) = plclfeed(i)
458  END DO
[524]459
[1992]460  DO i = 1, len
461    cpnk(i) = cpd*(1.0-qnk(i)) + cpv*qnk(i)
462    hnk(i) = gz(i, 1) + cpnk(i)*tnk(i)
463  END DO
[524]464
[2056]465! -------------------------------------------------------------------
466! --- Check whether parcel level temperature and specific humidity
467! --- are reasonable
468! -------------------------------------------------------------------
[1992]469  DO i = 1, len
470    IF (((tnk(i)<250.0) .OR. (qnk(i)<=0.0)) .AND. (iflag(i)==0)) iflag(i) = 7
471  END DO
[524]472
[2056]473! -------------------------------------------------------------------
474! --- Calculate first level above lcl (=icb)
475! -------------------------------------------------------------------
[524]476
[2056]477!@      do 270 i=1,len
478!@       icb(i)=nlm
479!@ 270  continue
480!@c
481!@      do 290 k=minorig,nl
482!@        do 280 i=1,len
483!@          if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i)))
484!@     &    icb(i)=min(icb(i),k)
485!@ 280    continue
486!@ 290  continue
487!@c
488!@      do 300 i=1,len
489!@        if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9
490!@ 300  continue
[524]491
[1992]492  DO i = 1, len
493    icb(i) = nlm
494  END DO
[524]495
[2056]496! la modification consiste a comparer plcl a ph et non a p:
497! icb est defini par :  ph(icb)<plcl<ph(icb-1)
498!@      do 290 k=minorig,nl
[1992]499  DO k = 3, nl - 1 ! modif pour que icb soit sup/egal a 2
500    DO i = 1, len
501      IF (ph(i,k)<plcl(i)) icb(i) = min(icb(i), k)
502    END DO
503  END DO
[524]504
505
[2056]506! print*,'icb dans cv3_feed '
507! write(*,'(64i2)') icb(2:len-1)
508! call dump2d(64,43,'plcl dans cv3_feed ',plcl(2:len-1))
[524]509
[1992]510  DO i = 1, len
[2056]511!@        if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9
[1992]512    IF ((icb(i)==nlm) .AND. (iflag(i)==0)) iflag(i) = 9
513  END DO
[524]514
[1992]515  DO i = 1, len
516    icb(i) = icb(i) - 1 ! icb sup ou egal a 2
517  END DO
[524]518
[2056]519! Compute icbmax.
[524]520
[1992]521  icbmax = 2
522  DO i = 1, len
[2056]523!!        icbmax=max(icbmax,icb(i))
524    IF (iflag(i)<7) icbmax = max(icbmax, icb(i))     ! sb Jun7th02
[1992]525  END DO
[524]526
[1992]527  RETURN
528END SUBROUTINE cv3_feed
[524]529
[1992]530SUBROUTINE cv3_undilute1(len, nd, t, qs, gz, plcl, p, icb, tnk, qnk, gznk, &
[2056]531                         tp, tvp, clw, icbs)
[1992]532  IMPLICIT NONE
[524]533
[2056]534! ----------------------------------------------------------------
535! Equivalent de TLIFT entre NK et ICB+1 inclus
[524]536
[2056]537! Differences with convect4:
538!    - specify plcl in input
539!    - icbs is the first level above LCL (may differ from icb)
540!    - in the iterations, used x(icbs) instead x(icb)
541!    - many minor differences in the iterations
542!    - tvp is computed in only one time
543!    - icbs: first level above Plcl (IMIN de TLIFT) in output
544!    - if icbs=icb, compute also tp(icb+1),tvp(icb+1) & clw(icb+1)
545! ----------------------------------------------------------------
[524]546
[1992]547  include "cvthermo.h"
548  include "cv3param.h"
[524]549
[2056]550! inputs:
[2298]551  INTEGER, INTENT (IN)                              :: len, nd
552  INTEGER, DIMENSION (len), INTENT (IN)             :: icb
553  REAL, DIMENSION (len, nd), INTENT (IN)            :: t, qs, gz
554  REAL, DIMENSION (len), INTENT (IN)                :: tnk, qnk, gznk
555  REAL, DIMENSION (len, nd), INTENT (IN)            :: p
556  REAL, DIMENSION (len), INTENT (IN)                :: plcl              ! convect3
[524]557
[2056]558! outputs:
[2298]559  INTEGER, DIMENSION (len), INTENT (OUT)            :: icbs
560  REAL, DIMENSION (len, nd), INTENT (OUT)           :: tp, tvp, clw
[524]561
[2056]562! local variables:
[1992]563  INTEGER i, k
[2298]564  INTEGER icb1(len), icbsmax2                                            ! convect3
[1992]565  REAL tg, qg, alv, s, ahg, tc, denom, es, rg
566  REAL ah0(len), cpp(len)
567  REAL ticb(len), gzicb(len)
[2298]568  REAL qsicb(len)                                                        ! convect3
569  REAL cpinv(len)                                                        ! convect3
[524]570
[2056]571! -------------------------------------------------------------------
572! --- Calculates the lifted parcel virtual temperature at nk,
573! --- the actual temperature, and the adiabatic
574! --- liquid water content. The procedure is to solve the equation.
575!     cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
576! -------------------------------------------------------------------
[524]577
578
[2056]579! ***  Calculate certain parcel quantities, including static energy   ***
[524]580
[1992]581  DO i = 1, len
[2056]582    ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i)
[1992]583    cpp(i) = cpd*(1.-qnk(i)) + qnk(i)*cpv
584    cpinv(i) = 1./cpp(i)
585  END DO
[524]586
[2056]587! ***   Calculate lifted parcel quantities below cloud base   ***
[524]588
[2056]589  DO i = 1, len                                           !convect3
[2542]590    icb1(i) = min(max(icb(i), 2), nl)
[2056]591! if icb is below LCL, start loop at ICB+1:
592! (icbs est le premier niveau au-dessus du LCL)
593    icbs(i) = icb1(i)                                     !convect3
[1992]594    IF (plcl(i)<p(i,icb1(i))) THEN
[2056]595      icbs(i) = min(icbs(i)+1, nl)                        !convect3
[1992]596    END IF
[2056]597  END DO                                                  !convect3
[524]598
[1992]599  DO i = 1, len !convect3
[2056]600    ticb(i) = t(i, icbs(i))                               !convect3
601    gzicb(i) = gz(i, icbs(i))                             !convect3
602    qsicb(i) = qs(i, icbs(i))                             !convect3
[1992]603  END DO !convect3
[524]604
605
[2056]606! Re-compute icbsmax (icbsmax2):                          !convect3
607!                                                         !convect3
608  icbsmax2 = 2                                            !convect3
609  DO i = 1, len                                           !convect3
610    icbsmax2 = max(icbsmax2, icbs(i))                     !convect3
611  END DO                                                  !convect3
[524]612
[2056]613! initialization outputs:
[524]614
[2056]615  DO k = 1, icbsmax2                                      ! convect3
616    DO i = 1, len                                         ! convect3
617      tp(i, k) = 0.0                                      ! convect3
618      tvp(i, k) = 0.0                                     ! convect3
619      clw(i, k) = 0.0                                     ! convect3
620    END DO                                                ! convect3
621  END DO                                                  ! convect3
[524]622
[2056]623! tp and tvp below cloud base:
[524]624
[1992]625  DO k = minorig, icbsmax2 - 1
626    DO i = 1, len
627      tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))*cpinv(i)
[2056]628      tvp(i, k) = tp(i, k)*(1.+qnk(i)/eps-qnk(i))        !whole thing (convect3)
[1992]629    END DO
630  END DO
[524]631
[2056]632! ***  Find lifted parcel quantities above cloud base    ***
[524]633
[1992]634  DO i = 1, len
635    tg = ticb(i)
[2056]636! ori         qg=qs(i,icb(i))
[1992]637    qg = qsicb(i) ! convect3
[2056]638! debug         alv=lv0-clmcpv*(ticb(i)-t0)
[1992]639    alv = lv0 - clmcpv*(ticb(i)-273.15)
[524]640
[2056]641! First iteration.
[524]642
[2056]643! ori          s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
644    s = cpd*(1.-qnk(i)) + cl*qnk(i) + &                   ! convect3
645        alv*alv*qg/(rrv*ticb(i)*ticb(i))                  ! convect3
[1992]646    s = 1./s
[2056]647! ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
[1992]648    ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3
649    tg = tg + s*(ah0(i)-ahg)
[2056]650! ori          tg=max(tg,35.0)
651! debug          tc=tg-t0
[1992]652    tc = tg - 273.15
653    denom = 243.5 + tc
654    denom = max(denom, 1.0) ! convect3
[2056]655! ori          if(tc.ge.0.0)then
[1992]656    es = 6.112*exp(17.67*tc/denom)
[2056]657! ori          else
658! ori           es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
659! ori          endif
660! ori          qg=eps*es/(p(i,icb(i))-es*(1.-eps))
[1992]661    qg = eps*es/(p(i,icbs(i))-es*(1.-eps))
[524]662
[2056]663! Second iteration.
[524]664
665
[2056]666! ori          s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
667! ori          s=1./s
668! ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
[1992]669    ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3
670    tg = tg + s*(ah0(i)-ahg)
[2056]671! ori          tg=max(tg,35.0)
672! debug          tc=tg-t0
[1992]673    tc = tg - 273.15
674    denom = 243.5 + tc
[2056]675    denom = max(denom, 1.0)                               ! convect3
676! ori          if(tc.ge.0.0)then
[1992]677    es = 6.112*exp(17.67*tc/denom)
[2056]678! ori          else
679! ori           es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
680! ori          end if
681! ori          qg=eps*es/(p(i,icb(i))-es*(1.-eps))
[1992]682    qg = eps*es/(p(i,icbs(i))-es*(1.-eps))
[524]683
[1992]684    alv = lv0 - clmcpv*(ticb(i)-273.15)
[524]685
[2056]686! ori c approximation here:
687! ori         tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i)
688! ori     &   -gz(i,icb(i))-alv*qg)/cpd
[524]689
[2056]690! convect3: no approximation:
[1992]691    tp(i, icbs(i)) = (ah0(i)-gz(i,icbs(i))-alv*qg)/(cpd+(cl-cpd)*qnk(i))
[524]692
[2056]693! ori         clw(i,icb(i))=qnk(i)-qg
694! ori         clw(i,icb(i))=max(0.0,clw(i,icb(i)))
[1992]695    clw(i, icbs(i)) = qnk(i) - qg
696    clw(i, icbs(i)) = max(0.0, clw(i,icbs(i)))
[524]697
[1992]698    rg = qg/(1.-qnk(i))
[2056]699! ori         tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi)
700! convect3: (qg utilise au lieu du vrai mixing ratio rg)
701    tvp(i, icbs(i)) = tp(i, icbs(i))*(1.+qg/eps-qnk(i))   !whole thing
[524]702
[1992]703  END DO
[524]704
[2056]705! ori      do 380 k=minorig,icbsmax2
706! ori       do 370 i=1,len
707! ori         tvp(i,k)=tvp(i,k)-tp(i,k)*qnk(i)
708! ori 370   continue
709! ori 380  continue
[1849]710
711
[2056]712! -- The following is only for convect3:
[1849]713
[2056]714! * icbs is the first level above the LCL:
715! if plcl<p(icb), then icbs=icb+1
716! if plcl>p(icb), then icbs=icb
[1849]717
[2056]718! * the routine above computes tvp from minorig to icbs (included).
[1849]719
[2056]720! * to compute buoybase (in cv3_trigger.F), both tvp(icb) and tvp(icb+1)
721! must be known. This is the case if icbs=icb+1, but not if icbs=icb.
[1849]722
[2056]723! * therefore, in the case icbs=icb, we compute tvp at level icb+1
724! (tvp at other levels will be computed in cv3_undilute2.F)
[524]725
726
[1992]727  DO i = 1, len
728    ticb(i) = t(i, icb(i)+1)
729    gzicb(i) = gz(i, icb(i)+1)
730    qsicb(i) = qs(i, icb(i)+1)
731  END DO
[524]732
[1992]733  DO i = 1, len
734    tg = ticb(i)
735    qg = qsicb(i) ! convect3
[2056]736! debug         alv=lv0-clmcpv*(ticb(i)-t0)
[1992]737    alv = lv0 - clmcpv*(ticb(i)-273.15)
[524]738
[2056]739! First iteration.
[524]740
[2056]741! ori          s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
742    s = cpd*(1.-qnk(i)) + cl*qnk(i) &                         ! convect3
743      +alv*alv*qg/(rrv*ticb(i)*ticb(i))                       ! convect3
[1992]744    s = 1./s
[2056]745! ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
746    ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i)     ! convect3
[1992]747    tg = tg + s*(ah0(i)-ahg)
[2056]748! ori          tg=max(tg,35.0)
749! debug          tc=tg-t0
[1992]750    tc = tg - 273.15
751    denom = 243.5 + tc
[2056]752    denom = max(denom, 1.0)                                   ! convect3
753! ori          if(tc.ge.0.0)then
[1992]754    es = 6.112*exp(17.67*tc/denom)
[2056]755! ori          else
756! ori           es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
757! ori          endif
758! ori          qg=eps*es/(p(i,icb(i))-es*(1.-eps))
[1992]759    qg = eps*es/(p(i,icb(i)+1)-es*(1.-eps))
[524]760
[2056]761! Second iteration.
[524]762
763
[2056]764! ori          s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
765! ori          s=1./s
766! ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
767    ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i)     ! convect3
[1992]768    tg = tg + s*(ah0(i)-ahg)
[2056]769! ori          tg=max(tg,35.0)
770! debug          tc=tg-t0
[1992]771    tc = tg - 273.15
772    denom = 243.5 + tc
[2056]773    denom = max(denom, 1.0)                                   ! convect3
774! ori          if(tc.ge.0.0)then
[1992]775    es = 6.112*exp(17.67*tc/denom)
[2056]776! ori          else
777! ori           es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
778! ori          end if
779! ori          qg=eps*es/(p(i,icb(i))-es*(1.-eps))
[1992]780    qg = eps*es/(p(i,icb(i)+1)-es*(1.-eps))
[524]781
[1992]782    alv = lv0 - clmcpv*(ticb(i)-273.15)
[524]783
[2056]784! ori c approximation here:
785! ori         tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i)
786! ori     &   -gz(i,icb(i))-alv*qg)/cpd
[1849]787
[2056]788! convect3: no approximation:
[1992]789    tp(i, icb(i)+1) = (ah0(i)-gz(i,icb(i)+1)-alv*qg)/(cpd+(cl-cpd)*qnk(i))
[1849]790
[2056]791! ori         clw(i,icb(i))=qnk(i)-qg
792! ori         clw(i,icb(i))=max(0.0,clw(i,icb(i)))
[1992]793    clw(i, icb(i)+1) = qnk(i) - qg
794    clw(i, icb(i)+1) = max(0.0, clw(i,icb(i)+1))
[1849]795
[1992]796    rg = qg/(1.-qnk(i))
[2056]797! ori         tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi)
798! convect3: (qg utilise au lieu du vrai mixing ratio rg)
799    tvp(i, icb(i)+1) = tp(i, icb(i)+1)*(1.+qg/eps-qnk(i))     !whole thing
[1849]800
[1992]801  END DO
[1501]802
[1992]803  RETURN
804END SUBROUTINE cv3_undilute1
[524]805
[2056]806SUBROUTINE cv3_trigger(len, nd, icb, plcl, p, th, tv, tvp, thnk, &
807                       pbase, buoybase, iflag, sig, w0)
[1992]808  IMPLICIT NONE
[524]809
[2056]810! -------------------------------------------------------------------
811! --- TRIGGERING
[524]812
[2056]813! - computes the cloud base
814! - triggering (crude in this version)
815! - relaxation of sig and w0 when no convection
[524]816
[2056]817! Caution1: if no convection, we set iflag=4
818! (it used to be 0 in convect3)
[524]819
[2056]820! Caution2: at this stage, tvp (and thus buoy) are know up
821! through icb only!
822! -> the buoyancy below cloud base not (yet) set to the cloud base buoyancy
823! -------------------------------------------------------------------
[524]824
[1992]825  include "cv3param.h"
[524]826
[2056]827! input:
[1992]828  INTEGER len, nd
829  INTEGER icb(len)
830  REAL plcl(len), p(len, nd)
831  REAL th(len, nd), tv(len, nd), tvp(len, nd)
832  REAL thnk(len)
[524]833
[2056]834! output:
[1992]835  REAL pbase(len), buoybase(len)
[524]836
[2056]837! input AND output:
[1992]838  INTEGER iflag(len)
839  REAL sig(len, nd), w0(len, nd)
[524]840
[2056]841! local variables:
[1992]842  INTEGER i, k
843  REAL tvpbase, tvbase, tdif, ath, ath1
[524]844
[879]845
[2056]846! ***   set cloud base buoyancy at (plcl+dpbase) level buoyancy
[879]847
[1992]848  DO i = 1, len
849    pbase(i) = plcl(i) + dpbase
[2056]850    tvpbase = tvp(i, icb(i))  *(pbase(i)-p(i,icb(i)+1))/(p(i,icb(i))-p(i,icb(i)+1)) + &
851              tvp(i, icb(i)+1)*(p(i,icb(i))-pbase(i))  /(p(i,icb(i))-p(i,icb(i)+1))
852    tvbase = tv(i, icb(i))  *(pbase(i)-p(i,icb(i)+1))/(p(i,icb(i))-p(i,icb(i)+1)) + &
853             tv(i, icb(i)+1)*(p(i,icb(i))-pbase(i))  /(p(i,icb(i))-p(i,icb(i)+1))
[1992]854    buoybase(i) = tvpbase - tvbase
855  END DO
[524]856
[829]857
[2056]858! ***   make sure that column is dry adiabatic between the surface  ***
859! ***    and cloud base, and that lifted air is positively buoyant  ***
860! ***                         at cloud base                         ***
861! ***       if not, return to calling program after resetting       ***
862! ***                        sig(i) and w0(i)                       ***
[1849]863
864
[2056]865! oct3      do 200 i=1,len
866! oct3
867! oct3       tdif = buoybase(i)
868! oct3       ath1 = th(i,1)
869! oct3       ath  = th(i,icb(i)-1) - dttrig
870! oct3
871! oct3       if (tdif.lt.dtcrit .or. ath.gt.ath1) then
872! oct3         do 60 k=1,nl
873! oct3            sig(i,k) = beta*sig(i,k) - 2.*alpha*tdif*tdif
874! oct3            sig(i,k) = AMAX1(sig(i,k),0.0)
875! oct3            w0(i,k)  = beta*w0(i,k)
876! oct3   60    continue
877! oct3         iflag(i)=4 ! pour version vectorisee
878! oct3c convect3         iflag(i)=0
879! oct3cccc         return
880! oct3       endif
881! oct3
882! oct3200   continue
[1849]883
[2056]884! -- oct3: on reecrit la boucle 200 (pour la vectorisation)
[524]885
[1992]886  DO k = 1, nl
887    DO i = 1, len
[524]888
[1992]889      tdif = buoybase(i)
890      ath1 = thnk(i)
891      ath = th(i, icb(i)-1) - dttrig
[524]892
[1992]893      IF (tdif<dtcrit .OR. ath>ath1) THEN
894        sig(i, k) = beta*sig(i, k) - 2.*alpha*tdif*tdif
895        sig(i, k) = amax1(sig(i,k), 0.0)
896        w0(i, k) = beta*w0(i, k)
897        iflag(i) = 4 ! pour version vectorisee
[2056]898! convect3         iflag(i)=0
[1992]899      END IF
[524]900
[1992]901    END DO
902  END DO
[524]903
[2056]904! fin oct3 --
[524]905
[1992]906  RETURN
907END SUBROUTINE cv3_trigger
[524]908
[2056]909SUBROUTINE cv3_compress(len, nloc, ncum, nd, ntra, &
910                        iflag1, nk1, icb1, icbs1, &
911                        plcl1, tnk1, qnk1, gznk1, pbase1, buoybase1, &
912                        t1, q1, qs1, u1, v1, gz1, th1, &
913                        tra1, &
914                        h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, &
915                        sig1, w01, &
916                        iflag, nk, icb, icbs, &
917                        plcl, tnk, qnk, gznk, pbase, buoybase, &
918                        t, q, qs, u, v, gz, th, &
919                        tra, &
920                        h, lv, cpn, p, ph, tv, tp, tvp, clw, &
921                        sig, w0)
[2408]922  USE print_control_mod, ONLY: lunout
[1992]923  IMPLICIT NONE
[524]924
[1992]925  include "cv3param.h"
[524]926
[2056]927!inputs:
[1992]928  INTEGER len, ncum, nd, ntra, nloc
929  INTEGER iflag1(len), nk1(len), icb1(len), icbs1(len)
930  REAL plcl1(len), tnk1(len), qnk1(len), gznk1(len)
931  REAL pbase1(len), buoybase1(len)
932  REAL t1(len, nd), q1(len, nd), qs1(len, nd), u1(len, nd), v1(len, nd)
933  REAL gz1(len, nd), h1(len, nd), lv1(len, nd), cpn1(len, nd)
934  REAL p1(len, nd), ph1(len, nd+1), tv1(len, nd), tp1(len, nd)
935  REAL tvp1(len, nd), clw1(len, nd)
936  REAL th1(len, nd)
937  REAL sig1(len, nd), w01(len, nd)
938  REAL tra1(len, nd, ntra)
[524]939
[2056]940!outputs:
941! en fait, on a nloc=len pour l'instant (cf cv_driver)
[1992]942  INTEGER iflag(nloc), nk(nloc), icb(nloc), icbs(nloc)
943  REAL plcl(nloc), tnk(nloc), qnk(nloc), gznk(nloc)
944  REAL pbase(nloc), buoybase(nloc)
945  REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd), u(nloc, nd), v(nloc, nd)
946  REAL gz(nloc, nd), h(nloc, nd), lv(nloc, nd), cpn(nloc, nd)
947  REAL p(nloc, nd), ph(nloc, nd+1), tv(nloc, nd), tp(nloc, nd)
948  REAL tvp(nloc, nd), clw(nloc, nd)
949  REAL th(nloc, nd)
950  REAL sig(nloc, nd), w0(nloc, nd)
951  REAL tra(nloc, nd, ntra)
[524]952
[2056]953!local variables:
[1992]954  INTEGER i, k, nn, j
[524]955
[1992]956  CHARACTER (LEN=20) :: modname = 'cv3_compress'
957  CHARACTER (LEN=80) :: abort_message
[879]958
[1992]959  DO k = 1, nl + 1
960    nn = 0
961    DO i = 1, len
962      IF (iflag1(i)==0) THEN
963        nn = nn + 1
964        sig(nn, k) = sig1(i, k)
965        w0(nn, k) = w01(i, k)
966        t(nn, k) = t1(i, k)
967        q(nn, k) = q1(i, k)
968        qs(nn, k) = qs1(i, k)
969        u(nn, k) = u1(i, k)
970        v(nn, k) = v1(i, k)
971        gz(nn, k) = gz1(i, k)
972        h(nn, k) = h1(i, k)
973        lv(nn, k) = lv1(i, k)
974        cpn(nn, k) = cpn1(i, k)
975        p(nn, k) = p1(i, k)
976        ph(nn, k) = ph1(i, k)
977        tv(nn, k) = tv1(i, k)
978        tp(nn, k) = tp1(i, k)
979        tvp(nn, k) = tvp1(i, k)
980        clw(nn, k) = clw1(i, k)
981        th(nn, k) = th1(i, k)
982      END IF
983    END DO
984  END DO
[524]985
[2056]986!AC!      do 121 j=1,ntra
987!AC!ccccc      do 111 k=1,nl+1
988!AC!      do 111 k=1,nd
989!AC!       nn=0
990!AC!      do 101 i=1,len
991!AC!      if(iflag1(i).eq.0)then
992!AC!       nn=nn+1
993!AC!       tra(nn,k,j)=tra1(i,k,j)
994!AC!      endif
995!AC! 101  continue
996!AC! 111  continue
997!AC! 121  continue
[524]998
[1992]999  IF (nn/=ncum) THEN
1000    WRITE (lunout, *) 'strange! nn not equal to ncum: ', nn, ncum
1001    abort_message = ''
[2408]1002    CALL abort_physic(modname, abort_message, 1)
[1992]1003  END IF
[524]1004
[1992]1005  nn = 0
1006  DO i = 1, len
1007    IF (iflag1(i)==0) THEN
1008      nn = nn + 1
1009      pbase(nn) = pbase1(i)
1010      buoybase(nn) = buoybase1(i)
1011      plcl(nn) = plcl1(i)
1012      tnk(nn) = tnk1(i)
1013      qnk(nn) = qnk1(i)
1014      gznk(nn) = gznk1(i)
1015      nk(nn) = nk1(i)
1016      icb(nn) = icb1(i)
1017      icbs(nn) = icbs1(i)
1018      iflag(nn) = iflag1(i)
1019    END IF
1020  END DO
[524]1021
[1992]1022  RETURN
1023END SUBROUTINE cv3_compress
[524]1024
[1992]1025SUBROUTINE icefrac(t, clw, qi, nl, len)
1026  IMPLICIT NONE
[524]1027
1028
[2056]1029!JAM--------------------------------------------------------------------
1030! Calcul de la quantité d'eau sous forme de glace
1031! --------------------------------------------------------------------
[2160]1032  INTEGER nl, len
[1992]1033  REAL qi(len, nl)
1034  REAL t(len, nl), clw(len, nl)
1035  REAL fracg
[2160]1036  INTEGER k, i
[524]1037
[1992]1038  DO k = 3, nl
1039    DO i = 1, len
1040      IF (t(i,k)>263.15) THEN
1041        qi(i, k) = 0.
1042      ELSE
1043        IF (t(i,k)<243.15) THEN
1044          qi(i, k) = clw(i, k)
1045        ELSE
1046          fracg = (263.15-t(i,k))/20
1047          qi(i, k) = clw(i, k)*fracg
1048        END IF
1049      END IF
[2056]1050! print*,t(i,k),qi(i,k),'temp,testglace'
[1992]1051    END DO
1052  END DO
[879]1053
[1992]1054  RETURN
[524]1055
[1992]1056END SUBROUTINE icefrac
[524]1057
[2056]1058SUBROUTINE cv3_undilute2(nloc, ncum, nd, icb, icbs, nk, &
1059                         tnk, qnk, gznk, hnk, t, q, qs, gz, &
[2435]1060                         p, ph, h, tv, lv, lf, pbase, buoybase, plcl, &
[2056]1061                         inb, tp, tvp, clw, hp, ep, sigp, buoy, frac)
[2641]1062  USE print_control_mod, ONLY: prt_level
[1992]1063  IMPLICIT NONE
[524]1064
[2056]1065! ---------------------------------------------------------------------
1066! Purpose:
1067! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
1068! &
1069! COMPUTE THE PRECIPITATION EFFICIENCIES AND THE
1070! FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD
1071! &
1072! FIND THE LEVEL OF NEUTRAL BUOYANCY
[524]1073
[2056]1074! Main differences convect3/convect4:
1075!   - icbs (input) is the first level above LCL (may differ from icb)
1076!   - many minor differences in the iterations
1077!   - condensed water not removed from tvp in convect3
1078!   - vertical profile of buoyancy computed here (use of buoybase)
1079!   - the determination of inb is different
1080!   - no inb1, only inb in output
1081! ---------------------------------------------------------------------
[524]1082
[1992]1083  include "cvthermo.h"
1084  include "cv3param.h"
1085  include "conema3.h"
1086  include "cvflag.h"
[2435]1087  include "YOMCST2.h"
[524]1088
[2056]1089!inputs:
[2298]1090  INTEGER, INTENT (IN)                               :: ncum, nd, nloc
1091  INTEGER, DIMENSION (nloc), INTENT (IN)             :: icb, icbs, nk
1092  REAL, DIMENSION (nloc, nd), INTENT (IN)            :: t, q, qs, gz
1093  REAL, DIMENSION (nloc, nd), INTENT (IN)            :: p
[2435]1094  REAL, DIMENSION (nloc, nd+1), INTENT (IN)          :: ph
[2298]1095  REAL, DIMENSION (nloc), INTENT (IN)                :: tnk, qnk, gznk
1096  REAL, DIMENSION (nloc), INTENT (IN)                :: hnk
1097  REAL, DIMENSION (nloc, nd), INTENT (IN)            :: lv, lf, tv, h
1098  REAL, DIMENSION (nloc), INTENT (IN)                :: pbase, buoybase, plcl
[524]1099
[2298]1100!input/outputs:
1101  REAL, DIMENSION (nloc, nd), INTENT (INOUT)         :: tp, tvp, clw   ! Input for k = 1, icb+1 (computed in cv3_undilute1)
1102                                                                       ! Output above
1103
[2056]1104!outputs:
[2298]1105  INTEGER, DIMENSION (nloc), INTENT (OUT)            :: inb
1106  REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: ep, sigp, hp
1107  REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: buoy
[2408]1108  REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: frac
[524]1109
[2056]1110!local variables:
[2298]1111  INTEGER i, j, k
[1992]1112  REAL tg, qg, ahg, alv, alf, s, tc, es, esi, denom, rg, tca, elacrit
1113  REAL als
1114  REAL qsat_new, snew, qi(nloc, nd)
1115  REAL by, defrac, pden, tbis
1116  REAL ah0(nloc), cape(nloc), capem(nloc), byp(nloc)
1117  LOGICAL lcape(nloc)
1118  INTEGER iposit(nloc)
1119  REAL fracg
[2435]1120  REAL deltap
[524]1121
[2641]1122  IF (prt_level >= 10) THEN
1123    print *,'cv3_undilute2.0. t(1,k), q(1,k), qs(1,k) ', &
1124                        (k, t(1,k), q(1,k), qs(1,k), k = 1,nl)
1125  ENDIF
1126
[2056]1127! =====================================================================
1128! --- SOME INITIALIZATIONS
1129! =====================================================================
[524]1130
[1992]1131  DO k = 1, nl
1132    DO i = 1, ncum
1133      qi(i, k) = 0.
1134    END DO
1135  END DO
[524]1136
[2056]1137! =====================================================================
1138! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
1139! =====================================================================
[524]1140
[2056]1141! ---       The procedure is to solve the equation.
1142!                cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
[524]1143
[2056]1144! ***  Calculate certain parcel quantities, including static energy   ***
[524]1145
1146
[1992]1147  DO i = 1, ncum
[2056]1148    ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i)+ &
1149! debug          qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i)
1150             qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i)
[1992]1151  END DO
[524]1152
1153
[2056]1154! ***  Find lifted parcel quantities above cloud base    ***
[524]1155
1156
[1992]1157  DO k = minorig + 1, nl
1158    DO i = 1, ncum
[2056]1159! ori       if(k.ge.(icb(i)+1))then
1160      IF (k>=(icbs(i)+1)) THEN                                ! convect3
[1992]1161        tg = t(i, k)
1162        qg = qs(i, k)
[2056]1163! debug       alv=lv0-clmcpv*(t(i,k)-t0)
[1992]1164        alv = lv0 - clmcpv*(t(i,k)-273.15)
[524]1165
[2056]1166! First iteration.
[524]1167
[2056]1168! ori          s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k))
1169        s = cpd*(1.-qnk(i)) + cl*qnk(i) + &                   ! convect3
1170            alv*alv*qg/(rrv*t(i,k)*t(i,k))                    ! convect3
[1992]1171        s = 1./s
[2056]1172! ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k)
[1992]1173        ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3
1174        tg = tg + s*(ah0(i)-ahg)
[2056]1175! ori          tg=max(tg,35.0)
1176! debug        tc=tg-t0
[1992]1177        tc = tg - 273.15
1178        denom = 243.5 + tc
[2056]1179        denom = max(denom, 1.0)                               ! convect3
1180! ori          if(tc.ge.0.0)then
[1992]1181        es = 6.112*exp(17.67*tc/denom)
[2056]1182! ori          else
1183! ori                   es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
1184! ori          endif
[1992]1185        qg = eps*es/(p(i,k)-es*(1.-eps))
[524]1186
[2056]1187! Second iteration.
[524]1188
[2056]1189! ori          s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k))
1190! ori          s=1./s
1191! ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k)
[1992]1192        ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3
1193        tg = tg + s*(ah0(i)-ahg)
[2056]1194! ori          tg=max(tg,35.0)
1195! debug        tc=tg-t0
[1992]1196        tc = tg - 273.15
1197        denom = 243.5 + tc
[2056]1198        denom = max(denom, 1.0)                               ! convect3
1199! ori          if(tc.ge.0.0)then
[1992]1200        es = 6.112*exp(17.67*tc/denom)
[2056]1201! ori          else
1202! ori                   es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
1203! ori          endif
[1992]1204        qg = eps*es/(p(i,k)-es*(1.-eps))
[524]1205
[2056]1206! debug        alv=lv0-clmcpv*(t(i,k)-t0)
[1992]1207        alv = lv0 - clmcpv*(t(i,k)-273.15)
[2056]1208! print*,'cpd dans convect2 ',cpd
1209! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd'
1210! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd
[524]1211
[2056]1212! ori c approximation here:
1213! ori        tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd
[524]1214
[2056]1215! convect3: no approximation:
[1992]1216        IF (cvflag_ice) THEN
1217          tp(i, k) = max(0., (ah0(i)-gz(i,k)-alv*qg)/(cpd+(cl-cpd)*qnk(i)))
1218        ELSE
1219          tp(i, k) = (ah0(i)-gz(i,k)-alv*qg)/(cpd+(cl-cpd)*qnk(i))
1220        END IF
[524]1221
[1992]1222        clw(i, k) = qnk(i) - qg
1223        clw(i, k) = max(0.0, clw(i,k))
1224        rg = qg/(1.-qnk(i))
[2056]1225! ori               tvp(i,k)=tp(i,k)*(1.+rg*epsi)
1226! convect3: (qg utilise au lieu du vrai mixing ratio rg):
[1992]1227        tvp(i, k) = tp(i, k)*(1.+qg/eps-qnk(i)) ! whole thing
1228        IF (cvflag_ice) THEN
1229          IF (clw(i,k)<1.E-11) THEN
1230            tp(i, k) = tv(i, k)
1231            tvp(i, k) = tv(i, k)
1232          END IF
1233        END IF
[2298]1234!jyg<
1235!!      END IF  ! Endif moved to the end of the loop
1236!>jyg
[524]1237
[1992]1238      IF (cvflag_ice) THEN
[2056]1239!CR:attention boucle en klon dans Icefrac
1240! Call Icefrac(t,clw,qi,nl,nloc)
[1992]1241        IF (t(i,k)>263.15) THEN
1242          qi(i, k) = 0.
1243        ELSE
1244          IF (t(i,k)<243.15) THEN
1245            qi(i, k) = clw(i, k)
1246          ELSE
1247            fracg = (263.15-t(i,k))/20
1248            qi(i, k) = clw(i, k)*fracg
1249          END IF
1250        END IF
[2056]1251!CR: fin test
[1992]1252        IF (t(i,k)<263.15) THEN
[2056]1253!CR: on commente les calculs d'Arnaud car division par zero
1254! nouveau calcul propose par JYG
1255!       alv=lv0-clmcpv*(t(i,k)-273.15)
1256!       alf=lf0-clmci*(t(i,k)-273.15)
1257!       tg=tp(i,k)
1258!       tc=tp(i,k)-273.15
1259!       denom=243.5+tc
1260!       do j=1,3
1261! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1262! il faudra que esi vienne en argument de la convection
1263! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1264!        tbis=t(i,k)+(tp(i,k)-tg)
1265!        esi=exp(23.33086-(6111.72784/tbis) + &
1266!                       0.15215*log(tbis))
1267!        qsat_new=eps*esi/(p(i,k)-esi*(1.-eps))
1268!        snew=cpd*(1.-qnk(i))+cl*qnk(i)+alv*alv*qsat_new/ &
1269!                                       (rrv*tbis*tbis)
1270!        snew=1./snew
1271!        print*,esi,qsat_new,snew,'esi,qsat,snew'
1272!        tp(i,k)=tg+(alf*qi(i,k)+alv*qg*(1.-(esi/es)))*snew
1273!        print*,k,tp(i,k),qnk(i),'avec glace'
1274!        print*,'tpNAN',tg,alf,qi(i,k),alv,qg,esi,es,snew
1275!       enddo
[524]1276
[1992]1277          alv = lv0 - clmcpv*(t(i,k)-273.15)
1278          alf = lf0 + clmci*(t(i,k)-273.15)
1279          als = alf + alv
1280          tg = tp(i, k)
1281          tp(i, k) = t(i, k)
1282          DO j = 1, 3
1283            esi = exp(23.33086-(6111.72784/tp(i,k))+0.15215*log(tp(i,k)))
1284            qsat_new = eps*esi/(p(i,k)-esi*(1.-eps))
[2056]1285            snew = cpd*(1.-qnk(i)) + cl*qnk(i) + alv*als*qsat_new/ &
1286                                                 (rrv*tp(i,k)*tp(i,k))
[1992]1287            snew = 1./snew
[2056]1288! c             print*,esi,qsat_new,snew,'esi,qsat,snew'
1289            tp(i, k) = tp(i, k) + &
1290                       ((cpd*(1.-qnk(i))+cl*qnk(i))*(tg-tp(i,k)) + &
1291                        alv*(qg-qsat_new)+alf*qi(i,k))*snew
1292! print*,k,tp(i,k),qsat_new,qnk(i),qi(i,k), &
1293!              'k,tp,q,qt,qi avec glace'
[1992]1294          END DO
[524]1295
[2056]1296!CR:reprise du code AJ
[1992]1297          clw(i, k) = qnk(i) - qsat_new
1298          clw(i, k) = max(0.0, clw(i,k))
1299          tvp(i, k) = max(0., tp(i,k)*(1.+qsat_new/eps-qnk(i)))
[2056]1300! print*,tvp(i,k),'tvp'
[1992]1301        END IF
1302        IF (clw(i,k)<1.E-11) THEN
1303          tp(i, k) = tv(i, k)
1304          tvp(i, k) = tv(i, k)
1305        END IF
1306      END IF ! (cvflag_ice)
[2298]1307!jyg<
1308      END IF ! (k>=(icbs(i)+1))
1309!>jyg
[1992]1310    END DO
1311  END DO
[1849]1312
[2641]1313  IF (prt_level >= 10) THEN
1314    print *,'cv3_undilute2.1. tp(1,k), tvp(1,k) ', &
1315                          (k, tp(1,k), tvp(1,k), k = 1,nl)
1316  ENDIF
1317
[2056]1318! =====================================================================
1319! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF
1320! --- PRECIPITATION FALLING OUTSIDE OF CLOUD
1321! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I)
1322! =====================================================================
[2298]1323!
1324!jyg<
1325  DO k = 1, nl
1326    DO i = 1, ncum
1327      ep(i, k) = 0.0
1328      sigp(i, k) = spfac
1329    END DO
1330  END DO
1331!>jyg
1332!
[1992]1333  IF (flag_epkeorig/=1) THEN
1334    DO k = 1, nl ! convect3
1335      DO i = 1, ncum
[2298]1336!jyg<
1337       IF(k>=icb(i)) THEN
1338!>jyg
1339         pden = ptcrit - pbcrit
1340         ep(i, k) = (plcl(i)-p(i,k)-pbcrit)/pden*epmax
1341         ep(i, k) = max(ep(i,k), 0.0)
1342         ep(i, k) = min(ep(i,k), epmax)
1343!!         sigp(i, k) = spfac  ! jyg
1344        ENDIF   ! (k>=icb(i))
[1992]1345      END DO
1346    END DO
1347  ELSE
1348    DO k = 1, nl
1349      DO i = 1, ncum
[2298]1350        IF(k>=icb(i)) THEN
1351!!        IF (k>=(nk(i)+1)) THEN
1352!>jyg
[1992]1353          tca = tp(i, k) - t0
1354          IF (tca>=0.0) THEN
1355            elacrit = elcrit
1356          ELSE
1357            elacrit = elcrit*(1.0-tca/tlcrit)
1358          END IF
1359          elacrit = max(elacrit, 0.0)
1360          ep(i, k) = 1.0 - elacrit/max(clw(i,k), 1.0E-8)
1361          ep(i, k) = max(ep(i,k), 0.0)
1362          ep(i, k) = min(ep(i,k), epmax)
[2298]1363!!          sigp(i, k) = spfac  ! jyg
1364        END IF  ! (k>=icb(i))
[1992]1365      END DO
1366    END DO
1367  END IF
[2298]1368!
[2056]1369! =====================================================================
1370! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL
1371! --- VIRTUAL TEMPERATURE
1372! =====================================================================
[1849]1373
[2056]1374! dans convect3, tvp est calcule en une seule fois, et sans retirer
1375! l'eau condensee (~> reversible CAPE)
[1849]1376
[2056]1377! ori      do 340 k=minorig+1,nl
1378! ori        do 330 i=1,ncum
1379! ori        if(k.ge.(icb(i)+1))then
1380! ori          tvp(i,k)=tvp(i,k)*(1.0-qnk(i)+ep(i,k)*clw(i,k))
1381! oric         print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)'
1382! oric         print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)
1383! ori        endif
1384! ori 330    continue
1385! ori 340  continue
[524]1386
[2056]1387! ori      do 350 i=1,ncum
1388! ori       tvp(i,nlp)=tvp(i,nl)-(gz(i,nlp)-gz(i,nl))/cpd
1389! ori 350  continue
[524]1390
[2056]1391  DO i = 1, ncum                                           ! convect3
1392    tp(i, nlp) = tp(i, nl)                                 ! convect3
1393  END DO                                                   ! convect3
[524]1394
[2056]1395! =====================================================================
1396! --- EFFECTIVE VERTICAL PROFILE OF BUOYANCY (convect3 only):
1397! =====================================================================
[524]1398
[2056]1399! -- this is for convect3 only:
[524]1400
[2056]1401! first estimate of buoyancy:
[879]1402
[2298]1403!jyg : k-loop outside i-loop (07042015)
1404  DO k = 1, nl
1405    DO i = 1, ncum
[1992]1406      buoy(i, k) = tvp(i, k) - tv(i, k)
1407    END DO
1408  END DO
[524]1409
[2056]1410! set buoyancy=buoybase for all levels below base
1411! for safety, set buoy(icb)=buoybase
[524]1412
[2298]1413!jyg : k-loop outside i-loop (07042015)
1414  DO k = 1, nl
1415    DO i = 1, ncum
[1992]1416      IF ((k>=icb(i)) .AND. (k<=nl) .AND. (p(i,k)>=pbase(i))) THEN
1417        buoy(i, k) = buoybase(i)
1418      END IF
1419    END DO
[2298]1420  END DO
1421  DO i = 1, ncum
[2056]1422!    buoy(icb(i),k)=buoybase(i)
[1992]1423    buoy(i, icb(i)) = buoybase(i)
1424  END DO
[524]1425
[2056]1426! -- end convect3
[524]1427
[2056]1428! =====================================================================
1429! --- FIND THE FIRST MODEL LEVEL (INB) ABOVE THE PARCEL'S
1430! --- LEVEL OF NEUTRAL BUOYANCY
1431! =====================================================================
[524]1432
[2056]1433! -- this is for convect3 only:
[524]1434
[1992]1435  DO i = 1, ncum
1436    inb(i) = nl - 1
1437    iposit(i) = nl
1438  END DO
[524]1439
1440
[2056]1441! --    iposit(i) = first level, above icb, with positive buoyancy
[1992]1442  DO k = 1, nl - 1
1443    DO i = 1, ncum
1444      IF (k>=icb(i) .AND. buoy(i,k)>0.) THEN
1445        iposit(i) = min(iposit(i), k)
1446      END IF
1447    END DO
1448  END DO
[1849]1449
[1992]1450  DO i = 1, ncum
1451    IF (iposit(i)==nl) THEN
1452      iposit(i) = icb(i)
1453    END IF
1454  END DO
[1849]1455
[1992]1456  DO k = 1, nl - 1
1457    DO i = 1, ncum
1458      IF ((k>=iposit(i)) .AND. (buoy(i,k)<dtovsh)) THEN
1459        inb(i) = min(inb(i), k)
1460      END IF
1461    END DO
1462  END DO
[1849]1463
[2435]1464!CR fix computation of inb
1465!keep flag or modify in all cases?
1466  IF (iflag_mix_adiab.eq.1) THEN
1467  DO i = 1, ncum
1468     cape(i)=0.
1469     inb(i)=icb(i)+1
1470  ENDDO
1471 
1472  DO k = 2, nl
1473    DO i = 1, ncum
1474       IF ((k>=iposit(i))) THEN
1475       deltap = min(plcl(i), ph(i,k-1)) - min(plcl(i), ph(i,k))
1476       cape(i) = cape(i) + rrd*buoy(i, k-1)*deltap/p(i, k-1)
1477       IF (cape(i).gt.0.) THEN
1478        inb(i) = max(inb(i), k)
1479       END IF
1480       ENDIF
1481    ENDDO
1482  ENDDO
1483
1484!  DO i = 1, ncum
1485!     print*,"inb",inb(i)
1486!  ENDDO
1487
1488  endif
1489
[2056]1490! -- end convect3
[1849]1491
[2056]1492! ori      do 510 i=1,ncum
1493! ori        cape(i)=0.0
1494! ori        capem(i)=0.0
1495! ori        inb(i)=icb(i)+1
1496! ori        inb1(i)=inb(i)
1497! ori 510  continue
[524]1498
[2056]1499! Originial Code
[524]1500
[2056]1501!    do 530 k=minorig+1,nl-1
1502!     do 520 i=1,ncum
1503!      if(k.ge.(icb(i)+1))then
1504!       by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1505!       byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1506!       cape(i)=cape(i)+by
1507!       if(by.ge.0.0)inb1(i)=k+1
1508!       if(cape(i).gt.0.0)then
1509!        inb(i)=k+1
1510!        capem(i)=cape(i)
1511!       endif
1512!      endif
1513!520    continue
1514!530  continue
1515!    do 540 i=1,ncum
1516!     byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl)
1517!     cape(i)=capem(i)+byp
1518!     defrac=capem(i)-cape(i)
1519!     defrac=max(defrac,0.001)
1520!     frac(i)=-cape(i)/defrac
1521!     frac(i)=min(frac(i),1.0)
1522!     frac(i)=max(frac(i),0.0)
1523!540   continue
[524]1524
[2056]1525!    K Emanuel fix
[524]1526
[2056]1527!    call zilch(byp,ncum)
1528!    do 530 k=minorig+1,nl-1
1529!     do 520 i=1,ncum
1530!      if(k.ge.(icb(i)+1))then
1531!       by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1532!       cape(i)=cape(i)+by
1533!       if(by.ge.0.0)inb1(i)=k+1
1534!       if(cape(i).gt.0.0)then
1535!        inb(i)=k+1
1536!        capem(i)=cape(i)
1537!        byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1538!       endif
1539!      endif
1540!520    continue
1541!530  continue
1542!    do 540 i=1,ncum
1543!     inb(i)=max(inb(i),inb1(i))
1544!     cape(i)=capem(i)+byp(i)
1545!     defrac=capem(i)-cape(i)
1546!     defrac=max(defrac,0.001)
1547!     frac(i)=-cape(i)/defrac
1548!     frac(i)=min(frac(i),1.0)
1549!     frac(i)=max(frac(i),0.0)
1550!540   continue
[524]1551
[2056]1552! J Teixeira fix
[524]1553
[2056]1554! ori      call zilch(byp,ncum)
1555! ori      do 515 i=1,ncum
1556! ori        lcape(i)=.true.
1557! ori 515  continue
1558! ori      do 530 k=minorig+1,nl-1
1559! ori        do 520 i=1,ncum
1560! ori          if(cape(i).lt.0.0)lcape(i)=.false.
1561! ori          if((k.ge.(icb(i)+1)).and.lcape(i))then
1562! ori            by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1563! ori            byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1564! ori            cape(i)=cape(i)+by
1565! ori            if(by.ge.0.0)inb1(i)=k+1
1566! ori            if(cape(i).gt.0.0)then
1567! ori              inb(i)=k+1
1568! ori              capem(i)=cape(i)
1569! ori            endif
1570! ori          endif
1571! ori 520    continue
1572! ori 530  continue
1573! ori      do 540 i=1,ncum
1574! ori          cape(i)=capem(i)+byp(i)
1575! ori          defrac=capem(i)-cape(i)
1576! ori          defrac=max(defrac,0.001)
1577! ori          frac(i)=-cape(i)/defrac
1578! ori          frac(i)=min(frac(i),1.0)
1579! ori          frac(i)=max(frac(i),0.0)
1580! ori 540  continue
[524]1581
[2056]1582! =====================================================================
1583! ---   CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL
1584! =====================================================================
[524]1585
[2408]1586  DO k = 1, nl
[1992]1587    DO i = 1, ncum
1588      hp(i, k) = h(i, k)
1589    END DO
1590  END DO
[524]1591
[2298]1592!jyg : cvflag_ice test outside the loops (07042015)
1593!
1594  IF (cvflag_ice) THEN
1595!
1596    DO k = minorig + 1, nl
1597      DO i = 1, ncum
1598        IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
[1992]1599          frac(i, k) = 1. - (t(i,k)-243.15)/(263.15-243.15)
1600          frac(i, k) = min(max(frac(i,k),0.0), 1.0)
[2056]1601          hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac(i,k)*lf(i,k))* &
1602                              ep(i, k)*clw(i, k)
[2298]1603        END IF
1604      END DO
1605    END DO
[2408]1606! Below cloud base, set ice fraction to cloud base value
1607    DO k = 1, nl
1608      DO i = 1, ncum
1609        IF (k<icb(i)) THEN
1610          frac(i,k) = frac(i,icb(i))
1611        END IF
1612      END DO
1613    END DO
[2298]1614!
1615  ELSE
1616!
1617    DO k = minorig + 1, nl
1618      DO i = 1, ncum
1619        IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
[1992]1620          hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k))*ep(i, k)*clw(i, k)
1621        END IF
[2298]1622      END DO
[1992]1623    END DO
[2298]1624!
1625  END IF  ! (cvflag_ice)
[524]1626
[1992]1627  RETURN
1628END SUBROUTINE cv3_undilute2
[524]1629
[2056]1630SUBROUTINE cv3_closure(nloc, ncum, nd, icb, inb, &
1631                       pbase, p, ph, tv, buoy, &
1632                       sig, w0, cape, m, iflag)
[1992]1633  IMPLICIT NONE
[524]1634
[2056]1635! ===================================================================
1636! ---  CLOSURE OF CONVECT3
1637!
1638! vectorization: S. Bony
1639! ===================================================================
[524]1640
[1992]1641  include "cvthermo.h"
1642  include "cv3param.h"
[524]1643
[2056]1644!input:
[1992]1645  INTEGER ncum, nd, nloc
1646  INTEGER icb(nloc), inb(nloc)
1647  REAL pbase(nloc)
1648  REAL p(nloc, nd), ph(nloc, nd+1)
1649  REAL tv(nloc, nd), buoy(nloc, nd)
[524]1650
[2056]1651!input/output:
[1992]1652  REAL sig(nloc, nd), w0(nloc, nd)
1653  INTEGER iflag(nloc)
[524]1654
[2056]1655!output:
[1992]1656  REAL cape(nloc)
1657  REAL m(nloc, nd)
[524]1658
[2056]1659!local variables:
[1992]1660  INTEGER i, j, k, icbmax
1661  REAL deltap, fac, w, amu
1662  REAL dtmin(nloc, nd), sigold(nloc, nd)
1663  REAL cbmflast(nloc)
[524]1664
[776]1665
[2056]1666! -------------------------------------------------------
1667! -- Initialization
1668! -------------------------------------------------------
[524]1669
[1992]1670  DO k = 1, nl
1671    DO i = 1, ncum
1672      m(i, k) = 0.0
1673    END DO
1674  END DO
[524]1675
[2056]1676! -------------------------------------------------------
1677! -- Reset sig(i) and w0(i) for i>inb and i<icb
1678! -------------------------------------------------------
[524]1679
[2056]1680! update sig and w0 above LNB:
[879]1681
[1992]1682  DO k = 1, nl - 1
1683    DO i = 1, ncum
1684      IF ((inb(i)<(nl-1)) .AND. (k>=(inb(i)+1))) THEN
[2056]1685        sig(i, k) = beta*sig(i, k) + &
1686                    2.*alpha*buoy(i, inb(i))*abs(buoy(i,inb(i)))
[1992]1687        sig(i, k) = amax1(sig(i,k), 0.0)
1688        w0(i, k) = beta*w0(i, k)
1689      END IF
1690    END DO
1691  END DO
[1494]1692
[2056]1693! compute icbmax:
[524]1694
[1992]1695  icbmax = 2
1696  DO i = 1, ncum
1697    icbmax = max(icbmax, icb(i))
1698  END DO
[524]1699
[2056]1700! update sig and w0 below cloud base:
[1494]1701
[1992]1702  DO k = 1, icbmax
1703    DO i = 1, ncum
1704      IF (k<=icb(i)) THEN
[2056]1705        sig(i, k) = beta*sig(i, k) - &
1706                    2.*alpha*buoy(i, icb(i))*buoy(i, icb(i))
[1992]1707        sig(i, k) = max(sig(i,k), 0.0)
1708        w0(i, k) = beta*w0(i, k)
1709      END IF
1710    END DO
1711  END DO
[524]1712
[2056]1713!!      if(inb.lt.(nl-1))then
1714!!         do 85 i=inb+1,nl-1
1715!!            sig(i)=beta*sig(i)+2.*alpha*buoy(inb)*
1716!!     1              abs(buoy(inb))
1717!!            sig(i)=max(sig(i),0.0)
1718!!            w0(i)=beta*w0(i)
1719!!   85    continue
1720!!      end if
[524]1721
[2056]1722!!      do 87 i=1,icb
1723!!         sig(i)=beta*sig(i)-2.*alpha*buoy(icb)*buoy(icb)
1724!!         sig(i)=max(sig(i),0.0)
1725!!         w0(i)=beta*w0(i)
1726!!   87 continue
[524]1727
[2056]1728! -------------------------------------------------------------
1729! -- Reset fractional areas of updrafts and w0 at initial time
1730! -- and after 10 time steps of no convection
1731! -------------------------------------------------------------
[524]1732
[1992]1733  DO k = 1, nl - 1
1734    DO i = 1, ncum
1735      IF (sig(i,nd)<1.5 .OR. sig(i,nd)>12.0) THEN
1736        sig(i, k) = 0.0
1737        w0(i, k) = 0.0
1738      END IF
1739    END DO
1740  END DO
[524]1741
[2056]1742! -------------------------------------------------------------
1743! -- Calculate convective available potential energy (cape),
1744! -- vertical velocity (w), fractional area covered by
1745! -- undilute updraft (sig), and updraft mass flux (m)
1746! -------------------------------------------------------------
[1849]1747
[1992]1748  DO i = 1, ncum
1749    cape(i) = 0.0
1750  END DO
[1849]1751
[2056]1752! compute dtmin (minimum buoyancy between ICB and given level k):
[1849]1753
[1992]1754  DO i = 1, ncum
1755    DO k = 1, nl
1756      dtmin(i, k) = 100.0
1757    END DO
1758  END DO
[524]1759
[1992]1760  DO i = 1, ncum
1761    DO k = 1, nl
1762      DO j = minorig, nl
[2056]1763        IF ((k>=(icb(i)+1)) .AND. (k<=inb(i)) .AND. (j>=icb(i)) .AND. (j<=(k-1))) THEN
[1992]1764          dtmin(i, k) = amin1(dtmin(i,k), buoy(i,j))
1765        END IF
1766      END DO
1767    END DO
1768  END DO
[1849]1769
[2056]1770! the interval on which cape is computed starts at pbase :
[1849]1771
[1992]1772  DO k = 1, nl
1773    DO i = 1, ncum
[1849]1774
[1992]1775      IF ((k>=(icb(i)+1)) .AND. (k<=inb(i))) THEN
[1849]1776
[1992]1777        deltap = min(pbase(i), ph(i,k-1)) - min(pbase(i), ph(i,k))
1778        cape(i) = cape(i) + rrd*buoy(i, k-1)*deltap/p(i, k-1)
1779        cape(i) = amax1(0.0, cape(i))
1780        sigold(i, k) = sig(i, k)
[1849]1781
[2056]1782! dtmin(i,k)=100.0
1783! do 97 j=icb(i),k-1 ! mauvaise vectorisation
1784! dtmin(i,k)=AMIN1(dtmin(i,k),buoy(i,j))
1785! 97     continue
[1849]1786
[1992]1787        sig(i, k) = beta*sig(i, k) + alpha*dtmin(i, k)*abs(dtmin(i,k))
1788        sig(i, k) = max(sig(i,k), 0.0)
1789        sig(i, k) = amin1(sig(i,k), 0.01)
1790        fac = amin1(((dtcrit-dtmin(i,k))/dtcrit), 1.0)
1791        w = (1.-beta)*fac*sqrt(cape(i)) + beta*w0(i, k)
1792        amu = 0.5*(sig(i,k)+sigold(i,k))*w
1793        m(i, k) = amu*0.007*p(i, k)*(ph(i,k)-ph(i,k+1))/tv(i, k)
1794        w0(i, k) = w
1795      END IF
[1849]1796
[1992]1797    END DO
1798  END DO
[1849]1799
[1992]1800  DO i = 1, ncum
1801    w0(i, icb(i)) = 0.5*w0(i, icb(i)+1)
[2056]1802    m(i, icb(i)) = 0.5*m(i, icb(i)+1)*(ph(i,icb(i))-ph(i,icb(i)+1))/(ph(i,icb(i)+1)-ph(i,icb(i)+2))
[1992]1803    sig(i, icb(i)) = sig(i, icb(i)+1)
1804    sig(i, icb(i)-1) = sig(i, icb(i))
1805  END DO
[1849]1806
[2056]1807! ccc 3. Compute final cloud base mass flux and set iflag to 3 if
1808! ccc    cloud base mass flux is exceedingly small and is decreasing (i.e. if
1809! ccc    the final mass flux (cbmflast) is greater than the target mass flux
1810! ccc    (cbmf) ??).
1811! cc
1812! c      do i = 1,ncum
1813! c       cbmflast(i) = 0.
1814! c      enddo
1815! cc
1816! c      do k= 1,nl
1817! c       do i = 1,ncum
1818! c        IF (k .ge. icb(i) .and. k .le. inb(i)) THEN
1819! c         cbmflast(i) = cbmflast(i)+M(i,k)
1820! c        ENDIF
1821! c       enddo
1822! c      enddo
1823! cc
1824! c      do i = 1,ncum
1825! c       IF (cbmflast(i) .lt. 1.e-6) THEN
1826! c         iflag(i) = 3
1827! c       ENDIF
1828! c      enddo
1829! cc
1830! c      do k= 1,nl
1831! c       do i = 1,ncum
1832! c        IF (iflag(i) .ge. 3) THEN
1833! c         M(i,k) = 0.
1834! c         sig(i,k) = 0.
1835! c         w0(i,k) = 0.
1836! c        ENDIF
1837! c       enddo
1838! c      enddo
1839! cc
1840!!      cape=0.0
1841!!      do 98 i=icb+1,inb
1842!!         deltap = min(pbase,ph(i-1))-min(pbase,ph(i))
1843!!         cape=cape+rrd*buoy(i-1)*deltap/p(i-1)
1844!!         dcape=rrd*buoy(i-1)*deltap/p(i-1)
1845!!         dlnp=deltap/p(i-1)
1846!!         cape=max(0.0,cape)
1847!!         sigold=sig(i)
[1849]1848
[2056]1849!!         dtmin=100.0
1850!!         do 97 j=icb,i-1
1851!!            dtmin=amin1(dtmin,buoy(j))
1852!!   97    continue
[1849]1853
[2056]1854!!         sig(i)=beta*sig(i)+alpha*dtmin*abs(dtmin)
1855!!         sig(i)=max(sig(i),0.0)
1856!!         sig(i)=amin1(sig(i),0.01)
1857!!         fac=amin1(((dtcrit-dtmin)/dtcrit),1.0)
1858!!         w=(1.-beta)*fac*sqrt(cape)+beta*w0(i)
1859!!         amu=0.5*(sig(i)+sigold)*w
1860!!         m(i)=amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i)
1861!!         w0(i)=w
1862!!   98 continue
1863!!      w0(icb)=0.5*w0(icb+1)
1864!!      m(icb)=0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2))
1865!!      sig(icb)=sig(icb+1)
1866!!      sig(icb-1)=sig(icb)
[1849]1867
[1992]1868  RETURN
1869END SUBROUTINE cv3_closure
[1849]1870
[2056]1871SUBROUTINE cv3_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, &
1872                      ph, t, rr, rs, u, v, tra, h, lv, lf, frac, qnk, &
1873                      unk, vnk, hp, tv, tvp, ep, clw, m, sig, &
1874                      ment, qent, uent, vent, nent, sij, elij, ments, qents, traent)
[1992]1875  IMPLICIT NONE
[1849]1876
[2056]1877! ---------------------------------------------------------------------
1878! a faire:
1879! - vectorisation de la partie normalisation des flux (do 789...)
1880! ---------------------------------------------------------------------
[524]1881
[1992]1882  include "cvthermo.h"
1883  include "cv3param.h"
1884  include "cvflag.h"
[524]1885
[2056]1886!inputs:
[2298]1887  INTEGER, INTENT (IN)                               :: ncum, nd, na, ntra, nloc
1888  INTEGER, DIMENSION (nloc), INTENT (IN)             :: icb, inb, nk
1889  REAL, DIMENSION (nloc, nd), INTENT (IN)            :: sig
1890  REAL, DIMENSION (nloc), INTENT (IN)                :: qnk, unk, vnk
1891  REAL, DIMENSION (nloc, nd+1), INTENT (IN)          :: ph
1892  REAL, DIMENSION (nloc, nd), INTENT (IN)            :: t, rr, rs
1893  REAL, DIMENSION (nloc, nd), INTENT (IN)            :: u, v
1894  REAL, DIMENSION (nloc, nd, ntra), INTENT (IN)      :: tra               ! input of convect3
1895  REAL, DIMENSION (nloc, na), INTENT (IN)            :: lv, h, hp
1896  REAL, DIMENSION (nloc, na), INTENT (IN)            :: lf, frac
1897  REAL, DIMENSION (nloc, na), INTENT (IN)            :: tv, tvp, ep, clw
1898  REAL, DIMENSION (nloc, na), INTENT (IN)            :: m                 ! input of convect3
[524]1899
[2056]1900!outputs:
[2298]1901  REAL, DIMENSION (nloc, na, na), INTENT (OUT)        :: ment, qent
1902  REAL, DIMENSION (nloc, na, na), INTENT (OUT)        :: uent, vent
1903  REAL, DIMENSION (nloc, na, na), INTENT (OUT)        :: sij, elij
1904  REAL, DIMENSION (nloc, nd, nd, ntra), INTENT (OUT)  :: traent
1905  REAL, DIMENSION (nloc, nd, nd), INTENT (OUT)        :: ments, qents
1906  INTEGER, DIMENSION (nloc, nd), INTENT (OUT)         :: nent
[524]1907
[2056]1908!local variables:
[1992]1909  INTEGER i, j, k, il, im, jm
1910  INTEGER num1, num2
1911  REAL rti, bf2, anum, denom, dei, altem, cwat, stemp, qp
1912  REAL alt, smid, sjmin, sjmax, delp, delm
1913  REAL asij(nloc), smax(nloc), scrit(nloc)
1914  REAL asum(nloc, nd), bsum(nloc, nd), csum(nloc, nd)
[2298]1915  REAL sigij(nloc, nd, nd)
[1992]1916  REAL wgh
1917  REAL zm(nloc, na)
1918  LOGICAL lwork(nloc)
[524]1919
[2056]1920! =====================================================================
1921! --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS
1922! =====================================================================
[524]1923
[2056]1924! ori        do 360 i=1,ncum*nlp
[1992]1925  DO j = 1, nl
1926    DO i = 1, ncum
1927      nent(i, j) = 0
[2056]1928! in convect3, m is computed in cv3_closure
1929! ori          m(i,1)=0.0
[1992]1930    END DO
1931  END DO
[524]1932
[2056]1933! ori      do 400 k=1,nlp
1934! ori       do 390 j=1,nlp
[1992]1935  DO j = 1, nl
1936    DO k = 1, nl
1937      DO i = 1, ncum
1938        qent(i, k, j) = rr(i, j)
1939        uent(i, k, j) = u(i, j)
1940        vent(i, k, j) = v(i, j)
1941        elij(i, k, j) = 0.0
[2056]1942!ym            ment(i,k,j)=0.0
1943!ym            sij(i,k,j)=0.0
[1992]1944      END DO
1945    END DO
1946  END DO
[524]1947
[2056]1948!ym
[1992]1949  ment(1:ncum, 1:nd, 1:nd) = 0.0
1950  sij(1:ncum, 1:nd, 1:nd) = 0.0
[524]1951
[2056]1952!AC!      do k=1,ntra
1953!AC!       do j=1,nd  ! instead nlp
1954!AC!        do i=1,nd ! instead nlp
1955!AC!         do il=1,ncum
1956!AC!            traent(il,i,j,k)=tra(il,j,k)
1957!AC!         enddo
1958!AC!        enddo
1959!AC!       enddo
1960!AC!      enddo
[1992]1961  zm(:, :) = 0.
[524]1962
[2056]1963! =====================================================================
1964! --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING
1965! --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING
1966! --- FRACTION (sij)
1967! =====================================================================
[524]1968
[1992]1969  DO i = minorig + 1, nl
[524]1970
[1992]1971    DO j = minorig, nl
1972      DO il = 1, ncum
[2056]1973        IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)-1)) .AND. (j<=inb(il))) THEN
[524]1974
[1992]1975          rti = qnk(il) - ep(il, i)*clw(il, i)
1976          bf2 = 1. + lv(il, j)*lv(il, j)*rs(il, j)/(rrv*t(il,j)*t(il,j)*cpd)
[524]1977
1978
[1992]1979          IF (cvflag_ice) THEN
[2056]1980! print*,cvflag_ice,'cvflag_ice dans do 700'
[1992]1981            IF (t(il,j)<=263.15) THEN
[2056]1982              bf2 = 1. + (lf(il,j)+lv(il,j))*(lv(il,j)+frac(il,j)* &
1983                   lf(il,j))*rs(il, j)/(rrv*t(il,j)*t(il,j)*cpd)
[1992]1984            END IF
1985          END IF
[524]1986
[1992]1987          anum = h(il, j) - hp(il, i) + (cpv-cpd)*t(il, j)*(rti-rr(il,j))
1988          denom = h(il, i) - hp(il, i) + (cpd-cpv)*(rr(il,i)-rti)*t(il, j)
1989          dei = denom
1990          IF (abs(dei)<0.01) dei = 0.01
1991          sij(il, i, j) = anum/dei
1992          sij(il, i, i) = 1.0
1993          altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j)
1994          altem = altem/bf2
1995          cwat = clw(il, j)*(1.-ep(il,j))
1996          stemp = sij(il, i, j)
1997          IF ((stemp<0.0 .OR. stemp>1.0 .OR. altem>cwat) .AND. j>i) THEN
[524]1998
[1992]1999            IF (cvflag_ice) THEN
[2056]2000              anum = anum - (lv(il,j)+frac(il,j)*lf(il,j))*(rti-rs(il,j)-cwat*bf2)
[1992]2001              denom = denom + (lv(il,j)+frac(il,j)*lf(il,j))*(rr(il,i)-rti)
2002            ELSE
2003              anum = anum - lv(il, j)*(rti-rs(il,j)-cwat*bf2)
2004              denom = denom + lv(il, j)*(rr(il,i)-rti)
2005            END IF
[524]2006
[1992]2007            IF (abs(denom)<0.01) denom = 0.01
2008            sij(il, i, j) = anum/denom
[2056]2009            altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j)
[1992]2010            altem = altem - (bf2-1.)*cwat
2011          END IF
2012          IF (sij(il,i,j)>0.0 .AND. sij(il,i,j)<0.95) THEN
2013            qent(il, i, j) = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti
[2056]2014            uent(il, i, j) = sij(il, i, j)*u(il, i) + (1.-sij(il,i,j))*unk(il)
2015            vent(il, i, j) = sij(il, i, j)*v(il, i) + (1.-sij(il,i,j))*vnk(il)
2016!!!!      do k=1,ntra
2017!!!!      traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k)
2018!!!!     :      +(1.-sij(il,i,j))*tra(il,nk(il),k)
2019!!!!      end do
[1992]2020            elij(il, i, j) = altem
2021            elij(il, i, j) = max(0.0, elij(il,i,j))
2022            ment(il, i, j) = m(il, i)/(1.-sij(il,i,j))
2023            nent(il, i) = nent(il, i) + 1
2024          END IF
2025          sij(il, i, j) = max(0.0, sij(il,i,j))
2026          sij(il, i, j) = amin1(1.0, sij(il,i,j))
2027        END IF ! new
2028      END DO
2029    END DO
[524]2030
[2056]2031!AC!       do k=1,ntra
2032!AC!        do j=minorig,nl
2033!AC!         do il=1,ncum
2034!AC!          if( (i.ge.icb(il)).and.(i.le.inb(il)).and.
2035!AC!     :       (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then
2036!AC!            traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k)
2037!AC!     :            +(1.-sij(il,i,j))*tra(il,nk(il),k)
2038!AC!          endif
2039!AC!         enddo
2040!AC!        enddo
2041!AC!       enddo
[524]2042
2043
[2056]2044! ***   if no air can entrain at level i assume that updraft detrains  ***
2045! ***   at that level and calculate detrained air flux and properties  ***
[524]2046
2047
[2056]2048! @      do 170 i=icb(il),inb(il)
[524]2049
[1992]2050    DO il = 1, ncum
2051      IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (nent(il,i)==0)) THEN
[2056]2052! @      if(nent(il,i).eq.0)then
[1992]2053        ment(il, i, i) = m(il, i)
2054        qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i)
2055        uent(il, i, i) = unk(il)
2056        vent(il, i, i) = vnk(il)
2057        elij(il, i, i) = clw(il, i)
[2056]2058! MAF      sij(il,i,i)=1.0
[1992]2059        sij(il, i, i) = 0.0
2060      END IF
2061    END DO
2062  END DO
[879]2063
[2056]2064!AC!      do j=1,ntra
2065!AC!       do i=minorig+1,nl
2066!AC!        do il=1,ncum
2067!AC!         if (i.ge.icb(il) .and. i.le.inb(il) .and. nent(il,i).eq.0) then
2068!AC!          traent(il,i,i,j)=tra(il,nk(il),j)
2069!AC!         endif
2070!AC!        enddo
2071!AC!       enddo
2072!AC!      enddo
[879]2073
[1992]2074  DO j = minorig, nl
2075    DO i = minorig, nl
2076      DO il = 1, ncum
[2056]2077        IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. (i>=icb(il)) .AND. (i<=inb(il))) THEN
[1992]2078          sigij(il, i, j) = sij(il, i, j)
2079        END IF
2080      END DO
2081    END DO
2082  END DO
[2056]2083! @      enddo
[879]2084
[2056]2085! @170   continue
[524]2086
[2056]2087! =====================================================================
2088! ---  NORMALIZE ENTRAINED AIR MASS FLUXES
2089! ---  TO REPRESENT EQUAL PROBABILITIES OF MIXING
2090! =====================================================================
[970]2091
[1992]2092  CALL zilch(asum, nloc*nd)
2093  CALL zilch(csum, nloc*nd)
2094  CALL zilch(csum, nloc*nd)
[524]2095
[1992]2096  DO il = 1, ncum
2097    lwork(il) = .FALSE.
2098  END DO
[524]2099
[1992]2100  DO i = minorig + 1, nl
[524]2101
[1992]2102    num1 = 0
2103    DO il = 1, ncum
2104      IF (i>=icb(il) .AND. i<=inb(il)) num1 = num1 + 1
2105    END DO
2106    IF (num1<=0) GO TO 789
[524]2107
[879]2108
[1992]2109    DO il = 1, ncum
2110      IF (i>=icb(il) .AND. i<=inb(il)) THEN
2111        lwork(il) = (nent(il,i)/=0)
2112        qp = qnk(il) - ep(il, i)*clw(il, i)
[524]2113
[1992]2114        IF (cvflag_ice) THEN
[524]2115
[2056]2116          anum = h(il, i) - hp(il, i) - (lv(il,i)+frac(il,i)*lf(il,i))* &
2117                       (qp-rs(il,i)) + (cpv-cpd)*t(il, i)*(qp-rr(il,i))
2118          denom = h(il, i) - hp(il, i) + (lv(il,i)+frac(il,i)*lf(il,i))* &
2119                       (rr(il,i)-qp) + (cpd-cpv)*t(il, i)*(rr(il,i)-qp)
[1992]2120        ELSE
[879]2121
[1992]2122          anum = h(il, i) - hp(il, i) - lv(il, i)*(qp-rs(il,i)) + &
[2056]2123                       (cpv-cpd)*t(il, i)*(qp-rr(il,i))
[1992]2124          denom = h(il, i) - hp(il, i) + lv(il, i)*(rr(il,i)-qp) + &
[2056]2125                       (cpd-cpv)*t(il, i)*(rr(il,i)-qp)
[1992]2126        END IF
[524]2127
[1992]2128        IF (abs(denom)<0.01) denom = 0.01
2129        scrit(il) = anum/denom
2130        alt = qp - rs(il, i) + scrit(il)*(rr(il,i)-qp)
2131        IF (scrit(il)<=0.0 .OR. alt<=0.0) scrit(il) = 1.0
2132        smax(il) = 0.0
2133        asij(il) = 0.0
2134      END IF
2135    END DO
[524]2136
[1992]2137    DO j = nl, minorig, -1
[524]2138
[1992]2139      num2 = 0
2140      DO il = 1, ncum
[2056]2141        IF (i>=icb(il) .AND. i<=inb(il) .AND. &
2142            j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
2143            lwork(il)) num2 = num2 + 1
[1992]2144      END DO
2145      IF (num2<=0) GO TO 175
[524]2146
[1992]2147      DO il = 1, ncum
[2056]2148        IF (i>=icb(il) .AND. i<=inb(il) .AND. &
2149            j>=(icb(il)-1) .AND. j<=inb(il) .AND. &
2150            lwork(il)) THEN
[524]2151
[1992]2152          IF (sij(il,i,j)>1.0E-16 .AND. sij(il,i,j)<0.95) THEN
2153            wgh = 1.0
2154            IF (j>i) THEN
2155              sjmax = max(sij(il,i,j+1), smax(il))
2156              sjmax = amin1(sjmax, scrit(il))
2157              smax(il) = max(sij(il,i,j), smax(il))
2158              sjmin = max(sij(il,i,j-1), smax(il))
2159              sjmin = amin1(sjmin, scrit(il))
2160              IF (sij(il,i,j)<(smax(il)-1.0E-16)) wgh = 0.0
2161              smid = amin1(sij(il,i,j), scrit(il))
2162            ELSE
2163              sjmax = max(sij(il,i,j+1), scrit(il))
2164              smid = max(sij(il,i,j), scrit(il))
2165              sjmin = 0.0
2166              IF (j>1) sjmin = sij(il, i, j-1)
2167              sjmin = max(sjmin, scrit(il))
2168            END IF
2169            delp = abs(sjmax-smid)
2170            delm = abs(sjmin-smid)
2171            asij(il) = asij(il) + wgh*(delp+delm)
2172            ment(il, i, j) = ment(il, i, j)*(delp+delm)*wgh
2173          END IF
2174        END IF
2175      END DO
[524]2176
[1992]2177175 END DO
[524]2178
[1992]2179    DO il = 1, ncum
2180      IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il)) THEN
2181        asij(il) = max(1.0E-16, asij(il))
2182        asij(il) = 1.0/asij(il)
2183        asum(il, i) = 0.0
2184        bsum(il, i) = 0.0
2185        csum(il, i) = 0.0
2186      END IF
2187    END DO
[524]2188
[1992]2189    DO j = minorig, nl
2190      DO il = 1, ncum
[2056]2191        IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2192            j>=(icb(il)-1) .AND. j<=inb(il)) THEN
[1992]2193          ment(il, i, j) = ment(il, i, j)*asij(il)
2194        END IF
2195      END DO
2196    END DO
[524]2197
[1992]2198    DO j = minorig, nl
2199      DO il = 1, ncum
[2056]2200        IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2201            j>=(icb(il)-1) .AND. j<=inb(il)) THEN
[1992]2202          asum(il, i) = asum(il, i) + ment(il, i, j)
2203          ment(il, i, j) = ment(il, i, j)*sig(il, j)
2204          bsum(il, i) = bsum(il, i) + ment(il, i, j)
2205        END IF
2206      END DO
2207    END DO
[1849]2208
[1992]2209    DO il = 1, ncum
2210      IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il)) THEN
2211        bsum(il, i) = max(bsum(il,i), 1.0E-16)
2212        bsum(il, i) = 1.0/bsum(il, i)
2213      END IF
2214    END DO
[1849]2215
[1992]2216    DO j = minorig, nl
2217      DO il = 1, ncum
[2056]2218        IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2219            j>=(icb(il)-1) .AND. j<=inb(il)) THEN
[1992]2220          ment(il, i, j) = ment(il, i, j)*asum(il, i)*bsum(il, i)
2221        END IF
2222      END DO
2223    END DO
[879]2224
[1992]2225    DO j = minorig, nl
2226      DO il = 1, ncum
[2056]2227        IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2228            j>=(icb(il)-1) .AND. j<=inb(il)) THEN
[1992]2229          csum(il, i) = csum(il, i) + ment(il, i, j)
2230        END IF
2231      END DO
2232    END DO
[1849]2233
[1992]2234    DO il = 1, ncum
2235      IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. &
2236          csum(il,i)<m(il,i)) THEN
2237        nent(il, i) = 0
2238        ment(il, i, i) = m(il, i)
2239        qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i)
2240        uent(il, i, i) = unk(il)
2241        vent(il, i, i) = vnk(il)
2242        elij(il, i, i) = clw(il, i)
[2056]2243! MAF        sij(il,i,i)=1.0
[1992]2244        sij(il, i, i) = 0.0
2245      END IF
2246    END DO ! il
[1849]2247
[2056]2248!AC!      do j=1,ntra
2249!AC!       do il=1,ncum
2250!AC!        if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
2251!AC!     :     .and. csum(il,i).lt.m(il,i) ) then
2252!AC!         traent(il,i,i,j)=tra(il,nk(il),j)
2253!AC!        endif
2254!AC!       enddo
2255!AC!      enddo
[1992]2256789 END DO
[879]2257
[2056]2258! MAF: renormalisation de MENT
[1992]2259  CALL zilch(zm, nloc*na)
[2408]2260  DO jm = 1, nl
2261    DO im = 1, nl
[1992]2262      DO il = 1, ncum
2263        zm(il, im) = zm(il, im) + (1.-sij(il,im,jm))*ment(il, im, jm)
2264      END DO
2265    END DO
2266  END DO
[524]2267
[2408]2268  DO jm = 1, nl
2269    DO im = 1, nl
[1992]2270      DO il = 1, ncum
2271        IF (zm(il,im)/=0.) THEN
2272          ment(il, im, jm) = ment(il, im, jm)*m(il, im)/zm(il, im)
2273        END IF
2274      END DO
2275    END DO
2276  END DO
[524]2277
[2408]2278  DO jm = 1, nl
2279    DO im = 1, nl
[1992]2280      DO il = 1, ncum
2281        qents(il, im, jm) = qent(il, im, jm)
2282        ments(il, im, jm) = ment(il, im, jm)
2283      END DO
2284    END DO
2285  END DO
[524]2286
[1992]2287  RETURN
2288END SUBROUTINE cv3_mixing
[879]2289
[2056]2290SUBROUTINE cv3_unsat(nloc, ncum, nd, na, ntra, icb, inb, iflag, &
2291                     t, rr, rs, gz, u, v, tra, p, ph, &
2292                     th, tv, lv, lf, cpn, ep, sigp, clw, &
2293                     m, ment, elij, delt, plcl, coef_clos, &
2294                     mp, rp, up, vp, trap, wt, water, evap, fondue, ice, &
2295                     faci, b, sigd, &
2296                     wdtrainA, wdtrainM)                                      ! RomP
[2408]2297  USE print_control_mod, ONLY: prt_level, lunout
[1992]2298  IMPLICIT NONE
[879]2299
2300
[1992]2301  include "cvthermo.h"
2302  include "cv3param.h"
2303  include "cvflag.h"
[2298]2304  include "nuage.h"
[524]2305
[2056]2306!inputs:
[2408]2307  INTEGER, INTENT (IN)                               :: ncum, nd, na, ntra, nloc
2308  INTEGER, DIMENSION (nloc), INTENT (IN)             :: icb, inb
2309  REAL, INTENT(IN)                                   :: delt
2310  REAL, DIMENSION (nloc), INTENT (IN)                :: plcl
2311  REAL, DIMENSION (nloc, nd), INTENT (IN)            :: t, rr, rs
2312  REAL, DIMENSION (nloc, na), INTENT (IN)            :: gz
2313  REAL, DIMENSION (nloc, nd), INTENT (IN)            :: u, v
[1992]2314  REAL tra(nloc, nd, ntra)
2315  REAL p(nloc, nd), ph(nloc, nd+1)
[2408]2316  REAL, DIMENSION (nloc, na), INTENT (IN)            :: ep, sigp, clw
2317  REAL, DIMENSION (nloc, na), INTENT (IN)            :: th, tv, lv, cpn
2318  REAL, DIMENSION (nloc, na), INTENT (IN)            :: lf
2319  REAL, DIMENSION (nloc, na), INTENT (IN)            :: m
2320  REAL, DIMENSION (nloc, na, na), INTENT (IN)        :: ment, elij
2321  REAL, DIMENSION (nloc), INTENT (IN)                :: coef_clos
[524]2322
[2056]2323!input/output
[2408]2324  INTEGER, DIMENSION (nloc), INTENT (INOUT)          :: iflag(nloc)
[524]2325
[2056]2326!outputs:
[2408]2327  REAL, DIMENSION (nloc, na), INTENT (OUT)           :: mp, rp, up, vp
2328  REAL, DIMENSION (nloc, na), INTENT (OUT)           :: water, evap, wt
2329  REAL, DIMENSION (nloc, na), INTENT (OUT)           :: ice, fondue, faci
2330  REAL, DIMENSION (nloc, na, ntra), INTENT (OUT)     :: trap
2331  REAL, DIMENSION (nloc, na), INTENT (OUT)           :: b
2332  REAL, DIMENSION (nloc), INTENT (OUT)               :: sigd
[2056]2333! 25/08/10 - RomP---- ajout des masses precipitantes ejectees
2334! de l ascendance adiabatique et des flux melanges Pa et Pm.
2335! Distinction des wdtrain
2336! Pa = wdtrainA     Pm = wdtrainM
[2408]2337  REAL, DIMENSION (nloc, na), INTENT (OUT)           :: wdtrainA, wdtrainM
[879]2338
[2056]2339!local variables
[1992]2340  INTEGER i, j, k, il, num1, ndp1
2341  REAL tinv, delti, coef
2342  REAL awat, afac, afac1, afac2, bfac
2343  REAL pr1, pr2, sigt, b6, c6, d6, e6, f6, revap, delth
2344  REAL amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf
2345  REAL ampmax, thaw
2346  REAL tevap(nloc)
2347  REAL lvcp(nloc, na), lfcp(nloc, na)
2348  REAL h(nloc, na), hm(nloc, na)
2349  REAL frac(nloc, na)
2350  REAL fraci(nloc, na), prec(nloc, na)
2351  REAL wdtrain(nloc)
2352  LOGICAL lwork(nloc), mplus(nloc)
[524]2353
2354
[2056]2355! ------------------------------------------------------
[524]2356
[2408]2357! =============================
2358! --- INITIALIZE OUTPUT ARRAYS
2359! =============================
2360!  (loops up to nl+1)
[524]2361
[2408]2362  DO i = 1, nlp
[1992]2363    DO il = 1, ncum
2364      mp(il, i) = 0.0
2365      rp(il, i) = rr(il, i)
2366      up(il, i) = u(il, i)
2367      vp(il, i) = v(il, i)
2368      wt(il, i) = 0.001
2369      water(il, i) = 0.0
2370      faci(il, i) = 0.0
2371      ice(il, i) = 0.0
2372      fondue(il, i) = 0.0
2373      evap(il, i) = 0.0
2374      b(il, i) = 0.0
[2408]2375    END DO
2376  END DO
2377!! RomP >>>
2378  DO i = 1, nlp
2379    DO il = 1, ncum
2380      wdtrainA(il, i) = 0.0
2381      wdtrainM(il, i) = 0.0
2382    END DO
2383  END DO
2384!! RomP <<<
2385
2386! ***  Set the fractionnal area sigd of precipitating downdraughts
2387  DO il = 1, ncum
2388    sigd(il) = sigdz*coef_clos(il)
2389  END DO
2390
2391! =====================================================================
2392! --- INITIALIZE VARIOUS ARRAYS AND PARAMETERS USED IN THE COMPUTATIONS
2393! =====================================================================
2394!  (loops up to nl+1)
2395
2396  delti = 1./delt
2397  tinv = 1./3.
2398
2399  DO i = 1, nlp
2400    DO il = 1, ncum
2401      frac(il, i) = 0.0
2402      fraci(il, i) = 0.0
2403      prec(il, i) = 0.0
[1992]2404      lvcp(il, i) = lv(il, i)/cpn(il, i)
2405      lfcp(il, i) = lf(il, i)/cpn(il, i)
2406    END DO
2407  END DO
[2408]2408
[2056]2409!AC!        do k=1,ntra
2410!AC!         do i=1,nd
2411!AC!          do il=1,ncum
2412!AC!           trap(il,i,k)=tra(il,i,k)
2413!AC!          enddo
2414!AC!         enddo
2415!AC!        enddo
[524]2416
[2056]2417! ***  check whether ep(inb)=0, if so, skip precipitating    ***
2418! ***             downdraft calculation                      ***
[524]2419
2420
[1992]2421  DO il = 1, ncum
[2056]2422!!          lwork(il)=.TRUE.
2423!!          if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE.
[1992]2424    lwork(il) = ep(il, inb(il)) >= 0.0001
2425  END DO
[524]2426
2427
[2056]2428! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2429!
2430! ***                    begin downdraft loop                    ***
2431!
2432! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[524]2433
[1992]2434  DO i = nl + 1, 1, -1
[524]2435
[1992]2436    num1 = 0
2437    DO il = 1, ncum
2438      IF (i<=inb(il) .AND. lwork(il)) num1 = num1 + 1
2439    END DO
2440    IF (num1<=0) GO TO 400
[1146]2441
[1992]2442    CALL zilch(wdtrain, ncum)
[1146]2443
2444
[2056]2445! ***  integrate liquid water equation to find condensed water   ***
2446! ***                and condensed water flux                    ***
2447!
2448!
2449! ***              calculate detrained precipitation             ***
[524]2450
[1992]2451    DO il = 1, ncum
2452      IF (i<=inb(il) .AND. lwork(il)) THEN
2453        IF (cvflag_grav) THEN
2454          wdtrain(il) = grav*ep(il, i)*m(il, i)*clw(il, i)
[2056]2455          wdtrainA(il, i) = wdtrain(il)/grav                        !   Pa   RomP
[1992]2456        ELSE
2457          wdtrain(il) = 10.0*ep(il, i)*m(il, i)*clw(il, i)
[2056]2458          wdtrainA(il, i) = wdtrain(il)/10.                         !   Pa   RomP
[1992]2459        END IF
2460      END IF
2461    END DO
[524]2462
[1992]2463    IF (i>1) THEN
2464      DO j = 1, i - 1
2465        DO il = 1, ncum
2466          IF (i<=inb(il) .AND. lwork(il)) THEN
2467            awat = elij(il, j, i) - (1.-ep(il,i))*clw(il, i)
2468            awat = max(awat, 0.0)
2469            IF (cvflag_grav) THEN
2470              wdtrain(il) = wdtrain(il) + grav*awat*ment(il, j, i)
[2056]2471              wdtrainM(il, i) = wdtrain(il)/grav - wdtrainA(il, i)  !   Pm  RomP
[1992]2472            ELSE
2473              wdtrain(il) = wdtrain(il) + 10.0*awat*ment(il, j, i)
[2056]2474              wdtrainM(il, i) = wdtrain(il)/10. - wdtrainA(il, i)   !   Pm  RomP
[1992]2475            END IF
2476          END IF
2477        END DO
2478      END DO
2479    END IF
[524]2480
[1146]2481
[2056]2482! ***    find rain water and evaporation using provisional   ***
2483! ***              estimates of rp(i)and rp(i-1)             ***
[1146]2484
[1650]2485
[1992]2486    DO il = 1, ncum
2487      IF (i<=inb(il) .AND. lwork(il)) THEN
[524]2488
[1992]2489        wt(il, i) = 45.0
[524]2490
[1992]2491        IF (cvflag_ice) THEN
2492          frac(il, inb(il)) = 1. - (t(il,inb(il))-243.15)/(263.15-243.15)
2493          frac(il, inb(il)) = min(max(frac(il,inb(il)),0.), 1.)
2494          fraci(il, inb(il)) = frac(il, inb(il))
2495        ELSE
2496          CONTINUE
2497        END IF
[879]2498
[1992]2499        IF (i<inb(il)) THEN
[524]2500
[1992]2501          IF (cvflag_ice) THEN
[2298]2502!CR:tmax_fonte_cv: T for which ice is totally melted (used to be 275.15)
2503            thaw = (t(il,i)-273.15)/(tmax_fonte_cv-273.15)
[1992]2504            thaw = min(max(thaw,0.0), 1.0)
2505            frac(il, i) = frac(il, i)*(1.-thaw)
2506          ELSE
2507            CONTINUE
2508          END IF
[524]2509
[2056]2510          rp(il, i) = rp(il, i+1) + &
2511                      (cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il, i)
[1992]2512          rp(il, i) = 0.5*(rp(il,i)+rr(il,i))
2513        END IF
2514        fraci(il, i) = 1. - (t(il,i)-243.15)/(263.15-243.15)
2515        fraci(il, i) = min(max(fraci(il,i),0.0), 1.0)
2516        rp(il, i) = max(rp(il,i), 0.0)
2517        rp(il, i) = amin1(rp(il,i), rs(il,i))
2518        rp(il, inb(il)) = rr(il, inb(il))
[524]2519
[1992]2520        IF (i==1) THEN
2521          afac = p(il, 1)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1))
2522          IF (cvflag_ice) THEN
[2056]2523            afac1 = p(il, i)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1))
[1992]2524          END IF
2525        ELSE
[2056]2526          rp(il, i-1) = rp(il, i) + (cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il, i)
[1992]2527          rp(il, i-1) = 0.5*(rp(il,i-1)+rr(il,i-1))
2528          rp(il, i-1) = amin1(rp(il,i-1), rs(il,i-1))
2529          rp(il, i-1) = max(rp(il,i-1), 0.0)
[2056]2530          afac1 = p(il, i)*(rs(il,i)-rp(il,i))/(1.0E4+2000.0*p(il,i)*rs(il,i))
2531          afac2 = p(il, i-1)*(rs(il,i-1)-rp(il,i-1))/(1.0E4+2000.0*p(il,i-1)*rs(il,i-1))
[1992]2532          afac = 0.5*(afac1+afac2)
2533        END IF
2534        IF (i==inb(il)) afac = 0.0
2535        afac = max(afac, 0.0)
2536        bfac = 1./(sigd(il)*wt(il,i))
[524]2537
[2408]2538!
2539    IF (prt_level >= 20) THEN
2540      Print*, 'cv3_unsat after provisional rp estimate: rp, afac, bfac ', &
2541          i, rp(1, i), afac,bfac
2542    ENDIF
2543!
[2056]2544!JYG1
2545! cc        sigt=1.0
2546! cc        if(i.ge.icb)sigt=sigp(i)
2547! prise en compte de la variation progressive de sigt dans
2548! les couches icb et icb-1:
2549! pour plcl<ph(i+1), pr1=0 & pr2=1
2550! pour plcl>ph(i),   pr1=1 & pr2=0
2551! pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval
2552! sur le nuage, et pr2 est la proportion sous la base du
2553! nuage.
[1992]2554        pr1 = (plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1))
2555        pr1 = max(0., min(1.,pr1))
2556        pr2 = (ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1))
2557        pr2 = max(0., min(1.,pr2))
2558        sigt = sigp(il, i)*pr1 + pr2
[2056]2559!JYG2
[524]2560
[2056]2561!JYG----
2562!    b6 = bfac*100.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac
2563!    c6 = water(il,i+1) + wdtrain(il)*bfac
2564!    c6 = prec(il,i+1) + wdtrain(il)*bfac
2565!    revap=0.5*(-b6+sqrt(b6*b6+4.*c6))
2566!    evap(il,i)=sigt*afac*revap
2567!    water(il,i)=revap*revap
2568!    prec(il,i)=revap*revap
2569!!        print *,' i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) ', &
2570!!                 i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il)
2571!!---end jyg---
[879]2572
[2056]2573! --------retour à la formulation originale d'Emanuel.
[1992]2574        IF (cvflag_ice) THEN
[524]2575
[2056]2576!   b6=bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac
2577!   c6=prec(il,i+1)+bfac*wdtrain(il) &
2578!       -50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)
2579!   if(c6.gt.0.0)then
2580!   revap=0.5*(-b6+sqrt(b6*b6+4.*c6))
[524]2581
[2056]2582!JAM  Attention: evap=sigt*E
2583!    Modification: evap devient l'évaporation en milieu de couche
2584!    car nécessaire dans cv3_yield
2585!    Du coup, il faut modifier pas mal d'équations...
2586!    et l'expression de afac qui devient afac1
2587!    revap=sqrt((prec(i+1)+prec(i))/2)
[524]2588
[1992]2589          b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac1
2590          c6 = prec(il, i+1) + 0.5*bfac*wdtrain(il)
[2056]2591! print *,'bfac,sigd(il),sigt,afac1 ',bfac,sigd(il),sigt,afac1
2592! print *,'prec(il,i+1),wdtrain(il) ',prec(il,i+1),wdtrain(il)
2593! print *,'b6,c6,b6*b6+4.*c6 ',b6,c6,b6*b6+4.*c6
[1992]2594          IF (c6>b6*b6+1.E-20) THEN
2595            revap = 2.*c6/(b6+sqrt(b6*b6+4.*c6))
2596          ELSE
2597            revap = (-b6+sqrt(b6*b6+4.*c6))/2.
2598          END IF
2599          prec(il, i) = max(0., 2.*revap*revap-prec(il,i+1))
[2056]2600! print*,prec(il,i),'neige'
[524]2601
[2056]2602!JYG    Dans sa formulation originale, Emanuel calcule l'evaporation par:
2603! c             evap(il,i)=sigt*afac*revap
2604! ce qui n'est pas correct. Dans cv_routines, la formulation a été modifiee.
2605! Ici,l'evaporation evap est simplement calculee par l'equation de
2606! conservation.
2607! prec(il,i)=revap*revap
2608! else
2609!JYG----   Correction : si c6 <= 0, water(il,i)=0.
2610! prec(il,i)=0.
2611! endif
[524]2612
[2056]2613!JYG---   Dans tous les cas, evaporation = [tt ce qui entre dans la couche i]
2614! moins [tt ce qui sort de la couche i]
2615! print *, 'evap avec ice'
2616          evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(prec(il,i+1)-prec(il,i))) / &
2617                        (sigd(il)*(ph(il,i)-ph(il,i+1))*100.)
[2408]2618!
2619    IF (prt_level >= 20) THEN
2620      Print*, 'cv3_unsat after evap computation: wdtrain, sigd, wt, prec(i+1),prec(i) ', &
2621          i, wdtrain(1), sigd(1), wt(1,i), prec(1,i+1),prec(1,i)
2622    ENDIF
2623!
[524]2624
[2542]2625!jyg<
2626          d6 = prec(il,i)-prec(il,i+1)
[524]2627
[2542]2628!!          d6 = bfac*wdtrain(il) - 100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i)
2629!!          e6 = bfac*wdtrain(il)
2630!!          f6 = -100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i)
2631!>jyg
[2298]2632!CR:tmax_fonte_cv: T for which ice is totally melted (used to be 275.15)
2633          thaw = (t(il,i)-273.15)/(tmax_fonte_cv-273.15)
[1992]2634          thaw = min(max(thaw,0.0), 1.0)
[2542]2635!jyg<
[1992]2636          water(il, i) = water(il, i+1) + (1-fraci(il,i))*d6
[2542]2637          ice(il, i)   = ice(il, i+1)   + fraci(il, i)*d6
2638          water(il, i) = min(prec(il,i), max(water(il,i), 0.))
2639          ice(il, i)   = min(prec(il,i), max(ice(il,i),   0.))
2640
2641!!          water(il, i) = water(il, i+1) + (1-fraci(il,i))*d6
2642!!          water(il, i) = max(water(il,i), 0.)
2643!!          ice(il, i) = ice(il, i+1) + fraci(il, i)*d6
2644!!          ice(il, i) = max(ice(il,i), 0.)
2645!>jyg
[1992]2646          fondue(il, i) = ice(il, i)*thaw
2647          water(il, i) = water(il, i) + fondue(il, i)
2648          ice(il, i) = ice(il, i) - fondue(il, i)
[524]2649
[1992]2650          IF (water(il,i)+ice(il,i)<1.E-30) THEN
2651            faci(il, i) = 0.
2652          ELSE
2653            faci(il, i) = ice(il, i)/(water(il,i)+ice(il,i))
2654          END IF
[524]2655
[2056]2656!           water(il,i)=water(il,i+1)+(1.-fraci(il,i))*e6+(1.-faci(il,i))*f6
2657!           water(il,i)=max(water(il,i),0.)
2658!           ice(il,i)=ice(il,i+1)+fraci(il,i)*e6+faci(il,i)*f6
2659!           ice(il,i)=max(ice(il,i),0.)
2660!           fondue(il,i)=ice(il,i)*thaw
2661!           water(il,i)=water(il,i)+fondue(il,i)
2662!           ice(il,i)=ice(il,i)-fondue(il,i)
2663           
2664!           if((water(il,i)+ice(il,i)).lt.1.e-30)then
2665!             faci(il,i)=0.
2666!           else
2667!             faci(il,i)=ice(il,i)/(water(il,i)+ice(il,i))
2668!           endif
[524]2669
[1992]2670        ELSE
2671          b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac
[2056]2672          c6 = water(il, i+1) + bfac*wdtrain(il) - &
2673               50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i+1)
[1992]2674          IF (c6>0.0) THEN
2675            revap = 0.5*(-b6+sqrt(b6*b6+4.*c6))
2676            water(il, i) = revap*revap
2677          ELSE
2678            water(il, i) = 0.
2679          END IF
[2056]2680! print *, 'evap sans ice'
2681          evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(water(il,i+1)-water(il,i)))/ &
2682                        (sigd(il)*(ph(il,i)-ph(il,i+1))*100.)
[524]2683
[1992]2684        END IF
2685      END IF !(i.le.inb(il) .and. lwork(il))
2686    END DO
[2056]2687! ----------------------------------------------------------------
[524]2688
[2056]2689! cc
2690! ***  calculate precipitating downdraft mass flux under     ***
2691! ***              hydrostatic approximation                 ***
[524]2692
[1992]2693    DO il = 1, ncum
2694      IF (i<=inb(il) .AND. lwork(il) .AND. i/=1) THEN
[524]2695
[1992]2696        tevap(il) = max(0.0, evap(il,i))
2697        delth = max(0.001, (th(il,i)-th(il,i-1)))
2698        IF (cvflag_ice) THEN
2699          IF (cvflag_grav) THEN
[2056]2700            mp(il, i) = 100.*ginv*(lvcp(il,i)*sigd(il)*tevap(il)* &
2701                                               (p(il,i-1)-p(il,i))/delth + &
2702                                   lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)* &
2703                                               (p(il,i-1)-p(il,i))/delth + &
2704                                   lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il,i)* &
2705                                               (p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1)))
[1992]2706          ELSE
[2056]2707            mp(il, i) = 10.*(lvcp(il,i)*sigd(il)*tevap(il)* &
2708                                                (p(il,i-1)-p(il,i))/delth + &
2709                             lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)* &
2710                                                (p(il,i-1)-p(il,i))/delth + &
2711                             lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il,i)* &
2712                                                (p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1)))
[524]2713
[1992]2714          END IF
2715        ELSE
2716          IF (cvflag_grav) THEN
2717            mp(il, i) = 100.*ginv*lvcp(il, i)*sigd(il)*tevap(il)* &
[2056]2718                                                (p(il,i-1)-p(il,i))/delth
[1992]2719          ELSE
2720            mp(il, i) = 10.*lvcp(il, i)*sigd(il)*tevap(il)* &
[2056]2721                                                (p(il,i-1)-p(il,i))/delth
[1992]2722          END IF
[524]2723
[1992]2724        END IF
[879]2725
[1992]2726      END IF !(i.le.inb(il) .and. lwork(il) .and. i.ne.1)
2727    END DO
[2056]2728! ----------------------------------------------------------------
[524]2729
[2056]2730! ***           if hydrostatic assumption fails,             ***
2731! ***   solve cubic difference equation for downdraft theta  ***
2732! ***  and mass flux from two simultaneous differential eqns ***
[524]2733
[1992]2734    DO il = 1, ncum
2735      IF (i<=inb(il) .AND. lwork(il) .AND. i/=1) THEN
[1742]2736
[1992]2737        amfac = sigd(il)*sigd(il)*70.0*ph(il, i)*(p(il,i-1)-p(il,i))* &
[2056]2738                         (th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i))
[1992]2739        amp2 = abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i))
[1742]2740
[1992]2741        IF (amp2>(0.1*amfac)) THEN
2742          xf = 100.0*sigd(il)*sigd(il)*sigd(il)*(ph(il,i)-ph(il,i+1))
[2056]2743          tf = b(il, i) - 5.0*(th(il,i)-th(il,i-1))*t(il, i) / &
2744                              (lvcp(il,i)*sigd(il)*th(il,i))
[1992]2745          af = xf*tf + mp(il, i+1)*mp(il, i+1)*tinv
[1742]2746
[1992]2747          IF (cvflag_ice) THEN
2748            bf = 2.*(tinv*mp(il,i+1))**3 + tinv*mp(il, i+1)*xf*tf + &
[2056]2749                 50.*(p(il,i-1)-p(il,i))*xf*(tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + &
2750                (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i)/(ph(il,i)-ph(il,i+1)))
[1992]2751          ELSE
[1774]2752
[1992]2753            bf = 2.*(tinv*mp(il,i+1))**3 + tinv*mp(il, i+1)*xf*tf + &
[2056]2754                                           50.*(p(il,i-1)-p(il,i))*xf*tevap(il)
[1992]2755          END IF
[1742]2756
[1992]2757          fac2 = 1.0
2758          IF (bf<0.0) fac2 = -1.0
2759          bf = abs(bf)
2760          ur = 0.25*bf*bf - af*af*af*tinv*tinv*tinv
2761          IF (ur>=0.0) THEN
2762            sru = sqrt(ur)
2763            fac = 1.0
2764            IF ((0.5*bf-sru)<0.0) fac = -1.0
2765            mp(il, i) = mp(il, i+1)*tinv + (0.5*bf+sru)**tinv + &
[2056]2766                                           fac*(abs(0.5*bf-sru))**tinv
[1992]2767          ELSE
2768            d = atan(2.*sqrt(-ur)/(bf+1.0E-28))
2769            IF (fac2<0.0) d = 3.14159 - d
2770            mp(il, i) = mp(il, i+1)*tinv + 2.*sqrt(af*tinv)*cos(d*tinv)
2771          END IF
2772          mp(il, i) = max(0.0, mp(il,i))
[524]2773
[1992]2774          IF (cvflag_ice) THEN
2775            IF (cvflag_grav) THEN
[2056]2776!JYG : il y a vraisemblablement une erreur dans la ligne 2 suivante:
2777! il faut diviser par (mp(il,i)*sigd(il)*grav) et non par (mp(il,i)+sigd(il)*0.1).
2778! Et il faut bien revoir les facteurs 100.
2779              b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))* &
2780                           (tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + &
2781                           (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i) / &
2782                           (ph(il,i)-ph(il,i+1))) / &
2783                           (mp(il,i)+sigd(il)*0.1) - &
2784                           10.0*(th(il,i)-th(il,i-1))*t(il, i) / &
2785                           (lvcp(il,i)*sigd(il)*th(il,i))
[1992]2786            ELSE
[2056]2787              b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*&
2788                           (tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + &
2789                           (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i) / &
2790                           (ph(il,i)-ph(il,i+1))) / &
2791                           (mp(il,i)+sigd(il)*0.1) - &
2792                           10.0*(th(il,i)-th(il,i-1))*t(il, i) / &
2793                           (lvcp(il,i)*sigd(il)*th(il,i))
[1992]2794            END IF
2795          ELSE
2796            IF (cvflag_grav) THEN
[2056]2797              b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il) / &
2798                           (mp(il,i)+sigd(il)*0.1) - &
2799                           10.0*(th(il,i)-th(il,i-1))*t(il, i) / &
2800                           (lvcp(il,i)*sigd(il)*th(il,i))
[1992]2801            ELSE
[2056]2802              b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il) / &
2803                           (mp(il,i)+sigd(il)*0.1) - &
2804                           10.0*(th(il,i)-th(il,i-1))*t(il, i) / &
2805                           (lvcp(il,i)*sigd(il)*th(il,i))
[1992]2806            END IF
2807          END IF
2808          b(il, i-1) = max(b(il,i-1), 0.0)
[524]2809
[1992]2810        END IF !(amp2.gt.(0.1*amfac))
[524]2811
[2056]2812! ***         limit magnitude of mp(i) to meet cfl condition      ***
[524]2813
[1992]2814        ampmax = 2.0*(ph(il,i)-ph(il,i+1))*delti
2815        amp2 = 2.0*(ph(il,i-1)-ph(il,i))*delti
2816        ampmax = min(ampmax, amp2)
2817        mp(il, i) = min(mp(il,i), ampmax)
[524]2818
[2056]2819! ***      force mp to decrease linearly to zero                 ***
2820! ***       between cloud base and the surface                   ***
[524]2821
2822
[2056]2823! c      if(p(il,i).gt.p(il,icb(il)))then
2824! c       mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il)))
2825! c      endif
[1992]2826        IF (ph(il,i)>0.9*plcl(il)) THEN
2827          mp(il, i) = mp(il, i)*(ph(il,1)-ph(il,i))/(ph(il,1)-0.9*plcl(il))
2828        END IF
[524]2829
[1992]2830      END IF ! (i.le.inb(il) .and. lwork(il) .and. i.ne.1)
2831    END DO
[2056]2832! ----------------------------------------------------------------
[2408]2833!
2834    IF (prt_level >= 20) THEN
2835      Print*, 'cv3_unsat after mp computation: mp, b(i), b(i-1) ', &
2836          i, mp(1, i), b(1,i), b(1,max(i-1,1))
2837    ENDIF
2838!
[524]2839
[2056]2840! ***       find mixing ratio of precipitating downdraft     ***
[524]2841
[1992]2842    DO il = 1, ncum
2843      IF (i<inb(il) .AND. lwork(il)) THEN
2844        mplus(il) = mp(il, i) > mp(il, i+1)
2845      END IF ! (i.lt.inb(il) .and. lwork(il))
2846    END DO
2847
2848    DO il = 1, ncum
2849      IF (i<inb(il) .AND. lwork(il)) THEN
2850
2851        rp(il, i) = rr(il, i)
2852
2853        IF (mplus(il)) THEN
2854
2855          IF (cvflag_grav) THEN
[2056]2856            rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i+1)) + &
2857              100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il,i))
[1992]2858          ELSE
[2056]2859            rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i+1)) + &
2860              5.*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il,i))
[1992]2861          END IF
2862          rp(il, i) = rp(il, i)/mp(il, i)
[2056]2863          up(il, i) = up(il, i+1)*mp(il, i+1) + u(il, i)*(mp(il,i)-mp(il,i+1))
[1992]2864          up(il, i) = up(il, i)/mp(il, i)
[2056]2865          vp(il, i) = vp(il, i+1)*mp(il, i+1) + v(il, i)*(mp(il,i)-mp(il,i+1))
[1992]2866          vp(il, i) = vp(il, i)/mp(il, i)
2867
2868        ELSE ! if (mplus(il))
2869
2870          IF (mp(il,i+1)>1.0E-16) THEN
2871            IF (cvflag_grav) THEN
[2056]2872              rp(il, i) = rp(il,i+1) + 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1)) * &
2873                                       (evap(il,i+1)+evap(il,i))/mp(il,i+1)
[1992]2874            ELSE
[2056]2875              rp(il, i) = rp(il,i+1) + 5.*sigd(il)*(ph(il,i)-ph(il,i+1)) * &
2876                                       (evap(il,i+1)+evap(il,i))/mp(il, i+1)
[1992]2877            END IF
2878            up(il, i) = up(il, i+1)
2879            vp(il, i) = vp(il, i+1)
2880          END IF ! (mp(il,i+1).gt.1.0e-16)
2881        END IF ! (mplus(il)) else if (.not.mplus(il))
2882
2883        rp(il, i) = amin1(rp(il,i), rs(il,i))
2884        rp(il, i) = max(rp(il,i), 0.0)
2885
2886      END IF ! (i.lt.inb(il) .and. lwork(il))
2887    END DO
[2056]2888! ----------------------------------------------------------------
[1992]2889
[2056]2890! ***       find tracer concentrations in precipitating downdraft     ***
[1992]2891
[2056]2892!AC!      do j=1,ntra
2893!AC!       do il = 1,ncum
2894!AC!       if (i.lt.inb(il) .and. lwork(il)) then
2895!AC!c
2896!AC!         if(mplus(il))then
2897!AC!          trap(il,i,j)=trap(il,i+1,j)*mp(il,i+1)
2898!AC!     :              +trap(il,i,j)*(mp(il,i)-mp(il,i+1))
2899!AC!          trap(il,i,j)=trap(il,i,j)/mp(il,i)
2900!AC!         else ! if (mplus(il))
2901!AC!          if(mp(il,i+1).gt.1.0e-16)then
2902!AC!           trap(il,i,j)=trap(il,i+1,j)
2903!AC!          endif
2904!AC!         endif ! (mplus(il)) else if (.not.mplus(il))
2905!AC!c
2906!AC!        endif ! (i.lt.inb(il) .and. lwork(il))
2907!AC!       enddo
2908!AC!      end do
[1992]2909
2910400 END DO
[2056]2911! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[1992]2912
[2056]2913! ***                    end of downdraft loop                    ***
[1992]2914
[2056]2915! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[1992]2916
2917
2918  RETURN
2919END SUBROUTINE cv3_unsat
2920
[2056]2921SUBROUTINE cv3_yield(nloc, ncum, nd, na, ntra, ok_conserv_q, &
2922                     icb, inb, delt, &
2923                     t, rr, t_wake, rr_wake, s_wake, u, v, tra, &
2924                     gz, p, ph, h, hp, lv, lf, cpn, th, th_wake, &
2925                     ep, clw, m, tp, mp, rp, up, vp, trap, &
2926                     wt, water, ice, evap, fondue, faci, b, sigd, &
2927                     ment, qent, hent, iflag_mix, uent, vent, &
2928                     nent, elij, traent, sig, &
2929                     tv, tvp, wghti, &
[2408]2930                     iflag, precip, Vprecip, Vprecipi, &     ! jyg: Vprecipi
2931                     ft, fr, fu, fv, ftra, &                 ! jyg
[2056]2932                     cbmf, upwd, dnwd, dnwd0, ma, mip, &
[2298]2933!!                     tls, tps,                             ! useless . jyg
2934                     qcondc, wd, &
[2220]2935                     ftd, fqd, qnk, qtc, sigt, tau_cld_cv, coefw_cld_cv)
[1992]2936
2937  IMPLICIT NONE
2938
2939  include "cvthermo.h"
2940  include "cv3param.h"
2941  include "cvflag.h"
2942  include "conema3.h"
2943
[2056]2944!inputs:
[2408]2945      INTEGER, INTENT (IN)                               :: iflag_mix
2946      INTEGER, INTENT (IN)                               :: ncum, nd, na, ntra, nloc
2947      LOGICAL, INTENT (IN)                               :: ok_conserv_q
2948      INTEGER, DIMENSION (nloc), INTENT (IN)             :: icb, inb
2949      REAL, INTENT (IN)                                  :: delt
2950      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: t, rr, u, v
2951      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: t_wake, rr_wake
2952      REAL, DIMENSION (nloc), INTENT (IN)                :: s_wake
2953      REAL, DIMENSION (nloc, nd, ntra), INTENT (IN)      :: tra
2954      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: p
2955      REAL, DIMENSION (nloc, nd+1), INTENT (IN)          :: ph
2956      REAL, DIMENSION (nloc, na), INTENT (IN)            :: gz, h, hp
2957      REAL, DIMENSION (nloc, na), INTENT (IN)            :: th, tp
2958      REAL, DIMENSION (nloc, na), INTENT (IN)            :: lv, cpn, ep, clw
2959      REAL, DIMENSION (nloc, na), INTENT (IN)            :: lf
2960      REAL, DIMENSION (nloc, na), INTENT (IN)            :: rp, up
2961      REAL, DIMENSION (nloc, na), INTENT (IN)            :: vp
2962      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: wt
2963      REAL, DIMENSION (nloc, nd, ntra), INTENT (IN)      :: trap
2964      REAL, DIMENSION (nloc, na), INTENT (IN)            :: water, evap, b
2965      REAL, DIMENSION (nloc, na), INTENT (IN)            :: fondue, faci, ice
2966      REAL, DIMENSION (nloc, na, na), INTENT (IN)        :: qent, uent
2967      REAL, DIMENSION (nloc, na, na), INTENT (IN)        :: hent
2968      REAL, DIMENSION (nloc, na, na), INTENT (IN)        :: vent, elij
2969      INTEGER, DIMENSION (nloc, nd), INTENT (IN)         :: nent
2970      REAL, DIMENSION (nloc, na, na, ntra), INTENT (IN)  :: traent
2971      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: tv, tvp, wghti
2972      REAL,INTENT(IN)                                    :: tau_cld_cv, coefw_cld_cv
[2056]2973!
2974!input/output:
[2408]2975      REAL, DIMENSION (nloc, na), INTENT (INOUT)         :: m, mp
2976      REAL, DIMENSION (nloc, na, na), INTENT (INOUT)     :: ment
2977      INTEGER, DIMENSION (nloc), INTENT (INOUT)          :: iflag
2978      REAL, DIMENSION (nloc, nd), INTENT (INOUT)         :: sig
2979      REAL, DIMENSION (nloc), INTENT (INOUT)             :: sigd
[2056]2980!
2981!outputs:
[2408]2982      REAL, DIMENSION (nloc), INTENT (OUT)               :: precip
2983      REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: ft, fr, fu, fv
2984      REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: ftd, fqd
2985      REAL, DIMENSION (nloc, nd, ntra), INTENT (OUT)     :: ftra
2986      REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: upwd, dnwd, ma
2987      REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: dnwd0, mip
2988      REAL, DIMENSION (nloc, nd+1), INTENT (OUT)         :: Vprecip
2989      REAL, DIMENSION (nloc, nd+1), INTENT (OUT)         :: Vprecipi
2990!!      REAL tls(nloc, nd), tps(nloc, nd)                    ! useless . jyg
2991      REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: qcondc                      ! cld
2992      REAL, DIMENSION (nloc, nd), INTENT (OUT)           :: qtc, sigt                   ! cld
2993      REAL, DIMENSION (nloc), INTENT (OUT)               :: wd                          ! gust
2994      REAL, DIMENSION (nloc), INTENT (OUT)               :: cbmf
[2056]2995!
2996!local variables:
[2542]2997      INTEGER                                            :: i, k, il, n, j, num1
2998      REAL                                               :: rat, delti
2999      REAL                                               :: ax, bx, cx, dx, ex
3000      REAL                                               :: cpinv, rdcp, dpinv
3001      REAL, DIMENSION (nloc)                             ::  awat
3002      REAL, DIMENSION (nloc, nd)                         :: lvcp, lfcp              ! , mke ! unused . jyg
3003      REAL, DIMENSION (nloc)                             :: am, work, ad, amp1
[2056]3004!!      real up1(nloc), dn1(nloc)
[2542]3005      REAL, DIMENSION (nloc, nd, nd)                     :: up1, dn1
3006!jyg<
3007      REAL, DIMENSION (nloc, nd)                         :: up_to, up_from
3008      REAL, DIMENSION (nloc, nd)                         :: dn_to, dn_from
3009!>jyg
3010      REAL, DIMENSION (nloc)                             :: asum, bsum, csum, dsum
3011      REAL, DIMENSION (nloc)                             :: esum, fsum, gsum, hsum
3012      REAL, DIMENSION (nloc, nd)                         :: th_wake
3013      REAL, DIMENSION (nloc)                             :: alpha_qpos, alpha_qpos1
3014      REAL, DIMENSION (nloc, nd)                         :: qcond, nqcond, wa           ! cld
3015      REAL, DIMENSION (nloc, nd)                         :: siga, sax, mac              ! cld
3016      REAL, DIMENSION (nloc)                             :: sument
3017      REAL, DIMENSION (nloc, nd)                         :: sigment, qtment             ! cld
3018      REAL, DIMENSION (nloc)                             :: qnk
[2056]3019      REAL sumdq !jyg
3020!
3021! -------------------------------------------------------------
[1992]3022
[2056]3023! initialization:
[1992]3024
3025  delti = 1.0/delt
[2056]3026! print*,'cv3_yield initialisation delt', delt
[2408]3027
[1992]3028  DO il = 1, ncum
3029    precip(il) = 0.0
3030    wd(il) = 0.0 ! gust
3031  END DO
3032
[2408]3033!   Fluxes are on a staggered grid : loops extend up to nl+1
3034  DO i = 1, nlp
[1992]3035    DO il = 1, ncum
[2056]3036      Vprecip(il, i) = 0.0
[2408]3037      Vprecipi(il, i) = 0.0                               ! jyg
3038      upwd(il, i) = 0.0
3039      dnwd(il, i) = 0.0
3040      dnwd0(il, i) = 0.0
3041      mip(il, i) = 0.0
3042    END DO
3043  END DO
3044  DO i = 1, nl
3045    DO il = 1, ncum
[1992]3046      ft(il, i) = 0.0
3047      fr(il, i) = 0.0
3048      fu(il, i) = 0.0
3049      fv(il, i) = 0.0
3050      ftd(il, i) = 0.0
3051      fqd(il, i) = 0.0
3052      qcondc(il, i) = 0.0 ! cld
3053      qcond(il, i) = 0.0 ! cld
[2220]3054      qtc(il, i) = 0.0 ! cld
3055      qtment(il, i) = 0.0 ! cld
3056      sigment(il, i) = 0.0 ! cld
3057      sigt(il, i) = 0.0 ! cld
[1992]3058      nqcond(il, i) = 0.0 ! cld
3059    END DO
3060  END DO
[2056]3061! print*,'cv3_yield initialisation 2'
3062!AC!      do j=1,ntra
3063!AC!       do i=1,nd
3064!AC!        do il=1,ncum
3065!AC!          ftra(il,i,j)=0.0
3066!AC!        enddo
3067!AC!       enddo
3068!AC!      enddo
3069! print*,'cv3_yield initialisation 3'
[1992]3070  DO i = 1, nl
3071    DO il = 1, ncum
3072      lvcp(il, i) = lv(il, i)/cpn(il, i)
3073      lfcp(il, i) = lf(il, i)/cpn(il, i)
3074    END DO
3075  END DO
3076
3077
3078
[2056]3079! ***  calculate surface precipitation in mm/day     ***
[1992]3080
3081  DO il = 1, ncum
3082    IF (ep(il,inb(il))>=0.0001 .AND. iflag(il)<=1) THEN
3083      IF (cvflag_ice) THEN
[2056]3084        precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1)) &
3085                              *86400.*1000./(rowl*grav)
[1992]3086      ELSE
[2056]3087        precip(il) = wt(il, 1)*sigd(il)*water(il, 1) &
3088                              *86400.*1000./(rowl*grav)
[1992]3089      END IF
3090    END IF
3091  END DO
[2056]3092! print*,'cv3_yield apres calcul precip'
[1992]3093
3094
[2056]3095! ===  calculate vertical profile of  precipitation in kg/m2/s  ===
[1992]3096
3097  DO i = 1, nl
3098    DO il = 1, ncum
3099      IF (ep(il,inb(il))>=0.0001 .AND. i<=inb(il) .AND. iflag(il)<=1) THEN
3100        IF (cvflag_ice) THEN
[2056]3101          Vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/grav
[2408]3102          Vprecipi(il, i) = wt(il, i)*sigd(il)*ice(il,i)/grav                   ! jyg
[1992]3103        ELSE
[2056]3104          Vprecip(il, i) = wt(il, i)*sigd(il)*water(il, i)/grav
[2408]3105          Vprecipi(il, i) = 0.                                                  ! jyg
[1992]3106        END IF
3107      END IF
3108    END DO
3109  END DO
3110
3111
[2056]3112! ***  Calculate downdraft velocity scale    ***
3113! ***  NE PAS UTILISER POUR L'INSTANT ***
[1992]3114
[2056]3115!!      do il=1,ncum
3116!!        wd(il)=betad*abs(mp(il,icb(il)))*0.01*rrd*t(il,icb(il)) &
3117!!                                       /(sigd(il)*p(il,icb(il)))
3118!!      enddo
[1992]3119
3120
[2056]3121! ***  calculate tendencies of lowest level potential temperature  ***
3122! ***                      and mixing ratio                        ***
[1992]3123
3124  DO il = 1, ncum
3125    work(il) = 1.0/(ph(il,1)-ph(il,2))
3126    cbmf(il) = 0.0
3127  END DO
3128
3129  DO k = 2, nl
3130    DO il = 1, ncum
3131      IF (k>=icb(il)) THEN
3132        cbmf(il) = cbmf(il) + m(il, k)
3133      END IF
3134    END DO
3135  END DO
3136
[2056]3137!    print*,'cv3_yield avant ft'
3138! am is the part of cbmf taken from the first level
[1992]3139  DO il = 1, ncum
3140    am(il) = cbmf(il)*wghti(il, 1)
3141  END DO
3142
3143  DO il = 1, ncum
3144    IF (iflag(il)<=1) THEN
[2056]3145! convect3      if((0.1*dpinv*am).ge.delti)iflag(il)=4
3146!JYG  Correction pour conserver l'eau
3147! cc       ft(il,1)=-0.5*lvcp(il,1)*sigd(il)*(evap(il,1)+evap(il,2))          !precip
[1992]3148      IF (cvflag_ice) THEN
3149        ft(il, 1) = -lvcp(il, 1)*sigd(il)*evap(il, 1) - &
[2056]3150                     lfcp(il, 1)*sigd(il)*evap(il, 1)*faci(il, 1) - &
3151                     lfcp(il, 1)*sigd(il)*(fondue(il,1)*wt(il,1)) / &
3152                       (100.*(ph(il,1)-ph(il,2)))                             !precip
[1992]3153      ELSE
3154        ft(il, 1) = -lvcp(il, 1)*sigd(il)*evap(il, 1)
3155      END IF
3156
[2056]3157      ft(il, 1) = ft(il, 1) - 0.009*grav*sigd(il)*mp(il, 2)*t_wake(il, 1)*b(il, 1)*work(il)
[1992]3158
3159      IF (cvflag_ice) THEN
[2056]3160        ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) * &
3161                                     (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) + &
3162                                0.01*sigd(il)*wt(il, 1)*(ci-cpd)*ice(il, 2) * &
3163                                     (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1)
[1992]3164      ELSE
[2056]3165        ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) * &
3166                                     (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1)
[1992]3167      END IF
3168
[2056]3169      ftd(il, 1) = ft(il, 1)                                                  ! fin precip
[1992]3170
[2056]3171      IF ((0.01*grav*work(il)*am(il))>=delti) iflag(il) = 1 !consist vect
3172      ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*am(il) * &
3173                                   (t(il,2)-t(il,1)+(gz(il,2)-gz(il,1))/cpn(il,1))
[1992]3174    END IF ! iflag
3175  END DO
3176
3177
3178  DO j = 2, nl
3179    IF (iflag_mix>0) THEN
3180      DO il = 1, ncum
[2056]3181! FH WARNING a modifier :
[1992]3182        cpinv = 0.
[2056]3183! cpinv=1.0/cpn(il,1)
[1992]3184        IF (j<=inb(il) .AND. iflag(il)<=1) THEN
[2056]3185          ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*ment(il, j, 1) * &
3186                     (hent(il,j,1)-h(il,1)+t(il,1)*(cpv-cpd)*(rr(il,1)-qent(il,j,1)))*cpinv
[1992]3187        END IF ! j
3188      END DO
3189    END IF
3190  END DO
[2056]3191! fin sature
[1992]3192
3193
3194  DO il = 1, ncum
3195    IF (iflag(il)<=1) THEN
[2056]3196!JYG1  Correction pour mieux conserver l'eau (conformite avec CONVECT4.3)
3197      fr(il, 1) = 0.01*grav*mp(il, 2)*(rp(il,2)-rr_wake(il,1))*work(il) + &
3198                  sigd(il)*evap(il, 1)
3199!!!                  sigd(il)*0.5*(evap(il,1)+evap(il,2))
[1992]3200
[2056]3201      fqd(il, 1) = fr(il, 1) !precip
[1992]3202
[2056]3203      fr(il, 1) = fr(il, 1) + 0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il)        !sature
[1992]3204
[2056]3205      fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(up(il,2)-u(il,1)) + &
3206                                                  am(il)*(u(il,2)-u(il,1)))
3207      fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(vp(il,2)-v(il,1)) + &
3208                                                  am(il)*(v(il,2)-v(il,1)))
[1992]3209    END IF ! iflag
3210  END DO ! il
3211
3212
[2056]3213!AC!     do j=1,ntra
3214!AC!      do il=1,ncum
3215!AC!       if (iflag(il) .le. 1) then
3216!AC!       if (cvflag_grav) then
3217!AC!        ftra(il,1,j)=ftra(il,1,j)+0.01*grav*work(il)
3218!AC!    :                     *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))
3219!AC!    :             +am(il)*(tra(il,2,j)-tra(il,1,j)))
3220!AC!       else
3221!AC!        ftra(il,1,j)=ftra(il,1,j)+0.1*work(il)
3222!AC!    :                     *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))
3223!AC!    :             +am(il)*(tra(il,2,j)-tra(il,1,j)))
3224!AC!       endif
3225!AC!       endif  ! iflag
3226!AC!      enddo
3227!AC!     enddo
[1992]3228
3229  DO j = 2, nl
3230    DO il = 1, ncum
3231      IF (j<=inb(il) .AND. iflag(il)<=1) THEN
[2056]3232        fr(il, 1) = fr(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(qent(il,j,1)-rr(il,1))
3233        fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(uent(il,j,1)-u(il,1))
3234        fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(vent(il,j,1)-v(il,1))
[1992]3235      END IF ! j
3236    END DO
3237  END DO
3238
[2056]3239!AC!      do k=1,ntra
3240!AC!       do j=2,nl
3241!AC!        do il=1,ncum
3242!AC!         if (j.le.inb(il) .and. iflag(il) .le. 1) then
3243!AC!
3244!AC!          if (cvflag_grav) then
3245!AC!           ftra(il,1,k)=ftra(il,1,k)+0.01*grav*work(il)*ment(il,j,1)
3246!AC!     :                *(traent(il,j,1,k)-tra(il,1,k))
3247!AC!          else
3248!AC!           ftra(il,1,k)=ftra(il,1,k)+0.1*work(il)*ment(il,j,1)
3249!AC!     :                *(traent(il,j,1,k)-tra(il,1,k))
3250!AC!          endif
3251!AC!
3252!AC!         endif
3253!AC!        enddo
3254!AC!       enddo
3255!AC!      enddo
3256! print*,'cv3_yield apres ft'
[1992]3257
[2542]3258!jyg<
3259!-----------------------------------------------------------
3260           IF (ok_optim_yield) THEN                       !|
3261!-----------------------------------------------------------
3262!
3263!***                                                      ***
3264!***    Compute convective mass fluxes upwd and dnwd      ***
3265
3266upwd(:,:) = 0.
3267up_to(:,:) = 0.
3268up_from(:,:) = 0.
3269dnwd(:,:) = 0.
3270dn_to(:,:) = 0.
3271dn_from(:,:) = 0.
3272!
3273! =================================================
3274!              upward fluxes                      |
3275! ------------------------------------------------
3276DO i = 2, nl
3277  DO il = 1, ncum
3278    IF (i<=inb(il)) THEN
3279      up_to(il,i) = m(il,i)
3280    ENDIF
3281  ENDDO
3282  DO j = 1, i-1
3283    DO il = 1, ncum
3284      IF (i<=inb(il)) THEN
3285        up_to(il,i) = up_to(il,i) + ment(il,j,i)
3286      ENDIF
3287    ENDDO
3288  ENDDO
3289ENDDO
3290!
3291DO i = 1, nl
3292  DO il = 1, ncum
3293    IF (i<=inb(il)) THEN
3294      up_from(il,i) = cbmf(il)*wghti(il,i)
3295    ENDIF
3296  ENDDO
3297ENDDO
3298!!DO i = 2, nl
3299!!  DO j = i+1, nl          !! Permuter les boucles i et j
3300DO j = 3, nl
3301  DO i = 2, j-1
3302    DO il = 1, ncum
3303      IF (j<=inb(il)) THEN
3304        up_from(il,i) = up_from(il,i) + ment(il,i,j)
3305      ENDIF
3306    ENDDO
3307  ENDDO
3308ENDDO
3309!
3310! The difference between upwd(il,i) and upwd(il,i-1) is due to updrafts ending in layer
3311!(i-1) (theses drafts cross interface (i-1) but not interface(i)) and to updrafts starting
3312!from layer (i-1) (theses drafts cross interface (i) but not interface(i-1)):
3313!
3314DO i = 2, nlp
3315  DO il = 1, ncum
3316    upwd(il,i) = max(0., upwd(il,i-1) - up_to(il,i-1) + up_from(il,i-1))
3317  ENDDO
3318ENDDO
3319!
3320! =================================================
3321!              downward fluxes                    |
3322! ------------------------------------------------
3323DO i = 1, nl
3324  DO j = i+1, nl
3325    DO il = 1, ncum
3326      IF (j<=inb(il)) THEN
3327        dn_to(il,i) = dn_to(il,i) + ment(il,j,i)
3328      ENDIF
3329    ENDDO
3330  ENDDO
3331ENDDO
3332!
3333!!DO i = 2, nl
3334!!  DO j = 1, i-1          !! Permuter les boucles i et j
3335DO j = 1, nl
3336  DO i = j+1, nl
3337    DO il = 1, ncum
3338      IF (i<=inb(il)) THEN
3339        dn_from(il,i) = dn_from(il,i) + ment(il,i,j)
3340      ENDIF
3341    ENDDO
3342  ENDDO
3343ENDDO
3344!
3345! The difference between dnwd(il,i) and dnwd(il,i+1) is due to downdrafts ending in layer
3346!(i) (theses drafts cross interface (i+1) but not interface(i)) and to downdrafts
3347!starting from layer (i) (theses drafts cross interface (i) but not interface(i+1)):
3348!
3349DO i = nl-1, 1, -1
3350  DO il = 1, ncum
3351    dnwd(il,i) = max(0., dnwd(il,i+1) - dn_to(il,i) + dn_from(il,i))
3352  ENDDO
3353ENDDO
3354! =================================================
3355!
3356!-----------------------------------------------------------
3357        ENDIF !(ok_optim_yield)                           !|
3358!-----------------------------------------------------------
3359!>jyg
3360
[2056]3361! ***  calculate tendencies of potential temperature and mixing ratio  ***
3362! ***               at levels above the lowest level                   ***
[1992]3363
[2056]3364! ***  first find the net saturated updraft and downdraft mass fluxes  ***
3365! ***                      through each level                          ***
[1992]3366
3367
[2542]3368!jyg<
3369!!  DO i = 2, nl + 1 ! newvecto: mettre nl au lieu nl+1?
3370  DO i = 2, nl
3371!>jyg
[1992]3372
3373    num1 = 0
3374    DO il = 1, ncum
3375      IF (i<=inb(il) .AND. iflag(il)<=1) num1 = num1 + 1
3376    END DO
3377    IF (num1<=0) GO TO 500
3378
[2542]3379!
[2408]3380!jyg<
[2542]3381!-----------------------------------------------------------
3382           IF (ok_optim_yield) THEN                       !|
3383!-----------------------------------------------------------
3384DO il = 1, ncum
3385   amp1(il) = upwd(il,i+1)
3386   ad(il) = dnwd(il,i)
3387ENDDO
3388!-----------------------------------------------------------
3389        ELSE !(ok_optim_yield)                            !|
3390!-----------------------------------------------------------
3391!>jyg
[2408]3392    DO il = 1,ncum
3393      amp1(il) = 0.
3394      ad(il) = 0.
3395    ENDDO
[1992]3396
3397    DO k = 1, nl + 1
3398      DO il = 1, ncum
3399        IF (i>=icb(il)) THEN
3400          IF (k>=i+1 .AND. k<=(inb(il)+1)) THEN
3401            amp1(il) = amp1(il) + m(il, k)
3402          END IF
3403        ELSE
[2056]3404! AMP1 is the part of cbmf taken from layers I and lower
[1992]3405          IF (k<=i) THEN
3406            amp1(il) = amp1(il) + cbmf(il)*wghti(il, k)
3407          END IF
3408        END IF
3409      END DO
3410    END DO
3411
[2542]3412    DO j = i + 1, nl + 1         
3413       DO k = 1, i
3414          !yor! reverted j and k loops
3415          DO il = 1, ncum
3416!yor!        IF (i<=inb(il) .AND. j<=(inb(il)+1)) THEN ! the second condition implies the first !
3417             IF (j<=(inb(il)+1)) THEN 
3418                amp1(il) = amp1(il) + ment(il, k, j)
3419             END IF
3420          END DO
3421       END DO
[1992]3422    END DO
3423
3424    DO k = 1, i - 1
[2542]3425!jyg<
3426!!      DO j = i, nl + 1 ! newvecto: nl au lieu nl+1?
3427      DO j = i, nl
3428!>jyg
[1992]3429        DO il = 1, ncum
[2542]3430!yor!        IF (i<=inb(il) .AND. j<=inb(il)) THEN ! the second condition implies the 1st !
3431             IF (j<=inb(il)) THEN   
[1992]3432            ad(il) = ad(il) + ment(il, j, k)
3433          END IF
3434        END DO
3435      END DO
3436    END DO
[2542]3437!
3438!-----------------------------------------------------------
3439        ENDIF !(ok_optim_yield)                           !|
3440!-----------------------------------------------------------
3441!
3442!!   print *,'yield, i, amp1, ad', i, amp1(1), ad(1)
[1992]3443
3444    DO il = 1, ncum
3445      IF (i<=inb(il) .AND. iflag(il)<=1) THEN
3446        dpinv = 1.0/(ph(il,i)-ph(il,i+1))
3447        cpinv = 1.0/cpn(il, i)
3448
[2056]3449! convect3      if((0.1*dpinv*amp1).ge.delti)iflag(il)=4
3450        IF ((0.01*grav*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto
[1992]3451
[2056]3452! precip
3453! cc       ft(il,i)= -0.5*sigd(il)*lvcp(il,i)*(evap(il,i)+evap(il,i+1))
[1992]3454        IF (cvflag_ice) THEN
3455          ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i) - &
[2056]3456                       sigd(il)*lfcp(il, i)*evap(il, i)*faci(il, i) - &
3457                       sigd(il)*lfcp(il, i)*fondue(il, i)*wt(il, i)/(100.*(p(il,i-1)-p(il,i)))
[1992]3458        ELSE
3459          ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i)
3460        END IF
3461
3462        rat = cpn(il, i-1)*cpinv
3463
[2056]3464        ft(il, i) = ft(il, i) - 0.009*grav*sigd(il) * &
3465                     (mp(il,i+1)*t_wake(il,i)*b(il,i)-mp(il,i)*t_wake(il,i-1)*rat*b(il,i-1))*dpinv
3466        IF (cvflag_ice) THEN
3467          ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * &
3468                                       (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + &
3469                                  0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1) * &
3470                                       (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv
3471        ELSE
3472          ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * &
3473                                       (t_wake(il,i+1)-t_wake(il,i))*dpinv* &
3474            cpinv
3475        END IF
[1992]3476
[2056]3477        ftd(il, i) = ft(il, i)
3478! fin precip
[1992]3479
[2056]3480! sature
3481        ft(il, i) = ft(il, i) + 0.01*grav*dpinv * &
3482                     (amp1(il)*(t(il,i+1)-t(il,i) + (gz(il,i+1)-gz(il,i))*cpinv) - &
3483                      ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv))
[1992]3484
3485
[2056]3486        IF (iflag_mix==0) THEN
3487          ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, i, i)*(hp(il,i)-h(il,i) + &
3488                                    t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv
3489        END IF
[1992]3490
3491
3492
[2056]3493! sb: on ne fait pas encore la correction permettant de mieux
3494! conserver l'eau:
3495!JYG: correction permettant de mieux conserver l'eau:
3496! cc         fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1))
3497        fr(il, i) = sigd(il)*evap(il, i) + 0.01*grav*(mp(il,i+1)*(rp(il,i+1)-rr_wake(il,i)) - &
3498                                                      mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv
3499        fqd(il, i) = fr(il, i)                                                                     ! precip
[1992]3500
[2056]3501        fu(il, i) = 0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il,i)) - &
3502                               mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv
3503        fv(il, i) = 0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il,i)) - &
3504                               mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv
[1992]3505
3506
[2056]3507        fr(il, i) = fr(il, i) + 0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i)) - &
3508                                                 ad(il)*(rr(il,i)-rr(il,i-1)))
3509        fu(il, i) = fu(il, i) + 0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il,i)) - &
3510                                                 ad(il)*(u(il,i)-u(il,i-1)))
3511        fv(il, i) = fv(il, i) + 0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il,i)) - &
3512                                                 ad(il)*(v(il,i)-v(il,i-1)))
[1992]3513
3514      END IF ! i
3515    END DO
3516
[2056]3517!AC!      do k=1,ntra
3518!AC!       do il=1,ncum
3519!AC!        if (i.le.inb(il) .and. iflag(il) .le. 1) then
3520!AC!         dpinv=1.0/(ph(il,i)-ph(il,i+1))
3521!AC!         cpinv=1.0/cpn(il,i)
3522!AC!         if (cvflag_grav) then
3523!AC!           ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv
3524!AC!     :         *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))
3525!AC!     :           -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))
3526!AC!         else
3527!AC!           ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv
3528!AC!     :         *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))
3529!AC!     :           -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))
3530!AC!         endif
3531!AC!        endif
3532!AC!       enddo
3533!AC!      enddo
[1992]3534
3535    DO k = 1, i - 1
3536
3537      DO il = 1, ncum
3538        awat(il) = elij(il, k, i) - (1.-ep(il,i))*clw(il, i)
3539        awat(il) = max(awat(il), 0.0)
3540      END DO
3541
3542      IF (iflag_mix/=0) THEN
3543        DO il = 1, ncum
3544          IF (i<=inb(il) .AND. iflag(il)<=1) THEN
3545            dpinv = 1.0/(ph(il,i)-ph(il,i+1))
3546            cpinv = 1.0/cpn(il, i)
[2056]3547            ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * &
3548                 (hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k,i)))*cpinv
3549!
3550!
[1992]3551          END IF ! i
3552        END DO
3553      END IF
3554
3555      DO il = 1, ncum
3556        IF (i<=inb(il) .AND. iflag(il)<=1) THEN
3557          dpinv = 1.0/(ph(il,i)-ph(il,i+1))
3558          cpinv = 1.0/cpn(il, i)
[2056]3559          fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i) * &
3560                                                       (qent(il,k,i)-awat(il)-rr(il,i))
3561          fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i))
3562          fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i))
[1992]3563
[2056]3564! (saturated updrafts resulting from mixing)                                   ! cld
3565          qcond(il, i) = qcond(il, i) + (elij(il,k,i)-awat(il))                ! cld
[2220]3566          qtment(il, i) = qtment(il, i) + qent(il,k,i)                         ! cld
3567          nqcond(il, i) = nqcond(il, i) + 1.                                   ! cld
[1992]3568        END IF ! i
3569      END DO
3570    END DO
3571
[2056]3572!AC!      do j=1,ntra
3573!AC!       do k=1,i-1
3574!AC!        do il=1,ncum
3575!AC!         if (i.le.inb(il) .and. iflag(il) .le. 1) then
3576!AC!          dpinv=1.0/(ph(il,i)-ph(il,i+1))
3577!AC!          cpinv=1.0/cpn(il,i)
3578!AC!          if (cvflag_grav) then
3579!AC!           ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)
3580!AC!     :        *(traent(il,k,i,j)-tra(il,i,j))
3581!AC!          else
3582!AC!           ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)
3583!AC!     :        *(traent(il,k,i,j)-tra(il,i,j))
3584!AC!          endif
3585!AC!         endif
3586!AC!        enddo
3587!AC!       enddo
3588!AC!      enddo
[1992]3589
[2542]3590!jyg<
3591!!    DO k = i, nl + 1
3592    DO k = i, nl
3593!>jyg
[1992]3594
3595      IF (iflag_mix/=0) THEN
3596        DO il = 1, ncum
3597          IF (i<=inb(il) .AND. k<=inb(il) .AND. iflag(il)<=1) THEN
3598            dpinv = 1.0/(ph(il,i)-ph(il,i+1))
3599            cpinv = 1.0/cpn(il, i)
[2056]3600            ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * &
3601                  (hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k,i)))*cpinv
[1992]3602
3603
3604          END IF ! i
3605        END DO
3606      END IF
3607
3608      DO il = 1, ncum
3609        IF (i<=inb(il) .AND. k<=inb(il) .AND. iflag(il)<=1) THEN
3610          dpinv = 1.0/(ph(il,i)-ph(il,i+1))
3611          cpinv = 1.0/cpn(il, i)
3612
[2056]3613          fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k,i)-rr(il,i))
3614          fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i))
3615          fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i))
[1992]3616        END IF ! i and k
3617      END DO
3618    END DO
3619
[2056]3620!AC!      do j=1,ntra
3621!AC!       do k=i,nl+1
3622!AC!        do il=1,ncum
3623!AC!         if (i.le.inb(il) .and. k.le.inb(il)
3624!AC!     $                .and. iflag(il) .le. 1) then
3625!AC!          dpinv=1.0/(ph(il,i)-ph(il,i+1))
3626!AC!          cpinv=1.0/cpn(il,i)
3627!AC!          if (cvflag_grav) then
3628!AC!           ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)
3629!AC!     :         *(traent(il,k,i,j)-tra(il,i,j))
3630!AC!          else
3631!AC!           ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)
3632!AC!     :             *(traent(il,k,i,j)-tra(il,i,j))
3633!AC!          endif
3634!AC!         endif ! i and k
3635!AC!        enddo
3636!AC!       enddo
3637!AC!      enddo
[1992]3638
[2056]3639! sb: interface with the cloud parameterization:                               ! cld
[1992]3640
3641    DO k = i + 1, nl
3642      DO il = 1, ncum
[2056]3643        IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN               ! cld
3644! (saturated downdrafts resulting from mixing)                                 ! cld
3645          qcond(il, i) = qcond(il, i) + elij(il, k, i)                         ! cld
[2220]3646          qtment(il, i) = qent(il,k,i) + qtment(il,i)                          ! cld
3647          nqcond(il, i) = nqcond(il, i) + 1.                                   ! cld
[1992]3648        END IF ! cld
3649      END DO ! cld
3650    END DO ! cld
3651
[2056]3652! (particular case: no detraining level is found)                              ! cld
3653    DO il = 1, ncum                                                            ! cld
3654      IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN              ! cld
3655        qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i)                 ! cld
[2220]3656        qtment(il, i) = qent(il,k,i) + qtment(il,i)                          ! cld
[2056]3657        nqcond(il, i) = nqcond(il, i) + 1.                                     ! cld
3658      END IF                                                                   ! cld
3659    END DO                                                                     ! cld
[1992]3660
[2056]3661    DO il = 1, ncum                                                            ! cld
3662      IF (i<=inb(il) .AND. nqcond(il,i)/=0 .AND. iflag(il)<=1) THEN            ! cld
3663        qcond(il, i) = qcond(il, i)/nqcond(il, i)                              ! cld
[2220]3664        qtment(il, i) = qtment(il,i)/nqcond(il, i)                             ! cld
[2056]3665      END IF                                                                   ! cld
[1992]3666    END DO
3667
[2056]3668!AC!      do j=1,ntra
3669!AC!       do il=1,ncum
3670!AC!        if (i.le.inb(il) .and. iflag(il) .le. 1) then
3671!AC!         dpinv=1.0/(ph(il,i)-ph(il,i+1))
3672!AC!         cpinv=1.0/cpn(il,i)
3673!AC!
3674!AC!         if (cvflag_grav) then
3675!AC!          ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv
3676!AC!     :     *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))
3677!AC!     :     -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j)))
3678!AC!         else
3679!AC!          ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv
3680!AC!     :     *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))
3681!AC!     :     -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j)))
3682!AC!         endif
3683!AC!        endif ! i
3684!AC!       enddo
3685!AC!      enddo
[1992]3686
3687
3688500 END DO
3689
[2056]3690!JYG<
3691!Conservation de l'eau
3692!   sumdq = 0.
3693!   DO k = 1, nl
3694!     sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav
3695!   END DO
3696!   PRINT *, 'cv3_yield, apres 500, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1)
3697!JYG>
3698! ***   move the detrainment at level inb down to level inb-1   ***
3699! ***        in such a way as to preserve the vertically        ***
3700! ***          integrated enthalpy and water tendencies         ***
[1992]3701
[2056]3702! Correction bug le 18-03-09
[1992]3703  DO il = 1, ncum
3704    IF (iflag(il)<=1) THEN
[2056]3705      ax = 0.01*grav*ment(il, inb(il), inb(il))* &
3706           (hp(il,inb(il))-h(il,inb(il))+t(il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il),inb(il))))/ &
3707                                (cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1)))
3708      ft(il, inb(il)) = ft(il, inb(il)) - ax
3709      ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))/ &
3710                              (cpn(il,inb(il)-1)*(ph(il,inb(il)-1)-ph(il,inb(il))))
[1992]3711
[2056]3712      bx = 0.01*grav*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))-rr(il,inb(il)))/ &
3713                                                 (ph(il,inb(il))-ph(il,inb(il)+1))
3714      fr(il, inb(il)) = fr(il, inb(il)) - bx
3715      fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb(il)+1))/ &
3716                                                 (ph(il,inb(il)-1)-ph(il,inb(il)))
[1992]3717
[2056]3718      cx = 0.01*grav*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u(il,inb(il)))/ &
3719                                                 (ph(il,inb(il))-ph(il,inb(il)+1))
3720      fu(il, inb(il)) = fu(il, inb(il)) - cx
3721      fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb(il)+1))/ &
3722                                                 (ph(il,inb(il)-1)-ph(il,inb(il)))
[1992]3723
[2056]3724      dx = 0.01*grav*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v(il,inb(il)))/ &
3725                                                 (ph(il,inb(il))-ph(il,inb(il)+1))
3726      fv(il, inb(il)) = fv(il, inb(il)) - dx
3727      fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb(il)+1))/ &
3728                                                 (ph(il,inb(il)-1)-ph(il,inb(il)))
[1992]3729    END IF !iflag
3730  END DO
3731
[2056]3732!JYG<
3733!Conservation de l'eau
3734!   sumdq = 0.
3735!   DO k = 1, nl
3736!     sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav
3737!   END DO
3738!   PRINT *, 'cv3_yield, apres 503, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1)
3739!JYG>
[1992]3740
[2056]3741!AC!      do j=1,ntra
3742!AC!       do il=1,ncum
3743!AC!        IF (iflag(il) .le. 1) THEN
3744!AC!    IF (cvflag_grav) then
3745!AC!        ex=0.01*grav*ment(il,inb(il),inb(il))
3746!AC!     :      *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j))
3747!AC!     :      /(ph(i l,inb(il))-ph(il,inb(il)+1))
3748!AC!        ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex
3749!AC!        ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j)
3750!AC!     :       +ex*(ph(il,inb(il))-ph(il,inb(il)+1))
3751!AC!     :          /(ph(il,inb(il)-1)-ph(il,inb(il)))
3752!AC!    else
3753!AC!        ex=0.1*ment(il,inb(il),inb(il))
3754!AC!     :      *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j))
3755!AC!     :      /(ph(i l,inb(il))-ph(il,inb(il)+1))
3756!AC!        ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex
3757!AC!        ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j)
3758!AC!     :       +ex*(ph(il,inb(il))-ph(il,inb(il)+1))
3759!AC!     :          /(ph(il,inb(il)-1)-ph(il,inb(il)))
3760!AC!        ENDIF   !cvflag grav
3761!AC!        ENDIF    !iflag
3762!AC!       enddo
3763!AC!      enddo
[1992]3764
3765
[2056]3766! ***    homogenize tendencies below cloud base    ***
[1992]3767
[2056]3768
[1992]3769  DO il = 1, ncum
3770    asum(il) = 0.0
3771    bsum(il) = 0.0
3772    csum(il) = 0.0
3773    dsum(il) = 0.0
3774    esum(il) = 0.0
3775    fsum(il) = 0.0
3776    gsum(il) = 0.0
3777    hsum(il) = 0.0
3778  END DO
3779
[2056]3780!do i=1,nl
3781!do il=1,ncum
3782!th_wake(il,i)=t_wake(il,i)*(1000.0/p(il,i))**rdcp
3783!enddo
3784!enddo
[1992]3785
3786  DO i = 1, nl
3787    DO il = 1, ncum
3788      IF (i<=(icb(il)-1) .AND. iflag(il)<=1) THEN
[2056]3789!jyg  Saturated part : use T profile
[1992]3790        asum(il) = asum(il) + (ft(il,i)-ftd(il,i))*(ph(il,i)-ph(il,i+1))
[2056]3791!jyg<20140311
3792!Correction pour conserver l eau
3793        IF (ok_conserv_q) THEN
3794          bsum(il) = bsum(il) + (fr(il,i)-fqd(il,i))*(ph(il,i)-ph(il,i+1))
3795          csum(il) = csum(il) + (ph(il,i)-ph(il,i+1))
3796
3797        ELSE
3798          bsum(il)=bsum(il)+(fr(il,i)-fqd(il,i))*(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* &
3799                            (ph(il,i)-ph(il,i+1))
3800          csum(il)=csum(il)+(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* &
3801                            (ph(il,i)-ph(il,i+1))
3802        ENDIF ! (ok_conserv_q)
3803!jyg>
[1992]3804        dsum(il) = dsum(il) + t(il, i)*(ph(il,i)-ph(il,i+1))/th(il, i)
[2056]3805!jyg  Unsaturated part : use T_wake profile
[1992]3806        esum(il) = esum(il) + ftd(il, i)*(ph(il,i)-ph(il,i+1))
[2056]3807!jyg<20140311
3808!Correction pour conserver l eau
3809        IF (ok_conserv_q) THEN
3810          fsum(il) = fsum(il) + fqd(il, i)*(ph(il,i)-ph(il,i+1))
3811          gsum(il) = gsum(il) + (ph(il,i)-ph(il,i+1))
3812        ELSE
3813          fsum(il)=fsum(il)+fqd(il,i)*(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* &
3814                            (ph(il,i)-ph(il,i+1))
3815          gsum(il)=gsum(il)+(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* &
3816                            (ph(il,i)-ph(il,i+1))
3817        ENDIF ! (ok_conserv_q)
3818!jyg>
3819        hsum(il) = hsum(il) + t_wake(il, i)*(ph(il,i)-ph(il,i+1))/th_wake(il, i)
[1992]3820      END IF
3821    END DO
3822  END DO
3823
[2056]3824!!!!      do 700 i=1,icb(il)-1
[1992]3825  DO i = 1, nl
3826    DO il = 1, ncum
3827      IF (i<=(icb(il)-1) .AND. iflag(il)<=1) THEN
3828        ftd(il, i) = esum(il)*t_wake(il, i)/(th_wake(il,i)*hsum(il))
3829        fqd(il, i) = fsum(il)/gsum(il)
3830        ft(il, i) = ftd(il, i) + asum(il)*t(il, i)/(th(il,i)*dsum(il))
3831        fr(il, i) = fqd(il, i) + bsum(il)/csum(il)
3832      END IF
3833    END DO
3834  END DO
3835
[2056]3836!jyg<
3837!Conservation de l'eau
3838!!  sumdq = 0.
3839!!  DO k = 1, nl
3840!!    sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav
3841!!  END DO
3842!!  PRINT *, 'cv3_yield, apres hom, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1)
3843!jyg>
[1992]3844
[2056]3845
3846! ***   Check that moisture stays positive. If not, scale tendencies
3847! in order to ensure moisture positivity
[1992]3848  DO il = 1, ncum
3849    alpha_qpos(il) = 1.
3850    IF (iflag(il)<=1) THEN
3851      IF (fr(il,1)<=0.) THEN
[2056]3852        alpha_qpos(il) = max(alpha_qpos(il), (-delt*fr(il,1))/(s_wake(il)*rr_wake(il,1)+(1.-s_wake(il))*rr(il,1)))
[1992]3853      END IF
3854    END IF
3855  END DO
3856  DO i = 2, nl
3857    DO il = 1, ncum
3858      IF (iflag(il)<=1) THEN
3859        IF (fr(il,i)<=0.) THEN
[2056]3860          alpha_qpos1(il) = max(1., (-delt*fr(il,i))/(s_wake(il)*rr_wake(il,i)+(1.-s_wake(il))*rr(il,i)))
3861          IF (alpha_qpos1(il)>=alpha_qpos(il)) alpha_qpos(il) = alpha_qpos1(il)
[1992]3862        END IF
3863      END IF
3864    END DO
3865  END DO
3866  DO il = 1, ncum
3867    IF (iflag(il)<=1 .AND. alpha_qpos(il)>1.001) THEN
3868      alpha_qpos(il) = alpha_qpos(il)*1.1
3869    END IF
3870  END DO
[2408]3871!
3872!    print *,' YIELD : alpha_qpos ',alpha_qpos(1)
3873!
[1992]3874  DO il = 1, ncum
3875    IF (iflag(il)<=1) THEN
3876      sigd(il) = sigd(il)/alpha_qpos(il)
3877      precip(il) = precip(il)/alpha_qpos(il)
[2594]3878      cbmf(il) = cbmf(il)/alpha_qpos(il)
[1992]3879    END IF
3880  END DO
3881  DO i = 1, nl
3882    DO il = 1, ncum
3883      IF (iflag(il)<=1) THEN
3884        fr(il, i) = fr(il, i)/alpha_qpos(il)
3885        ft(il, i) = ft(il, i)/alpha_qpos(il)
3886        fqd(il, i) = fqd(il, i)/alpha_qpos(il)
3887        ftd(il, i) = ftd(il, i)/alpha_qpos(il)
3888        fu(il, i) = fu(il, i)/alpha_qpos(il)
3889        fv(il, i) = fv(il, i)/alpha_qpos(il)
3890        m(il, i) = m(il, i)/alpha_qpos(il)
3891        mp(il, i) = mp(il, i)/alpha_qpos(il)
[2408]3892        Vprecip(il, i) = Vprecip(il, i)/alpha_qpos(il)
3893        Vprecipi(il, i) = Vprecipi(il, i)/alpha_qpos(il)                     ! jyg
[1992]3894      END IF
3895    END DO
3896  END DO
[2542]3897!jyg<
3898!-----------------------------------------------------------
3899           IF (ok_optim_yield) THEN                       !|
3900!-----------------------------------------------------------
[1992]3901  DO i = 1, nl
[2542]3902    DO il = 1, ncum
3903      IF (iflag(il)<=1) THEN
3904        upwd(il, i) = upwd(il, i)/alpha_qpos(il)
3905        dnwd(il, i) = dnwd(il, i)/alpha_qpos(il)
3906      END IF
3907    END DO
3908  END DO
3909!-----------------------------------------------------------
3910        ENDIF !(ok_optim_yield)                           !|
3911!-----------------------------------------------------------
3912!>jyg
3913  DO j = 1, nl !yor! inverted i and j loops
3914     DO i = 1, nl
[1992]3915      DO il = 1, ncum
3916        IF (iflag(il)<=1) THEN
3917          ment(il, i, j) = ment(il, i, j)/alpha_qpos(il)
3918        END IF
3919      END DO
3920    END DO
3921  END DO
3922
[2056]3923!AC!      DO j = 1,ntra
3924!AC!      DO i = 1,nl
3925!AC!       DO il = 1,ncum
3926!AC!        IF (iflag(il) .le. 1) THEN
3927!AC!         ftra(il,i,j) = ftra(il,i,j)/alpha_qpos(il)
3928!AC!        ENDIF
3929!AC!       ENDDO
3930!AC!      ENDDO
3931!AC!      ENDDO
[1992]3932
3933
[2056]3934! ***           reset counter and return           ***
[1992]3935
[2298]3936! Reset counter only for points actually convective (jyg)
3937! In order take into account the possibility of changing the compression,
3938! reset m, sig and w0 to zero for non-convecting points.
[1992]3939  DO il = 1, ncum
[2298]3940    IF (iflag(il) < 3) THEN
3941      sig(il, nd) = 2.0
3942    ENDIF
[1992]3943  END DO
3944
3945
[2408]3946  DO i = 1, nl
[1992]3947    DO il = 1, ncum
3948      dnwd0(il, i) = -mp(il, i)
3949    END DO
3950  END DO
[2408]3951!jyg<  (loops stop at nl)
3952!!  DO i = nl + 1, nd
3953!!    DO il = 1, ncum
3954!!      dnwd0(il, i) = 0.
3955!!    END DO
3956!!  END DO
3957!>jyg
[1992]3958
3959
[2542]3960!jyg<
3961!-----------------------------------------------------------
3962           IF (.NOT.ok_optim_yield) THEN                  !|
3963!-----------------------------------------------------------
[1992]3964  DO i = 1, nl
3965    DO il = 1, ncum
[2542]3966      upwd(il, i) = 0.0
3967      dnwd(il, i) = 0.0
[1992]3968    END DO
3969  END DO
3970
[2542]3971!!  DO i = 1, nl                                           ! useless; jyg
3972!!    DO il = 1, ncum                                      ! useless; jyg
3973!!      IF (i>=icb(il) .AND. i<=inb(il)) THEN              ! useless; jyg
3974!!        upwd(il, i) = 0.0                                ! useless; jyg
3975!!        dnwd(il, i) = 0.0                                ! useless; jyg
3976!!      END IF                                             ! useless; jyg
3977!!    END DO                                               ! useless; jyg
3978!!  END DO                                                 ! useless; jyg
3979
[1992]3980  DO i = 1, nl
3981    DO k = 1, nl
3982      DO il = 1, ncum
3983        up1(il, k, i) = 0.0
3984        dn1(il, k, i) = 0.0
3985      END DO
3986    END DO
3987  END DO
3988
[2542]3989!yor! commented original
3990!  DO i = 1, nl
3991!    DO k = i, nl
3992!      DO n = 1, i - 1
3993!        DO il = 1, ncum
3994!          IF (i>=icb(il) .AND. i<=inb(il) .AND. k<=inb(il)) THEN
3995!            up1(il, k, i) = up1(il, k, i) + ment(il, n, k)
3996!            dn1(il, k, i) = dn1(il, k, i) - ment(il, k, n)
3997!          END IF
3998!        END DO
3999!      END DO
4000!    END DO
4001!  END DO
4002!yor! replaced with
[1992]4003  DO i = 1, nl
4004    DO k = i, nl
4005      DO n = 1, i - 1
4006        DO il = 1, ncum
[2542]4007          IF (i>=icb(il) .AND. k<=inb(il)) THEN ! yor ! as i always <= k
4008             up1(il, k, i) = up1(il, k, i) + ment(il, n, k)
[1992]4009          END IF
4010        END DO
4011      END DO
4012    END DO
4013  END DO
[2542]4014  DO i = 1, nl
4015    DO n = 1, i - 1
4016      DO k = i, nl
4017        DO il = 1, ncum
4018          IF (i>=icb(il) .AND. k<=inb(il)) THEN ! yor !  i always <= k
4019             dn1(il, k, i) = dn1(il, k, i) - ment(il, k, n)
4020          END IF
4021        END DO
4022      END DO
4023    END DO
4024  END DO
4025!yor! end replace
[1992]4026
4027  DO i = 1, nl
4028    DO k = 1, nl
4029      DO il = 1, ncum
4030        IF (i>=icb(il)) THEN
4031          IF (k>=i .AND. k<=(inb(il))) THEN
4032            upwd(il, i) = upwd(il, i) + m(il, k)
4033          END IF
4034        ELSE
4035          IF (k<i) THEN
4036            upwd(il, i) = upwd(il, i) + cbmf(il)*wghti(il, k)
4037          END IF
4038        END IF
[2056]4039! c        print *,'cbmf',il,i,k,cbmf(il),wghti(il,k)
[1992]4040      END DO
4041    END DO
4042  END DO
4043
4044  DO i = 2, nl
4045    DO k = i, nl
4046      DO il = 1, ncum
[2056]4047! test         if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then
[1992]4048        IF (i<=inb(il) .AND. k<=inb(il)) THEN
4049          upwd(il, i) = upwd(il, i) + up1(il, k, i)
4050          dnwd(il, i) = dnwd(il, i) + dn1(il, k, i)
4051        END IF
[2056]4052! c         print *,'upwd',il,i,k,inb(il),upwd(il,i),m(il,k),up1(il,k,i)
[1992]4053      END DO
4054    END DO
4055  END DO
4056
4057
[2056]4058!!!!      DO il=1,ncum
4059!!!!      do i=icb(il),inb(il)
4060!!!!
4061!!!!      upwd(il,i)=0.0
4062!!!!      dnwd(il,i)=0.0
4063!!!!      do k=i,inb(il)
4064!!!!      up1=0.0
4065!!!!      dn1=0.0
4066!!!!      do n=1,i-1
4067!!!!      up1=up1+ment(il,n,k)
4068!!!!      dn1=dn1-ment(il,k,n)
4069!!!!      enddo
4070!!!!      upwd(il,i)=upwd(il,i)+m(il,k)+up1
4071!!!!      dnwd(il,i)=dnwd(il,i)+dn1
4072!!!!      enddo
4073!!!!      enddo
4074!!!!
4075!!!!      ENDDO
[2542]4076!-----------------------------------------------------------
4077        ENDIF !(.NOT.ok_optim_yield)                      !|
4078!-----------------------------------------------------------
4079!>jyg
[1992]4080
[2056]4081! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
4082! determination de la variation de flux ascendant entre
4083! deux niveau non dilue mip
4084! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
[1992]4085
4086  DO i = 1, nl
4087    DO il = 1, ncum
4088      mip(il, i) = m(il, i)
4089    END DO
4090  END DO
4091
[2408]4092!jyg<  (loops stop at nl)
4093!!  DO i = nl + 1, nd
4094!!    DO il = 1, ncum
4095!!      mip(il, i) = 0.
4096!!    END DO
4097!!  END DO
4098!>jyg
[1992]4099
[2408]4100  DO i = 1, nlp
[1992]4101    DO il = 1, ncum
4102      ma(il, i) = 0
4103    END DO
4104  END DO
4105
4106  DO i = 1, nl
4107    DO j = i, nl
4108      DO il = 1, ncum
4109        ma(il, i) = ma(il, i) + m(il, j)
4110      END DO
4111    END DO
4112  END DO
4113
[2408]4114!jyg<  (loops stop at nl)
4115!!  DO i = nl + 1, nd
4116!!    DO il = 1, ncum
4117!!      ma(il, i) = 0.
4118!!    END DO
4119!!  END DO
4120!>jyg
[1992]4121
4122  DO i = 1, nl
4123    DO il = 1, ncum
4124      IF (i<=(icb(il)-1)) THEN
4125        ma(il, i) = 0
4126      END IF
4127    END DO
4128  END DO
4129
[2056]4130! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
4131! icb represente de niveau ou se trouve la
4132! base du nuage , et inb le top du nuage
4133! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
[1992]4134
[2298]4135!!  DO i = 1, nd                                  ! unused . jyg
4136!!    DO il = 1, ncum                             ! unused . jyg
4137!!      mke(il, i) = upwd(il, i) + dnwd(il, i)    ! unused . jyg
4138!!    END DO                                      ! unused . jyg
4139!!  END DO                                        ! unused . jyg
[1992]4140
[2298]4141!!  DO i = 1, nd                                                                 ! unused . jyg
4142!!    DO il = 1, ncum                                                            ! unused . jyg
4143!!      rdcp = (rrd*(1.-rr(il,i))-rr(il,i)*rrv)/(cpd*(1.-rr(il,i))+rr(il,i)*cpv) ! unused . jyg
4144!!      tls(il, i) = t(il, i)*(1000.0/p(il,i))**rdcp                             ! unused . jyg
4145!!      tps(il, i) = tp(il, i)                                                   ! unused . jyg
4146!!    END DO                                                                     ! unused . jyg
4147!!  END DO                                                                       ! unused . jyg
[1992]4148
4149
[2056]4150! *** diagnose the in-cloud mixing ratio   ***                       ! cld
4151! ***           of condensed water         ***                       ! cld
4152!! cld                                                               
4153                                                                     
[2408]4154  DO i = 1, nl+1                                                     ! cld
[2056]4155    DO il = 1, ncum                                                  ! cld
4156      mac(il, i) = 0.0                                               ! cld
4157      wa(il, i) = 0.0                                                ! cld
4158      siga(il, i) = 0.0                                              ! cld
4159      sax(il, i) = 0.0                                               ! cld
4160    END DO                                                           ! cld
4161  END DO                                                             ! cld
4162                                                                     
4163  DO i = minorig, nl                                                 ! cld
4164    DO k = i + 1, nl + 1                                             ! cld
4165      DO il = 1, ncum                                                ! cld
[1992]4166        IF (i<=inb(il) .AND. k<=(inb(il)+1) .AND. iflag(il)<=1) THEN ! cld
[2056]4167          mac(il, i) = mac(il, i) + m(il, k)                         ! cld
4168        END IF                                                       ! cld
4169      END DO                                                         ! cld
4170    END DO                                                           ! cld
4171  END DO                                                             ! cld
[1992]4172
[2056]4173  DO i = 1, nl                                                       ! cld
4174    DO j = 1, i                                                      ! cld
4175      DO il = 1, ncum                                                ! cld
4176        IF (i>=icb(il) .AND. i<=(inb(il)-1) &                        ! cld
4177            .AND. j>=icb(il) .AND. iflag(il)<=1) THEN                ! cld
4178          sax(il, i) = sax(il, i) + rrd*(tvp(il,j)-tv(il,j)) &       ! cld
4179            *(ph(il,j)-ph(il,j+1))/p(il, j)                          ! cld
4180        END IF                                                       ! cld
4181      END DO                                                         ! cld
4182    END DO                                                           ! cld
4183  END DO                                                             ! cld
[1992]4184
[2056]4185  DO i = 1, nl                                                       ! cld
4186    DO il = 1, ncum                                                  ! cld
4187      IF (i>=icb(il) .AND. i<=(inb(il)-1) &                          ! cld
4188          .AND. sax(il,i)>0.0 .AND. iflag(il)<=1) THEN               ! cld
4189        wa(il, i) = sqrt(2.*sax(il,i))                               ! cld
4190      END IF                                                         ! cld
4191    END DO                                                           ! cld
[2220]4192  END DO 
4193                                                           ! cld
4194  DO i = 1, nl 
[1992]4195
[2220]4196! 14/01/15 AJ je remets les parties manquantes cf JYG
4197! Initialize sument to 0
4198
4199    DO il = 1,ncum
4200     sument(il) = 0.
4201    ENDDO
4202
4203! Sum mixed mass fluxes in sument
4204
4205    DO k = 1,nl
4206      DO il = 1,ncum
4207        IF  (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN   ! cld
4208          sument(il) =sument(il) + abs(ment(il,k,i))
4209        ENDIF
4210      ENDDO     ! il
4211    ENDDO       ! k
4212
4213! 14/01/15 AJ delta n'a rien à faire là...                                                 
[2056]4214    DO il = 1, ncum                                                  ! cld
4215      IF (wa(il,i)>0.0 .AND. iflag(il)<=1) &                         ! cld
[2220]4216        siga(il, i) = mac(il, i)/(coefw_cld_cv*wa(il, i)) &          ! cld
4217        *rrd*tvp(il, i)/p(il, i)/100.                                ! cld
4218
[2056]4219      siga(il, i) = min(siga(il,i), 1.0)                             ! cld
[2220]4220
4221! IM cf. FH
4222! 14/01/15 AJ ne correspond pas à ce qui a été codé par JYG et SB           
4223                                                         
[2056]4224      IF (iflag_clw==0) THEN                                         ! cld
4225        qcondc(il, i) = siga(il, i)*clw(il, i)*(1.-ep(il,i)) &       ! cld
4226          +(1.-siga(il,i))*qcond(il, i)                              ! cld
[2220]4227
4228
4229        sigment(il,i)=sument(il)*tau_cld_cv/(ph(il,i)-ph(il,i+1))    ! cld
4230        sigment(il, i) = min(1.e-4+sigment(il,i), 1.0 - siga(il,i))  ! cld
4231        qtc(il, i) = (siga(il,i)*qnk(il)+sigment(il,i)*qtment(il,i)) & ! cld
4232                     /(siga(il,i)+sigment(il,i))                     ! cld
4233        sigt(il,i) = sigment(il, i) + siga(il, i)
4234
4235!        qtc(il, i) = siga(il,i)*qnk(il)+(1.-siga(il,i))*qtment(il,i) ! cld
4236!     print*,'BIGAUSSIAN CONV',siga(il,i),sigment(il,i),qtc(il,i) 
4237               
[2056]4238      ELSE IF (iflag_clw==1) THEN                                    ! cld
4239        qcondc(il, i) = qcond(il, i)                                 ! cld
[2220]4240        qtc(il,i) = qtment(il,i)                                     ! cld
[2056]4241      END IF                                                         ! cld
[1992]4242
[2056]4243    END DO                                                           ! cld
[1992]4244  END DO
[2056]4245! print*,'cv3_yield fin'
4246
[1992]4247  RETURN
4248END SUBROUTINE cv3_yield
4249
[2056]4250!AC! et !RomP >>>
4251SUBROUTINE cv3_tracer(nloc, len, ncum, nd, na, &
4252                      ment, sigij, da, phi, phi2, d1a, dam, &
4253                      ep, Vprecip, elij, clw, epmlmMm, eplaMm, &
4254                      icb, inb)
[1992]4255  IMPLICIT NONE
4256
4257  include "cv3param.h"
4258
[2056]4259!inputs:
[1992]4260  INTEGER ncum, nd, na, nloc, len
4261  REAL ment(nloc, na, na), sigij(nloc, na, na)
4262  REAL clw(nloc, nd), elij(nloc, na, na)
4263  REAL ep(nloc, na)
4264  INTEGER icb(nloc), inb(nloc)
[2056]4265  REAL Vprecip(nloc, nd+1)
4266!ouputs:
[1992]4267  REAL da(nloc, na), phi(nloc, na, na)
4268  REAL phi2(nloc, na, na)
4269  REAL d1a(nloc, na), dam(nloc, na)
[2056]4270  REAL epmlmMm(nloc, na, na), eplaMm(nloc, na)
4271! variables pour tracer dans precip de l'AA et des mel
4272!local variables:
[1992]4273  INTEGER i, j, k
4274  REAL epm(nloc, na, na)
4275
[2056]4276! variables d'Emanuel : du second indice au troisieme
4277! --->    tab(i,k,j) -> de l origine k a l arrivee j
4278! ment, sigij, elij
4279! variables personnelles : du troisieme au second indice
4280! --->    tab(i,j,k) -> de k a j
4281! phi, phi2
[1992]4282
[2056]4283! initialisations
[1992]4284
4285  da(:, :) = 0.
4286  d1a(:, :) = 0.
4287  dam(:, :) = 0.
4288  epm(:, :, :) = 0.
[2056]4289  eplaMm(:, :) = 0.
4290  epmlmMm(:, :, :) = 0.
[1992]4291  phi(:, :, :) = 0.
4292  phi2(:, :, :) = 0.
4293
[2056]4294! fraction deau condensee dans les melanges convertie en precip : epm
4295! et eau condensée précipitée dans masse d'air saturé : l_m*dM_m/dzdz.dzdz
[2408]4296  DO j = 1, nl
4297    DO k = 1, nl
[1992]4298      DO i = 1, ncum
[2056]4299        IF (k>=icb(i) .AND. k<=inb(i) .AND. &
4300!!jyg              j.ge.k.and.j.le.inb(i)) then
4301!!jyg             epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/elij(i,k,j)
[1992]4302            j>k .AND. j<=inb(i)) THEN
4303          epm(i, j, k) = 1. - (1.-ep(i,j))*clw(i, j)/max(elij(i,k,j), 1.E-16)
[2056]4304!!
[1992]4305          epm(i, j, k) = max(epm(i,j,k), 0.0)
4306        END IF
4307      END DO
4308    END DO
4309  END DO
4310
4311
[2408]4312  DO j = 1, nl
4313    DO k = 1, nl
[1992]4314      DO i = 1, ncum
4315        IF (k>=icb(i) .AND. k<=inb(i)) THEN
[2056]4316          eplaMm(i, j) = eplamm(i, j) + &
4317                         ep(i, j)*clw(i, j)*ment(i, j, k)*(1.-sigij(i,j,k))
[1992]4318        END IF
4319      END DO
4320    END DO
4321  END DO
4322
[2408]4323  DO j = 1, nl
[1992]4324    DO k = 1, j - 1
4325      DO i = 1, ncum
4326        IF (k>=icb(i) .AND. k<=inb(i) .AND. j<=inb(i)) THEN
[2056]4327          epmlmMm(i, j, k) = epm(i, j, k)*elij(i, k, j)*ment(i, k, j)
[1992]4328        END IF
4329      END DO
4330    END DO
4331  END DO
4332
[2056]4333! matrices pour calculer la tendance des concentrations dans cvltr.F90
[2408]4334  DO j = 1, nl
4335    DO k = 1, nl
[1992]4336      DO i = 1, ncum
4337        da(i, j) = da(i, j) + (1.-sigij(i,k,j))*ment(i, k, j)
4338        phi(i, j, k) = sigij(i, k, j)*ment(i, k, j)
4339        d1a(i, j) = d1a(i, j) + ment(i, k, j)*ep(i, k)*(1.-sigij(i,k,j))
4340        IF (k<=j) THEN
[2056]4341          dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1.-sigij(i,k,j))
[1992]4342          phi2(i, j, k) = phi(i, j, k)*epm(i, j, k)
4343        END IF
4344      END DO
4345    END DO
4346  END DO
4347
4348  RETURN
4349END SUBROUTINE cv3_tracer
[2056]4350!AC! et !RomP <<<
[1992]4351
[2056]4352SUBROUTINE cv3_uncompress(nloc, len, ncum, nd, ntra, idcum, &
4353                          iflag, &
4354                          precip, sig, w0, &
4355                          ft, fq, fu, fv, ftra, &
4356                          Ma, upwd, dnwd, dnwd0, qcondc, wd, cape, &
[2488]4357                          epmax_diag, & ! epmax_cape
[2056]4358                          iflag1, &
4359                          precip1, sig1, w01, &
4360                          ft1, fq1, fu1, fv1, ftra1, &
[2488]4361                          Ma1, upwd1, dnwd1, dnwd01, qcondc1, wd1, cape1, &
4362                          epmax_diag1) ! epmax_cape
[1992]4363  IMPLICIT NONE
4364
4365  include "cv3param.h"
4366
[2056]4367!inputs:
[1992]4368  INTEGER len, ncum, nd, ntra, nloc
4369  INTEGER idcum(nloc)
4370  INTEGER iflag(nloc)
4371  REAL precip(nloc)
4372  REAL sig(nloc, nd), w0(nloc, nd)
4373  REAL ft(nloc, nd), fq(nloc, nd), fu(nloc, nd), fv(nloc, nd)
4374  REAL ftra(nloc, nd, ntra)
4375  REAL ma(nloc, nd)
4376  REAL upwd(nloc, nd), dnwd(nloc, nd), dnwd0(nloc, nd)
4377  REAL qcondc(nloc, nd)
4378  REAL wd(nloc), cape(nloc)
[2488]4379  REAL epmax_diag(nloc)
[1992]4380
[2056]4381!outputs:
[1992]4382  INTEGER iflag1(len)
4383  REAL precip1(len)
4384  REAL sig1(len, nd), w01(len, nd)
4385  REAL ft1(len, nd), fq1(len, nd), fu1(len, nd), fv1(len, nd)
4386  REAL ftra1(len, nd, ntra)
4387  REAL ma1(len, nd)
4388  REAL upwd1(len, nd), dnwd1(len, nd), dnwd01(len, nd)
4389  REAL qcondc1(nloc, nd)
4390  REAL wd1(nloc), cape1(nloc)
[2488]4391  REAL epmax_diag1(len) ! epmax_cape
[1992]4392
[2056]4393!local variables:
[1992]4394  INTEGER i, k, j
4395
4396  DO i = 1, ncum
4397    precip1(idcum(i)) = precip(i)
4398    iflag1(idcum(i)) = iflag(i)
4399    wd1(idcum(i)) = wd(i)
4400    cape1(idcum(i)) = cape(i)
[2488]4401    epmax_diag1(idcum(i))=epmax_diag(i) ! epmax_cape
[1992]4402  END DO
4403
4404  DO k = 1, nl
4405    DO i = 1, ncum
4406      sig1(idcum(i), k) = sig(i, k)
4407      w01(idcum(i), k) = w0(i, k)
4408      ft1(idcum(i), k) = ft(i, k)
4409      fq1(idcum(i), k) = fq(i, k)
4410      fu1(idcum(i), k) = fu(i, k)
4411      fv1(idcum(i), k) = fv(i, k)
4412      ma1(idcum(i), k) = ma(i, k)
4413      upwd1(idcum(i), k) = upwd(i, k)
4414      dnwd1(idcum(i), k) = dnwd(i, k)
4415      dnwd01(idcum(i), k) = dnwd0(i, k)
4416      qcondc1(idcum(i), k) = qcondc(i, k)
4417    END DO
4418  END DO
4419
4420  DO i = 1, ncum
4421    sig1(idcum(i), nd) = sig(i, nd)
4422  END DO
4423
4424
[2056]4425!AC!        do 2100 j=1,ntra
4426!AC!c oct3         do 2110 k=1,nl
4427!AC!         do 2110 k=1,nd ! oct3
4428!AC!          do 2120 i=1,ncum
4429!AC!            ftra1(idcum(i),k,j)=ftra(i,k,j)
4430!AC! 2120     continue
4431!AC! 2110    continue
4432!AC! 2100   continue
4433!
[1992]4434  RETURN
4435END SUBROUTINE cv3_uncompress
[2488]4436
4437
4438        subroutine cv3_epmax_fn_cape(nloc,ncum,nd &
4439                 , ep,hp,icb,inb,clw,nk,t,h,hnk,lv,lf,frac &
4440                 , pbase, p, ph, tv, buoy, sig, w0,iflag &
4441                 , epmax_diag)
4442        implicit none
4443
4444        ! On fait varier epmax en fn de la cape
4445        ! Il faut donc recalculer ep, et hp qui a déjà été calculé et
4446        ! qui en dépend
4447        ! Toutes les autres variables fn de ep sont calculées plus bas.
4448
4449  include "cvthermo.h"
4450  include "cv3param.h" 
4451  include "conema3.h"
4452  include "cvflag.h"
4453
4454! inputs:
4455      INTEGER, INTENT (IN)                               :: ncum, nd, nloc
4456      INTEGER, DIMENSION (nloc), INTENT (IN)             :: icb, inb, nk
4457      REAL, DIMENSION (nloc), INTENT (IN)                :: hnk,pbase
4458      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: t, lv, lf, tv, h
4459      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: clw, buoy,frac
4460      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: sig,w0
4461      INTEGER, DIMENSION (nloc), INTENT (IN)             :: iflag(nloc)
4462      REAL, DIMENSION (nloc, nd), INTENT (IN)            :: p
4463      REAL, DIMENSION (nloc, nd+1), INTENT (IN)          :: ph
4464! inouts:
4465      REAL, DIMENSION (nloc, nd), INTENT (INOUT)         :: ep,hp 
4466! outputs
4467      REAL, DIMENSION (nloc), INTENT (OUT)           :: epmax_diag
4468
4469! local
4470      integer i,k   
4471!      real hp_bak(nloc,nd)
4472!      real ep_bak(nloc,nd)
4473      real m_loc(nloc,nd)
4474      real sig_loc(nloc,nd)
4475      real w0_loc(nloc,nd)
4476      integer iflag_loc(nloc)
4477      real cape(nloc)
4478       
4479        if (coef_epmax_cape.gt.1e-12) then
4480
4481        ! il faut calculer la cape: on fait un calcule simple car tant qu'on ne
4482        ! connait pas ep, on ne connait pas les mélanges, ddfts etc... qui sont
4483        ! necessaires au calcul de la cape dans la nouvelle physique
4484       
4485!        write(*,*) 'cv3_routines check 4303'
4486        do i=1,ncum
4487        do k=1,nd
4488          sig_loc(i,k)=sig(i,k)
4489          w0_loc(i,k)=w0(i,k)
4490          iflag_loc(i)=iflag(i)
4491!          ep_bak(i,k)=ep(i,k)
4492        enddo ! do k=1,nd
4493        enddo !do i=1,ncum
4494
4495!        write(*,*) 'cv3_routines check 4311'
4496!        write(*,*) 'nl=',nl
4497        CALL cv3_closure(nloc, ncum, nd, icb, inb, & ! na->nd
4498          pbase, p, ph, tv, buoy, &
4499          sig_loc, w0_loc, cape, m_loc,iflag_loc)
4500
4501!        write(*,*) 'cv3_routines check 4316'
4502!        write(*,*) 'ep(1,:)=',ep(1,:)
4503        do i=1,ncum
4504           epmax_diag(i)=epmax-coef_epmax_cape*sqrt(cape(i))
4505           epmax_diag(i)=amax1(epmax_diag(i),0.0)
4506!           write(*,*) 'i,icb,inb,cape,epmax_diag=', &
4507!                i,icb(i),inb(i),cape(i),epmax_diag(i)
4508           do k=1,nl
4509                ep(i,k)=ep(i,k)/epmax*epmax_diag(i)
4510                ep(i,k)=amax1(ep(i,k),0.0)
4511                ep(i,k)=amin1(ep(i,k),epmax_diag(i))
4512           enddo
4513        enddo
4514 !       write(*,*) 'ep(1,:)=',ep(1,:)
4515
4516      !write(*,*) 'cv3_routines check 4326'
4517! On recalcule hp:
4518!      do k=1,nl
4519!        do i=1,ncum
4520!         hp_bak(i,k)=hp(i,k)
4521!       enddo
4522!      enddo
4523      do k=1,nl
4524        do i=1,ncum
4525          hp(i,k)=h(i,k)
4526        enddo
4527      enddo
4528
4529  IF (cvflag_ice) THEN
4530
4531      do k=minorig+1,nl
4532       do i=1,ncum
4533        if((k.ge.icb(i)).and.(k.le.inb(i)))then
4534          hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac(i,k)*lf(i,k))* &
4535                              ep(i, k)*clw(i, k)
4536        endif
4537       enddo
4538      enddo !do k=minorig+1,n
4539  ELSE !IF (cvflag_ice) THEN
4540
4541      DO k = minorig + 1, nl
4542       DO i = 1, ncum
4543        IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
4544          hp(i,k)=hnk(i)+(lv(i,k)+(cpd-cpv)*t(i,k))*ep(i,k)*clw(i,k)
4545        endif
4546       enddo
4547      enddo !do k=minorig+1,n
4548
4549  ENDIF !IF (cvflag_ice) THEN     
4550      !write(*,*) 'cv3_routines check 4345'
4551!      do i=1,ncum 
4552!       do k=1,nl
4553!        if ((abs(hp_bak(i,k)-hp(i,k))/hp_bak(i,k).gt.1e-1).or. &
4554!            ((abs(hp_bak(i,k)-hp(i,k))/hp_bak(i,k).gt.1e-4).and. &
4555!            (ep(i,k)-ep_bak(i,k).lt.1e-4))) then
4556!           write(*,*) 'i,k=',i,k
4557!           write(*,*) 'coef_epmax_cape=',coef_epmax_cape
4558!           write(*,*) 'epmax_diag(i)=',epmax_diag(i)
4559!           write(*,*) 'ep(i,k)=',ep(i,k)
4560!           write(*,*) 'ep_bak(i,k)=',ep_bak(i,k)
4561!           write(*,*) 'hp(i,k)=',hp(i,k)
4562!           write(*,*) 'hp_bak(i,k)=',hp_bak(i,k)
4563!           write(*,*) 'h(i,k)=',h(i,k)
4564!           write(*,*) 'nk(i)=',nk(i)
4565!           write(*,*) 'h(i,nk(i))=',h(i,nk(i))
4566!           write(*,*) 'lv(i,k)=',lv(i,k)
4567!           write(*,*) 't(i,k)=',t(i,k)
4568!           write(*,*) 'clw(i,k)=',clw(i,k)
4569!           write(*,*) 'cpd,cpv=',cpd,cpv
4570!           stop
4571!        endif
4572!       enddo !do k=1,nl
4573!      enddo !do i=1,ncum 
4574      endif !if (coef_epmax_cape.gt.1e-12) then
4575      !write(*,*) 'cv3_routines check 4367'
4576
4577      return
4578      end subroutine cv3_epmax_fn_cape
4579
4580
4581
Note: See TracBrowser for help on using the repository browser.