source: LMDZ5/branches/LMDZ5-DOFOCO/libf/phylmd/cv30_routines.F @ 5452

Last change on this file since 5452 was 1744, checked in by Ehouarn Millour, 12 years ago

Fix to avoid dividing by zero.
JYG

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 98.4 KB
Line 
1!
2! $Id: cv30_routines.F 1744 2013-04-09 06:31:40Z aborella $
3!
4c
5c
6      SUBROUTINE cv30_param(nd,delt)
7      implicit none
8
9c------------------------------------------------------------
10c Set parameters for convectL for iflag_con = 3
11c------------------------------------------------------------
12
13C
14C   ***  PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE ***
15C   ***      PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO     ***
16C   ***  PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. ***     
17C   ***            EFFICIENCY IS ASSUMED TO BE UNITY            ***
18C   ***  SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT  ***
19C   ***  SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***     
20C   ***                        OF CLOUD                         ***
21C
22C [TAU: CHARACTERISTIC TIMESCALE USED TO COMPUTE ALPHA & BETA]
23C   ***    ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF ***
24C   ***                 APPROACH TO QUASI-EQUILIBRIUM           ***
25C   ***    (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) ***
26C   ***           (BETA MUST BE LESS THAN OR EQUAL TO 1)        ***
27C
28C   ***    DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE ***
29C   ***                 APPROACH TO QUASI-EQUILIBRIUM           ***
30C   ***                     IT MUST BE LESS THAN 0              ***
31
32#include "cv30param.h"
33#include "conema3.h"
34
35      integer nd
36      real delt ! timestep (seconds)
37
38c noff: integer limit for convection (nd-noff)
39c minorig: First level of convection
40
41c -- limit levels for convection:
42
43      noff    = 1
44      minorig = 1
45      nl=nd-noff
46      nlp=nl+1
47      nlm=nl-1
48
49c -- "microphysical" parameters:
50
51      sigd   = 0.01
52      spfac  = 0.15
53      pbcrit = 150.0
54      ptcrit = 500.0
55cIM cf. FH     epmax  = 0.993
56
57      omtrain = 45.0 ! used also for snow (no disctinction rain/snow)
58
59c -- misc:
60
61      dtovsh = -0.2 ! dT for overshoot
62      dpbase = -40. ! definition cloud base (400m above LCL)
63      dttrig = 5.   ! (loose) condition for triggering
64
65c -- rate of approach to quasi-equilibrium:
66
67      dtcrit = -2.0
68      tau    = 8000.
69      beta   = 1.0 - delt/tau
70      alpha  = 1.5E-3 * delt/tau
71c increase alpha to compensate W decrease:
72      alpha  = alpha*1.5
73
74c -- interface cloud parameterization:
75
76      delta=0.01  ! cld
77
78c -- interface with boundary-layer (gust factor): (sb)
79
80      betad=10.0   ! original value (from convect 4.3)
81
82      return
83      end
84
85      SUBROUTINE cv30_prelim(len,nd,ndp1,t,q,p,ph
86     :                    ,lv,cpn,tv,gz,h,hm,th)
87      implicit none
88
89!=====================================================================
90! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY
91! "ori": from convect4.3 (vectorized)
92! "convect3": to be exactly consistent with convect3
93!=====================================================================
94
95c inputs:
96      integer len, nd, ndp1
97      real t(len,nd), q(len,nd), p(len,nd), ph(len,ndp1)
98
99c outputs:
100      real lv(len,nd), cpn(len,nd), tv(len,nd)
101      real gz(len,nd), h(len,nd), hm(len,nd)
102      real th(len,nd)
103
104c local variables:
105      integer k, i
106      real rdcp
107      real tvx,tvy ! convect3
108      real cpx(len,nd)
109
110#include "cvthermo.h"
111#include "cv30param.h"
112
113
114c ori      do 110 k=1,nlp
115      do 110 k=1,nl ! convect3
116        do 100 i=1,len
117cdebug          lv(i,k)= lv0-clmcpv*(t(i,k)-t0)
118          lv(i,k)= lv0-clmcpv*(t(i,k)-273.15)
119          cpn(i,k)=cpd*(1.0-q(i,k))+cpv*q(i,k)
120          cpx(i,k)=cpd*(1.0-q(i,k))+cl*q(i,k)
121c ori          tv(i,k)=t(i,k)*(1.0+q(i,k)*epsim1)
122          tv(i,k)=t(i,k)*(1.0+q(i,k)/eps-q(i,k))
123          rdcp=(rrd*(1.-q(i,k))+q(i,k)*rrv)/cpn(i,k)
124          th(i,k)=t(i,k)*(1000.0/p(i,k))**rdcp
125 100    continue
126 110  continue
127c
128c gz = phi at the full levels (same as p).
129c
130      do 120 i=1,len
131        gz(i,1)=0.0
132 120  continue
133c ori      do 140 k=2,nlp
134      do 140 k=2,nl ! convect3
135        do 130 i=1,len
136        tvx=t(i,k)*(1.+q(i,k)/eps-q(i,k))       !convect3
137        tvy=t(i,k-1)*(1.+q(i,k-1)/eps-q(i,k-1)) !convect3
138        gz(i,k)=gz(i,k-1)+0.5*rrd*(tvx+tvy)     !convect3
139     &          *(p(i,k-1)-p(i,k))/ph(i,k)      !convect3
140
141c ori         gz(i,k)=gz(i,k-1)+hrd*(tv(i,k-1)+tv(i,k))
142c ori    &         *(p(i,k-1)-p(i,k))/ph(i,k)
143 130    continue
144 140  continue
145c
146c h  = phi + cpT (dry static energy).
147c hm = phi + cp(T-Tbase)+Lq
148c
149c ori      do 170 k=1,nlp
150      do 170 k=1,nl ! convect3
151        do 160 i=1,len
152          h(i,k)=gz(i,k)+cpn(i,k)*t(i,k)
153          hm(i,k)=gz(i,k)+cpx(i,k)*(t(i,k)-t(i,1))+lv(i,k)*q(i,k)
154 160    continue
155 170  continue
156
157      return
158      end
159
160      SUBROUTINE cv30_feed(len,nd,t,q,qs,p,ph,hm,gz
161     :                  ,nk,icb,icbmax,iflag,tnk,qnk,gznk,plcl)
162      implicit none
163
164C================================================================
165C Purpose: CONVECTIVE FEED
166C
167C Main differences with cv_feed:
168C   - ph added in input
169C       - here, nk(i)=minorig
170C       - icb defined differently (plcl compared with ph instead of p)
171C
172C Main differences with convect3:
173C       - we do not compute dplcldt and dplcldr of CLIFT anymore
174C       - values iflag different (but tests identical)
175C   - A,B explicitely defined (!...)
176C================================================================
177
178#include "cv30param.h"
179
180c inputs:
181          integer len, nd
182      real t(len,nd), q(len,nd), qs(len,nd), p(len,nd)
183      real hm(len,nd), gz(len,nd)
184      real ph(len,nd+1)
185
186c outputs:
187          integer iflag(len), nk(len), icb(len), icbmax
188      real tnk(len), qnk(len), gznk(len), plcl(len)
189
190c local variables:
191      integer i, k
192      integer ihmin(len)
193      real work(len)
194      real pnk(len), qsnk(len), rh(len), chi(len)
195      real A, B ! convect3
196cym
197      plcl=0.0
198c@ !-------------------------------------------------------------------
199c@ ! --- Find level of minimum moist static energy
200c@ ! --- If level of minimum moist static energy coincides with
201c@ ! --- or is lower than minimum allowable parcel origin level,
202c@ ! --- set iflag to 6.
203c@ !-------------------------------------------------------------------
204c@
205c@       do 180 i=1,len
206c@        work(i)=1.0e12
207c@        ihmin(i)=nl
208c@  180  continue
209c@       do 200 k=2,nlp
210c@         do 190 i=1,len
211c@          if((hm(i,k).lt.work(i)).and.
212c@      &      (hm(i,k).lt.hm(i,k-1)))then
213c@            work(i)=hm(i,k)
214c@            ihmin(i)=k
215c@          endif
216c@  190    continue
217c@  200  continue
218c@       do 210 i=1,len
219c@         ihmin(i)=min(ihmin(i),nlm)
220c@         if(ihmin(i).le.minorig)then
221c@           iflag(i)=6
222c@         endif
223c@  210  continue
224c@ c
225c@ !-------------------------------------------------------------------
226c@ ! --- Find that model level below the level of minimum moist static
227c@ ! --- energy that has the maximum value of moist static energy
228c@ !-------------------------------------------------------------------
229c@ 
230c@       do 220 i=1,len
231c@        work(i)=hm(i,minorig)
232c@        nk(i)=minorig
233c@  220  continue
234c@       do 240 k=minorig+1,nl
235c@         do 230 i=1,len
236c@          if((hm(i,k).gt.work(i)).and.(k.le.ihmin(i)))then
237c@            work(i)=hm(i,k)
238c@            nk(i)=k
239c@          endif
240c@  230     continue
241c@  240  continue
242
243!-------------------------------------------------------------------
244! --- Origin level of ascending parcels for convect3:
245!-------------------------------------------------------------------
246
247         do 220 i=1,len
248          nk(i)=minorig
249  220    continue
250
251!-------------------------------------------------------------------
252! --- Check whether parcel level temperature and specific humidity
253! --- are reasonable
254!-------------------------------------------------------------------
255       do 250 i=1,len
256       if( (     ( t(i,nk(i)).lt.250.0    )
257     &       .or.( q(i,nk(i)).le.0.0      )     )
258c@      &       .or.( p(i,ihmin(i)).lt.400.0 )  )
259     &   .and.
260     &       ( iflag(i).eq.0) ) iflag(i)=7
261 250   continue
262!-------------------------------------------------------------------
263! --- Calculate lifted condensation level of air at parcel origin level
264! --- (Within 0.2% of formula of Bolton, MON. WEA. REV.,1980)
265!-------------------------------------------------------------------
266
267       A = 1669.0 ! convect3
268       B = 122.0  ! convect3
269
270       do 260 i=1,len
271
272        if (iflag(i).ne.7) then ! modif sb Jun7th 2002
273
274        tnk(i)=t(i,nk(i))
275        qnk(i)=q(i,nk(i))
276        gznk(i)=gz(i,nk(i))
277        pnk(i)=p(i,nk(i))
278        qsnk(i)=qs(i,nk(i))
279c
280        rh(i)=qnk(i)/qsnk(i)
281c ori        rh(i)=min(1.0,rh(i)) ! removed for convect3
282c ori        chi(i)=tnk(i)/(1669.0-122.0*rh(i)-tnk(i))
283        chi(i)=tnk(i)/(A-B*rh(i)-tnk(i)) ! convect3
284        plcl(i)=pnk(i)*(rh(i)**chi(i))
285        if(((plcl(i).lt.200.0).or.(plcl(i).ge.2000.0))
286     &   .and.(iflag(i).eq.0))iflag(i)=8
287 
288        endif ! iflag=7 
289
290 260   continue
291
292!-------------------------------------------------------------------
293! --- Calculate first level above lcl (=icb)
294!-------------------------------------------------------------------
295
296c@      do 270 i=1,len
297c@       icb(i)=nlm
298c@ 270  continue
299c@c
300c@      do 290 k=minorig,nl
301c@        do 280 i=1,len
302c@          if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i)))
303c@     &    icb(i)=min(icb(i),k)
304c@ 280    continue
305c@ 290  continue
306c@c
307c@      do 300 i=1,len
308c@        if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9
309c@ 300  continue
310
311      do 270 i=1,len
312       icb(i)=nlm
313 270  continue
314c
315c la modification consiste a comparer plcl a ph et non a p:
316c icb est defini par :  ph(icb)<plcl<ph(icb-1)
317c@      do 290 k=minorig,nl
318      do 290 k=3,nl-1 ! modif pour que icb soit sup/egal a 2
319        do 280 i=1,len
320          if( ph(i,k).lt.plcl(i) ) icb(i)=min(icb(i),k)
321 280    continue
322 290  continue
323c
324      do 300 i=1,len
325c@        if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9
326        if((icb(i).eq.nlm).and.(iflag(i).eq.0))iflag(i)=9
327 300  continue
328
329      do 400 i=1,len
330        icb(i) = icb(i)-1 ! icb sup ou egal a 2
331 400  continue
332c
333c Compute icbmax.
334c
335      icbmax=2
336      do 310 i=1,len
337c!        icbmax=max(icbmax,icb(i))
338       if (iflag(i).lt.7) icbmax=max(icbmax,icb(i)) ! sb Jun7th02
339 310  continue
340
341      return
342      end
343
344      SUBROUTINE cv30_undilute1(len,nd,t,q,qs,gz,plcl,p,nk,icb
345     :                       ,tp,tvp,clw,icbs)
346      implicit none
347
348!----------------------------------------------------------------
349! Equivalent de TLIFT entre NK et ICB+1 inclus
350!
351! Differences with convect4:
352!               - specify plcl in input
353!       - icbs is the first level above LCL (may differ from icb)
354!       - in the iterations, used x(icbs) instead x(icb)
355!       - many minor differences in the iterations
356!               - tvp is computed in only one time
357!               - icbs: first level above Plcl (IMIN de TLIFT) in output
358!       - if icbs=icb, compute also tp(icb+1),tvp(icb+1) & clw(icb+1)
359!----------------------------------------------------------------
360
361#include "cvthermo.h"
362#include "cv30param.h"
363
364c inputs:
365      integer len, nd
366      integer nk(len), icb(len)
367      real t(len,nd), q(len,nd), qs(len,nd), gz(len,nd)
368      real p(len,nd)
369      real plcl(len) ! convect3
370
371c outputs:
372      real tp(len,nd), tvp(len,nd), clw(len,nd)
373
374c local variables:
375      integer i, k
376      integer icb1(len), icbs(len), icbsmax2 ! convect3
377      real tg, qg, alv, s, ahg, tc, denom, es, rg
378      real ah0(len), cpp(len)
379      real tnk(len), qnk(len), gznk(len), ticb(len), gzicb(len)
380      real qsicb(len) ! convect3
381      real cpinv(len) ! convect3
382
383!-------------------------------------------------------------------
384! --- Calculates the lifted parcel virtual temperature at nk,
385! --- the actual temperature, and the adiabatic
386! --- liquid water content. The procedure is to solve the equation.
387!     cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
388!-------------------------------------------------------------------
389
390      do 320 i=1,len
391        tnk(i)=t(i,nk(i))
392        qnk(i)=q(i,nk(i))
393        gznk(i)=gz(i,nk(i))
394c ori        ticb(i)=t(i,icb(i))
395c ori        gzicb(i)=gz(i,icb(i))
396 320  continue
397c
398c   ***  Calculate certain parcel quantities, including static energy   ***
399c
400      do 330 i=1,len
401        ah0(i)=(cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i)
402     &         +qnk(i)*(lv0-clmcpv*(tnk(i)-273.15))+gznk(i)
403        cpp(i)=cpd*(1.-qnk(i))+qnk(i)*cpv
404        cpinv(i)=1./cpp(i)
405 330  continue
406c
407c   ***   Calculate lifted parcel quantities below cloud base   ***
408c
409        do i=1,len                      !convect3
410         icb1(i)=MAX(icb(i),2)          !convect3
411         icb1(i)=MIN(icb(i),nl)         !convect3
412c if icb is below LCL, start loop at ICB+1:
413c (icbs est le premier niveau au-dessus du LCL)
414         icbs(i)=icb1(i)                !convect3
415         if (plcl(i).lt.p(i,icb1(i))) then
416             icbs(i)=MIN(icbs(i)+1,nl)  !convect3
417         endif
418        enddo                           !convect3
419
420        do i=1,len                      !convect3
421         ticb(i)=t(i,icbs(i))           !convect3
422         gzicb(i)=gz(i,icbs(i))         !convect3
423         qsicb(i)=qs(i,icbs(i))         !convect3
424        enddo                           !convect3
425
426c
427c Re-compute icbsmax (icbsmax2):        !convect3
428c                                       !convect3
429      icbsmax2=2                        !convect3
430      do 310 i=1,len                    !convect3
431        icbsmax2=max(icbsmax2,icbs(i))  !convect3
432 310  continue                          !convect3
433
434c initialization outputs:
435
436      do k=1,icbsmax2     ! convect3
437       do i=1,len         ! convect3
438        tp(i,k)  = 0.0    ! convect3
439        tvp(i,k) = 0.0    ! convect3
440        clw(i,k) = 0.0    ! convect3
441       enddo              ! convect3
442      enddo               ! convect3
443
444c tp and tvp below cloud base:
445
446        do 350 k=minorig,icbsmax2-1
447          do 340 i=1,len
448           tp(i,k)=tnk(i)-(gz(i,k)-gznk(i))*cpinv(i)
449           tvp(i,k)=tp(i,k)*(1.+qnk(i)/eps-qnk(i)) !whole thing (convect3)
450  340     continue
451  350   continue
452c
453c    ***  Find lifted parcel quantities above cloud base    ***
454c
455        do 360 i=1,len
456         tg=ticb(i)
457c ori         qg=qs(i,icb(i))
458         qg=qsicb(i) ! convect3
459cdebug         alv=lv0-clmcpv*(ticb(i)-t0)
460         alv=lv0-clmcpv*(ticb(i)-273.15)
461c
462c First iteration.
463c
464c ori          s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
465          s=cpd*(1.-qnk(i))+cl*qnk(i)         ! convect3
466     :      +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3
467          s=1./s
468c ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
469          ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gzicb(i) ! convect3
470          tg=tg+s*(ah0(i)-ahg)
471c ori          tg=max(tg,35.0)
472cdebug          tc=tg-t0
473          tc=tg-273.15
474          denom=243.5+tc
475          denom=MAX(denom,1.0) ! convect3
476c ori          if(tc.ge.0.0)then
477           es=6.112*exp(17.67*tc/denom)
478c ori          else
479c ori           es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
480c ori          endif
481c ori          qg=eps*es/(p(i,icb(i))-es*(1.-eps))
482          qg=eps*es/(p(i,icbs(i))-es*(1.-eps))
483c
484c Second iteration.
485c
486
487c ori          s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
488c ori          s=1./s
489c ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
490          ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gzicb(i) ! convect3
491          tg=tg+s*(ah0(i)-ahg)
492c ori          tg=max(tg,35.0)
493cdebug          tc=tg-t0
494          tc=tg-273.15
495          denom=243.5+tc
496          denom=MAX(denom,1.0) ! convect3
497c ori          if(tc.ge.0.0)then
498           es=6.112*exp(17.67*tc/denom)
499c ori          else
500c ori           es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
501c ori          end if
502c ori          qg=eps*es/(p(i,icb(i))-es*(1.-eps))
503          qg=eps*es/(p(i,icbs(i))-es*(1.-eps))
504
505         alv=lv0-clmcpv*(ticb(i)-273.15)
506
507c ori c approximation here:
508c ori         tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i)
509c ori     &   -gz(i,icb(i))-alv*qg)/cpd
510
511c convect3: no approximation:
512         tp(i,icbs(i))=(ah0(i)-gz(i,icbs(i))-alv*qg)
513     :                /(cpd+(cl-cpd)*qnk(i))
514
515c ori         clw(i,icb(i))=qnk(i)-qg
516c ori         clw(i,icb(i))=max(0.0,clw(i,icb(i)))
517         clw(i,icbs(i))=qnk(i)-qg
518         clw(i,icbs(i))=max(0.0,clw(i,icbs(i)))
519
520         rg=qg/(1.-qnk(i))
521c ori         tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi)
522c convect3: (qg utilise au lieu du vrai mixing ratio rg)
523         tvp(i,icbs(i))=tp(i,icbs(i))*(1.+qg/eps-qnk(i)) !whole thing
524
525  360   continue
526c
527c ori      do 380 k=minorig,icbsmax2
528c ori       do 370 i=1,len
529c ori         tvp(i,k)=tvp(i,k)-tp(i,k)*qnk(i)
530c ori 370   continue
531c ori 380  continue
532c
533
534c -- The following is only for convect3:
535c
536c * icbs is the first level above the LCL:
537c    if plcl<p(icb), then icbs=icb+1
538c    if plcl>p(icb), then icbs=icb
539c
540c * the routine above computes tvp from minorig to icbs (included).
541c
542c * to compute buoybase (in cv3_trigger.F), both tvp(icb) and tvp(icb+1)
543c    must be known. This is the case if icbs=icb+1, but not if icbs=icb.
544c
545c * therefore, in the case icbs=icb, we compute tvp at level icb+1
546c   (tvp at other levels will be computed in cv3_undilute2.F)
547c
548
549        do i=1,len             
550         ticb(i)=t(i,icb(i)+1)   
551         gzicb(i)=gz(i,icb(i)+1)
552         qsicb(i)=qs(i,icb(i)+1)
553        enddo                   
554
555        do 460 i=1,len
556         tg=ticb(i)
557         qg=qsicb(i) ! convect3
558cdebug         alv=lv0-clmcpv*(ticb(i)-t0)
559         alv=lv0-clmcpv*(ticb(i)-273.15)
560c
561c First iteration.
562c
563c ori          s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
564          s=cpd*(1.-qnk(i))+cl*qnk(i)         ! convect3
565     :      +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3
566          s=1./s
567c ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
568          ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gzicb(i) ! convect3
569          tg=tg+s*(ah0(i)-ahg)
570c ori          tg=max(tg,35.0)
571cdebug          tc=tg-t0
572          tc=tg-273.15
573          denom=243.5+tc
574          denom=MAX(denom,1.0) ! convect3
575c ori          if(tc.ge.0.0)then
576           es=6.112*exp(17.67*tc/denom)
577c ori          else
578c ori           es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
579c ori          endif
580c ori          qg=eps*es/(p(i,icb(i))-es*(1.-eps))
581          qg=eps*es/(p(i,icb(i)+1)-es*(1.-eps))
582c
583c Second iteration.
584c
585
586c ori          s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i))
587c ori          s=1./s
588c ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i)
589          ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gzicb(i) ! convect3
590          tg=tg+s*(ah0(i)-ahg)
591c ori          tg=max(tg,35.0)
592cdebug          tc=tg-t0
593          tc=tg-273.15
594          denom=243.5+tc
595          denom=MAX(denom,1.0) ! convect3
596c ori          if(tc.ge.0.0)then
597           es=6.112*exp(17.67*tc/denom)
598c ori          else
599c ori           es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
600c ori          end if
601c ori          qg=eps*es/(p(i,icb(i))-es*(1.-eps))
602          qg=eps*es/(p(i,icb(i)+1)-es*(1.-eps))
603
604         alv=lv0-clmcpv*(ticb(i)-273.15)
605
606c ori c approximation here:
607c ori         tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i)
608c ori     &   -gz(i,icb(i))-alv*qg)/cpd
609
610c convect3: no approximation:
611         tp(i,icb(i)+1)=(ah0(i)-gz(i,icb(i)+1)-alv*qg)
612     :                /(cpd+(cl-cpd)*qnk(i))
613
614c ori         clw(i,icb(i))=qnk(i)-qg
615c ori         clw(i,icb(i))=max(0.0,clw(i,icb(i)))
616         clw(i,icb(i)+1)=qnk(i)-qg
617         clw(i,icb(i)+1)=max(0.0,clw(i,icb(i)+1))
618
619         rg=qg/(1.-qnk(i))
620c ori         tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi)
621c convect3: (qg utilise au lieu du vrai mixing ratio rg)
622         tvp(i,icb(i)+1)=tp(i,icb(i)+1)*(1.+qg/eps-qnk(i)) !whole thing
623
624  460   continue
625
626      return
627      end
628
629      SUBROUTINE cv30_trigger(len,nd,icb,plcl,p,th,tv,tvp
630     o                ,pbase,buoybase,iflag,sig,w0)
631      implicit none
632
633!-------------------------------------------------------------------
634! --- TRIGGERING
635!
636!       - computes the cloud base
637!   - triggering (crude in this version)
638!       - relaxation of sig and w0 when no convection
639!
640!       Caution1: if no convection, we set iflag=4
641!              (it used to be 0 in convect3)
642!
643!       Caution2: at this stage, tvp (and thus buoy) are know up
644!             through icb only!
645! -> the buoyancy below cloud base not (yet) set to the cloud base buoyancy
646!-------------------------------------------------------------------
647
648#include "cv30param.h"
649
650c input:
651      integer len, nd
652      integer icb(len)
653      real plcl(len), p(len,nd)
654      real th(len,nd), tv(len,nd), tvp(len,nd)
655
656c output:
657      real pbase(len), buoybase(len)
658
659c input AND output:
660      integer iflag(len)
661      real sig(len,nd), w0(len,nd)
662
663c local variables:
664      integer i,k
665      real tvpbase, tvbase, tdif, ath, ath1
666
667c
668c ***   set cloud base buoyancy at (plcl+dpbase) level buoyancy
669c
670      do 100 i=1,len
671       pbase(i) = plcl(i) + dpbase
672       tvpbase = tvp(i,icb(i))*(pbase(i)-p(i,icb(i)+1))
673     :                        /(p(i,icb(i))-p(i,icb(i)+1))
674     :         + tvp(i,icb(i)+1)*(p(i,icb(i))-pbase(i))
675     :                          /(p(i,icb(i))-p(i,icb(i)+1))
676       tvbase = tv(i,icb(i))*(pbase(i)-p(i,icb(i)+1))
677     :                      /(p(i,icb(i))-p(i,icb(i)+1))
678     :        + tv(i,icb(i)+1)*(p(i,icb(i))-pbase(i))
679     :                        /(p(i,icb(i))-p(i,icb(i)+1))
680       buoybase(i) = tvpbase - tvbase
681100   continue
682
683c
684c   ***   make sure that column is dry adiabatic between the surface  ***
685c   ***    and cloud base, and that lifted air is positively buoyant  ***
686c   ***                         at cloud base                         ***
687c   ***       if not, return to calling program after resetting       ***
688c   ***                        sig(i) and w0(i)                       ***
689c
690
691c oct3      do 200 i=1,len
692c oct3
693c oct3       tdif = buoybase(i)
694c oct3       ath1 = th(i,1)
695c oct3       ath  = th(i,icb(i)-1) - dttrig
696c oct3
697c oct3       if (tdif.lt.dtcrit .or. ath.gt.ath1) then
698c oct3         do 60 k=1,nl
699c oct3            sig(i,k) = beta*sig(i,k) - 2.*alpha*tdif*tdif
700c oct3            sig(i,k) = AMAX1(sig(i,k),0.0)
701c oct3            w0(i,k)  = beta*w0(i,k)
702c oct3   60    continue
703c oct3         iflag(i)=4 ! pour version vectorisee
704c oct3c convect3         iflag(i)=0
705c oct3cccc         return
706c oct3       endif
707c oct3
708c oct3200   continue
709 
710c -- oct3: on reecrit la boucle 200 (pour la vectorisation)
711
712      do  60 k=1,nl
713      do 200 i=1,len
714
715       tdif = buoybase(i)
716       ath1 = th(i,1)
717       ath  = th(i,icb(i)-1) - dttrig
718
719       if (tdif.lt.dtcrit .or. ath.gt.ath1) then
720            sig(i,k) = beta*sig(i,k) - 2.*alpha*tdif*tdif
721            sig(i,k) = AMAX1(sig(i,k),0.0)
722            w0(i,k)  = beta*w0(i,k)
723        iflag(i)=4 ! pour version vectorisee
724c convect3         iflag(i)=0
725       endif
726
727200   continue
728 60   continue
729
730c fin oct3 --
731
732      return
733      end
734
735      SUBROUTINE cv30_compress( len,nloc,ncum,nd,ntra
736     :    ,iflag1,nk1,icb1,icbs1
737     :    ,plcl1,tnk1,qnk1,gznk1,pbase1,buoybase1
738     :    ,t1,q1,qs1,u1,v1,gz1,th1
739     :    ,tra1
740     :    ,h1,lv1,cpn1,p1,ph1,tv1,tp1,tvp1,clw1
741     :    ,sig1,w01
742     o    ,iflag,nk,icb,icbs
743     o    ,plcl,tnk,qnk,gznk,pbase,buoybase
744     o    ,t,q,qs,u,v,gz,th
745     o    ,tra
746     o    ,h,lv,cpn,p,ph,tv,tp,tvp,clw
747     o    ,sig,w0  )
748      implicit none
749
750#include "cv30param.h"
751      include 'iniprint.h'
752
753c inputs:
754      integer len,ncum,nd,ntra,nloc
755      integer iflag1(len),nk1(len),icb1(len),icbs1(len)
756      real plcl1(len),tnk1(len),qnk1(len),gznk1(len)
757      real pbase1(len),buoybase1(len)
758      real t1(len,nd),q1(len,nd),qs1(len,nd),u1(len,nd),v1(len,nd)
759      real gz1(len,nd),h1(len,nd),lv1(len,nd),cpn1(len,nd)
760      real p1(len,nd),ph1(len,nd+1),tv1(len,nd),tp1(len,nd)
761      real tvp1(len,nd),clw1(len,nd)
762      real th1(len,nd)
763      real sig1(len,nd), w01(len,nd)
764      real tra1(len,nd,ntra)
765
766c outputs:
767c en fait, on a nloc=len pour l'instant (cf cv_driver)
768      integer iflag(nloc),nk(nloc),icb(nloc),icbs(nloc)
769      real plcl(nloc),tnk(nloc),qnk(nloc),gznk(nloc)
770      real pbase(nloc),buoybase(nloc)
771      real t(nloc,nd),q(nloc,nd),qs(nloc,nd),u(nloc,nd),v(nloc,nd)
772      real gz(nloc,nd),h(nloc,nd),lv(nloc,nd),cpn(nloc,nd)
773      real p(nloc,nd),ph(nloc,nd+1),tv(nloc,nd),tp(nloc,nd)
774      real tvp(nloc,nd),clw(nloc,nd)
775      real th(nloc,nd)
776      real sig(nloc,nd), w0(nloc,nd)
777      real tra(nloc,nd,ntra)
778
779c local variables:
780      integer i,k,nn,j
781
782      CHARACTER (LEN=20) :: modname='cv30_compress'
783      CHARACTER (LEN=80) :: abort_message
784
785
786      do 110 k=1,nl+1
787       nn=0
788      do 100 i=1,len
789      if(iflag1(i).eq.0)then
790        nn=nn+1
791        sig(nn,k)=sig1(i,k)
792        w0(nn,k)=w01(i,k)
793        t(nn,k)=t1(i,k)
794        q(nn,k)=q1(i,k)
795        qs(nn,k)=qs1(i,k)
796        u(nn,k)=u1(i,k)
797        v(nn,k)=v1(i,k)
798        gz(nn,k)=gz1(i,k)
799        h(nn,k)=h1(i,k)
800        lv(nn,k)=lv1(i,k)
801        cpn(nn,k)=cpn1(i,k)
802        p(nn,k)=p1(i,k)
803        ph(nn,k)=ph1(i,k)
804        tv(nn,k)=tv1(i,k)
805        tp(nn,k)=tp1(i,k)
806        tvp(nn,k)=tvp1(i,k)
807        clw(nn,k)=clw1(i,k)
808        th(nn,k)=th1(i,k)
809      endif
810 100    continue
811 110  continue
812
813c      do 121 j=1,ntra
814c      do 111 k=1,nd
815c       nn=0
816c      do 101 i=1,len
817c      if(iflag1(i).eq.0)then
818c       nn=nn+1
819c       tra(nn,k,j)=tra1(i,k,j)
820c      endif
821c 101  continue
822c 111  continue
823c 121  continue
824
825      if (nn.ne.ncum) then
826         write(lunout,*)'strange! nn not equal to ncum: ',nn,ncum
827         abort_message = ''
828         CALL abort_gcm (modname,abort_message,1)
829      endif
830
831      nn=0
832      do 150 i=1,len
833      if(iflag1(i).eq.0)then
834      nn=nn+1
835      pbase(nn)=pbase1(i)
836      buoybase(nn)=buoybase1(i)
837      plcl(nn)=plcl1(i)
838      tnk(nn)=tnk1(i)
839      qnk(nn)=qnk1(i)
840      gznk(nn)=gznk1(i)
841      nk(nn)=nk1(i)
842      icb(nn)=icb1(i)
843      icbs(nn)=icbs1(i)
844      iflag(nn)=iflag1(i)
845      endif
846 150  continue
847
848      return
849      end
850
851      SUBROUTINE cv30_undilute2(nloc,ncum,nd,icb,icbs,nk
852     :                       ,tnk,qnk,gznk,t,q,qs,gz
853     :                       ,p,h,tv,lv,pbase,buoybase,plcl
854     o                       ,inb,tp,tvp,clw,hp,ep,sigp,buoy)
855      implicit none
856
857C---------------------------------------------------------------------
858C Purpose:
859C     FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
860C     &
861C     COMPUTE THE PRECIPITATION EFFICIENCIES AND THE
862C     FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD
863C     &
864C     FIND THE LEVEL OF NEUTRAL BUOYANCY
865C
866C Main differences convect3/convect4:
867C       - icbs (input) is the first level above LCL (may differ from icb)
868C       - many minor differences in the iterations
869C       - condensed water not removed from tvp in convect3
870C   - vertical profile of buoyancy computed here (use of buoybase)
871C   - the determination of inb is different
872C   - no inb1, only inb in output
873C---------------------------------------------------------------------
874
875#include "cvthermo.h"
876#include "cv30param.h"
877#include "conema3.h"
878
879c inputs:
880      integer ncum, nd, nloc
881      integer icb(nloc), icbs(nloc), nk(nloc)
882      real t(nloc,nd), q(nloc,nd), qs(nloc,nd), gz(nloc,nd)
883      real p(nloc,nd)
884      real tnk(nloc), qnk(nloc), gznk(nloc)
885      real lv(nloc,nd), tv(nloc,nd), h(nloc,nd)
886      real pbase(nloc), buoybase(nloc), plcl(nloc)
887
888c outputs:
889      integer inb(nloc)
890      real tp(nloc,nd), tvp(nloc,nd), clw(nloc,nd)
891      real ep(nloc,nd), sigp(nloc,nd), hp(nloc,nd)
892      real buoy(nloc,nd)
893
894c local variables:
895      integer i, k
896      real tg,qg,ahg,alv,s,tc,es,denom,rg,tca,elacrit
897      real by, defrac, pden
898      real ah0(nloc), cape(nloc), capem(nloc), byp(nloc)
899      logical lcape(nloc)
900
901!=====================================================================
902! --- SOME INITIALIZATIONS
903!=====================================================================
904
905      do 170 k=1,nl
906      do 160 i=1,ncum
907       ep(i,k)=0.0
908       sigp(i,k)=spfac
909 160  continue
910 170  continue
911
912!=====================================================================
913! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
914!=====================================================================
915c
916c ---       The procedure is to solve the equation.
917c              cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
918c
919c   ***  Calculate certain parcel quantities, including static energy   ***
920c
921c
922      do 240 i=1,ncum
923         ah0(i)=(cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i)
924cdebug     &         +qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i)
925     &         +qnk(i)*(lv0-clmcpv*(tnk(i)-273.15))+gznk(i)
926 240  continue
927c
928c
929c    ***  Find lifted parcel quantities above cloud base    ***
930c
931c
932        do 300 k=minorig+1,nl
933          do 290 i=1,ncum
934c ori       if(k.ge.(icb(i)+1))then
935            if(k.ge.(icbs(i)+1))then ! convect3
936              tg=t(i,k)
937              qg=qs(i,k)
938cdebug        alv=lv0-clmcpv*(t(i,k)-t0)
939              alv=lv0-clmcpv*(t(i,k)-273.15)
940c
941c First iteration.
942c
943c ori          s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k))
944           s=cpd*(1.-qnk(i))+cl*qnk(i)      ! convect3
945     :      +alv*alv*qg/(rrv*t(i,k)*t(i,k)) ! convect3
946               s=1./s
947c ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k)
948           ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gz(i,k) ! convect3
949               tg=tg+s*(ah0(i)-ahg)
950c ori          tg=max(tg,35.0)
951cdebug         tc=tg-t0
952               tc=tg-273.15
953               denom=243.5+tc
954           denom=MAX(denom,1.0) ! convect3
955c ori          if(tc.ge.0.0)then
956                        es=6.112*exp(17.67*tc/denom)
957c ori          else
958c ori                   es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
959c ori          endif
960                        qg=eps*es/(p(i,k)-es*(1.-eps))
961c
962c Second iteration.
963c
964c ori          s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k))
965c ori          s=1./s
966c ori          ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k)
967           ahg=cpd*tg+(cl-cpd)*qnk(i)*tg+alv*qg+gz(i,k) ! convect3
968               tg=tg+s*(ah0(i)-ahg)
969c ori          tg=max(tg,35.0)
970cdebug         tc=tg-t0
971               tc=tg-273.15
972               denom=243.5+tc
973           denom=MAX(denom,1.0) ! convect3
974c ori          if(tc.ge.0.0)then
975                        es=6.112*exp(17.67*tc/denom)
976c ori          else
977c ori                   es=exp(23.33086-6111.72784/tg+0.15215*log(tg))
978c ori          endif
979                        qg=eps*es/(p(i,k)-es*(1.-eps))
980c
981cdebug         alv=lv0-clmcpv*(t(i,k)-t0)
982               alv=lv0-clmcpv*(t(i,k)-273.15)
983c      print*,'cpd dans convect2 ',cpd
984c      print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd'
985c      print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd
986
987c ori c approximation here:
988c ori        tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd
989
990c convect3: no approximation:
991           tp(i,k)=(ah0(i)-gz(i,k)-alv*qg)/(cpd+(cl-cpd)*qnk(i))
992
993               clw(i,k)=qnk(i)-qg
994               clw(i,k)=max(0.0,clw(i,k))
995               rg=qg/(1.-qnk(i))
996c ori               tvp(i,k)=tp(i,k)*(1.+rg*epsi)
997c convect3: (qg utilise au lieu du vrai mixing ratio rg):
998               tvp(i,k)=tp(i,k)*(1.+qg/eps-qnk(i)) ! whole thing
999            endif
1000  290     continue
1001  300   continue
1002c
1003!=====================================================================
1004! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF
1005! --- PRECIPITATION FALLING OUTSIDE OF CLOUD
1006! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I)
1007!=====================================================================
1008c
1009c ori      do 320 k=minorig+1,nl
1010      do 320 k=1,nl ! convect3
1011        do 310 i=1,ncum
1012           pden=ptcrit-pbcrit
1013           ep(i,k)=(plcl(i)-p(i,k)-pbcrit)/pden*epmax
1014           ep(i,k)=amax1(ep(i,k),0.0)
1015           ep(i,k)=amin1(ep(i,k),epmax)
1016           sigp(i,k)=spfac
1017c ori          if(k.ge.(nk(i)+1))then
1018c ori            tca=tp(i,k)-t0
1019c ori            if(tca.ge.0.0)then
1020c ori              elacrit=elcrit
1021c ori            else
1022c ori              elacrit=elcrit*(1.0-tca/tlcrit)
1023c ori            endif
1024c ori            elacrit=max(elacrit,0.0)
1025c ori            ep(i,k)=1.0-elacrit/max(clw(i,k),1.0e-8)
1026c ori            ep(i,k)=max(ep(i,k),0.0 )
1027c ori            ep(i,k)=min(ep(i,k),1.0 )
1028c ori            sigp(i,k)=sigs
1029c ori          endif
1030 310    continue
1031 320  continue
1032c
1033!=====================================================================
1034! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL
1035! --- VIRTUAL TEMPERATURE
1036!=====================================================================
1037c
1038c dans convect3, tvp est calcule en une seule fois, et sans retirer
1039c l'eau condensee (~> reversible CAPE)
1040c
1041c ori      do 340 k=minorig+1,nl
1042c ori        do 330 i=1,ncum
1043c ori        if(k.ge.(icb(i)+1))then
1044c ori          tvp(i,k)=tvp(i,k)*(1.0-qnk(i)+ep(i,k)*clw(i,k))
1045c oric         print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)'
1046c oric         print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)
1047c ori        endif
1048c ori 330    continue
1049c ori 340  continue
1050
1051c ori      do 350 i=1,ncum
1052c ori       tvp(i,nlp)=tvp(i,nl)-(gz(i,nlp)-gz(i,nl))/cpd
1053c ori 350  continue
1054
1055      do 350 i=1,ncum       ! convect3
1056       tp(i,nlp)=tp(i,nl)   ! convect3
1057 350  continue              ! convect3
1058c
1059c=====================================================================
1060c  --- EFFECTIVE VERTICAL PROFILE OF BUOYANCY (convect3 only):
1061c=====================================================================
1062
1063c-- this is for convect3 only:
1064
1065c first estimate of buoyancy:
1066
1067      do 500 i=1,ncum
1068       do 501 k=1,nl
1069        buoy(i,k)=tvp(i,k)-tv(i,k)
1070 501   continue
1071 500  continue
1072
1073c set buoyancy=buoybase for all levels below base
1074c for safety, set buoy(icb)=buoybase
1075
1076      do 505 i=1,ncum
1077       do 506 k=1,nl
1078        if((k.ge.icb(i)).and.(k.le.nl).and.(p(i,k).ge.pbase(i)))then
1079         buoy(i,k)=buoybase(i)
1080        endif
1081 506   continue
1082cIM cf. CRio/JYG 270807   buoy(icb(i),k)=buoybase(i)
1083       buoy(i,icb(i))=buoybase(i)
1084 505  continue
1085
1086c-- end convect3
1087
1088c=====================================================================
1089c  --- FIND THE FIRST MODEL LEVEL (INB) ABOVE THE PARCEL'S
1090c  --- LEVEL OF NEUTRAL BUOYANCY
1091c=====================================================================
1092c
1093c-- this is for convect3 only:
1094
1095      do 510 i=1,ncum
1096       inb(i)=nl-1
1097 510  continue
1098
1099      do 530 i=1,ncum
1100       do 535 k=1,nl-1
1101        if ((k.ge.icb(i)).and.(buoy(i,k).lt.dtovsh)) then
1102         inb(i)=MIN(inb(i),k)
1103        endif
1104 535   continue
1105 530  continue
1106
1107c-- end convect3
1108
1109c ori      do 510 i=1,ncum
1110c ori        cape(i)=0.0
1111c ori        capem(i)=0.0
1112c ori        inb(i)=icb(i)+1
1113c ori        inb1(i)=inb(i)
1114c ori 510  continue
1115c
1116c Originial Code
1117c
1118c     do 530 k=minorig+1,nl-1
1119c       do 520 i=1,ncum
1120c         if(k.ge.(icb(i)+1))then
1121c           by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1122c           byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1123c           cape(i)=cape(i)+by
1124c           if(by.ge.0.0)inb1(i)=k+1
1125c           if(cape(i).gt.0.0)then
1126c             inb(i)=k+1
1127c             capem(i)=cape(i)
1128c           endif
1129c         endif
1130c520    continue
1131c530  continue
1132c     do 540 i=1,ncum
1133c         byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl)
1134c         cape(i)=capem(i)+byp
1135c         defrac=capem(i)-cape(i)
1136c         defrac=max(defrac,0.001)
1137c         frac(i)=-cape(i)/defrac
1138c         frac(i)=min(frac(i),1.0)
1139c         frac(i)=max(frac(i),0.0)
1140c540   continue
1141c
1142c K Emanuel fix
1143c
1144c     call zilch(byp,ncum)
1145c     do 530 k=minorig+1,nl-1
1146c       do 520 i=1,ncum
1147c         if(k.ge.(icb(i)+1))then
1148c           by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1149c           cape(i)=cape(i)+by
1150c           if(by.ge.0.0)inb1(i)=k+1
1151c           if(cape(i).gt.0.0)then
1152c             inb(i)=k+1
1153c             capem(i)=cape(i)
1154c             byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1155c           endif
1156c         endif
1157c520    continue
1158c530  continue
1159c     do 540 i=1,ncum
1160c         inb(i)=max(inb(i),inb1(i))
1161c         cape(i)=capem(i)+byp(i)
1162c         defrac=capem(i)-cape(i)
1163c         defrac=max(defrac,0.001)
1164c         frac(i)=-cape(i)/defrac
1165c         frac(i)=min(frac(i),1.0)
1166c         frac(i)=max(frac(i),0.0)
1167c540   continue
1168c
1169c J Teixeira fix
1170c
1171c ori      call zilch(byp,ncum)
1172c ori      do 515 i=1,ncum
1173c ori        lcape(i)=.true.
1174c ori 515  continue
1175c ori      do 530 k=minorig+1,nl-1
1176c ori        do 520 i=1,ncum
1177c ori          if(cape(i).lt.0.0)lcape(i)=.false.
1178c ori          if((k.ge.(icb(i)+1)).and.lcape(i))then
1179c ori            by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
1180c ori            byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
1181c ori            cape(i)=cape(i)+by
1182c ori            if(by.ge.0.0)inb1(i)=k+1
1183c ori            if(cape(i).gt.0.0)then
1184c ori              inb(i)=k+1
1185c ori              capem(i)=cape(i)
1186c ori            endif
1187c ori          endif
1188c ori 520    continue
1189c ori 530  continue
1190c ori      do 540 i=1,ncum
1191c ori          cape(i)=capem(i)+byp(i)
1192c ori          defrac=capem(i)-cape(i)
1193c ori          defrac=max(defrac,0.001)
1194c ori          frac(i)=-cape(i)/defrac
1195c ori          frac(i)=min(frac(i),1.0)
1196c ori          frac(i)=max(frac(i),0.0)
1197c ori 540  continue
1198c
1199c=====================================================================
1200c ---   CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL
1201c=====================================================================
1202c
1203cym      do i=1,ncum*nlp
1204cym       hp(i,1)=h(i,1)
1205cym      enddo
1206
1207      do k=1,nlp
1208        do i=1,ncum
1209          hp(i,k)=h(i,k)
1210        enddo
1211      enddo
1212
1213      do 600 k=minorig+1,nl
1214        do 590 i=1,ncum
1215        if((k.ge.icb(i)).and.(k.le.inb(i)))then
1216          hp(i,k)=h(i,nk(i))+(lv(i,k)+(cpd-cpv)*t(i,k))*ep(i,k)*clw(i,k)
1217        endif
1218 590    continue
1219 600  continue
1220
1221        return
1222        end
1223
1224      SUBROUTINE cv30_closure(nloc,ncum,nd,icb,inb
1225     :                      ,pbase,p,ph,tv,buoy
1226     o                      ,sig,w0,cape,m)
1227      implicit none
1228
1229!===================================================================
1230! ---  CLOSURE OF CONVECT3
1231!
1232! vectorization: S. Bony
1233!===================================================================
1234
1235#include "cvthermo.h"
1236#include "cv30param.h"
1237
1238c input:
1239      integer ncum, nd, nloc
1240      integer icb(nloc), inb(nloc)
1241      real pbase(nloc)
1242      real p(nloc,nd), ph(nloc,nd+1)
1243      real tv(nloc,nd), buoy(nloc,nd)
1244
1245c input/output:
1246      real sig(nloc,nd), w0(nloc,nd)
1247
1248c output:
1249      real cape(nloc)
1250      real m(nloc,nd)
1251
1252c local variables:
1253      integer i, j, k, icbmax
1254      real deltap, fac, w, amu
1255      real dtmin(nloc,nd), sigold(nloc,nd)
1256
1257
1258c -------------------------------------------------------
1259c -- Initialization
1260c -------------------------------------------------------
1261
1262      do k=1,nl
1263       do i=1,ncum
1264        m(i,k)=0.0
1265       enddo
1266      enddo
1267
1268c -------------------------------------------------------
1269c -- Reset sig(i) and w0(i) for i>inb and i<icb   
1270c -------------------------------------------------------
1271     
1272c update sig and w0 above LNB:
1273
1274      do 100 k=1,nl-1
1275       do 110 i=1,ncum
1276        if ((inb(i).lt.(nl-1)).and.(k.ge.(inb(i)+1)))then
1277         sig(i,k)=beta*sig(i,k)
1278     :            +2.*alpha*buoy(i,inb(i))*ABS(buoy(i,inb(i)))
1279         sig(i,k)=AMAX1(sig(i,k),0.0)
1280         w0(i,k)=beta*w0(i,k)
1281        endif
1282 110   continue
1283 100  continue
1284
1285c compute icbmax:
1286
1287      icbmax=2
1288      do 200 i=1,ncum
1289        icbmax=MAX(icbmax,icb(i))
1290 200  continue
1291
1292c update sig and w0 below cloud base:
1293
1294      do 300 k=1,icbmax
1295       do 310 i=1,ncum
1296        if (k.le.icb(i))then
1297         sig(i,k)=beta*sig(i,k)-2.*alpha*buoy(i,icb(i))*buoy(i,icb(i))
1298         sig(i,k)=amax1(sig(i,k),0.0)
1299         w0(i,k)=beta*w0(i,k)
1300        endif
1301310    continue
1302300    continue
1303
1304c!      if(inb.lt.(nl-1))then
1305c!         do 85 i=inb+1,nl-1
1306c!            sig(i)=beta*sig(i)+2.*alpha*buoy(inb)*
1307c!     1              abs(buoy(inb))
1308c!            sig(i)=amax1(sig(i),0.0)
1309c!            w0(i)=beta*w0(i)
1310c!   85    continue
1311c!      end if
1312
1313c!      do 87 i=1,icb
1314c!         sig(i)=beta*sig(i)-2.*alpha*buoy(icb)*buoy(icb)
1315c!         sig(i)=amax1(sig(i),0.0)
1316c!         w0(i)=beta*w0(i)
1317c!   87 continue
1318
1319c -------------------------------------------------------------
1320c -- Reset fractional areas of updrafts and w0 at initial time
1321c -- and after 10 time steps of no convection
1322c -------------------------------------------------------------
1323     
1324      do 400 k=1,nl-1
1325       do 410 i=1,ncum
1326        if (sig(i,nd).lt.1.5.or.sig(i,nd).gt.12.0)then
1327         sig(i,k)=0.0
1328         w0(i,k)=0.0
1329        endif
1330 410   continue
1331 400  continue
1332
1333c -------------------------------------------------------------
1334c -- Calculate convective available potential energy (cape), 
1335c -- vertical velocity (w), fractional area covered by   
1336c -- undilute updraft (sig), and updraft mass flux (m) 
1337c -------------------------------------------------------------
1338
1339      do 500 i=1,ncum
1340       cape(i)=0.0
1341 500  continue
1342
1343c compute dtmin (minimum buoyancy between ICB and given level k):
1344
1345      do i=1,ncum
1346       do k=1,nl
1347         dtmin(i,k)=100.0
1348       enddo
1349      enddo
1350
1351      do 550 i=1,ncum
1352       do 560 k=1,nl
1353         do 570 j=minorig,nl
1354          if ( (k.ge.(icb(i)+1)).and.(k.le.inb(i)).and.
1355     :         (j.ge.icb(i)).and.(j.le.(k-1)) )then
1356           dtmin(i,k)=AMIN1(dtmin(i,k),buoy(i,j))
1357          endif
1358 570     continue
1359 560   continue
1360 550  continue
1361
1362c the interval on which cape is computed starts at pbase :
1363
1364      do 600 k=1,nl
1365       do 610 i=1,ncum
1366
1367        if ((k.ge.(icb(i)+1)).and.(k.le.inb(i))) then
1368
1369         deltap = MIN(pbase(i),ph(i,k-1))-MIN(pbase(i),ph(i,k))
1370         cape(i)=cape(i)+rrd*buoy(i,k-1)*deltap/p(i,k-1)
1371         cape(i)=AMAX1(0.0,cape(i))
1372         sigold(i,k)=sig(i,k)
1373
1374c         dtmin(i,k)=100.0
1375c         do 97 j=icb(i),k-1 ! mauvaise vectorisation
1376c          dtmin(i,k)=AMIN1(dtmin(i,k),buoy(i,j))
1377c  97     continue
1378
1379         sig(i,k)=beta*sig(i,k)+alpha*dtmin(i,k)*ABS(dtmin(i,k))
1380         sig(i,k)=amax1(sig(i,k),0.0)
1381         sig(i,k)=amin1(sig(i,k),0.01)
1382         fac=AMIN1(((dtcrit-dtmin(i,k))/dtcrit),1.0)
1383         w=(1.-beta)*fac*SQRT(cape(i))+beta*w0(i,k)
1384         amu=0.5*(sig(i,k)+sigold(i,k))*w
1385         m(i,k)=amu*0.007*p(i,k)*(ph(i,k)-ph(i,k+1))/tv(i,k)
1386         w0(i,k)=w
1387        endif
1388
1389 610   continue
1390 600  continue
1391
1392      do 700 i=1,ncum
1393       w0(i,icb(i))=0.5*w0(i,icb(i)+1)
1394       m(i,icb(i))=0.5*m(i,icb(i)+1)
1395     :             *(ph(i,icb(i))-ph(i,icb(i)+1))
1396     :             /(ph(i,icb(i)+1)-ph(i,icb(i)+2))
1397       sig(i,icb(i))=sig(i,icb(i)+1)
1398       sig(i,icb(i)-1)=sig(i,icb(i))
1399 700  continue
1400
1401
1402c!      cape=0.0
1403c!      do 98 i=icb+1,inb
1404c!         deltap = min(pbase,ph(i-1))-min(pbase,ph(i))
1405c!         cape=cape+rrd*buoy(i-1)*deltap/p(i-1)
1406c!         dcape=rrd*buoy(i-1)*deltap/p(i-1)
1407c!         dlnp=deltap/p(i-1)
1408c!         cape=amax1(0.0,cape)
1409c!         sigold=sig(i)
1410
1411c!         dtmin=100.0
1412c!         do 97 j=icb,i-1
1413c!            dtmin=amin1(dtmin,buoy(j))
1414c!   97    continue
1415
1416c!         sig(i)=beta*sig(i)+alpha*dtmin*abs(dtmin)
1417c!         sig(i)=amax1(sig(i),0.0)
1418c!         sig(i)=amin1(sig(i),0.01)
1419c!         fac=amin1(((dtcrit-dtmin)/dtcrit),1.0)
1420c!         w=(1.-beta)*fac*sqrt(cape)+beta*w0(i)
1421c!         amu=0.5*(sig(i)+sigold)*w
1422c!         m(i)=amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i)
1423c!         w0(i)=w
1424c!   98 continue
1425c!      w0(icb)=0.5*w0(icb+1)
1426c!      m(icb)=0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2))
1427c!      sig(icb)=sig(icb+1)
1428c!      sig(icb-1)=sig(icb)
1429
1430       return
1431       end
1432
1433      SUBROUTINE cv30_mixing(nloc,ncum,nd,na,ntra,icb,nk,inb
1434     :                    ,ph,t,rr,rs,u,v,tra,h,lv,qnk
1435     :                    ,hp,tv,tvp,ep,clw,m,sig
1436     :   ,ment,qent,uent,vent,sij,elij,ments,qents,traent)
1437      implicit none
1438
1439!---------------------------------------------------------------------
1440! a faire:
1441!       - changer rr(il,1) -> qnk(il)
1442!   - vectorisation de la partie normalisation des flux (do 789...)
1443!---------------------------------------------------------------------
1444
1445#include "cvthermo.h"
1446#include "cv30param.h"
1447
1448c inputs:
1449      integer ncum, nd, na, ntra, nloc
1450      integer icb(nloc), inb(nloc), nk(nloc)
1451      real sig(nloc,nd)
1452      real qnk(nloc)
1453      real ph(nloc,nd+1)
1454      real t(nloc,nd), rr(nloc,nd), rs(nloc,nd)
1455      real u(nloc,nd), v(nloc,nd)
1456      real tra(nloc,nd,ntra) ! input of convect3
1457      real lv(nloc,na), h(nloc,na), hp(nloc,na)
1458      real tv(nloc,na), tvp(nloc,na), ep(nloc,na), clw(nloc,na)
1459      real m(nloc,na)        ! input of convect3
1460
1461c outputs:
1462      real ment(nloc,na,na), qent(nloc,na,na)
1463      real uent(nloc,na,na), vent(nloc,na,na)
1464      real sij(nloc,na,na), elij(nloc,na,na)
1465      real traent(nloc,nd,nd,ntra)
1466      real ments(nloc,nd,nd), qents(nloc,nd,nd)
1467      real sigij(nloc,nd,nd)
1468
1469c local variables:
1470      integer i, j, k, il, im, jm
1471      integer num1, num2
1472      integer nent(nloc,na)
1473      real rti, bf2, anum, denom, dei, altem, cwat, stemp, qp
1474      real alt, smid, sjmin, sjmax, delp, delm
1475      real asij(nloc), smax(nloc), scrit(nloc)
1476      real asum(nloc,nd),bsum(nloc,nd),csum(nloc,nd)
1477      real wgh
1478      real zm(nloc,na)
1479      logical lwork(nloc)
1480
1481c=====================================================================
1482c --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS
1483c=====================================================================
1484
1485c ori        do 360 i=1,ncum*nlp
1486        do 361 j=1,nl
1487        do 360 i=1,ncum
1488          nent(i,j)=0
1489c in convect3, m is computed in cv3_closure
1490c ori          m(i,1)=0.0
1491 360    continue
1492 361    continue
1493
1494c ori      do 400 k=1,nlp
1495c ori       do 390 j=1,nlp
1496      do 400 j=1,nl
1497       do 390 k=1,nl
1498          do 385 i=1,ncum
1499            qent(i,k,j)=rr(i,j)
1500            uent(i,k,j)=u(i,j)
1501            vent(i,k,j)=v(i,j)
1502            elij(i,k,j)=0.0
1503cym            ment(i,k,j)=0.0
1504cym            sij(i,k,j)=0.0
1505 385      continue
1506 390    continue
1507 400  continue
1508
1509cym
1510      ment(1:ncum,1:nd,1:nd)=0.0
1511      sij(1:ncum,1:nd,1:nd)=0.0
1512     
1513c      do k=1,ntra
1514c       do j=1,nd  ! instead nlp
1515c        do i=1,nd ! instead nlp
1516c         do il=1,ncum
1517c            traent(il,i,j,k)=tra(il,j,k)
1518c         enddo
1519c        enddo
1520c       enddo
1521c      enddo
1522      zm(:,:)=0.
1523
1524c=====================================================================
1525c --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING
1526c --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING
1527c --- FRACTION (sij)
1528c=====================================================================
1529
1530      do 750 i=minorig+1, nl
1531
1532       do 710 j=minorig,nl
1533        do 700 il=1,ncum
1534         if( (i.ge.icb(il)).and.(i.le.inb(il)).and.
1535     :      (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then
1536
1537          rti=rr(il,1)-ep(il,i)*clw(il,i)
1538          bf2=1.+lv(il,j)*lv(il,j)*rs(il,j)/(rrv*t(il,j)*t(il,j)*cpd)
1539          anum=h(il,j)-hp(il,i)+(cpv-cpd)*t(il,j)*(rti-rr(il,j))
1540          denom=h(il,i)-hp(il,i)+(cpd-cpv)*(rr(il,i)-rti)*t(il,j)
1541          dei=denom
1542          if(abs(dei).lt.0.01)dei=0.01
1543          sij(il,i,j)=anum/dei
1544          sij(il,i,i)=1.0
1545          altem=sij(il,i,j)*rr(il,i)+(1.-sij(il,i,j))*rti-rs(il,j)
1546          altem=altem/bf2
1547          cwat=clw(il,j)*(1.-ep(il,j))
1548          stemp=sij(il,i,j)
1549          if((stemp.lt.0.0.or.stemp.gt.1.0.or.altem.gt.cwat)
1550     :                 .and.j.gt.i)then
1551           anum=anum-lv(il,j)*(rti-rs(il,j)-cwat*bf2)
1552           denom=denom+lv(il,j)*(rr(il,i)-rti)
1553           if(abs(denom).lt.0.01)denom=0.01
1554           sij(il,i,j)=anum/denom
1555           altem=sij(il,i,j)*rr(il,i)+(1.-sij(il,i,j))*rti-rs(il,j)
1556           altem=altem-(bf2-1.)*cwat
1557          end if
1558         if(sij(il,i,j).gt.0.0.and.sij(il,i,j).lt.0.95)then
1559          qent(il,i,j)=sij(il,i,j)*rr(il,i)+(1.-sij(il,i,j))*rti
1560          uent(il,i,j)=sij(il,i,j)*u(il,i)+(1.-sij(il,i,j))*u(il,nk(il))
1561          vent(il,i,j)=sij(il,i,j)*v(il,i)+(1.-sij(il,i,j))*v(il,nk(il))
1562c!!!      do k=1,ntra
1563c!!!      traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k)
1564c!!!     :      +(1.-sij(il,i,j))*tra(il,nk(il),k)
1565c!!!      end do
1566          elij(il,i,j)=altem
1567          elij(il,i,j)=amax1(0.0,elij(il,i,j))
1568          ment(il,i,j)=m(il,i)/(1.-sij(il,i,j))
1569          nent(il,i)=nent(il,i)+1
1570         end if
1571         sij(il,i,j)=amax1(0.0,sij(il,i,j))
1572         sij(il,i,j)=amin1(1.0,sij(il,i,j))
1573         endif ! new
1574 700   continue
1575 710  continue
1576
1577c       do k=1,ntra
1578c        do j=minorig,nl
1579c         do il=1,ncum
1580c          if( (i.ge.icb(il)).and.(i.le.inb(il)).and.
1581c     :       (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then
1582c            traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k)
1583c     :            +(1.-sij(il,i,j))*tra(il,nk(il),k)
1584c          endif
1585c         enddo
1586c        enddo
1587c       enddo
1588
1589c
1590c   ***   if no air can entrain at level i assume that updraft detrains  ***
1591c   ***   at that level and calculate detrained air flux and properties  ***
1592c
1593
1594c@      do 170 i=icb(il),inb(il)
1595
1596      do 740 il=1,ncum
1597      if ((i.ge.icb(il)).and.(i.le.inb(il)).and.(nent(il,i).eq.0)) then
1598c@      if(nent(il,i).eq.0)then
1599      ment(il,i,i)=m(il,i)
1600      qent(il,i,i)=rr(il,nk(il))-ep(il,i)*clw(il,i)
1601      uent(il,i,i)=u(il,nk(il))
1602      vent(il,i,i)=v(il,nk(il))
1603      elij(il,i,i)=clw(il,i)
1604cMAF      sij(il,i,i)=1.0
1605      sij(il,i,i)=0.0
1606      end if
1607 740  continue
1608 750  continue
1609 
1610c      do j=1,ntra
1611c       do i=minorig+1,nl
1612c        do il=1,ncum
1613c         if (i.ge.icb(il) .and. i.le.inb(il) .and. nent(il,i).eq.0) then
1614c          traent(il,i,i,j)=tra(il,nk(il),j)
1615c         endif
1616c        enddo
1617c       enddo
1618c      enddo
1619
1620      do 100 j=minorig,nl
1621      do 101 i=minorig,nl
1622      do 102 il=1,ncum
1623      if ((j.ge.(icb(il)-1)).and.(j.le.inb(il))
1624     :    .and.(i.ge.icb(il)).and.(i.le.inb(il)))then
1625       sigij(il,i,j)=sij(il,i,j)
1626      endif
1627 102  continue
1628 101  continue
1629 100  continue
1630c@      enddo
1631
1632c@170   continue
1633
1634c=====================================================================
1635c   ---  NORMALIZE ENTRAINED AIR MASS FLUXES
1636c   ---  TO REPRESENT EQUAL PROBABILITIES OF MIXING
1637c=====================================================================
1638
1639cym      call zilch(asum,ncum*nd)
1640cym      call zilch(bsum,ncum*nd)
1641cym      call zilch(csum,ncum*nd)
1642      call zilch(asum,nloc*nd)
1643      call zilch(csum,nloc*nd)
1644      call zilch(csum,nloc*nd)
1645
1646      do il=1,ncum
1647       lwork(il) = .FALSE.
1648      enddo
1649
1650      DO 789 i=minorig+1,nl
1651
1652      num1=0
1653      do il=1,ncum
1654       if ( i.ge.icb(il) .and. i.le.inb(il) ) num1=num1+1
1655      enddo
1656      if (num1.le.0) goto 789
1657
1658
1659      do 781 il=1,ncum
1660       if ( i.ge.icb(il) .and. i.le.inb(il) ) then
1661        lwork(il)=(nent(il,i).ne.0)
1662        qp=rr(il,1)-ep(il,i)*clw(il,i)
1663        anum=h(il,i)-hp(il,i)-lv(il,i)*(qp-rs(il,i))
1664     :           +(cpv-cpd)*t(il,i)*(qp-rr(il,i))
1665        denom=h(il,i)-hp(il,i)+lv(il,i)*(rr(il,i)-qp)
1666     :           +(cpd-cpv)*t(il,i)*(rr(il,i)-qp)
1667        if(abs(denom).lt.0.01)denom=0.01
1668        scrit(il)=anum/denom
1669        alt=qp-rs(il,i)+scrit(il)*(rr(il,i)-qp)
1670        if(scrit(il).le.0.0.or.alt.le.0.0)scrit(il)=1.0
1671        smax(il)=0.0
1672        asij(il)=0.0
1673       endif
1674781   continue
1675
1676      do 175 j=nl,minorig,-1
1677
1678      num2=0
1679      do il=1,ncum
1680       if ( i.ge.icb(il) .and. i.le.inb(il) .and.
1681     :      j.ge.(icb(il)-1) .and. j.le.inb(il)
1682     :      .and. lwork(il) ) num2=num2+1
1683      enddo
1684      if (num2.le.0) goto 175
1685
1686      do 782 il=1,ncum
1687      if ( i.ge.icb(il) .and. i.le.inb(il) .and.
1688     :      j.ge.(icb(il)-1) .and. j.le.inb(il)
1689     :      .and. lwork(il) ) then
1690
1691       if(sij(il,i,j).gt.1.0e-16.and.sij(il,i,j).lt.0.95)then
1692        wgh=1.0
1693        if(j.gt.i)then
1694         sjmax=amax1(sij(il,i,j+1),smax(il))
1695         sjmax=amin1(sjmax,scrit(il))
1696         smax(il)=amax1(sij(il,i,j),smax(il))
1697         sjmin=amax1(sij(il,i,j-1),smax(il))
1698         sjmin=amin1(sjmin,scrit(il))
1699         if(sij(il,i,j).lt.(smax(il)-1.0e-16))wgh=0.0
1700         smid=amin1(sij(il,i,j),scrit(il))
1701        else
1702         sjmax=amax1(sij(il,i,j+1),scrit(il))
1703         smid=amax1(sij(il,i,j),scrit(il))
1704         sjmin=0.0
1705         if(j.gt.1)sjmin=sij(il,i,j-1)
1706         sjmin=amax1(sjmin,scrit(il))
1707        endif
1708        delp=abs(sjmax-smid)
1709        delm=abs(sjmin-smid)
1710        asij(il)=asij(il)+wgh*(delp+delm)
1711        ment(il,i,j)=ment(il,i,j)*(delp+delm)*wgh
1712       endif
1713      endif
1714782   continue
1715
1716175   continue
1717
1718      do il=1,ncum
1719       if (i.ge.icb(il).and.i.le.inb(il).and.lwork(il)) then
1720        asij(il)=amax1(1.0e-16,asij(il))
1721        asij(il)=1.0/asij(il)
1722        asum(il,i)=0.0
1723        bsum(il,i)=0.0
1724        csum(il,i)=0.0
1725       endif
1726      enddo
1727
1728      do 180 j=minorig,nl
1729       do il=1,ncum
1730        if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1731     :   .and. j.ge.(icb(il)-1) .and. j.le.inb(il) ) then
1732         ment(il,i,j)=ment(il,i,j)*asij(il)
1733        endif
1734       enddo
1735180   continue
1736
1737      do 190 j=minorig,nl
1738       do il=1,ncum
1739        if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1740     :   .and. j.ge.(icb(il)-1) .and. j.le.inb(il) ) then
1741         asum(il,i)=asum(il,i)+ment(il,i,j)
1742         ment(il,i,j)=ment(il,i,j)*sig(il,j)
1743         bsum(il,i)=bsum(il,i)+ment(il,i,j)
1744        endif
1745       enddo
1746190   continue
1747
1748      do il=1,ncum
1749       if (i.ge.icb(il).and.i.le.inb(il).and.lwork(il)) then
1750        bsum(il,i)=amax1(bsum(il,i),1.0e-16)
1751        bsum(il,i)=1.0/bsum(il,i)
1752       endif
1753      enddo
1754
1755      do 195 j=minorig,nl
1756       do il=1,ncum
1757        if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1758     :   .and. j.ge.(icb(il)-1) .and. j.le.inb(il) ) then
1759         ment(il,i,j)=ment(il,i,j)*asum(il,i)*bsum(il,i)
1760        endif
1761       enddo
1762195   continue
1763
1764      do 197 j=minorig,nl
1765       do il=1,ncum
1766        if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1767     :   .and. j.ge.(icb(il)-1) .and. j.le.inb(il) ) then
1768         csum(il,i)=csum(il,i)+ment(il,i,j)
1769        endif
1770       enddo
1771197   continue
1772
1773      do il=1,ncum
1774       if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1775     :     .and. csum(il,i).lt.m(il,i) ) then
1776        nent(il,i)=0
1777        ment(il,i,i)=m(il,i)
1778        qent(il,i,i)=rr(il,1)-ep(il,i)*clw(il,i)
1779        uent(il,i,i)=u(il,nk(il))
1780        vent(il,i,i)=v(il,nk(il))
1781        elij(il,i,i)=clw(il,i)
1782cMAF        sij(il,i,i)=1.0
1783        sij(il,i,i)=0.0
1784       endif
1785      enddo ! il
1786
1787c      do j=1,ntra
1788c       do il=1,ncum
1789c        if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)
1790c     :     .and. csum(il,i).lt.m(il,i) ) then
1791c         traent(il,i,i,j)=tra(il,nk(il),j)
1792c        endif
1793c       enddo
1794c      enddo
1795789   continue
1796c     
1797c MAF: renormalisation de MENT
1798      do jm=1,nd
1799        do im=1,nd
1800          do il=1,ncum
1801          zm(il,im)=zm(il,im)+(1.-sij(il,im,jm))*ment(il,im,jm)
1802         end do
1803        end do
1804      end do
1805c
1806      do jm=1,nd
1807        do im=1,nd
1808          do il=1,ncum
1809          if(zm(il,im).ne.0.) then
1810          ment(il,im,jm)=ment(il,im,jm)*m(il,im)/zm(il,im)
1811          endif
1812         end do
1813       end do
1814      end do
1815c
1816      do jm=1,nd
1817       do im=1,nd
1818        do 999 il=1,ncum
1819         qents(il,im,jm)=qent(il,im,jm)
1820         ments(il,im,jm)=ment(il,im,jm)
1821999     continue
1822       enddo
1823      enddo
1824
1825      return
1826      end
1827
1828
1829      SUBROUTINE cv30_unsat(nloc,ncum,nd,na,ntra,icb,inb
1830     :              ,t,rr,rs,gz,u,v,tra,p,ph
1831     :              ,th,tv,lv,cpn,ep,sigp,clw
1832     :              ,m,ment,elij,delt,plcl
1833     :              ,mp,rp,up,vp,trap,wt,water,evap,b ! RomP-jyg
1834     :              ,wdtrainA,wdtrainM)               ! 26/08/10  RomP-jyg
1835      implicit none
1836
1837
1838#include "cvthermo.h"
1839#include "cv30param.h"
1840#include "cvflag.h"
1841
1842c inputs:
1843      integer ncum, nd, na, ntra, nloc
1844      integer icb(nloc), inb(nloc)
1845      real delt, plcl(nloc)
1846      real t(nloc,nd), rr(nloc,nd), rs(nloc,nd)
1847      real u(nloc,nd), v(nloc,nd)
1848      real tra(nloc,nd,ntra)
1849      real p(nloc,nd), ph(nloc,nd+1)
1850      real th(nloc,na), gz(nloc,na)
1851      real lv(nloc,na), ep(nloc,na), sigp(nloc,na), clw(nloc,na)
1852      real cpn(nloc,na), tv(nloc,na)
1853      real m(nloc,na), ment(nloc,na,na), elij(nloc,na,na)
1854
1855c outputs:
1856      real mp(nloc,na), rp(nloc,na), up(nloc,na), vp(nloc,na)
1857      real water(nloc,na), evap(nloc,na), wt(nloc,na)
1858      real trap(nloc,na,ntra)
1859      real b(nloc,na)
1860! 25/08/10 - RomP---- ajout des masses precipitantes ejectees
1861! lascendance adiabatique et des flux melanges Pa et Pm.
1862! Distinction des wdtrain
1863! Pa = wdtrainA     Pm = wdtrainM
1864      real  wdtrainA(nloc,na), wdtrainM(nloc,na)
1865
1866c local variables
1867      integer i,j,k,il,num1
1868      real tinv, delti
1869      real awat, afac, afac1, afac2, bfac
1870      real pr1, pr2, sigt, b6, c6, revap, tevap, delth
1871      real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf
1872      real ampmax
1873      real lvcp(nloc,na)
1874      real wdtrain(nloc)
1875      logical lwork(nloc)
1876
1877
1878c------------------------------------------------------
1879
1880        delti = 1./delt
1881        tinv=1./3.
1882
1883        mp(:,:)=0.
1884
1885        do i=1,nl
1886         do il=1,ncum
1887          mp(il,i)=0.0
1888          rp(il,i)=rr(il,i)
1889          up(il,i)=u(il,i)
1890          vp(il,i)=v(il,i)
1891          wt(il,i)=0.001
1892          water(il,i)=0.0
1893          evap(il,i)=0.0
1894          b(il,i)=0.0
1895          lvcp(il,i)=lv(il,i)/cpn(il,i)
1896         enddo
1897        enddo
1898
1899c        do k=1,ntra
1900c         do i=1,nd
1901c          do il=1,ncum
1902c           trap(il,i,k)=tra(il,i,k)
1903c          enddo
1904c         enddo
1905c        enddo
1906!! RomP >>>
1907         do i=1,nd
1908          do il=1,ncum
1909          wdtrainA(il,i)=0.0     
1910          wdtrainM(il,i)=0.0     
1911         enddo
1912        enddo
1913!! RomP <<<
1914c
1915c   ***  check whether ep(inb)=0, if so, skip precipitating    ***
1916c   ***             downdraft calculation                      ***
1917c
1918
1919        do il=1,ncum
1920          lwork(il)=.TRUE.
1921          if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE.
1922        enddo
1923
1924        call zilch(wdtrain,ncum)
1925 
1926        DO 400 i=nl+1,1,-1
1927
1928        num1=0
1929        do il=1,ncum
1930         if ( i.le.inb(il) .and. lwork(il) ) num1=num1+1
1931        enddo
1932        if (num1.le.0) goto 400
1933
1934c
1935c   ***  integrate liquid water equation to find condensed water   ***
1936c   ***                and condensed water flux                    ***
1937c
1938
1939c
1940c    ***                    begin downdraft loop                    ***
1941c
1942
1943c
1944c    ***              calculate detrained precipitation             ***
1945c
1946       do il=1,ncum
1947        if (i.le.inb(il) .and. lwork(il)) then
1948         if (cvflag_grav) then
1949          wdtrain(il)=grav*ep(il,i)*m(il,i)*clw(il,i)
1950          wdtrainA(il,i) = wdtrain(il)/grav     !   Pa  26/08/10   RomP
1951         else
1952          wdtrain(il)=10.0*ep(il,i)*m(il,i)*clw(il,i)
1953          wdtrainA(il,i) = wdtrain(il)/10.      !   Pa  26/08/10   RomP
1954         endif
1955        endif
1956       enddo
1957
1958       if(i.gt.1)then
1959
1960        do 320 j=1,i-1
1961         do il=1,ncum
1962          if (i.le.inb(il) .and. lwork(il)) then
1963           awat=elij(il,j,i)-(1.-ep(il,i))*clw(il,i)
1964           awat=amax1(awat,0.0)
1965           if (cvflag_grav) then
1966            wdtrain(il)=wdtrain(il)+grav*awat*ment(il,j,i)
1967           else
1968            wdtrain(il)=wdtrain(il)+10.0*awat*ment(il,j,i)
1969           endif
1970          endif
1971         enddo
1972320     continue
1973         do il=1,ncum
1974           if (cvflag_grav) then
1975           wdtrainM(il,i) = wdtrain(il)/grav-wdtrainA(il,i)    !   Pm  26/08/10   RomP
1976           else
1977           wdtrainM(il,i) = wdtrain(il)/10.-wdtrainA(il,i)    !   Pm  26/08/10   RomP
1978           endif
1979         enddo
1980
1981       endif
1982
1983c
1984c    ***    find rain water and evaporation using provisional   ***
1985c    ***              estimates of rp(i)and rp(i-1)             ***
1986c
1987
1988      do 999 il=1,ncum
1989
1990       if (i.le.inb(il) .and. lwork(il)) then
1991
1992      wt(il,i)=45.0
1993
1994      if(i.lt.inb(il))then
1995       rp(il,i)=rp(il,i+1)
1996     :       +(cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il,i)
1997       rp(il,i)=0.5*(rp(il,i)+rr(il,i))
1998      endif
1999      rp(il,i)=amax1(rp(il,i),0.0)
2000      rp(il,i)=amin1(rp(il,i),rs(il,i))
2001      rp(il,inb(il))=rr(il,inb(il))
2002
2003      if(i.eq.1)then
2004       afac=p(il,1)*(rs(il,1)-rp(il,1))/(1.0e4+2000.0*p(il,1)*rs(il,1))
2005      else
2006       rp(il,i-1)=rp(il,i)
2007     :          +(cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il,i)
2008       rp(il,i-1)=0.5*(rp(il,i-1)+rr(il,i-1))
2009       rp(il,i-1)=amin1(rp(il,i-1),rs(il,i-1))
2010       rp(il,i-1)=amax1(rp(il,i-1),0.0)
2011       afac1=p(il,i)*(rs(il,i)-rp(il,i))/(1.0e4+2000.0*p(il,i)*rs(il,i))
2012       afac2=p(il,i-1)*(rs(il,i-1)-rp(il,i-1))
2013     :                /(1.0e4+2000.0*p(il,i-1)*rs(il,i-1))
2014       afac=0.5*(afac1+afac2)
2015      endif
2016      if(i.eq.inb(il))afac=0.0
2017      afac=amax1(afac,0.0)
2018      bfac=1./(sigd*wt(il,i))
2019c
2020cjyg1
2021ccc        sigt=1.0
2022ccc        if(i.ge.icb)sigt=sigp(i)
2023c prise en compte de la variation progressive de sigt dans
2024c les couches icb et icb-1:
2025c       pour plcl<ph(i+1), pr1=0 & pr2=1
2026c       pour plcl>ph(i),   pr1=1 & pr2=0
2027c       pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval
2028c    sur le nuage, et pr2 est la proportion sous la base du
2029c    nuage.
2030      pr1=(plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1))
2031      pr1=max(0.,min(1.,pr1))
2032      pr2=(ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1))
2033      pr2=max(0.,min(1.,pr2))
2034      sigt=sigp(il,i)*pr1+pr2
2035cjyg2
2036c
2037      b6=bfac*50.*sigd*(ph(il,i)-ph(il,i+1))*sigt*afac
2038      c6=water(il,i+1)+bfac*wdtrain(il)
2039     :                -50.*sigd*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)
2040      if(c6.gt.0.0)then
2041       revap=0.5*(-b6+sqrt(b6*b6+4.*c6))
2042       evap(il,i)=sigt*afac*revap
2043       water(il,i)=revap*revap
2044      else
2045       evap(il,i)=-evap(il,i+1)
2046     :            +0.02*(wdtrain(il)+sigd*wt(il,i)*water(il,i+1))
2047     :                 /(sigd*(ph(il,i)-ph(il,i+1)))
2048      end if
2049c
2050c    ***  calculate precipitating downdraft mass flux under     ***
2051c    ***              hydrostatic approximation                 ***
2052c
2053      if (i.ne.1) then
2054
2055      tevap=amax1(0.0,evap(il,i))
2056      delth=amax1(0.001,(th(il,i)-th(il,i-1)))
2057      if (cvflag_grav) then
2058       mp(il,i)=100.*ginv*lvcp(il,i)*sigd*tevap
2059     :              *(p(il,i-1)-p(il,i))/delth
2060      else
2061       mp(il,i)=10.*lvcp(il,i)*sigd*tevap*(p(il,i-1)-p(il,i))/delth
2062      endif
2063c
2064c    ***           if hydrostatic assumption fails,             ***
2065c    ***   solve cubic difference equation for downdraft theta  ***
2066c    ***  and mass flux from two simultaneous differential eqns ***
2067c
2068      amfac=sigd*sigd*70.0*ph(il,i)*(p(il,i-1)-p(il,i))
2069     :          *(th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i))
2070      amp2=abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i))
2071      if(amp2.gt.(0.1*amfac))then
2072       xf=100.0*sigd*sigd*sigd*(ph(il,i)-ph(il,i+1))
2073       tf=b(il,i)-5.0*(th(il,i)-th(il,i-1))*t(il,i)
2074     :               /(lvcp(il,i)*sigd*th(il,i))
2075       af=xf*tf+mp(il,i+1)*mp(il,i+1)*tinv
2076       bf=2.*(tinv*mp(il,i+1))**3+tinv*mp(il,i+1)*xf*tf
2077     :            +50.*(p(il,i-1)-p(il,i))*xf*tevap
2078       fac2=1.0
2079       if(bf.lt.0.0)fac2=-1.0
2080       bf=abs(bf)
2081       ur=0.25*bf*bf-af*af*af*tinv*tinv*tinv
2082       if(ur.ge.0.0)then
2083        sru=sqrt(ur)
2084        fac=1.0
2085        if((0.5*bf-sru).lt.0.0)fac=-1.0
2086        mp(il,i)=mp(il,i+1)*tinv+(0.5*bf+sru)**tinv
2087     :                  +fac*(abs(0.5*bf-sru))**tinv
2088       else
2089        d=atan(2.*sqrt(-ur)/(bf+1.0e-28))
2090        if(fac2.lt.0.0)d=3.14159-d
2091        mp(il,i)=mp(il,i+1)*tinv+2.*sqrt(af*tinv)*cos(d*tinv)
2092       endif
2093       mp(il,i)=amax1(0.0,mp(il,i))
2094
2095       if (cvflag_grav) then
2096Cjyg : il y a vraisemblablement une erreur dans la ligne 2 suivante:
2097C il faut diviser par (mp(il,i)*sigd*grav) et non par (mp(il,i)+sigd*0.1).
2098C Et il faut bien revoir les facteurs 100.
2099        b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap
2100     2   /(mp(il,i)+sigd*0.1)
2101     3   -10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i))
2102       else
2103        b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap
2104     2   /(mp(il,i)+sigd*0.1)
2105     3   -10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i))
2106       endif
2107       b(il,i-1)=amax1(b(il,i-1),0.0)
2108      endif
2109c
2110c   ***         limit magnitude of mp(i) to meet cfl condition      ***
2111c
2112      ampmax=2.0*(ph(il,i)-ph(il,i+1))*delti
2113      amp2=2.0*(ph(il,i-1)-ph(il,i))*delti
2114      ampmax=amin1(ampmax,amp2)
2115      mp(il,i)=amin1(mp(il,i),ampmax)
2116c
2117c    ***      force mp to decrease linearly to zero                 ***
2118c    ***       between cloud base and the surface                   ***
2119c
2120      if(p(il,i).gt.p(il,icb(il)))then
2121       mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il)))
2122      endif
2123
2124360   continue
2125      endif ! i.eq.1
2126c
2127c    ***       find mixing ratio of precipitating downdraft     ***
2128c
2129
2130      if (i.ne.inb(il)) then
2131
2132      rp(il,i)=rr(il,i)
2133
2134      if(mp(il,i).gt.mp(il,i+1))then
2135
2136       if (cvflag_grav) then
2137        rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1))
2138     :   +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1))
2139     :                     *(evap(il,i+1)+evap(il,i))
2140       else
2141        rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1))
2142     :   +5.*sigd*(ph(il,i)-ph(il,i+1))
2143     :                      *(evap(il,i+1)+evap(il,i))
2144       endif
2145      rp(il,i)=rp(il,i)/mp(il,i)
2146      up(il,i)=up(il,i+1)*mp(il,i+1)+u(il,i)*(mp(il,i)-mp(il,i+1))
2147      up(il,i)=up(il,i)/mp(il,i)
2148      vp(il,i)=vp(il,i+1)*mp(il,i+1)+v(il,i)*(mp(il,i)-mp(il,i+1))
2149      vp(il,i)=vp(il,i)/mp(il,i)
2150
2151c      do j=1,ntra
2152c      trap(il,i,j)=trap(il,i+1,j)*mp(il,i+1)
2153ctestmaf     :            +trap(il,i,j)*(mp(il,i)-mp(il,i+1))
2154c     :            +tra(il,i,j)*(mp(il,i)-mp(il,i+1))
2155c      trap(il,i,j)=trap(il,i,j)/mp(il,i)
2156c      end do
2157
2158      else
2159
2160       if(mp(il,i+1).gt.1.0e-16)then
2161        if (cvflag_grav) then
2162         rp(il,i)=rp(il,i+1)
2163     :            +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1))
2164     :            *(evap(il,i+1)+evap(il,i))/mp(il,i+1)
2165        else
2166         rp(il,i)=rp(il,i+1)
2167     :           +5.*sigd*(ph(il,i)-ph(il,i+1))
2168     :           *(evap(il,i+1)+evap(il,i))/mp(il,i+1)
2169        endif
2170       up(il,i)=up(il,i+1)
2171       vp(il,i)=vp(il,i+1)
2172
2173c       do j=1,ntra
2174c       trap(il,i,j)=trap(il,i+1,j)
2175c       end do
2176
2177       endif
2178      endif
2179      rp(il,i)=amin1(rp(il,i),rs(il,i))
2180      rp(il,i)=amax1(rp(il,i),0.0)
2181
2182      endif
2183      endif
2184999   continue
2185
2186400   continue
2187
2188       return
2189       end
2190
2191      SUBROUTINE cv30_yield(nloc,ncum,nd,na,ntra
2192     :                    ,icb,inb,delt
2193     :                    ,t,rr,u,v,tra,gz,p,ph,h,hp,lv,cpn,th
2194     :                    ,ep,clw,m,tp,mp,rp,up,vp,trap
2195     :                    ,wt,water,evap,b
2196     :                    ,ment,qent,uent,vent,nent,elij,traent,sig
2197     :                    ,tv,tvp
2198     :                    ,iflag,precip,VPrecip,ft,fr,fu,fv,ftra
2199     :                    ,upwd,dnwd,dnwd0,ma,mike,tls,tps,qcondc,wd)
2200      implicit none
2201
2202#include "cvthermo.h"
2203#include "cv30param.h"
2204#include "cvflag.h"
2205#include "conema3.h"
2206
2207c inputs:
2208      integer ncum,nd,na,ntra,nloc
2209      integer icb(nloc), inb(nloc)
2210      real delt
2211      real t(nloc,nd), rr(nloc,nd), u(nloc,nd), v(nloc,nd)
2212      real tra(nloc,nd,ntra), sig(nloc,nd)
2213      real gz(nloc,na), ph(nloc,nd+1), h(nloc,na), hp(nloc,na)
2214      real th(nloc,na), p(nloc,nd), tp(nloc,na)
2215      real lv(nloc,na), cpn(nloc,na), ep(nloc,na), clw(nloc,na)
2216      real m(nloc,na), mp(nloc,na), rp(nloc,na), up(nloc,na)
2217      real vp(nloc,na), wt(nloc,nd), trap(nloc,nd,ntra)
2218      real water(nloc,na), evap(nloc,na), b(nloc,na)
2219      real ment(nloc,na,na), qent(nloc,na,na), uent(nloc,na,na)
2220cym      real vent(nloc,na,na), nent(nloc,na), elij(nloc,na,na)
2221      real vent(nloc,na,na), elij(nloc,na,na)
2222      integer nent(nloc,na)
2223      real traent(nloc,na,na,ntra)
2224      real tv(nloc,nd), tvp(nloc,nd)
2225
2226c input/output:
2227      integer iflag(nloc)
2228
2229c outputs:
2230      real precip(nloc)
2231      real VPrecip(nloc,nd+1)
2232      real ft(nloc,nd), fr(nloc,nd), fu(nloc,nd), fv(nloc,nd)
2233      real ftra(nloc,nd,ntra)
2234      real upwd(nloc,nd), dnwd(nloc,nd), ma(nloc,nd)
2235      real dnwd0(nloc,nd), mike(nloc,nd)
2236      real tls(nloc,nd), tps(nloc,nd)
2237      real qcondc(nloc,nd)                               ! cld
2238      real wd(nloc)                                      ! gust
2239
2240c local variables:
2241      integer i,k,il,n,j,num1
2242      real rat, awat, delti
2243      real ax, bx, cx, dx, ex
2244      real cpinv, rdcp, dpinv
2245      real lvcp(nloc,na), mke(nloc,na)
2246      real am(nloc), work(nloc), ad(nloc), amp1(nloc)
2247c!!      real up1(nloc), dn1(nloc)
2248      real up1(nloc,nd,nd), dn1(nloc,nd,nd)
2249      real asum(nloc), bsum(nloc), csum(nloc), dsum(nloc)
2250      real qcond(nloc,nd), nqcond(nloc,nd), wa(nloc,nd)  ! cld
2251      real siga(nloc,nd), sax(nloc,nd), mac(nloc,nd)      ! cld
2252
2253
2254c-------------------------------------------------------------
2255
2256c initialization:
2257
2258      delti = 1.0/delt
2259
2260      do il=1,ncum
2261       precip(il)=0.0
2262       wd(il)=0.0     ! gust
2263       VPrecip(il,nd+1)=0.
2264      enddo
2265
2266      do i=1,nd
2267       do il=1,ncum
2268         VPrecip(il,i)=0.0
2269         ft(il,i)=0.0
2270         fr(il,i)=0.0
2271         fu(il,i)=0.0
2272         fv(il,i)=0.0
2273         qcondc(il,i)=0.0                                ! cld
2274         qcond(il,i)=0.0                                 ! cld
2275         nqcond(il,i)=0.0                                ! cld
2276       enddo
2277      enddo
2278
2279c      do j=1,ntra
2280c       do i=1,nd
2281c        do il=1,ncum
2282c          ftra(il,i,j)=0.0
2283c        enddo
2284c       enddo
2285c      enddo
2286
2287      do i=1,nl
2288       do il=1,ncum
2289         lvcp(il,i)=lv(il,i)/cpn(il,i)
2290       enddo
2291      enddo
2292
2293
2294c
2295c   ***  calculate surface precipitation in mm/day     ***
2296c
2297      do il=1,ncum
2298       if(ep(il,inb(il)).ge.0.0001)then
2299        if (cvflag_grav) then
2300         precip(il)=wt(il,1)*sigd*water(il,1)*86400.*1000./(rowl*grav)
2301        else
2302         precip(il)=wt(il,1)*sigd*water(il,1)*8640.
2303        endif
2304       endif
2305      enddo
2306
2307C   ***  CALCULATE VERTICAL PROFILE OF  PRECIPITATIONs IN kg/m2/s  ===
2308C
2309c MAF rajout pour lessivage
2310       do k=1,nl
2311         do il=1,ncum
2312          if (k.le.inb(il)) then
2313            if (cvflag_grav) then
2314             VPrecip(il,k) = wt(il,k)*sigd*water(il,k)/grav
2315            else
2316             VPrecip(il,k) = wt(il,k)*sigd*water(il,k)/10.
2317            endif
2318          endif
2319         end do
2320       end do
2321C
2322c
2323c   ***  Calculate downdraft velocity scale    ***
2324c   ***  NE PAS UTILISER POUR L'INSTANT ***
2325c
2326c!      do il=1,ncum
2327c!        wd(il)=betad*abs(mp(il,icb(il)))*0.01*rrd*t(il,icb(il))
2328c!     :                                  /(sigd*p(il,icb(il)))
2329c!      enddo
2330
2331c
2332c   ***  calculate tendencies of lowest level potential temperature  ***
2333c   ***                      and mixing ratio                        ***
2334c
2335      do il=1,ncum
2336       work(il)=1.0/(ph(il,1)-ph(il,2))
2337       am(il)=0.0
2338      enddo
2339
2340      do k=2,nl
2341       do il=1,ncum
2342        if (k.le.inb(il)) then
2343         am(il)=am(il)+m(il,k)
2344        endif
2345       enddo
2346      enddo
2347
2348      do il=1,ncum
2349
2350c convect3      if((0.1*dpinv*am).ge.delti)iflag(il)=4
2351      if (cvflag_grav) then
2352      if((0.01*grav*work(il)*am(il)).ge.delti)iflag(il)=1!consist vect
2353       ft(il,1)=0.01*grav*work(il)*am(il)*(t(il,2)-t(il,1)
2354     :            +(gz(il,2)-gz(il,1))/cpn(il,1))
2355      else
2356       if((0.1*work(il)*am(il)).ge.delti)iflag(il)=1 !consistency vect
2357       ft(il,1)=0.1*work(il)*am(il)*(t(il,2)-t(il,1)
2358     :            +(gz(il,2)-gz(il,1))/cpn(il,1))
2359      endif
2360
2361      ft(il,1)=ft(il,1)-0.5*lvcp(il,1)*sigd*(evap(il,1)+evap(il,2))
2362
2363      if (cvflag_grav) then
2364       ft(il,1)=ft(il,1)-0.009*grav*sigd*mp(il,2)
2365     :                             *t(il,1)*b(il,1)*work(il)
2366      else
2367       ft(il,1)=ft(il,1)-0.09*sigd*mp(il,2)*t(il,1)*b(il,1)*work(il)
2368      endif
2369
2370      ft(il,1)=ft(il,1)+0.01*sigd*wt(il,1)*(cl-cpd)*water(il,2)*(t(il,2)
2371     :-t(il,1))*work(il)/cpn(il,1)
2372
2373      if (cvflag_grav) then
2374Cjyg1  Correction pour mieux conserver l'eau (conformite avec CONVECT4.3)
2375c (sb: pour l'instant, on ne fait que le chgt concernant grav, pas evap)
2376       fr(il,1)=0.01*grav*mp(il,2)*(rp(il,2)-rr(il,1))*work(il)
2377     :          +sigd*0.5*(evap(il,1)+evap(il,2))
2378c+tard     :          +sigd*evap(il,1)
2379
2380       fr(il,1)=fr(il,1)+0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il)
2381
2382       fu(il,1)=fu(il,1)+0.01*grav*work(il)*(mp(il,2)*(up(il,2)-u(il,1))
2383     :         +am(il)*(u(il,2)-u(il,1)))
2384       fv(il,1)=fv(il,1)+0.01*grav*work(il)*(mp(il,2)*(vp(il,2)-v(il,1))
2385     :         +am(il)*(v(il,2)-v(il,1)))
2386      else  ! cvflag_grav
2387       fr(il,1)=0.1*mp(il,2)*(rp(il,2)-rr(il,1))*work(il)
2388     :          +sigd*0.5*(evap(il,1)+evap(il,2))
2389       fr(il,1)=fr(il,1)+0.1*am(il)*(rr(il,2)-rr(il,1))*work(il)
2390       fu(il,1)=fu(il,1)+0.1*work(il)*(mp(il,2)*(up(il,2)-u(il,1))
2391     :         +am(il)*(u(il,2)-u(il,1)))
2392       fv(il,1)=fv(il,1)+0.1*work(il)*(mp(il,2)*(vp(il,2)-v(il,1))
2393     :         +am(il)*(v(il,2)-v(il,1)))
2394      endif ! cvflag_grav
2395
2396      enddo ! il
2397
2398c      do j=1,ntra
2399c       do il=1,ncum
2400c        if (cvflag_grav) then
2401c         ftra(il,1,j)=ftra(il,1,j)+0.01*grav*work(il)
2402c     :                     *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))
2403c     :             +am(il)*(tra(il,2,j)-tra(il,1,j)))
2404c        else
2405c         ftra(il,1,j)=ftra(il,1,j)+0.1*work(il)
2406c     :                     *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))
2407c     :             +am(il)*(tra(il,2,j)-tra(il,1,j)))
2408c        endif
2409c       enddo
2410c      enddo
2411
2412      do j=2,nl
2413       do il=1,ncum
2414        if (j.le.inb(il)) then
2415         if (cvflag_grav) then
2416          fr(il,1)=fr(il,1)
2417     :       +0.01*grav*work(il)*ment(il,j,1)*(qent(il,j,1)-rr(il,1))
2418          fu(il,1)=fu(il,1)
2419     :       +0.01*grav*work(il)*ment(il,j,1)*(uent(il,j,1)-u(il,1))
2420          fv(il,1)=fv(il,1)
2421     :       +0.01*grav*work(il)*ment(il,j,1)*(vent(il,j,1)-v(il,1))
2422         else   ! cvflag_grav
2423          fr(il,1)=fr(il,1)
2424     :         +0.1*work(il)*ment(il,j,1)*(qent(il,j,1)-rr(il,1))
2425          fu(il,1)=fu(il,1)
2426     :         +0.1*work(il)*ment(il,j,1)*(uent(il,j,1)-u(il,1))
2427          fv(il,1)=fv(il,1)
2428     :         +0.1*work(il)*ment(il,j,1)*(vent(il,j,1)-v(il,1))
2429         endif  ! cvflag_grav
2430        endif ! j
2431       enddo
2432      enddo
2433
2434c      do k=1,ntra
2435c       do j=2,nl
2436c        do il=1,ncum
2437c         if (j.le.inb(il)) then
2438
2439c          if (cvflag_grav) then
2440c           ftra(il,1,k)=ftra(il,1,k)+0.01*grav*work(il)*ment(il,j,1)
2441c     :                *(traent(il,j,1,k)-tra(il,1,k))
2442c          else
2443c           ftra(il,1,k)=ftra(il,1,k)+0.1*work(il)*ment(il,j,1)
2444c     :                *(traent(il,j,1,k)-tra(il,1,k))
2445c          endif
2446
2447c         endif
2448c        enddo
2449c       enddo
2450c      enddo
2451
2452c
2453c   ***  calculate tendencies of potential temperature and mixing ratio  ***
2454c   ***               at levels above the lowest level                   ***
2455c
2456c   ***  first find the net saturated updraft and downdraft mass fluxes  ***
2457c   ***                      through each level                          ***
2458c
2459
2460      do 500 i=2,nl+1 ! newvecto: mettre nl au lieu nl+1?
2461
2462       num1=0
2463       do il=1,ncum
2464        if(i.le.inb(il))num1=num1+1
2465       enddo
2466       if(num1.le.0)go to 500
2467
2468       call zilch(amp1,ncum)
2469       call zilch(ad,ncum)
2470
2471      do 440 k=i+1,nl+1
2472       do 441 il=1,ncum
2473        if (i.le.inb(il) .and. k.le.(inb(il)+1)) then
2474         amp1(il)=amp1(il)+m(il,k)
2475        endif
2476 441   continue
2477 440  continue
2478
2479      do 450 k=1,i
2480       do 451 j=i+1,nl+1
2481        do 452 il=1,ncum
2482         if (i.le.inb(il) .and. j.le.(inb(il)+1)) then
2483          amp1(il)=amp1(il)+ment(il,k,j)
2484         endif
2485452     continue
2486451    continue
2487450   continue
2488
2489      do 470 k=1,i-1
2490       do 471 j=i,nl+1 ! newvecto: nl au lieu nl+1?
2491        do 472 il=1,ncum
2492        if (i.le.inb(il) .and. j.le.inb(il)) then
2493         ad(il)=ad(il)+ment(il,j,k)
2494        endif
2495472     continue
2496471    continue
2497470   continue
2498 
2499      do 1350 il=1,ncum
2500      if (i.le.inb(il)) then
2501       dpinv=1.0/(ph(il,i)-ph(il,i+1))
2502       cpinv=1.0/cpn(il,i)
2503
2504c convect3      if((0.1*dpinv*amp1).ge.delti)iflag(il)=4
2505      if (cvflag_grav) then
2506       if((0.01*grav*dpinv*amp1(il)).ge.delti)iflag(il)=1 ! vecto
2507      else
2508       if((0.1*dpinv*amp1(il)).ge.delti)iflag(il)=1 ! vecto
2509      endif
2510
2511      if (cvflag_grav) then
2512       ft(il,i)=0.01*grav*dpinv*(amp1(il)*(t(il,i+1)-t(il,i)
2513     :    +(gz(il,i+1)-gz(il,i))*cpinv)
2514     :    -ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv))
2515     :    -0.5*sigd*lvcp(il,i)*(evap(il,i)+evap(il,i+1))
2516       rat=cpn(il,i-1)*cpinv
2517       ft(il,i)=ft(il,i)-0.009*grav*sigd*(mp(il,i+1)*t(il,i)*b(il,i)
2518     :   -mp(il,i)*t(il,i-1)*rat*b(il,i-1))*dpinv
2519       ft(il,i)=ft(il,i)+0.01*grav*dpinv*ment(il,i,i)*(hp(il,i)-h(il,i)
2520     :    +t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv
2521      else  ! cvflag_grav
2522       ft(il,i)=0.1*dpinv*(amp1(il)*(t(il,i+1)-t(il,i)
2523     :    +(gz(il,i+1)-gz(il,i))*cpinv)
2524     :    -ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv))
2525     :    -0.5*sigd*lvcp(il,i)*(evap(il,i)+evap(il,i+1))
2526       rat=cpn(il,i-1)*cpinv
2527       ft(il,i)=ft(il,i)-0.09*sigd*(mp(il,i+1)*t(il,i)*b(il,i)
2528     :   -mp(il,i)*t(il,i-1)*rat*b(il,i-1))*dpinv
2529       ft(il,i)=ft(il,i)+0.1*dpinv*ment(il,i,i)*(hp(il,i)-h(il,i)
2530     :    +t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv
2531      endif ! cvflag_grav
2532
2533
2534      ft(il,i)=ft(il,i)+0.01*sigd*wt(il,i)*(cl-cpd)*water(il,i+1)
2535     :           *(t(il,i+1)-t(il,i))*dpinv*cpinv
2536
2537      if (cvflag_grav) then
2538       fr(il,i)=0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i))
2539     :           -ad(il)*(rr(il,i)-rr(il,i-1)))
2540       fu(il,i)=fu(il,i)+0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il,i))
2541     :             -ad(il)*(u(il,i)-u(il,i-1)))
2542       fv(il,i)=fv(il,i)+0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il,i))
2543     :             -ad(il)*(v(il,i)-v(il,i-1)))
2544      else  ! cvflag_grav
2545       fr(il,i)=0.1*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i))
2546     :           -ad(il)*(rr(il,i)-rr(il,i-1)))
2547       fu(il,i)=fu(il,i)+0.1*dpinv*(amp1(il)*(u(il,i+1)-u(il,i))
2548     :             -ad(il)*(u(il,i)-u(il,i-1)))
2549       fv(il,i)=fv(il,i)+0.1*dpinv*(amp1(il)*(v(il,i+1)-v(il,i))
2550     :             -ad(il)*(v(il,i)-v(il,i-1)))
2551      endif ! cvflag_grav
2552
2553      endif ! i
25541350  continue
2555
2556c      do k=1,ntra
2557c       do il=1,ncum
2558c        if (i.le.inb(il)) then
2559c         dpinv=1.0/(ph(il,i)-ph(il,i+1))
2560c         cpinv=1.0/cpn(il,i)
2561c         if (cvflag_grav) then
2562c           ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv
2563c     :         *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))
2564c     :           -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))
2565c         else
2566c           ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv
2567c     :         *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))
2568c     :           -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))
2569c         endif
2570c        endif
2571c       enddo
2572c      enddo
2573
2574      do 480 k=1,i-1
2575       do 1370 il=1,ncum
2576        if (i.le.inb(il)) then
2577         dpinv=1.0/(ph(il,i)-ph(il,i+1))
2578         cpinv=1.0/cpn(il,i)
2579
2580      awat=elij(il,k,i)-(1.-ep(il,i))*clw(il,i)
2581      awat=amax1(awat,0.0)
2582
2583      if (cvflag_grav) then
2584      fr(il,i)=fr(il,i)
2585     :   +0.01*grav*dpinv*ment(il,k,i)*(qent(il,k,i)-awat-rr(il,i))
2586      fu(il,i)=fu(il,i)
2587     :         +0.01*grav*dpinv*ment(il,k,i)*(uent(il,k,i)-u(il,i))
2588      fv(il,i)=fv(il,i)
2589     :         +0.01*grav*dpinv*ment(il,k,i)*(vent(il,k,i)-v(il,i))
2590      else  ! cvflag_grav
2591      fr(il,i)=fr(il,i)
2592     :   +0.1*dpinv*ment(il,k,i)*(qent(il,k,i)-awat-rr(il,i))
2593      fu(il,i)=fu(il,i)
2594     :   +0.01*grav*dpinv*ment(il,k,i)*(uent(il,k,i)-u(il,i))
2595      fv(il,i)=fv(il,i)
2596     :   +0.1*dpinv*ment(il,k,i)*(vent(il,k,i)-v(il,i))
2597      endif ! cvflag_grav
2598
2599c (saturated updrafts resulting from mixing)        ! cld
2600        qcond(il,i)=qcond(il,i)+(elij(il,k,i)-awat) ! cld
2601        nqcond(il,i)=nqcond(il,i)+1.                ! cld
2602      endif ! i
26031370  continue
2604480   continue
2605
2606c      do j=1,ntra
2607c       do k=1,i-1
2608c        do il=1,ncum
2609c         if (i.le.inb(il)) then
2610c          dpinv=1.0/(ph(il,i)-ph(il,i+1))
2611c          cpinv=1.0/cpn(il,i)
2612c          if (cvflag_grav) then
2613c           ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)
2614c     :        *(traent(il,k,i,j)-tra(il,i,j))
2615c          else
2616c           ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)
2617c     :        *(traent(il,k,i,j)-tra(il,i,j))
2618c          endif
2619c         endif
2620c        enddo
2621c       enddo
2622c      enddo
2623
2624      do 490 k=i,nl+1
2625       do 1380 il=1,ncum
2626        if (i.le.inb(il) .and. k.le.inb(il)) then
2627         dpinv=1.0/(ph(il,i)-ph(il,i+1))
2628         cpinv=1.0/cpn(il,i)
2629
2630         if (cvflag_grav) then
2631         fr(il,i)=fr(il,i)
2632     :         +0.01*grav*dpinv*ment(il,k,i)*(qent(il,k,i)-rr(il,i))
2633         fu(il,i)=fu(il,i)
2634     :         +0.01*grav*dpinv*ment(il,k,i)*(uent(il,k,i)-u(il,i))
2635         fv(il,i)=fv(il,i)
2636     :         +0.01*grav*dpinv*ment(il,k,i)*(vent(il,k,i)-v(il,i))
2637         else  ! cvflag_grav
2638         fr(il,i)=fr(il,i)
2639     :         +0.1*dpinv*ment(il,k,i)*(qent(il,k,i)-rr(il,i))
2640         fu(il,i)=fu(il,i)
2641     :         +0.1*dpinv*ment(il,k,i)*(uent(il,k,i)-u(il,i))
2642         fv(il,i)=fv(il,i)
2643     :         +0.1*dpinv*ment(il,k,i)*(vent(il,k,i)-v(il,i))
2644         endif ! cvflag_grav
2645        endif ! i and k
26461380   continue
2647490   continue
2648
2649c      do j=1,ntra
2650c       do k=i,nl+1
2651c        do il=1,ncum
2652c         if (i.le.inb(il) .and. k.le.inb(il)) then
2653c          dpinv=1.0/(ph(il,i)-ph(il,i+1))
2654c          cpinv=1.0/cpn(il,i)
2655c          if (cvflag_grav) then
2656c           ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)
2657c     :         *(traent(il,k,i,j)-tra(il,i,j))
2658c          else
2659c           ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)
2660c     :             *(traent(il,k,i,j)-tra(il,i,j))
2661c          endif
2662c         endif ! i and k
2663c        enddo
2664c       enddo
2665c      enddo
2666
2667      do 1400 il=1,ncum
2668       if (i.le.inb(il)) then
2669        dpinv=1.0/(ph(il,i)-ph(il,i+1))
2670        cpinv=1.0/cpn(il,i)
2671
2672        if (cvflag_grav) then
2673c sb: on ne fait pas encore la correction permettant de mieux
2674c conserver l'eau:
2675         fr(il,i)=fr(il,i)+0.5*sigd*(evap(il,i)+evap(il,i+1))
2676     :        +0.01*grav*(mp(il,i+1)*(rp(il,i+1)-rr(il,i))-mp(il,i)
2677     :               *(rp(il,i)-rr(il,i-1)))*dpinv
2678
2679         fu(il,i)=fu(il,i)+0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il,i))
2680     :             -mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv
2681         fv(il,i)=fv(il,i)+0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il,i))
2682     :             -mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv
2683        else  ! cvflag_grav
2684         fr(il,i)=fr(il,i)+0.5*sigd*(evap(il,i)+evap(il,i+1))
2685     :        +0.1*(mp(il,i+1)*(rp(il,i+1)-rr(il,i))-mp(il,i)
2686     :               *(rp(il,i)-rr(il,i-1)))*dpinv
2687         fu(il,i)=fu(il,i)+0.1*(mp(il,i+1)*(up(il,i+1)-u(il,i))
2688     :             -mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv
2689         fv(il,i)=fv(il,i)+0.1*(mp(il,i+1)*(vp(il,i+1)-v(il,i))
2690     :             -mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv
2691        endif ! cvflag_grav
2692
2693      endif ! i
26941400  continue
2695
2696c sb: interface with the cloud parameterization:          ! cld
2697
2698      do k=i+1,nl
2699       do il=1,ncum
2700        if (k.le.inb(il) .and. i.le.inb(il)) then         ! cld
2701C (saturated downdrafts resulting from mixing)            ! cld
2702          qcond(il,i)=qcond(il,i)+elij(il,k,i)            ! cld
2703          nqcond(il,i)=nqcond(il,i)+1.                    ! cld
2704        endif                                             ! cld
2705       enddo                                              ! cld
2706      enddo                                               ! cld
2707
2708C (particular case: no detraining level is found)         ! cld
2709      do il=1,ncum                                        ! cld
2710       if (i.le.inb(il) .and. nent(il,i).eq.0) then       ! cld
2711          qcond(il,i)=qcond(il,i)+(1.-ep(il,i))*clw(il,i) ! cld
2712          nqcond(il,i)=nqcond(il,i)+1.                    ! cld
2713       endif                                              ! cld
2714      enddo                                               ! cld
2715
2716      do il=1,ncum                                        ! cld
2717       if (i.le.inb(il) .and. nqcond(il,i).ne.0.) then    ! cld
2718          qcond(il,i)=qcond(il,i)/nqcond(il,i)            ! cld
2719       endif                                              ! cld
2720      enddo
2721
2722c      do j=1,ntra
2723c       do il=1,ncum
2724c        if (i.le.inb(il)) then
2725c         dpinv=1.0/(ph(il,i)-ph(il,i+1))
2726c         cpinv=1.0/cpn(il,i)
2727
2728c         if (cvflag_grav) then
2729c          ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv
2730c     :     *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))
2731c     :     -mp(il,i)*(trap(il,i,j)-tra(il,i-1,j)))
2732c         else
2733c          ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv
2734c     :     *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))
2735c     :     -mp(il,i)*(trap(il,i,j)-tra(il,i-1,j)))
2736c         endif
2737c        endif ! i
2738c       enddo
2739c      enddo
2740
2741500   continue
2742
2743
2744c   ***   move the detrainment at level inb down to level inb-1   ***
2745c   ***        in such a way as to preserve the vertically        ***
2746c   ***          integrated enthalpy and water tendencies         ***
2747c
2748      do 503 il=1,ncum
2749
2750      ax=0.1*ment(il,inb(il),inb(il))*(hp(il,inb(il))-h(il,inb(il))
2751     : +t(il,inb(il))*(cpv-cpd)
2752     : *(rr(il,inb(il))-qent(il,inb(il),inb(il))))
2753     :  /(cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1)))
2754      ft(il,inb(il))=ft(il,inb(il))-ax
2755      ft(il,inb(il)-1)=ft(il,inb(il)-1)+ax*cpn(il,inb(il))
2756     :    *(ph(il,inb(il))-ph(il,inb(il)+1))/(cpn(il,inb(il)-1)
2757     :    *(ph(il,inb(il)-1)-ph(il,inb(il))))
2758
2759      bx=0.1*ment(il,inb(il),inb(il))*(qent(il,inb(il),inb(il))
2760     :    -rr(il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1))
2761      fr(il,inb(il))=fr(il,inb(il))-bx
2762      fr(il,inb(il)-1)=fr(il,inb(il)-1)
2763     :   +bx*(ph(il,inb(il))-ph(il,inb(il)+1))
2764     :      /(ph(il,inb(il)-1)-ph(il,inb(il)))
2765
2766      cx=0.1*ment(il,inb(il),inb(il))*(uent(il,inb(il),inb(il))
2767     :       -u(il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1))
2768      fu(il,inb(il))=fu(il,inb(il))-cx
2769      fu(il,inb(il)-1)=fu(il,inb(il)-1)
2770     :     +cx*(ph(il,inb(il))-ph(il,inb(il)+1))
2771     :        /(ph(il,inb(il)-1)-ph(il,inb(il)))
2772
2773      dx=0.1*ment(il,inb(il),inb(il))*(vent(il,inb(il),inb(il))
2774     :      -v(il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1))
2775      fv(il,inb(il))=fv(il,inb(il))-dx
2776      fv(il,inb(il)-1)=fv(il,inb(il)-1)
2777     :    +dx*(ph(il,inb(il))-ph(il,inb(il)+1))
2778     :       /(ph(il,inb(il)-1)-ph(il,inb(il)))
2779
2780503   continue
2781
2782c      do j=1,ntra
2783c       do il=1,ncum
2784c        ex=0.1*ment(il,inb(il),inb(il))
2785c     :      *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j))
2786c     :      /(ph(il,inb(il))-ph(il,inb(il)+1))
2787c        ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex
2788c        ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j)
2789c     :       +ex*(ph(il,inb(il))-ph(il,inb(il)+1))
2790c     :          /(ph(il,inb(il)-1)-ph(il,inb(il)))
2791c       enddo
2792c      enddo
2793
2794c
2795c   ***    homoginize tendencies below cloud base    ***
2796c
2797c
2798      do il=1,ncum
2799       asum(il)=0.0
2800       bsum(il)=0.0
2801       csum(il)=0.0
2802       dsum(il)=0.0
2803      enddo
2804
2805      do i=1,nl
2806       do il=1,ncum
2807        if (i.le.(icb(il)-1)) then
2808      asum(il)=asum(il)+ft(il,i)*(ph(il,i)-ph(il,i+1))
2809      bsum(il)=bsum(il)+fr(il,i)*(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))
2810     :                  *(ph(il,i)-ph(il,i+1))
2811      csum(il)=csum(il)+(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))
2812     :                      *(ph(il,i)-ph(il,i+1))
2813      dsum(il)=dsum(il)+t(il,i)*(ph(il,i)-ph(il,i+1))/th(il,i)
2814        endif
2815       enddo
2816      enddo
2817
2818c!!!      do 700 i=1,icb(il)-1
2819      do i=1,nl
2820       do il=1,ncum
2821        if (i.le.(icb(il)-1)) then
2822         ft(il,i)=asum(il)*t(il,i)/(th(il,i)*dsum(il))
2823         fr(il,i)=bsum(il)/csum(il)
2824        endif
2825       enddo
2826      enddo
2827
2828c
2829c   ***           reset counter and return           ***
2830c
2831      do il=1,ncum
2832       sig(il,nd)=2.0
2833      enddo
2834
2835
2836      do i=1,nd
2837       do il=1,ncum
2838        upwd(il,i)=0.0
2839        dnwd(il,i)=0.0
2840       enddo
2841      enddo
2842     
2843      do i=1,nl
2844       do il=1,ncum
2845        dnwd0(il,i)=-mp(il,i)
2846       enddo
2847      enddo
2848      do i=nl+1,nd
2849       do il=1,ncum
2850        dnwd0(il,i)=0.
2851       enddo
2852      enddo
2853
2854
2855      do i=1,nl
2856       do il=1,ncum
2857        if (i.ge.icb(il) .and. i.le.inb(il)) then
2858          upwd(il,i)=0.0
2859          dnwd(il,i)=0.0
2860        endif
2861       enddo
2862      enddo
2863
2864      do i=1,nl
2865       do k=1,nl
2866        do il=1,ncum
2867          up1(il,k,i)=0.0
2868          dn1(il,k,i)=0.0
2869        enddo
2870       enddo
2871      enddo
2872
2873      do i=1,nl
2874       do k=i,nl
2875        do n=1,i-1
2876         do il=1,ncum
2877          if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then
2878             up1(il,k,i)=up1(il,k,i)+ment(il,n,k)
2879             dn1(il,k,i)=dn1(il,k,i)-ment(il,k,n)
2880          endif
2881         enddo
2882        enddo
2883       enddo
2884      enddo
2885
2886      do i=2,nl
2887       do k=i,nl
2888        do il=1,ncum
2889ctest         if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then
2890         if (i.le.inb(il).and.k.le.inb(il)) then
2891            upwd(il,i)=upwd(il,i)+m(il,k)+up1(il,k,i)
2892            dnwd(il,i)=dnwd(il,i)+dn1(il,k,i)
2893         endif
2894        enddo
2895       enddo
2896      enddo
2897
2898
2899c!!!      DO il=1,ncum
2900c!!!      do i=icb(il),inb(il)
2901c!!!     
2902c!!!      upwd(il,i)=0.0
2903c!!!      dnwd(il,i)=0.0
2904c!!!      do k=i,inb(il)
2905c!!!      up1=0.0
2906c!!!      dn1=0.0
2907c!!!      do n=1,i-1
2908c!!!      up1=up1+ment(il,n,k)
2909c!!!      dn1=dn1-ment(il,k,n)
2910c!!!      enddo
2911c!!!      upwd(il,i)=upwd(il,i)+m(il,k)+up1
2912c!!!      dnwd(il,i)=dnwd(il,i)+dn1
2913c!!!      enddo
2914c!!!      enddo
2915c!!!
2916c!!!      ENDDO
2917
2918cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2919c        determination de la variation de flux ascendant entre
2920c        deux niveau non dilue mike
2921cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2922
2923      do i=1,nl
2924       do il=1,ncum
2925        mike(il,i)=m(il,i)
2926       enddo
2927      enddo
2928
2929      do i=nl+1,nd
2930       do il=1,ncum
2931        mike(il,i)=0.
2932       enddo
2933      enddo
2934
2935      do i=1,nd
2936       do il=1,ncum
2937        ma(il,i)=0
2938       enddo
2939      enddo
2940
2941      do i=1,nl
2942       do j=i,nl
2943        do il=1,ncum
2944         ma(il,i)=ma(il,i)+m(il,j)
2945        enddo
2946       enddo
2947      enddo
2948
2949      do i=nl+1,nd
2950       do il=1,ncum
2951        ma(il,i)=0.
2952       enddo
2953      enddo
2954
2955      do i=1,nl
2956       do il=1,ncum
2957        if (i.le.(icb(il)-1)) then
2958         ma(il,i)=0
2959        endif
2960       enddo
2961      enddo
2962
2963ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2964c        icb represente de niveau ou se trouve la
2965c        base du nuage , et inb le top du nuage
2966cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2967
2968      do i=1,nd
2969       do il=1,ncum
2970        mke(il,i)=upwd(il,i)+dnwd(il,i)
2971       enddo
2972      enddo
2973
2974      do i=1,nd
2975       DO 999 il=1,ncum
2976        rdcp=(rrd*(1.-rr(il,i))-rr(il,i)*rrv)
2977     :        /(cpd*(1.-rr(il,i))+rr(il,i)*cpv)
2978        tls(il,i)=t(il,i)*(1000.0/p(il,i))**rdcp
2979        tps(il,i)=tp(il,i)
2980999    CONTINUE
2981      enddo
2982
2983c
2984c   *** diagnose the in-cloud mixing ratio   ***            ! cld
2985c   ***           of condensed water         ***            ! cld
2986c                                                           ! cld
2987
2988       do i=1,nd                                            ! cld
2989        do il=1,ncum                                        ! cld
2990         mac(il,i)=0.0                                      ! cld
2991         wa(il,i)=0.0                                       ! cld
2992         siga(il,i)=0.0                                     ! cld
2993         sax(il,i)=0.0                                      ! cld
2994        enddo                                               ! cld
2995       enddo                                                ! cld
2996
2997       do i=minorig, nl                                     ! cld
2998        do k=i+1,nl+1                                       ! cld
2999         do il=1,ncum                                       ! cld
3000          if (i.le.inb(il) .and. k.le.(inb(il)+1)) then     ! cld
3001            mac(il,i)=mac(il,i)+m(il,k)                     ! cld
3002          endif                                             ! cld
3003         enddo                                              ! cld
3004        enddo                                               ! cld
3005       enddo                                                ! cld
3006
3007       do i=1,nl                                            ! cld
3008        do j=1,i                                            ! cld
3009         do il=1,ncum                                       ! cld
3010          if (i.ge.icb(il) .and. i.le.(inb(il)-1)           ! cld
3011     :      .and. j.ge.icb(il) ) then                       ! cld
3012           sax(il,i)=sax(il,i)+rrd*(tvp(il,j)-tv(il,j))     ! cld
3013     :        *(ph(il,j)-ph(il,j+1))/p(il,j)                ! cld
3014          endif                                             ! cld
3015         enddo                                              ! cld
3016        enddo                                               ! cld
3017       enddo                                                ! cld
3018
3019       do i=1,nl                                            ! cld
3020        do il=1,ncum                                        ! cld
3021         if (i.ge.icb(il) .and. i.le.(inb(il)-1)            ! cld
3022     :       .and. sax(il,i).gt.0.0 ) then                  ! cld
3023           wa(il,i)=sqrt(2.*sax(il,i))                      ! cld
3024         endif                                              ! cld
3025        enddo                                               ! cld
3026       enddo                                                ! cld
3027           
3028       do i=1,nl                                            ! cld
3029        do il=1,ncum                                        ! cld
3030         if (wa(il,i).gt.0.0)                               ! cld
3031     :     siga(il,i)=mac(il,i)/wa(il,i)                    ! cld
3032     :         *rrd*tvp(il,i)/p(il,i)/100./delta            ! cld
3033          siga(il,i) = min(siga(il,i),1.0)                  ! cld
3034cIM cf. FH
3035         if (iflag_clw.eq.0) then
3036          qcondc(il,i)=siga(il,i)*clw(il,i)*(1.-ep(il,i))   ! cld
3037     :           + (1.-siga(il,i))*qcond(il,i)              ! cld
3038         else if (iflag_clw.eq.1) then
3039          qcondc(il,i)=qcond(il,i)              ! cld
3040         endif
3041
3042        enddo                                               ! cld
3043       enddo                                                ! cld
3044
3045        return
3046        end
3047
3048!!RomP >>>
3049      SUBROUTINE cv30_tracer(nloc,len,ncum,nd,na,
3050     &                       ment,sij,da,phi,phi2,d1a,dam,
3051     &                       ep,VPrecip,elij,clw,epmlmMm,eplaMm,
3052     &                       icb,inb)
3053        implicit none
3054
3055#include "cv30param.h"
3056
3057c inputs:
3058        integer ncum, nd, na, nloc,len
3059        real ment(nloc,na,na),sij(nloc,na,na)
3060        real clw(nloc,nd),elij(nloc,na,na)
3061        real ep(nloc,na)
3062        integer icb(nloc),inb(nloc)
3063        real VPrecip(nloc,nd+1)
3064c ouputs:
3065        real da(nloc,na),phi(nloc,na,na)
3066        real phi2(nloc,na,na)
3067        real d1a(nloc,na),dam(nloc,na)
3068        real epmlmMm(nloc,na,na),eplaMm(nloc,na)
3069! variables pour tracer dans precip de l'AA et des mel
3070c local variables:
3071        integer i,j,k
3072        real epm(nloc,na,na)
3073c
3074! variables d'Emanuel : du second indice au troisieme
3075! --->    tab(i,k,j) -> de l origine k a l arrivee j
3076!  ment, sij, elij
3077! variables personnelles : du troisieme au second indice
3078! --->    tab(i,j,k) -> de k a j
3079! phi, phi2
3080!
3081! initialisations
3082       do j=1,na
3083        do i=1,ncum
3084         da(i,j)=0.
3085         d1a(i,j)=0.
3086         dam(i,j)=0.
3087         eplaMm(i,j)=0.
3088        enddo
3089       enddo
3090      do k=1,na
3091       do j=1,na
3092        do i=1,ncum
3093         epm(i,j,k)=0.
3094         epmlmMm(i,j,k)=0.
3095         phi(i,j,k)=0.
3096         phi2(i,j,k)=0.
3097        enddo
3098       enddo
3099      enddo
3100c
3101!  fraction deau condensee dans les melanges convertie en precip : epm
3102! et eau condensée précipitée dans masse d'air saturé : l_m*dM_m/dzdz.dzdz
3103        do j=1,na
3104         do k=1,j-1
3105           do i=1,ncum
3106            if(k.ge.icb(i).and.k.le.inb(i).and.
3107     &         j.le.inb(i)) then
3108!!jyg             epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/elij(i,k,j)
3109             epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/
3110     &                     max(elij(i,k,j),1.e-16)
3111!!
3112             epm(i,j,k)=max(epm(i,j,k),0.0)
3113            endif
3114           end do
3115         end do
3116        end do
3117!
3118        do j=1,na
3119         do k=1,na
3120           do i=1,ncum
3121            if(k.ge.icb(i).and.k.le.inb(i)) then
3122             eplaMm(i,j)=eplaMm(i,j) + ep(i,j)*clw(i,j)
3123     &                  *ment(i,j,k)*(1.-sij(i,j,k))
3124            endif
3125           end do
3126         end do
3127        end do
3128!
3129        do j=1,na
3130         do k=1,j-1
3131           do i=1,ncum
3132            if(k.ge.icb(i).and.k.le.inb(i).and.
3133     &         j.le.inb(i)) then
3134             epmlmMm(i,j,k)=epm(i,j,k)*elij(i,k,j)*ment(i,k,j)
3135            endif
3136           end do
3137         end do
3138        end do
3139
3140!  matrices pour calculer la tendance des concentrations dans cvltr.F90
3141        do j=1,na
3142          do k=1,na
3143            do i=1,ncum
3144             da(i,j)=da(i,j)+(1.-sij(i,k,j))*ment(i,k,j)
3145             phi(i,j,k)=sij(i,k,j)*ment(i,k,j)
3146             d1a(i,j)=d1a(i,j)+ment(i,k,j)*ep(i,k)
3147     &              *(1.-sij(i,k,j))
3148            end do
3149          end do
3150        end do
3151
3152        do j=1,na
3153          do k=1,j-1
3154            do i=1,ncum
3155             dam(i,j)=dam(i,j)+ment(i,k,j)
3156     &             *epm(i,j,k)*(1.-ep(i,k))*(1.-sij(i,k,j))
3157             phi2(i,j,k)=phi(i,j,k)*epm(i,j,k)
3158            end do
3159          end do
3160        end do
3161
3162        return
3163        end
3164!RomP <<<
3165
3166      SUBROUTINE cv30_uncompress(nloc,len,ncum,nd,ntra,idcum
3167     :         ,iflag
3168     :         ,precip,VPrecip,evap,ep,sig,w0
3169     :         ,ft,fq,fu,fv,ftra
3170     :         ,inb
3171     :         ,Ma,upwd,dnwd,dnwd0,qcondc,wd,cape
3172     :         ,da,phi,mp,phi2,d1a,dam,sij
3173     :         ,elij,clw,epmlmMm,eplaMm
3174     :         ,wdtrainA,wdtrainM
3175     :         ,iflag1
3176     :         ,precip1,VPrecip1,evap1,ep1,sig1,w01
3177     :         ,ft1,fq1,fu1,fv1,ftra1
3178     :         ,inb1
3179     :         ,Ma1,upwd1,dnwd1,dnwd01,qcondc1,wd1,cape1
3180     :         ,da1,phi1,mp1,phi21,d1a1,dam1,sij1
3181     :         ,elij1,clw1,epmlmMm1,eplaMm1
3182     :         ,wdtrainA1,wdtrainM1)
3183      implicit none
3184
3185#include "cv30param.h"
3186
3187c inputs:
3188      integer len, ncum, nd, ntra, nloc
3189      integer idcum(nloc)
3190      integer iflag(nloc)
3191      integer inb(nloc)
3192      real precip(nloc)
3193      real VPrecip(nloc,nd+1),evap(nloc,nd)
3194      real ep(nloc,nd)
3195      real sig(nloc,nd), w0(nloc,nd)
3196      real ft(nloc,nd), fq(nloc,nd), fu(nloc,nd), fv(nloc,nd)
3197      real ftra(nloc,nd,ntra)
3198      real Ma(nloc,nd)
3199      real upwd(nloc,nd),dnwd(nloc,nd),dnwd0(nloc,nd)
3200      real qcondc(nloc,nd)
3201      real wd(nloc),cape(nloc)
3202      real da(nloc,nd),phi(nloc,nd,nd),mp(nloc,nd)
3203!RomP >>>
3204      real phi2(nloc,nd,nd)
3205      real d1a(nloc,nd),dam(nloc,nd)
3206      real wdtrainA(nloc,nd), wdtrainM(nloc,nd)
3207      real sij(nloc,nd,nd)
3208      real elij(nloc,nd,nd),clw(nloc,nd)
3209      real epmlmMm(nloc,nd,nd),eplaMm(nloc,nd)
3210!RomP <<<
3211
3212c outputs:
3213      integer iflag1(len)
3214      integer inb1(len)
3215      real precip1(len)
3216      real VPrecip1(len,nd+1),evap1(len,nd) !<<< RomP
3217      real ep1(len,nd)                      !<<< RomP
3218      real sig1(len,nd), w01(len,nd)
3219      real ft1(len,nd), fq1(len,nd), fu1(len,nd), fv1(len,nd)
3220      real ftra1(len,nd,ntra)
3221      real Ma1(len,nd)
3222      real upwd1(len,nd),dnwd1(len,nd),dnwd01(len,nd)
3223      real qcondc1(nloc,nd)
3224      real wd1(nloc),cape1(nloc)
3225      real da1(nloc,nd),phi1(nloc,nd,nd),mp1(nloc,nd)
3226!RomP >>>
3227      real phi21(len,nd,nd)
3228      real d1a1(len,nd),dam1(len,nd)
3229      real wdtrainA1(len,nd), wdtrainM1(len,nd)
3230      real sij1(len,nd,nd)
3231      real elij1(len,nd,nd),clw1(len,nd)
3232      real epmlmMm1(len,nd,nd),eplaMm1(len,nd)
3233!RomP <<<
3234
3235c local variables:
3236      integer i,k,j
3237
3238        do 2000 i=1,ncum
3239         precip1(idcum(i))=precip(i)
3240         iflag1(idcum(i))=iflag(i)
3241         wd1(idcum(i))=wd(i)
3242         inb1(idcum(i))=inb(i)
3243         cape1(idcum(i))=cape(i)
3244 2000   continue
3245
3246        do 2020 k=1,nl
3247          do 2010 i=1,ncum
3248            VPrecip1(idcum(i),k)=VPrecip(i,k)
3249            evap1(idcum(i),k)=evap(i,k)   !<<< RomP
3250            sig1(idcum(i),k)=sig(i,k)
3251            w01(idcum(i),k)=w0(i,k)
3252            ft1(idcum(i),k)=ft(i,k)
3253            fq1(idcum(i),k)=fq(i,k)
3254            fu1(idcum(i),k)=fu(i,k)
3255            fv1(idcum(i),k)=fv(i,k)
3256            Ma1(idcum(i),k)=Ma(i,k)
3257            upwd1(idcum(i),k)=upwd(i,k)
3258            dnwd1(idcum(i),k)=dnwd(i,k)
3259            dnwd01(idcum(i),k)=dnwd0(i,k)
3260            qcondc1(idcum(i),k)=qcondc(i,k)
3261            da1(idcum(i),k)=da(i,k)
3262            mp1(idcum(i),k)=mp(i,k)
3263!RomP >>>
3264            ep1(idcum(i),k)=ep(i,k)
3265            d1a1(idcum(i),k)=d1a(i,k)
3266            dam1(idcum(i),k)=dam(i,k)
3267            clw1(idcum(i),k)=clw(i,k)
3268            eplaMm1(idcum(i),k)=eplaMm(i,k)
3269            wdtrainA1(idcum(i),k)=wdtrainA(i,k)
3270            wdtrainM1(idcum(i),k)=wdtrainM(i,k)
3271!RomP <<<
3272 2010     continue
3273 2020   continue
3274
3275        do 2200 i=1,ncum
3276          sig1(idcum(i),nd)=sig(i,nd)
32772200    continue
3278
3279
3280c        do 2100 j=1,ntra
3281c         do 2110 k=1,nd ! oct3
3282c          do 2120 i=1,ncum
3283c            ftra1(idcum(i),k,j)=ftra(i,k,j)
3284c 2120     continue
3285c 2110    continue
3286c 2100   continue
3287        do j=1,nd
3288         do k=1,nd
3289          do i=1,ncum
3290            sij1(idcum(i),k,j)=sij(i,k,j)
3291            phi1(idcum(i),k,j)=phi(i,k,j)
3292            phi21(idcum(i),k,j)=phi2(i,k,j)
3293            elij1(idcum(i),k,j)=elij(i,k,j)
3294            epmlmMm1(idcum(i),k,j)=epmlmMm(i,k,j)
3295          end do
3296         end do
3297        end do
3298
3299        return
3300        end
3301
Note: See TracBrowser for help on using the repository browser.