!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
*** S/P KFCP5
**
*
#include "phy_macros_f.h"

      SUBROUTINE KFCP5 (IX,KX,FLAGCONV,KKFC,PSB,TP1,QP1, 1,13
     +                  UB,VB,SCR3,
     +                  DTDT,DQDT,DUDT,DVDT,DQCDT,DQRDT,
     +                  A,DXDY,ZCRR,GZM,
     +                  RAD, CDEPTH, DETREG, DETTOT, 
     +                  TIMEC, TIMEA, 
     +                  CAPEOUT,AREAUP,CLOUDS,DMFOUT,PEFFOUT,
     +                  UMFOUT, ZBASEOUT, ZTOPOUT,
     +                  WUMAXOUT,RLIQOUT,RICEOUT,
     +                  RLIQ_INT,RICE_INT,
     +                  RNFLX,SNOFLX,
     +                  FCPMASK,KOUNT,XLAT,MG,MLAC)
*
#include "impnone.cdk"
*
*
      INTEGER IX,KX
      INTEGER KOUNT
      REAL FLAGCONV(IX),KKFC(IX)
      REAL UB(IX,KX),VB(IX,KX),TP1(IX,KX),QP1(IX,KX)
      REAL PSB(IX),SCR3(IX,KX),A(IX,KX)
      REAL DTDT(IX,KX),DQDT(IX,KX),DUDT(IX,KX),DVDT(IX,KX)
      REAL DQRDT(IX,KX),DQCDT(IX,KX)
      REAL RAD, CDEPTH, DETREG, DETTOT
      REAL TIMEC, TIMEA
      REAL ZCRR(IX),DXDY(IX)
      REAL CAPEOUT(IX), DMFOUT(IX,KX)
      REAL WUMAXOUT(IX), AREAUP(IX,KX), CLOUDS(IX,KX)
      REAL RLIQOUT(IX,KX), RICEOUT(IX,KX)
      REAL RLIQ_INT(IX), RICE_INT(IX)
      REAL RNFLX(IX,KX), SNOFLX(IX,KX)
      REAL NORM
      REAL PEFFOUT(IX), UMFOUT(IX,KX)
      REAL ZBASEOUT(IX), ZTOPOUT(IX)
      REAL GZM(IX,KX), FCPMASK(IX)
      REAL XLAT(IX)
      REAL MG(IX),MLAC(IX)
*
*Author
*          Jack Kain and JM Fritsch (Oct 14,1990)
*
*Revision
* 001      Stephane Belair and Zonghui Huo (Dec.1994)
*               inclusion into the RPN physics package
* 002      Stephane Belair (Nov. 1998) documentation of the code
* 003      Gerard Pellerin (Dec.1998) optimisation trigger
* 004      Richard Moffet  (Fev. 1999) RPN/CMC thermodynamic functions
* 005      Andre Methot correct bugs with NCA update and < 0
* 006      R. Moffet and S. Belair (Jan. 2000)
*                   Cleaning of the code
* 007      S. Belair (Nov. 2000)  new output diagnostics
* 008      A.-M. Leduc (Jan 2001) Automatic arrays
* 009      S. Belair (Apr. 2001)  force detrainment in the upper portion
*                                 of the updraft
* 010      S.Belair, G.Lemay, A-M Leduc (Apr 2001) Debugging
* 011      S.Belair (July 2001) convective transport of momentum
* 012      A-M. Leduc (Nov 2001) kfcp1 -->kfcp2 (changed arguments in call+
*                                NCA becomes FLAGCONV)
* 013      A-M. Leduc (Feb 2002) reactivation of cloud fraction.
* 014      S. Belair, A-M. Leduc (nov 2002) add convective 1D counter kkfc.
*                                argument kkfc added, kfcp2-->kfcp3.
* 015      K. Winger (nov 2002) conservation of water.
* 016      A-M. Leduc (Dec 2002) add switch ikfcpcp
* 017      L. Spacek (Sep 2003) do loop 107 changes LFS to LFS-1
* 018      A-M. Leduc (Sep 2003) Initialize LDB and minimize value of wabs.
* 019      L.Spacek (Dec 2003) loops 260,261 D/UMFOUT(kx-nk+1)=D/UMF(nk)
* 020      B. Bilodeau (Feb 2004) NUP is declared NK instead of IX
* 021      S. Belair (Fall 2003) Output precipitation fluxes
* 022      B. Bilodeau (Mar 2004) Add rliq_int and rice_int
* 023      B. Bilodeau (Mar 2004) Add "ramp" for wklcl
* 024      L.Spacek (May 2004)    In convective loop test
*                                 the vertical loop to ITOP instead LMAX
*                                 JKP replaced by LC+1       
* 025      L.Spacek (Nov 2004)    cloud clean-up, multiplication of RLIQOUT
*                                 RICEOUT by CLOUDS
* 026      B. Bilodeau (Dec 2004) Correct KKFC bug
* 027      B. Bilodeau (Jan 2005) Move the normalization of pcpn fluxes 
*                                 after ZCRR is recalculated
* 028      D. Figueras Nieto (Fev 2005) add D/UMFOUT(kx-nk+1)=D/UMF(nk) 
*                                       loop 170
* 029      D. Talbot (Spring 2005) wklcl = 0.02 at end of trigger function
*                    to make the scheme more active
* 030      B.Dugas (Jun 2005)     Add surface modulation of WKLCL via KFCTRIGA
* 031      B. Bilodeau and S. Belair (Aug 2005) - 
*                       Correct RLIQOUT and RICEOUT bug.
*                       Limit cloud fraction to values between (0.,1.)
* 032      R. McTaggart-Cowan and M. Desgagne (Jul 2006) - 
*                       Revert back to a more vectorizable form 
*                       for Vector processors
* 033      K. Winger (Sep 2004)   Correct normalization of precipitation fluxes
*
* 034      A-M. Leduc (Feb 2009) Add latitudinal variation to WKLCL over the ocean
*                      using logical key kfctriglat. Add arguments MG ,  Mlac and 
*                      xlat in call. kfcp4 becomes kfcp5.
* 035      L. Spacek (Feb 2009)  Add UD=0, VD=0 in loop 117
*
*
*Object
*          to compute the effects of deep convection using
*          the Kain-Fritsch convective paramerization scheme.(MKS units)
*
*Arguments
*
*          - Input -
* IX       X dimension of the model grid (NI)
* KX       Z dimension of the model grid (NK)
*
*          - Input/Output -
* FLAGCONV   counter for whether convection is activated?
*
*          - Input -
* PSB      pressure at the bottom of the atmosphere
* TP1      temperature at time (T+1)
* QP1      specific humidity at time (T+1)
* UB       wind in X direction at time (T+1)
* VB       wind in Y direction at time (T+1)
* SCR3     vertical velocity at time (T+1)
*
*          - Input/Output
* DTDT     convective effects of heating
* DQDT     convective effects of moistening
* DUDT     convective effects on u-momentum
* DVDT     convective effects of v-momentum
* DQCDT    cloud water/ ice due to the Kain and Fritsch scheme
* DQRDT    rain water/ snow due to the Kain and Fritsch scheme
*
*          - Input -
* GZM      geopotential
* A        a subset of the sigma levels in the model
* DXDY     area of each tile of the grid
* FCPMASK  switch to indicate which convection scheme is used for a
*          given point for CONVEC="KFC" or CONVEC="KFCKUO2" options
*          =  0        KFC no
*          otherwise   KFC yes
* XLAT     latitude(radians)
* MG       land-sea mask
* MLAC     fraction of lakes (mask)
*
*          - Output -
* ZCRR     convective rainfall rate
*
*
*          - Input -
* RAD      radius of the convective updraft at cloud base
* CDEPTH   minimum cloud depth
*
*          - Output (diagnostics) -
* CAPEOUT  available buoyant energy
* AREAUP   cloud coverage area (m^2)
* CLOUDS   cloud fractional coverage area (fraction between 0 and 1)
* DMFOUT   downdraft mass flux
* PEFFOUT  precipitation efficiency
* UMFOUT   updraft mass flux
* ZBASEOUT cloud base height (i.e., LCL height)
* ZTOPOUT  cloud base top
* WUMAXOUT maximum velocity in the convective updrafts (m/s)
* RLIQOUT  mixing ratio of liquid water in the updrafts (kg/kg)
* RICEOUT  mixing ratio of ice in the updrafts (kg/kg)
* RLIQ_INT vertical integral of RLIQOUT
* RICE_INT vertical integral of RICEOUT
*
*
*  References:
*  Fritsch and Chappell (1980), J. Atmos. Sci., 1722-1733.
*  Zhang and Fritsch (1986), J. Atmos. Sci., 1913-1943.
*  Kain and Fritsch (1990), J. Atmos. Sci., 2784-2802.
*
*
*THINGS THAT REMAINS TO BE DONE IN THIS SCHEME:
*=============================================
*
* 1) Verify the sensitivity to RAD (=3000 for the moment)
*
* 2) Convert to "mixing ratios" at the beginning of the
*    subroutine
*
* 3) Allow detrainment of ice nucleis, as well as cloud water
*
**
*
      INTEGER I,K,IFEXFB,IFLAG
      INTEGER KLCL,KMIN,KMIX,KFRZ,KPBL,LC,LCL,LDT
      INTEGER IL,JK,JKK,JKM,JKP
      INTEGER LDB,LET,LMIN,LMAX,LOW,LTOP,LTOP1,LTOPM1,LVF,LFS,ML
      INTEGER ND,ND1,NDK,NCOUNT,NIC,NJ,NK,NK1,NM
      INTEGER NSTEP,NTC,NLAYRS,NUPNK
      INTEGER KTOP
*
      REAL A1,ABE,ABEG,AICE,AINC,AINCM1,AINCM2,AINCMX,ALIQ,AU0
      REAL BE,BICE,BLIQ,BOTERM,CLDHGT
      REAL C5,CBH,CICE,CLIQ,CLVF,CNDTNF,CPM,CPORQ,CPR,CV
      REAL DABE,DQ,DLP,DPT,DTT,DTT1,DZZ,DLIQ,DICE
      REAL DEVDMF,DMFMIN,DMFLFS,DPTT
      REAL ZLCL
      REAL BETAW,BETAI,GAMW,GAMI
      REAL DPDD,DPLIN,DPPTDF,DDPPT,DDINC,DQSDT
      REAL DTMP,DTIME,DTMLTE,DTMLTD,DTLCL
      REAL DUMFDP
      REAL ES,EE,EE1,EE2,EMIX,EFFQ,ENTERM
      REAL F1,F2,FABE,FRC,FRC1
      REAL GDT,GDRY,LIQFRAC,ICEFRAC
      REAL P00,P165,PEF,PEFF,PEFMIN,PEFMAX,PEFCBH
      REAL PMID,PPR,PPTFLX,PPTFL2,PPTMLT,PPTML2
      REAL QENV,QESE,QNEWIC,QNEWLQ,QNWFRZ,QS,QSRH
      REAL R1,RL,RF,REI,RDD
      REAL ROVG,ROCPQ,RATE,RCBH,RCED,RHBC,RHIC,RTMP
      REAL STAB,SHSIGN,SUMFLX
      REAL TVLCL,TLOG,TENV,TVEN,TDPT,TBFRZ
      REAL TVAVG,TVBAR,THATA,THTFC,THTUDL,THTMIN,THTTMP
      REAL TTMP,TTEMP,TMPLIQ,TMPICE,TTFRZ,TRPPT,TSAT
      REAL TDP,TDER,TDER2,T1RH,TOPOMG
      REAL ONEOVG, MAXZPAR, DPMIX, BETAENT
      REAL TU10,TU95,TUDL
      REAL UD1,UD2,USR,UDLBE,UPDINC,UPDIN2
      REAL UPOLD,UPNEW
      REAL VWS,VMFLCL
      REAL WLCL,WKL,WSIGNE,WSQ,WTW
      REAL XLS0,XLS1,XLV0,XLV1
      REAL DPUP , DPDOWN, TAVG
      REAL DQDTDK,DQCDTDK
      REAL WKLCL, WKLCLD
      REAL KFSCALE
*
*
*
      REAL DETFRAC
*
*                                For the optimisation and 
*                                thermodynamic functions
*
*
      INTEGER L5,ISTOP,KLM,KL,LLFC,MXLAYR
*
      REAL DXSQ,TMC,RHOLCL,WABS,ZMIX,P300,THTA
c     
c
      REAL TPDD
C
C
*
***********************************************************************
*     AUTOMATIC ARRAYS
***********************************************************************
*
      AUTOMATIC ( ACTIV   , LOGICAL , (IX   ) )
      AUTOMATIC ( POSSIB  , LOGICAL , (IX   ) )
      AUTOMATIC ( TRIGGR  , LOGICAL , (IX   ) )
      AUTOMATIC ( TRIGG2  , LOGICAL , (IX   ) )
*
      AUTOMATIC ( ITOP    , INTEGER , (IX   ) )
      AUTOMATIC ( IPBL    , INTEGER , (IX   ) )
      AUTOMATIC ( IDPL    , INTEGER , (IX   ) )
      AUTOMATIC ( LCLG    , INTEGER , (IX   ) )
*
      AUTOMATIC ( NUP     , INTEGER , (KX   ) )
*
      AUTOMATIC ( TT0     , REAL    , (IX,KX) )
      AUTOMATIC ( TV00    , REAL    , (IX,KX) )
      AUTOMATIC ( Q00     , REAL    , (IX,KX) )
      AUTOMATIC ( U00     , REAL    , (IX,KX) )
      AUTOMATIC ( V00     , REAL    , (IX,KX) )
      AUTOMATIC ( WW0     , REAL    , (IX,KX) )
      AUTOMATIC ( DZP     , REAL    , (IX,KX) )
      AUTOMATIC ( DPP     , REAL    , (IX,KX) )
      AUTOMATIC ( QST1    , REAL    , (IX,KX) )
      AUTOMATIC ( PP0     , REAL    , (IX,KX) )
      AUTOMATIC ( THTS    , REAL    , (IX,KX) )
      AUTOMATIC ( Z0G     , REAL    , (IX,KX) )
      AUTOMATIC ( DPTHMXG , REAL    , (IX   ) )
      AUTOMATIC ( PMIXG   , REAL    , (IX   ) )
      AUTOMATIC ( TMIXG   , REAL    , (IX   ) )
      AUTOMATIC ( QMIXG   , REAL    , (IX   ) )
      AUTOMATIC ( ZDPL    , REAL    , (IX   ) )
      AUTOMATIC ( ZLCLG   , REAL    , (IX   ) )
      AUTOMATIC ( ROLCL   , REAL    , (IX   ) )
      AUTOMATIC ( CAPE    , REAL    , (IX   ) )
      AUTOMATIC ( ZTOP    , REAL    , (IX   ) )
      AUTOMATIC ( WORK1   , REAL    , (IX   ) )
      AUTOMATIC ( WORK2   , REAL    , (IX   ) )
      AUTOMATIC ( WORK3   , REAL    , (IX   ) )
      AUTOMATIC ( THEUL   , REAL    , (IX   ) )
      AUTOMATIC ( THMIXG  , REAL    , (IX   ) )
      AUTOMATIC ( TLCLG   , REAL    , (IX   ) )
      AUTOMATIC ( PLCLG   , REAL    , (IX   ) )
      AUTOMATIC ( WLCLG   , REAL    , (IX   ) )
      AUTOMATIC ( TENVG   , REAL    , (IX   ) )
      AUTOMATIC ( QENVG   , REAL    , (IX   ) )
      AUTOMATIC ( WKLCLA  , REAL    , (IX   ) )
      AUTOMATIC ( DDR     , REAL    , (KX   ) )
      AUTOMATIC ( DDR2    , REAL    , (KX   ) )
      AUTOMATIC ( DER     , REAL    , (KX   ) )
      AUTOMATIC ( DER2    , REAL    , (KX   ) )
      AUTOMATIC ( DETIC   , REAL    , (KX   ) )
      AUTOMATIC ( DETIC2  , REAL    , (KX   ) )
      AUTOMATIC ( DETLQ   , REAL    , (KX   ) )
      AUTOMATIC ( DETLQ2  , REAL    , (KX   ) )
      AUTOMATIC ( DMF     , REAL    , (KX   ) )
      AUTOMATIC ( DMF2    , REAL    , (KX   ) )
      AUTOMATIC ( DMS     , REAL    , (KX   ) )
      AUTOMATIC ( DOMGDP  , REAL    , (KX   ) )
      AUTOMATIC ( DTFM    , REAL    , (KX   ) )
      AUTOMATIC ( EMS     , REAL    , (KX   ) )
      AUTOMATIC ( EMSD    , REAL    , (KX   ) )
      AUTOMATIC ( EQFRC   , REAL    , (KX   ) )
      AUTOMATIC ( EXN     , REAL    , (KX   ) )
      AUTOMATIC ( FXM     , REAL    , (KX   ) )
      AUTOMATIC ( OMG     , REAL    , (KX+1 ) )
      AUTOMATIC ( OMGA    , REAL    , (KX   ) )
      AUTOMATIC ( PPTICE  , REAL    , (KX   ) )
      AUTOMATIC ( PPTLIQ  , REAL    , (KX   ) )
      AUTOMATIC ( QADV    , REAL    , (KX   ) )
      AUTOMATIC ( QD      , REAL    , (KX   ) )
      AUTOMATIC ( QDT     , REAL    , (KX   ) )
      AUTOMATIC ( QG      , REAL    , (KX   ) )
      AUTOMATIC ( QICOUT  , REAL    , (KX   ) )
      AUTOMATIC ( QLQOUT  , REAL    , (KX   ) )
      AUTOMATIC ( QMID    , REAL    , (KX   ) )
      AUTOMATIC ( QPA     , REAL    , (KX   ) )
      AUTOMATIC ( QU      , REAL    , (KX   ) )
      AUTOMATIC ( RATIO2  , REAL    , (KX   ) )
      AUTOMATIC ( RICE    , REAL    , (KX   ) )
      AUTOMATIC ( RLIQ    , REAL    , (KX   ) )
      AUTOMATIC ( TG      , REAL    , (KX   ) )
      AUTOMATIC ( THETED  , REAL    , (KX   ) )
      AUTOMATIC ( THETEE  , REAL    , (KX   ) )
      AUTOMATIC ( THETEU  , REAL    , (KX   ) )
      AUTOMATIC ( THADV   , REAL    , (KX   ) )
      AUTOMATIC ( THMID   , REAL    , (KX   ) )
      AUTOMATIC ( THPA    , REAL    , (KX   ) )
      AUTOMATIC ( THTAD   , REAL    , (KX   ) )
      AUTOMATIC ( THTAG   , REAL    , (KX   ) )
      AUTOMATIC ( THTAU   , REAL    , (KX   ) )
      AUTOMATIC ( THTA0   , REAL    , (KX   ) )
      AUTOMATIC ( THTES   , REAL    , (KX   ) )
      AUTOMATIC ( THTESG  , REAL    , (KX   ) )
      AUTOMATIC ( TU      , REAL    , (KX   ) )
      AUTOMATIC ( TVD     , REAL    , (KX   ) )
      AUTOMATIC ( TVG     , REAL    , (KX   ) )
      AUTOMATIC ( TVQU    , REAL    , (KX   ) )
      AUTOMATIC ( TVU     , REAL    , (KX   ) )
      AUTOMATIC ( TZ      , REAL    , (KX   ) )
      AUTOMATIC ( UDR     , REAL    , (KX   ) )
      AUTOMATIC ( UDR2    , REAL    , (KX   ) )
      AUTOMATIC ( UER     , REAL    , (KX   ) )
      AUTOMATIC ( UER2    , REAL    , (KX   ) )
      AUTOMATIC ( UMF     , REAL    , (KX   ) )
      AUTOMATIC ( UMF2    , REAL    , (KX   ) )
      AUTOMATIC ( WD      , REAL    , (KX   ) )
      AUTOMATIC ( WSPD    , REAL    , (KX   ) )
      AUTOMATIC ( WU      , REAL    , (KX   ) )
      AUTOMATIC ( UU      , REAL    , (KX   ) )
      AUTOMATIC ( VU      , REAL    , (KX   ) )
      AUTOMATIC ( UD      , REAL    , (KX   ) )
      AUTOMATIC ( VD      , REAL    , (KX   ) )
      AUTOMATIC ( UG      , REAL    , (KX   ) )
      AUTOMATIC ( VG      , REAL    , (KX   ) )
      AUTOMATIC ( UPA     , REAL    , (KX   ) )
      AUTOMATIC ( VPA     , REAL    , (KX   ) )
      AUTOMATIC ( UADV    , REAL    , (KX   ) )
      AUTOMATIC ( VADV    , REAL    , (KX   ) )
*
******************************************************
*
*

      EXTERNAL TPMIX
      EXTERNAL CONDLOAD
      EXTERNAL DTFRZNEW
      EXTERNAL ENVIRTHT
      EXTERNAL PROF5
      EXTERNAL TPDD
*
*
*
#include "surfacepar.cdk"
#include "consphy.cdk"
#include "options.cdk"
*
*
*
*     "RAMP" FOR WKLCL : 
*     ================
*
*     WKLCL WILL INCREASE FROM KFCTRIG4(3) TO KFCTRIG4(4)
*     BETWEEN TIMESTEPS KFCTRIG4(1) AND KFCTRIG4(2)
*
      IF      (KOUNT .LE. INT(KFCTRIG4(1))) THEN
         WKLCL = KFCTRIG4(3)
      ELSE IF (KOUNT .GT. INT(KFCTRIG4(2))) THEN
         WKLCL = KFCTRIG4(4)
      ELSE
*        LINEAR INTERPOLATION
         WKLCL = KFCTRIG4(3) +  (REAL(KOUNT)  - KFCTRIG4(1))  /
     +                          (KFCTRIG4(2)  - KFCTRIG4(1))  *
     +                          (KFCTRIG4(4)  - KFCTRIG4(3))
      ENDIF
*
*
*      Latitudinal ramp for WKLCL :
*     ============================
*
*     WKLCL will take on different values:
*     over land and lakes: we kee the value set by the "ramp" above
*     over sea water:
*       for |lat| >= TRIGLAT(2) we keep value set by the "ramp" above
*       for |lat| <= TRIGLAT(1) we use the new value KFCTRIGL
*       and linear interpolation in between TRIGLAT(1) and TRIGLAT(2)
*
      WKLCLA(:) = WKLCL

        IF (KFCTRIGLAT) THEN
 

         DO I=1,IX


          IF (ABS(XLAT(I)) .LE. TRIGLAT(1). and. 
     +        MG(I) .le. critmask .and.
     +        MLAC(I) .le. critmask) THEN
            WKLCLA(I)= KFCTRIGL
          ELSE IF (ABS(XLAT(I)).gt.TRIGLAT(1) .and.
     +             ABS(XLAT(I)).lt.TRIGLAT(2) .and.
     +             MG(I) .le. critmask .and.
     +             MLAC(I) .le. critmask) THEN
           WKLCLA(I)= ( ((ABS(XLAT(I))-TRIGLAT(1))/
     +                (TRIGLAT(2)-TRIGLAT(1)))*
     +             (WKLCL-KFCTRIGL) ) + KFCTRIGL
          ELSE
            WKLCLA(I)= WKLCL
          ENDIF

         END DO

       ENDIF
*===================================================
*
      IF (KFCTRIGA.GT.0.0) THEN
*        (B. Dugas, June 15 2005)
*
*        IN WHAT FOLLOWS, WE ASSUME THAT
*
*           KFCTRIG * RESOLUTION = CONSTANT,
*
*         SO THAT
*
*           KFCTRIG(RES2) = KFCTRIG(RES1) * RES1 / RES2
*
*        THE 0.17 AND 0.01 LIMITS ARE THOSE THAT ARE DEEMED
*        TO BE APPROPRIATE FOR 10KM AND 170KM, RESPECTIVELY.
*        THESE LAST TWO VALUES DEFINE THE RESOLUTION INTERVAL
*        AT WHICH THIS KF CONVECTION CODE WILL BE USED IN THE
*        SGMIP AND/OR OPERATIONAL FRAMEWORK
*
*        CONVERT KFCTRIGA TO METRES
         KFSCALE = 1000. * KFCTRIGA
*
         WKLCLA(:) = MIN( 0.17,
     +                    MAX( 0.01,
     +                         WKLCLA(:) * KFSCALE
     +                         / SQRT( DXDY(:) )
     +                       )
     +                  )
*
      ENDIF
*


*     2.  USEFUL PARAMETERS
*     =====================
*
      P00     = 1.E5
      CV      = 717.
      RHIC    = 1.
      RHBC    = 0.90
      TTFRZ =   268.16
      TBFRZ   = 248.16
      C5      = 1.0723E-3
      RATE    = 0.01
      MAXZPAR = 3.5E3
      DPMIX   = 60.E2
      BETAENT = 1.05
      PEFMIN  = 0.2
      PEFMAX  = 0.9
C
      ROVG   = RGASD/GRAV
      GDRY   = -GRAV/CPD
      ONEOVG = 101.9368
      KL     = KX
      KLM    = KL-1
*
      BETAW = 6822.459384
      GAMW  = 5.13948
      BETAI = 6295.421
      GAMI  = 0.56313
*
*
*                          Define constants for calculation
*                          of latent heating
*
      XLV0 = 3.147E+6
      XLV1 = 2369.
      XLS0 = 2.905E+6
      XLS1 = 259.532
*
*
*
*                          Define constants for calculation of
*                          saturation vapor pressure according
*                          to Buck (JAM, December 1981)
*
      ALIQ = 613.3
      BLIQ = 17.502
      CLIQ = 4780.8
      DLIQ = 32.19
      AICE = 613.2
      BICE = 22.452
      CICE = 6133.0
      DICE = 0.61
*
*
*                        Flag for feedback to explicit moisture
*                        IFEXFB = O  No feedback of the convective
*                                    scheme on the grid-scale
*                                    cloud and rainwater variables
*                        IFEXFB = 1  Feedback is included
*
      IFEXFB = 0
*
*     =============================================================
*
*
*      4. INPUT A VERTICAL SOUNDING (ENVIRONMENTAL)
*      ============================================
*
        DO K = 1, KX
          NK = KX-K+1
            DO I = 1, IX
*
*
*                         The sounding
*
*
*                         In the RPN physics, the K indices goes
*                         from 1 at the top of the model to KX
*                         at the surface.
*                         In the Kain-Fritsch subroutine, we use
*                         the opposite (of course).
*                         The switch is done in this loop.
*
           PP0(I,K) = 1.E3*(A(I,NK)*PSB(I))
           TT0(I,K) = TP1(I,NK)
           Q00(I,K) = MAX(QP1(I,NK),1.0E-10 )
           U00(I,K) = UB(I,NK)
           V00(I,K) = VB(I,NK)

*                        add the definition of z0g (geopotential height) 
*                        from gzm(geopotential)

           Z0G(I,K) = GZM(I,NK)/grav
*
*
*
*                         If Q0 is above saturation value, reduce it
*                         to saturation level
*
           ES=ALIQ*EXP((BLIQ*TT0(I,K)-CLIQ)/(TT0(I,K)-DLIQ))
           ES=MIN( ES, 0.5*PP0(I,K) )
           QST1(I,K)=0.622*ES/(PP0(I,K)-ES)
           QST1(I,K) = MAX( MIN(QST1(I,K),0.050) , 1.E-6 )
           Q00(I,K)  = MIN(QST1(I,K),Q00(I,K))
           TV00(I,K) = TT0(I,K) * (1. + 0.608*Q00(I,K) )
           WW0(I,K)  = -ONEOVG*SCR3(I,NK)/PP0(I,K)*(RGASD*TV00(I,K))
*
       END DO
      END DO
*
*
      DO I=1,IX
        DPP(I,1)   = ( A(I,KX)-A(I,KX-1) ) * PSB(I)*1.E3
        DPP(I,KX)  = ( A(I,2) -A(I,1)    ) * PSB(I)*1.E3
      END DO
*
*
      DO K=2,KX-1
        NK = KX-K+1
        DO I=1,IX
           DPUP      = ( A(I,NK)-A(I,NK-1) ) * PSB(I)*1.E3
           DPDOWN    = ( A(I,NK+1)-A(I,NK) ) * PSB(I)*1.E3
           DPP(I,K)  = 0.5 * (DPUP+DPDOWN)
        END DO
      END DO
*
**                         pass gzm as argument, so don't need to calculate z0g here,
*                          only need to calculate the dzp (thickness) from the inverted z0g.   
*
        DO K = 2, KX
        DO I = 1, IX
           DZP(I,K-1) = Z0G(I,K)-Z0G(I,K-1)
        END DO
        END DO

*                        at the top: do not put the thickness to zero but instead 
*                        put the level kx-1 in kx   

        DO I=1,IX
           DZP(I,KX) = DZP(I,KX-1)
        END DO

 
**
*
*       5. COUNTER "FLAGCONV"
*       ================
*
*
*                          If FLAGCONV > 0
*                          ==> convection is already activated
*                              the tendencies on T, Q, QC, and
*                              QR do not change.
*                              Go to the next column
*
*                          If FLAGCONV =< 0
*                          ==> convective tendencies and diagnostics
*                              are put to "0"
*
*
        DO I = 1, IX
          ACTIV(I) = .FALSE.
*
          IF (FLAGCONV(I).EQ.1.) KKFC(I)=1.
*
          IF (FLAGCONV(I).LE.0) THEN
*
            RLIQ_INT(I) = 0.
            RICE_INT(I) = 0.
*
            DO K=1,KX
              DTDT(I,K)  = 0.0
              DQDT(I,K)  = 0.0
              DUDT(I,K)  = 0.0
              DVDT(I,K)  = 0.0
              DQCDT(I,K) = 0.0
              DQRDT(I,K) = 0.0
*
              UMFOUT(I,K) = 0.
              DMFOUT(I,K) = 0.
*           
              RLIQOUT(I,K) = 0.
              RICEOUT(I,K) = 0.
*
              RNFLX(I,K)   = 0.
              SNOFLX(I,K)  = 0.
*
              AREAUP(I,K) = 0.
              CLOUDS(I,K) = 0.
*
            END DO
*
            ZCRR(I) = 0.0
*
            CAPEOUT(I)  = 0.
            PEFFOUT(I)  = 0.
            ZBASEOUT(I) = 0.
            ZTOPOUT(I)  = 0.
            WUMAXOUT(I) = 0.
*
          ELSE IF (FLAGCONV(I).GT.0) THEN
*
          ACTIV(I) = .TRUE.
          FLAGCONV(I) = FLAGCONV(I) - 1
          ZCRR(I) = 1000.*ZCRR(I)
*
          ENDIF
        END DO
*
*
*
***************************BEGINNING OF KF TRIGGER *********************
*
*                                Initialize
        DO IL = 1, IX
          IDPL(IL) = 1
          JK = IDPL(IL)
          ZDPL(IL) = Z0G(IL,JK)
          TRIGG2(IL)=.FALSE.
        END DO
*
*                                Compute THTS
       DO K = 1, KX
       DO IL = 1,IX
         THTS(IL,K) = TT0(IL,K)*(1.E5/PP0(IL,K))**(0.2854*
     1                (1.-0.28*QST1(IL,K)))*
     1                EXP((3374.6525/TT0(IL,K)-2.5403)*QST1(IL,K)*
     1                (1.+0.81*QST1(IL,K)))
       END DO
       END DO
*
*                                Highest TOP
*VDIR NOLSTVAL
      DO K = 2, KX
      DO IL = 1, IX
        IF(Z0G(IL,K) - Z0G(IL,1) .LT. MAXZPAR ) ITOP(IL)=K
      END DO
      END DO
*
*                                Begin convection test loop
*VDIR NOLSTVAL
      DO JKK= 1, KX
         DO IL = 1,IX
C         WKLCL = WKLCLA(IL)
         POSSIB(IL)= ZDPL(IL) - Z0G(IL,1) .LT. MAXZPAR
*
         IF(POSSIB(IL)) THEN
            THMIXG(IL)=0.
            QMIXG(IL)=0.
            PMIXG(IL)=0.
            DPTHMXG(IL)=0.
            TRIGGR(IL)=.FALSE.
         ENDIF
         end do
*
*                             Construct mixed layer
*
*VDIR NOLSTVAL
         DO JK = JKK, KX-1
            JKM = JK + 1
            DO IL = 1,IX
            IF(POSSIB(IL) .AND. DPTHMXG(IL) .LT. DPMIX) THEN
               ZDPL(IL) = Z0G(IL,JKK)
               IDPL(IL) = JKK
               IPBL(IL) = JK
               ROCPQ=0.2854*(1.-0.28*Q00(IL,JK))
               THMIXG(IL)=THMIXG(IL) +DPP(IL,JK)*TT0(IL,JK)*
     %          (P00/PP0(IL,JK))**ROCPQ
               QMIXG(IL)= QMIXG(IL) +DPP(IL,JK)*Q00(IL,JK)
               PMIXG(IL)= PMIXG(IL) +DPP(IL,JK)*PP0(IL,JK)
               DPTHMXG(IL)=DPTHMXG(IL)+DPP(IL,JK)
            ENDIF
            end do
         END DO
*
*
*                             Determine temperature and pressure 
*                             at LCL
*
         DO IL = 1,IX
         IF(POSSIB(IL)) THEN
            THMIXG(IL)=THMIXG(IL)/DPTHMXG(IL)
            QMIXG(IL)=QMIXG(IL)/DPTHMXG(IL)
            QMIXG(IL)=MAX( QMIXG(IL),1.0E-10 )
            PMIXG(IL)=PMIXG(IL)/DPTHMXG(IL)
            ROCPQ=0.2854*(1.-0.28*QMIXG(IL))
            TMIXG(IL)=THMIXG(IL)*(PMIXG(IL)/P00)**ROCPQ
            EMIX=QMIXG(IL)*PMIXG(IL)/(0.622+QMIXG(IL))
            TLOG=ALOG(EMIX/ALIQ)
            TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
            WORK1(IL)=TDPT
            TLCLG(IL)=TDPT-(.212+1.571E-3*(TDPT-TRPL)-4.36E-4*
     %          (TMIXG(IL)-TRPL))*
     %          (TMIXG(IL)-TDPT)
            TLCLG(IL)=MIN(TLCLG(IL),TMIXG(IL))
            TVLCL= TLCLG(IL) * ( 1. + 0.608 * QMIXG(IL) )
            CPORQ=1./ROCPQ
            PLCLG(IL)=P00*(TLCLG(IL)/THMIXG(IL))**CPORQ
         ENDIF
         end do
*
*
*                           Set to saturation value
*
*                           Determine vertical loop index 
*                           at LCL and DPL
*
*VDIR NOLSTVAL
         DO JK = JKK, KX-1
         DO IL = 1,IX
            IF (POSSIB(IL) .AND. PLCLG(IL) .LT. PP0(IL,JK) ) THEN
            LCLG(IL) = JK +1
            ENDIF
         end do
         END DO
*
*
*                           Estimate height and environment THETAV
*                           at LCL
*
          DO IL = 1,IX
          JK = LCLG(IL)
          JKM= JK -1
          IF (POSSIB(IL) ) THEN
            DLP = ALOG(PLCLG(IL)/PP0(IL,JKM))/ALOG(PP0(IL,JK)/PP0(IL,JKM))
            TENVG(IL) = TT0(IL,JKM)+(TT0(IL,JK)-TT0(IL,JKM))*DLP
            QENVG(IL) = Q00(IL,JKM)+(Q00(IL,JK)-Q00(IL,JKM))*DLP
            TVEN = TENVG(IL) * ( 1. + 0.608 * QENVG(IL) )
            TVBAR = 0.5*(TV00(IL,JKM)+TVEN)
            ZLCLG(IL) = Z0G(IL,JKM)+ROVG*TVBAR*ALOG(PP0(IL,JKM)/PLCLG(IL))
            TVAVG = 0.5*(TV00(IL,JK)+ TENVG(IL)*(1.+0.608*QENVG(IL)))
            PLCLG(IL) = PP0(IL,JK)*
     %               EXP(GRAV/(RGASD*TVAVG)*(Z0G(IL,JK)-ZLCLG(IL)))
            TVLCL = TLCLG(IL) * (1.+0.608*QMIXG(IL))
            ROLCL(IL) = PLCLG(IL)/(RGASD*TVLCL)
*
*                           Compute grid-scale vertical 
*                           velocity perturbation
*
            WKL = WW0(IL,JKM)+(WW0(IL,JK)-WW0(IL,JKM))*DLP-WKLCLA(IL)
            WSIGNE = WKL/(ABS(WKL)+1.E-10)
            WORK1(IL)=4.64*WSIGNE*(ABS(WKL)+1.E-10)**0.3333333
*
*
*                           Compute vertical velocity 
*                           at the LCL
*
            LC = IDPL(IL)
            GDT =GRAV*WORK1(IL)*(ZLCLG(IL)-Z0G(IL,LC))/(TV00(IL,LC)+TVEN)
            WLCLG(IL) = 1.+.5*WSIGNE*SQRT(ABS(GDT)+1.E-10)
*
*
*                           Check to see if cloud is buoyant
            IF( TLCLG(IL)+WORK1(IL).GT.TENVG(IL)
     %          .AND. WLCLG(IL) .GT. 0.) TRIGGR(IL)=.TRUE.
*
          ENDIF
*
*
*                          Look for parcels that produce sufficient
*                          cloud depth.  Cloud top level is where
*                          CAPE is less than critical value
*
*
          CAPE(IL)=0.
          THEUL(IL)=TMIXG(IL)*(1.E5/PMIXG(IL))**
     1              (0.2854*(1.-0.28*QMIXG(IL)))*
     1              EXP((3374.6525/TLCLG(IL)-2.5403)*
     1              QMIXG(IL)*(1.+0.81*QMIXG(IL)))
          end do
          DO IL = 1,IX
*
          IF (TRIGGR(IL)) THEN
            JK = LCLG(IL)
            ZTOP(IL) = Z0G(IL,JK)
            WORK3(IL)=0.
*
            DO LC  = JK,KX-2
              DZZ = Z0G(IL,LC+1)-Z0G(IL,LC)
              WORK1(IL) =((2.*THEUL(IL))/(THTS(IL,LC+1)+THTS(IL,LC))-1.)*DZZ
              CAPE(IL) = CAPE(IL)+WORK1(IL)*GRAV
*                                     FACTOR BETAENT FOR ENTRAINEMENT
              WORK2(IL) = 1.333*GRAV*CAPE(IL) + BETAENT * WLCLG(IL)*WLCLG(IL)
              WORK2(IL) = SIGN(1.,WORK2(IL))
              WORK3(IL) = WORK3(IL) + MIN(0., WORK2(IL))
              WORK3(IL) = MAX(-1.,WORK3(IL))
*
              ZTOP(IL) = Z0G(IL,LC)*0.5*(1+WORK2(IL))*(1+WORK3(IL))
     %                 + ZTOP(IL)*0.5*(1-WORK2(IL))
*                                IF CLDHGT > CDEPTH FLAG AGAIN
              IF( ZTOP(IL)-ZLCLG(IL) .GE. CDEPTH
     %                   .AND. .NOT.TRIGG2(IL) ) THEN
                TRIGG2(IL)=.TRUE.
              ENDIF
            END DO
          ENDIF
*               END OF CONVECTIVE LOOP TEST
       END DO
      END DO
**
*
*
************************ END OF KF TRIGGER ***********************
*
*
*
*
*                             The few points for which convective
*                             activity is possible are determined and
*                             are indicated by the TRIGG2 and ACTIV
*                             logical variables.
*
*                             For the columns with TRIGG2 = .true. and
*                                                   ACTIV = .false.
*                             ... do the whole Kain-Fritsch calculations ...
*
*
      DO 325 I = 1, IX
*
C        WKLCL = WKLCLA(I)
*
*       Do not perform calculation if iconvec=12 and fcpmask=0
*       This is where KUO schem is requested
*
        ACTIV(I)=ACTIV(I) .OR.
     $           ( iconvec.eq.12 .and. NINT( FCPMASK(I) ).EQ.0 )

        IF ( .NOT. TRIGG2 (I) .OR. ACTIV(I) ) GO TO 325
*
*
      KTOP = ITOP(I)
*
*
      DO K=1,KX
        RLIQ(K) = 0.
        RICE(K) = 0.
      END DO
*
*
      DXSQ = DXDY(I)
      TMC=2.E4*DXSQ/GRAV
*
C
  10  P300 = 1000.*(PSB(I)*A(I,KL)-30.)
*
*
*
        ML = 0
*VDIR NOLSTVAL
        DO 15 K = 1, KX
*
           NK = KX-K+1
*
           PMID = 0.5 * ( 1000.*PSB(I) + 100.E2 )
           IF (PP0(I,K).GE.PMID) L5 = K
           IF (PP0(I,K).GE.P300) LLFC = K
           IF (TT0(I,K).GT.TRPL) ML=K
*
  15    CONTINUE
*
*
*
*       5. COUNTER "FLAGCONV"
*       ================
*
*
*
       IF (FLAGCONV(I).LE.0) THEN
          DO 620 K=1,KX
           DTDT(I,K)  = 0.0
           DQDT(I,K)  = 0.0
           DUDT(I,K)  = 0.0
           DVDT(I,K)  = 0.0
           DQCDT(I,K) = 0.0
           DQRDT(I,K) = 0.0
 620      CONTINUE
       ENDIF
          ZCRR(I) = 0.0
*
*
*      6. TRIGGER FUNCTION
*      ===================
*
        KMIX=1
25      LOW = KMIX
*
*                           No levels (or parcels) in the lowest
*                           300 mb were found to be unstable
*                           ==> go to the next grid point
*
        IF (LOW.GT.LLFC) GOTO 325
        LC=LOW
        MXLAYR=0
*
*
*                           Find the number of layers needed to
*                           have a mixed layer of at least 60 mb
*
*                           Note: in a future version of the scheme,
*                           why not use results from the boundary-layer
*                           scheme concerning the well-mixed layer ?
*
*                           DPthmixg(i) = pressure depth of the mixed layer
*                           thmixg(i)   = potential temperature of the
*                                     mixed layer
*                           NLAYRS  = number of model layers in the
*                                     mixed layer
*
        NLAYRS=0
        DPTHMXG(I)=0.
        DO 63 NK = LC,KX
          DPTHMXG(I)=DPTHMXG(I)+DPP(I,NK)
          NLAYRS=NLAYRS+1
*
*
*
*                           The layer is at least 60-mb deep
*
63        IF(DPTHMXG(I).GT.DPMIX)GOTO 64
*
        GOTO 325
*
64      KPBL=LC+NLAYRS-1
        KMIX=LC+1
18      THMIXG(I)=0.
        QMIXG(I)=0.
        ZMIX=0.
        PMIXG(I)=0.
        DPTHMXG(I)=0.
*
*
*                           Integrated properties
*
        DO 17 NK = LC,KPBL
          DPTHMXG(I)=DPTHMXG(I)+DPP(I,NK)
          ROCPQ=0.2854*(1.-0.28*Q00(I,NK))
          THMIXG(I)=THMIXG(I)+DPP(I,NK)*TT0(I,NK)*(P00/PP0(I,NK))**ROCPQ
          QMIXG(I)=QMIXG(I)+DPP(I,NK)*Q00(I,NK)
          ZMIX=ZMIX+DPP(I,NK)*Z0G(I,NK)
17        PMIXG(I)=PMIXG(I)+DPP(I,NK)*PP0(I,NK)
*
*
*                          Average to obtain the mixed properties
*
        THMIXG(I)=THMIXG(I)/DPTHMXG(I)
        QMIXG(I)=QMIXG(I)/DPTHMXG(I)
        QMIXG(I)=AMAX1( QMIXG(I),1.0E-10 )
        ZMIX=ZMIX/DPTHMXG(I)
        PMIXG(I)=PMIXG(I)/DPTHMXG(I)
        ROCPQ=0.2854*(1.-0.28*QMIXG(I))
        TMIXG(I)=THMIXG(I)*(PMIXG(I)/P00)**ROCPQ
*
*
*                          We have all the characteristics of the
*                          departure parcels (the mixed values).
*                          Now we need the temperature and pressure
*                          at the LCL.  First calculate dew point
*                          temperature TDPT by inverting the saturated
*                          water vapor equation (see Davis and Jones
*                          1983).
*
        EMIX=QMIXG(I)*PMIXG(I)/(0.622+QMIXG(I))
        TLOG=ALOG(EMIX/ALIQ)
        TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
        TLCLG(I)=TDPT-(.212+1.571E-3*(TDPT-TRPL)-4.36E-4*(TMIXG(I)-TRPL))*
     *        (TMIXG(I)-TDPT)
        TLCLG(I)=AMIN1(TLCLG(I),TMIXG(I))
        TVLCL= TLCLG(I)*(1.+0.608*QMIXG(I))
        CPORQ=1./ROCPQ
        PLCLG(I)=P00*(TLCLG(I)/THMIXG(I))**CPORQ
*
*
*
*                         Find the first level above the LCL
*
        DO 29 NK = LC,KL
         KLCL=NK
29       IF(PLCLG(I).GE.PP0(I,NK))GO TO 35
*
        GOTO 325
*
35      K=KLCL-1
        DLP=ALOG(PLCLG(I)/PP0(I,K))/ALOG(PP0(I,KLCL)/PP0(I,K))
*
*
*                               Estimate environmental temperature
*                               and mixing ratio at the LCL
*
*
        TENV=TT0(I,K)+(TT0(I,KLCL)-TT0(I,K))*DLP
        QENV=Q00(I,K)+(Q00(I,KLCL)-Q00(I,K))*DLP
        TVEN= TENV*(1.+0.608*QENV)
        TVBAR=0.5*(TV00(I,K)+TVEN)
*
*                               to avoid getting negative dzz later on: 
*                               use simple linear interpolation to get 
*                               the level zlcl    

*        ZLCL=Z0G(I,K)+RGASD*TVBAR*ALOG(PP0(I,K)/PLCLG(I))/GRAV

         ZLCL= Z0G(I,K)+ (Z0G(I,K+1) - Z0G(I,K)) *
     1         ( PLCLG(I)-PP0(I,K) )/ ( PP0(I,K+1) - PP0(I,K) )

*                               we do not want zlcl to be at the level 
*                               z0g(k+1), otherwise we get dzz=0.
*                               Therefore we impose a difference
*                               of 1 metre.               

         ZLCL= MIN (ZLCL, Z0G(I,K+1) - 1.)
*
*
*                               Check to see if the parcel is buoyant
*
        WKLCLD = MIN(0.02,WKLCLA(I))
        WKL = WW0(I,K)+(WW0(I,KLCL)-WW0(I,K))*DLP-WKLCLD
        WABS = ABS(WKL)+1.E-10
        WSIGNE = WKL/WABS
        DTLCL = 4.64*WSIGNE*WABS**0.33
        GDT=GRAV*DTLCL*(ZLCL-Z0G(I,LC))/(TV00(I,LC)+TVEN)
        WLCL=1.+.5*WSIGNE*SQRT(ABS(GDT)+1.E-10)
*
*
*                               Parcel is convectively unstable
*                               Calculate the tendencies
*
        IF (TLCLG(I)+DTLCL.GT.TENV) GO TO 45
*
*
*                                Parcel not buoyant.
*                                Go to the next column.
*
        IF(KPBL.GE.LLFC)GO TO 325
        GOTO 25
*
*
*
*      7. CHARACTERISTICS OF THE BUOYANT PARCELS AT THE LCL
*      ====================================================
*
*
*                                THETEU = equivalent potential temperature
*                                         of the updraft just below the LCL.
*
*                                Note that K here is the level just below
*                                the LCL, whereas KLCL is the level just
*                                above it.
*
45    THETEU(K)=TMIXG(I)*(1.E5/PMIXG(I))**(0.2854*(1.-0.28*QMIXG(I)))*
     *      EXP((3374.6525/TLCLG(I)-2.5403)*QMIXG(I)*(1.+0.81*QMIXG(I)))
      ES=ALIQ*EXP((TENV*BLIQ-CLIQ)/(TENV-DLIQ))
      ES=MIN( ES , 0.5*PLCLG(I) )
*
*
*                                 Adjust the pressure at the LCL using the
*                                 height of the LCL and an average temperature
*                                 between the environmental and grid-scale
*                                 temperature.
*
      TVAVG=0.5*(TV00(I,KLCL)+ TENV*(1.+0.608*QENV))
      PLCLG(I)=PP0(I,KLCL)*EXP(GRAV/(RGASD*TVAVG)*(Z0G(I,KLCL)-ZLCL))
*
*
*                                 Vertical motion of the parcel and equivalent
*                                 pot. temperature of the environment at the
*                                 LCL.
*
      QESE=0.622*ES/(PLCLG(I)-ES)
      QESE=MAX( MIN( QESE , 0.050 ) , 1.E-6 )
      GDT=GRAV*DTLCL*(ZLCL-Z0G(I,LC))/(TV00(I,LC)+TVEN)
      WLCL=1.+.5*WSIGNE*SQRT(ABS(GDT)+1.E-10)
      THTES(K)=TENV*(1.E5/PLCLG(I))**(0.2854*(1.-0.28*QESE))*
     *      EXP((3374.6525/TENV-2.5403)*QESE*(1.+0.81*QESE))
      WTW=WLCL*WLCL
*
*                                 No upward motion ==> take next slab
*                                 and test for convective instability.
*
      IF(WLCL.LE.0.) GOTO 25
      TVLCL=TLCLG(I)*(1.+0.608*QMIXG(I))
      RHOLCL=PLCLG(I)/(RGASD*TVLCL)
*
      LCL=KLCL
      LET = LCL
*
*
*
*      8. COMPUTE UPDRAFT PROPERTIES
*      =============================
*
*
*                           Initial updraft mass flux (VMFU)
*
*                           AU0 = area of the updraft at cloud base
*                           UMF = updraft mass flux
*                           VMFLCL = vertical mass flux at the LCL
*                           RATIO2 = degree of glaciation
*
      WU(K)=WLCL
      AU0=PI*RAD*RAD
      UMF(K)=RHOLCL*AU0
      VMFLCL=UMF(K)
      UPOLD=VMFLCL
      UPNEW=UPOLD
      RATIO2(K)=0.
*
*
*                           UER = environmental entrainment rate
*                           ABE = the available buoyant energy
*                           TRPPT = total rate of precip. production
*
*
      UER(K)=0.
      ABE=0.
      TRPPT=0.
*
*                           TU, TVU, QU = updraft properties
*
      TU(K)=TLCLG(I)
      TVU(K)=TVLCL
      QU(K)=QMIXG(I)
*
*                           EQFRC = fraction of environmental air in
*                                   mixed subparcels
*
      EQFRC(K)=1.
*
*                           RLIQ = liquid water in the updraft
*                           RICE = ice in the updraft
*
      RLIQ(K)=0.
      RICE(K)=0.
*
*                           QLQOUT = liquid water fallout from the updraft
*                           QICOUT = ice fallout from the updraft
*
      QLQOUT(K)=0.
      QICOUT(K)=0.
*
*                           DETLQ = detrained liquid water from the updraft
*                           DETIC = detrained ice from the updraft
*
      DETLQ(K)=0.
      DETIC(K)=0.
*
*                           PPTLIQ = liquid precipitation from conv. updraft
*                           PPTICE = solid precipitation from conv. updraft
*
      PPTLIQ(K)=0.
      PPTICE(K)=0.

*
*                           KFRZ = freezing level
*
      IFLAG = 0
      KFRZ=LC
*
*
*                          The amount of convective available potential
*                          energy (CAPE) is calculated with respect to
*                          an undiluted parcel ascent.
*                          THUDL = equivalent potential temperature of an
*                          undiluted parcel.
*                          TUDL = temperature of an undiluted parcel
*
      THTUDL=THETEU(K)
      TUDL=TLCLG(i)
*
*
*                          TTEMP is used during the calculations of the
*                          linear glaciation process.
*                          This temperature is initially set to the
*                          temperature at which freezing is specified
*                          to occur within the glaciation interval.
*                          It is set equal to the UPDR temperature
*                          at the previous model level.
*
      TTEMP=TTFRZ
*
*
*                          LOOP FOR UPDRAFT CALCULATIONS.  We calculate
*                          here the updraft temperature, the mixing ratio,
*                          the vertical mass flux, the lateral detrainment
*                          of mass and moisture, and the precipitation
*                          rates at each model level.
*                          This loop is also pretty long...
*
       DO 60 NK=K,KLM
         NK1=NK+1
         RATIO2(NK1)=RATIO2(NK)
*
*
*                          At a first stage, consider that THETEU,
*                          QU, RLIQ, and RICE, are conserved from
*                          one level to another (UNDILUTED ascent
*                          before the role of ENTRAINMENT is evaluated).
*
*
         FRC1=0.
         TU(NK1)=TT0(i,nk1)
         THETEU(NK1)=THETEU(NK)
         QU(NK1)=QU(NK)
         RLIQ(NK1)=RLIQ(NK)
         RICE(NK1)=RICE(NK)
*
*
*                          Call the mixing subroutine for the
*                          UNDILUTED ASCENT.
*
         CALL TPMIX(PP0(I,NK1),THETEU(NK1),TU(NK1),QU(NK1),RLIQ(NK1),
     *     RICE(NK1),QNEWLQ,QNEWIC,RATIO2(NK1),RL,XLV0,XLV1,XLS0,XLS1,
     *     ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
*
         TVU(NK1)=TU(NK1)*(1.+0.608*QU(NK1))
*
*
*                          Check to see if updraft temperature is
*                          within the freezing interval.  If it is,
*                          calculate the fractional conversion to
*                          glaciation and adjust QNEWLQ to reflect the
*                          gradual change in THETAU since the last
*                          model level.  The glaciation effects will be
*                          determined after the amount of condensate
*                          available after precipitation fallout is
*                          determined.  TTFRZ is the temperature at
*                          which glaciation begins, TBFRZ is the
*                          temperature at which it ends.
*
*                          FRC1 = fractional conversion to glaciation
*                                 (considering the entire glaciation process,
*                                  from TTFRZ to TBFRZ)
*                          R1   = fractional conversion to glaciation
*                                 (but this time considering only the
*                                  remaining glaciation from TU(NK) to
*                                  TBFRZ).
*
         IF(TU(NK1).LE.TTFRZ.AND.IFLAG.LT.1)THEN
           IF(TU(NK1).GT.TBFRZ)THEN
*
*                              within the glaciation buffer zone...
*
             IF(TTEMP.GT.TTFRZ)TTEMP=TTFRZ
             FRC1=(TTEMP-TU(NK1))/(TTFRZ-TBFRZ)
             R1=(TTEMP-TU(NK1))/(TTEMP-TBFRZ)
           ELSE
*
*                              glaciation processes are over...
*
             FRC1=(TTEMP-TBFRZ)/(TTFRZ-TBFRZ)
             R1=1.
             IFLAG=1
           ENDIF
*
*
*                              In this glaciation process, the new liquid
*                              generated in the updraft directly goes into
*                              QNEWFRZ.
*
           QNWFRZ=QNEWLQ
*
*                              Increase new ice and decrease new liquid
*                              following the R1 fractional glaciation
*
           QNEWIC=QNEWIC+QNEWLQ*R1*0.5
           QNEWLQ=QNEWLQ-QNEWLQ*R1*0.5
           EFFQ=(TTFRZ-TBFRZ)/(TTEMP-TBFRZ)
           TTEMP=TU(NK1)
         ENDIF
*
*
*                             Updraft vertical velocity and
*                             precipitation fallout.
*
         IF(NK.EQ.K)THEN
*
*                             For the level just below the LCL
*
           BE=(TVLCL+TVU(NK1))/(TVEN+TV00(I,NK1))-1.
           BOTERM=2.*(Z0G(I,NK1)-ZLCL)*GRAV*BE/1.5
           ENTERM=0.
           DZZ=Z0G(I,NK1)-ZLCL

         ELSE
*
*                             And above...
*
           BE=(TVU(NK)+TVU(NK1))/(TV00(I,NK)+TV00(I,NK1))-1.
           BOTERM=2.*DZP(I,NK)*GRAV*BE/1.5
           ENTERM=2.*UER(NK)*WTW/UPOLD
           DZZ=DZP(I,NK)
         ENDIF
         WSQ=WTW
*
*                             Condensation in the updraft.
*
         CALL CONDLOAD(RLIQ(NK1),RICE(NK1),WTW,DZZ,BOTERM,ENTERM,
     *                 RATE,QNEWLQ,QNEWIC,QLQOUT(NK1),QICOUT(NK1),
     *                 GRAV)
*
         WABS=SQRT(MAX(ABS(WTW),1.E-10))

         WU(NK1)=WTW/WABS
*
*
*                              If the vertical velocity is less
*                              than zero, exit the updraft loop
*                              and if the cloud is deep enough,
*                              finalize the updraft calculations.
*
         IF(WU(NK1).LE.0.)GOTO 65
*
*
*                              Update ABE for undilute ascent.
*
*                              Note that we still did not consider
*                              any entrainment effect -
*                              except for the calculation of w.
*
         THTES(NK1)=TT0(I,NK1)*(1.E5/PP0(I,NK1))**(0.2854*(1.-0.28*QST1(I,NK1)))*
     *      EXP((3374.6525/TT0(I,NK1)-2.5403)*QST1(I,NK1)*(1.+0.81*QST1(I,NK1)))
         UDLBE=((2.*THTUDL)/(THTES(NK)+THTES(NK1))-1.)*DZZ
         IF(UDLBE.GT.0.)ABE=ABE+UDLBE*GRAV
*
*
*                              Other effects of cloud
*                              glaciation if within the specified
*                              temperature interval
*                              (on temperature, water variables, etc...).
*
*                              Phase change effects are calculated in
*                              DTFRZNEW subroutine.
*
         IF(FRC1.GT.1.E-6)THEN
*
           CALL DTFRZNEW(TU(NK1),PP0(I,NK1),THETEU(NK1),QU(NK1),RLIQ(NK1),
     *          RICE(NK1),RATIO2(NK1),TTFRZ,TBFRZ,QNWFRZ,RL,FRC1,EFFQ,
     *          IFLAG,XLV0,XLV1,XLS0,XLS1,
     *          ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
*
         ENDIF
*
*
*
*                             Call subroutine to calculate ENVIRONMENTAL
*                             potential temperature within glaciation
*                             interval.  THETAE must be calculated with
*                             respect to the same degree of glaciation for
*                             all entraining air.
*
         CALL ENVIRTHT(PP0(I,NK1),TT0(I,NK1),Q00(I,NK1),
     *         THETEE(NK1),RATIO2(NK1),RL,
     *         ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
*
*                             Trace the level of minimum eq. potential
*                             temperature for the downdraft.
*
         IF(NK1.EQ.KLCL)THTMIN=THTES(NK1)
         THTMIN=AMIN1(THTES(NK1),THTMIN)
         IF(THTMIN.EQ.THTES(NK1))KMIN=NK1
*
*
*
*                             BEGINNING OF ENTRAINMENT/DETRAINMENT CALCULATIONS
*
*
*                             REI is the rate of environmental inflow
*
         REI=VMFLCL*DPP(i,NK1)*0.03/RAD
         TVQU(NK1)=TU(NK1)*(1.+0.608*QU(NK1)-RLIQ(NK1)-RICE(NK1))
*
*
*                             UER   = updraft entrainment rate
*                             UDR   = updraft detrainment rate
*                             EQFRC = critical fraction of environmental
*                                     air in the mixed subparcels at which
*                                     they are neutrally stable.
*
*                             If cloud parcels are virtually colder than
*                             the environment, no entrainment is allowed
*                             at this level.
*
         IF(TVQU(NK1).LE.TV00(I,NK1))THEN
           UER(NK1)=0.0
           UDR(NK1)=REI
           EE2=0.
           UD2=1.
           EQFRC(NK1)=0.
           GOTO 55
         ENDIF
*
         LET=NK1
         TTMP=TVQU(NK1)
*
*
*
*                             Determine the critical mixed fraction of
*                             updraft and environmental air.
*
*                             First suppose a subparcel with 5% updraft air
*                             and 95% environmental air.
*
        F1=0.95
        F2=1.-F1
*
*                             Properties of the subparcel
*
*                             THTMP = eq. pot. temperature
*                             RTMP  = specific humidity
*                             TMPLIQ = liquid water content
*                             TMPICE = ice content
*
        THTTMP=F1*THETEE(NK1)+F2*THETEU(NK1)
        RTMP=F1*Q00(I,NK1)+F2*QU(NK1)
        TMPLIQ=F2*RLIQ(NK1)
        TMPICE=F2*RICE(NK1)
*
*                             Find the temperature and new liquid for
*                             this temporary subparcel.
*
        CALL TPMIX(PP0(I,NK1),THTTMP,TTMP,RTMP,TMPLIQ,TMPICE,QNEWLQ,
     *                QNEWIC,RATIO2(NK1),RL,XLV0,XLV1,XLS0,XLS1,
     *                ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
*
*                             moist virtual temperature of the subparcel
*
        TU95=TTMP*(1.+0.608*RTMP-TMPLIQ-TMPICE)
*
*                             If the parcel is buoyant with these mixing
*                             proportions, then the critical fraction of
*                             environmental air is close to 1.
*                             (In fact, we set it to 1. in this case).
*                             No detrainment in this case, only entrainment.
*
        IF(TU95.GT.TV00(I,NK1))THEN
          EE2=1.
          UD2=0.
          EQFRC(NK1)=1.0
          GOTO 50
        ENDIF
*
*
*                             Calculate the critical fraction of environmental
*                             air by creating a supbarcel with 10% updraft and
*                             90* environmental air.
*
        F1=0.10
        F2=1.-F1
        THTTMP=F1*THETEE(NK1)+F2*THETEU(NK1)
        RTMP=F1*Q00(I,NK1)+F2*QU(NK1)
        TMPLIQ=F2*RLIQ(NK1)
        TMPICE=F2*RICE(NK1)
*
        CALL TPMIX(PP0(I,NK1),THTTMP,TTMP,RTMP,TMPLIQ,TMPICE,QNEWLQ,
     *            QNEWIC,RATIO2(NK1),RL,XLV0,XLV1,XLS0,XLS1,
     *            ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
*
        TU10=TTMP*(1.+0.608*RTMP-TMPLIQ-TMPICE)
*
*                            It is possible, from this subparcel, to
*                            evaluate the critical fraction EQFRC.
*
        EQFRC(NK1)=(TV00(I,NK1)-TVQU(NK1))*F1/(TU10-TVQU(NK1)+1.E-20)
        EQFRC(NK1)=AMAX1(0.0,EQFRC(NK1))
        EQFRC(NK1)=AMIN1(1.0,EQFRC(NK1))
*
*                            In the simple cases in which the subparcel
*                            mixing possibilities are all buoyant or all
*                            non-buoyant, no need to integrate the
*                            Gaussian distribution.
*
        IF(EQFRC(NK1).EQ.1)THEN
*
*                            All buoyant case
*
          EE2=1.
          UD2=0.
          GOTO 50
        ELSEIF(EQFRC(NK1).EQ.0.)THEN
*
*                            All non-buoyant case
*
          EE2=0.
          UD2=1.
          GOTO 50
        ELSE
*
*
*                            Subroutine PROF5 integrates over the
*                            Gaussian distribution to determine the
*                            fractional entrainment and detrainment
*                            rates.
*
          CALL PROF5(EQFRC(NK1),EE2,UD2)
*
        ENDIF
*
*
*                            EE1 and UD1 are the entrainment and detrainment
*                            rates from the previous level.
*
50      IF(NK.EQ.K)THEN
           EE1=1.
           UD1=0.
        ENDIF
*
*
*                           Net entrainment and detrainment rates are
*                           given by the average fractional values in
*                           the layer.
*
        UER(NK1)=0.5*REI*(EE1+EE2)
        UDR(NK1)=0.5*REI*(UD1+UD2)
*
*
*
*                           Modification of the updraft detrainment rate
*                           to include the effect of an "ensemble" of 
*                           updrafts.  This is to avoid the problem of
*                           intense detrainment at a single layer at the
*                           cloud top level (between the LET and the top
*                           in fact).
*
        IF ( Z0G(I,NK1).GT.ZLCL+(1.-DETREG)*(ZTOP(I)-ZLCL) ) THEN
          DETFRAC  = DETTOT / MAX( FLOAT( KTOP-NK1 + 1 ), 1. )
          DETFRAC  = MIN( DETFRAC, 0.25 )
          UDR(NK1) = MAX( UDR(NK1), DETFRAC*UMF(NK) )
          UDR(NK1) = MIN( UDR(NK1), UMF(NK) - 11. )
        END IF
*
*
*                           If the calculated updraft detrainment rate
*                           is greater than the total updraft mass flux,
*                           all cloud mass detrains.  Exit updraft
*                           calculations.
*
55      IF(UMF(NK)-UDR(NK1).LT.10.)THEN
*
*
*                           If the calculated detrained mass flux is
*                           greater than the total updraft flux, impose
*                           total detrainment of updraft mass at the
*                           previous model level.
*
          IF(UDLBE.GT.0.)ABE=ABE-UDLBE*GRAV
          LET=NK
          GOTO 65
        ENDIF
*
*
*                           New updraft mass flux (remove the part that
*                           was detrained - and add the part that was
*                           entrained).
*
         EE1=EE2
         UD1=UD2
         UPOLD=UMF(NK)-UDR(NK1)
         UPNEW=UPOLD+UER(NK1)
         UMF(NK1)=UPNEW
*
*                          DETLQ and DETIC are the rates of detrainment
*                          of liquid and ice in the detraining updraft mass
*
         DETLQ(NK1)=RLIQ(NK1)*UDR(NK1)
         DETIC(NK1)=RICE(NK1)*UDR(NK1)
         QDT(NK1)=QU(NK1)
*
*                          New properties of the updraft after
*                          entrainment processes
*
         QU(NK1)=(UPOLD*QU(NK1)+UER(NK1)*Q00(I,NK1))/UPNEW
         THETEU(NK1)=(THETEU(NK1)*UPOLD+THETEE(NK1)*UER(NK1))/UPNEW
         RLIQ(NK1)=RLIQ(NK1)*UPOLD/UPNEW
         RICE(NK1)=RICE(NK1)*UPOLD/UPNEW
*
*
*
*                          END OF ENTRAINMENT/DETRAINMENT CALCULATIONS
*
*
*
*                         KFRZ is the highest model level at which
*                         liquid condensate is generated.  PPTLIQ is the
*                         rate of generation (fallout) of liquid precipitation
*                         at a given model level.  PPTICE is the same for ice.
*                         TRPPT is the total rate of production of precip.
*                         up to the current model level.
*
         IF(ABS(RATIO2(NK1)-1.).GT.1.E-6)KFRZ=NK1
         PPTLIQ(NK1)=QLQOUT(NK1)*UMF(NK)
         PPTICE(NK1)=QICOUT(NK1)*UMF(NK)
         TRPPT=TRPPT+PPTLIQ(NK1)+PPTICE(NK1)
         IF(NK1.LE.KPBL)UER(NK1)=UER(NK1)+VMFLCL*DPP(i,NK1)/DPTHMXG(I)
60     CONTINUE
*
*
*                           END OF THE PRETTY LONG LOOP for
*                           the updraft calculations.
*
*
*
*                           Check cloud depth.  If the cloud is deep
*                           enough, estimate the equilibrium temperature
*                           level (ETL) and adjust the mass flux profile
*                           at cloud top so that the mass flux decreases
*                           to zero as a linear function of pressure
*                           difference the LET and cloud top.
*
*                           LTOP is the model level just below the level
*                           at which vertical velocity first becomes
*                           negative.
*
65    LTOP=NK
      CLDHGT=Z0G(I,LTOP)-ZLCL
*
*
*                           If the cloud top height is less than the
*                           specified minimum height, go back to the
*                           next highest 50 mb layer to see if a bigger
*                           cloud can be obtained from the parcel.
*
      IF(CLDHGT.LT.CDEPTH .OR. ABE.LT.1.)THEN
        DO 70 NK=K,LTOP
          UMF(NK)=0.
          UDR(NK)=0.
          UER(NK)=0.
          DETLQ(NK)=0.
          DETIC(NK)=0.
          PPTLIQ(NK)=0.
70        PPTICE(NK)=0.
        GOTO 25
      ENDIF
*
*
*
      ZBASEOUT(I) = ZLCL
      ZTOPOUT(I)  = Z0G(I,LTOP)
*
*
*                          ABOVE THE LET
*
*
*                          If the LET and LTOP are the same, detrain all
*                          of the updraft mass at this level.
*
      IF(LET.EQ.LTOP)THEN
         UDR(LTOP)=UMF(LTOP)+UDR(LTOP)-UER(LTOP)
         DETLQ(LTOP)=RLIQ(LTOP)*UDR(LTOP)*UPNEW/UPOLD
         DETIC(LTOP)=RICE(LTOP)*UDR(LTOP)*UPNEW/UPOLD
         UER(LTOP)=0.
         UMF(LTOP)=0.
         GOTO 85
      ENDIF
*
*
*                         Begin total detrainment at the level above the
*                         LET.
*
       DPTT=0.
       DO 71 NJ=LET+1,LTOP
71       DPTT=DPTT+DPP(I,NJ)
       DUMFDP=UMF(LET)/DPTT
*
*
*                        Adjust mass flux profiles, detrainment rates,
*                        and precipitation fall rates to reflect the
*                        linear decrease in mass flux between the LET
*                        and cloud top.
*
      DO 75 NK=LET+1,LTOP
*
*
*                        A small part is detrained at each level above the
*                        LET.
*
        UDR(NK)=DPP(I,NK)*DUMFDP
        UMF(NK)=UMF(NK-1)-UDR(NK)
        DETLQ(NK)=RLIQ(NK)*UDR(NK)
        DETIC(NK)=RICE(NK)*UDR(NK)
*
        IF(NK.GE.LET+2)THEN
          TRPPT=TRPPT-PPTLIQ(NK)-PPTICE(NK)
          PPTLIQ(NK)=UMF(NK-1)*QLQOUT(NK)
          PPTICE(NK)=UMF(NK-1)*QICOUT(NK)
          TRPPT=TRPPT+PPTLIQ(NK)+PPTICE(NK)
        ENDIF
*
75    CONTINUE
*
*
85    CONTINUE
*
*
*
*                              BELOW CLOUD BASE
*
      DO NK=1,LC-1
        TU(NK)=0.
        QU(NK)=0.
        TVU(NK)=0.
        UMF(NK)=0.
        WU(NK)=0.
        UER(NK)=0.
      ENDDO
*
*                              Between the departure and cloud base levels.
*
      UMF(LC)=VMFLCL*DPP(i,LC)/DPTHMXG(I)
      UER(LC)=UMF(LC)
      DO NK=LC+1,KPBL
        UER(NK)=VMFLCL*DPP(i,NK)/DPTHMXG(I)
        UMF(NK)=UMF(NK-1)+UER(NK)
      ENDDO
      DO NK=KPBL+1,K
        UMF(NK)=VMFLCL
        UER(NK)=0.
      ENDDO
      DO NK=LC,K
	TU(NK)=TMIXG(I)+(Z0G(I,NK)-ZMIX)*GDRY
        QU(NK)=QMIXG(I)
        TVU(NK)= TU(NK)*(1.+0.608*QU(NK))
        WU(NK)=WLCL
      ENDDO
      DO 90 NK=1,K
*
*                              Between the departure and cloud base levels.
*
        UDR(NK)=0.
        QDT(NK)=0.
        UU(NK)=0.
        VU(NK)=0.
        RLIQ(NK)=0.
        RICE(NK)=0.
        QLQOUT(NK)=0.
        QICOUT(NK)=0.
        PPTLIQ(NK)=0.
        PPTICE(NK)=0.
        DETLQ(NK)=0.
        DETIC(NK)=0.
        RATIO2(NK)=0.
        EE=Q00(I,NK)*PP0(I,NK)/(0.622+Q00(I,NK))
        TLOG=ALOG(EE/ALIQ)
        TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
        TSAT=TDPT-(.212+1.571E-3*(TDPT-TRPL)-4.36E-4*(TT0(I,NK)-TRPL))*
     *        (TT0(I,NK)-TDPT)
        THTA=TT0(I,NK)*(1.E5/PP0(I,NK))**(0.2854*(1.-0.28*Q00(I,NK)))
        THETEE(NK)=THTA*
     *        EXP((3374.6525/TSAT-2.5403)*Q00(I,NK)*(1.+0.81*Q00(I,NK)))
        THTES(NK)=THTA*
     *    EXP((3374.6525/TT0(I,NK)-2.5403)*QST1(I,NK)*(1.+0.81*QST1(I,NK)))
        EQFRC(NK)=1.0
90    CONTINUE
*
*
*                            Some more definitions.
*
      LTOP1=LTOP+1
      LTOPM1=LTOP-1
*
*                            Make sure that the updraft vertical motion
*                            is not too small so that the cloud fraction
*                            becomes not too large just above the lifting
*                            condensation level (first level in the cloud
*                            above which WU is different from WLCL)
*
      DO NK=LC+1,LTOPM1
         IF (WU(NK).LT.WLCL) THEN
            WU(NK) = MAX(WLCL,WU(NK))
         ELSE IF (WU(NK).GT.WLCL) THEN
            GOTO 900
         ENDIF
      END DO
900   CONTINUE
*
*
      UU(LC)=U00(I,LC)
      VU(LC)=V00(I,LC)
      UU(LC+1)=UU(LC)
      VU(LC+1)=VU(LC)
*
      DO 91 NK = LC+1,LTOPM1
        UPOLD=UMF(NK-1)-UDR(NK)
        UPNEW=UPOLD+UER(NK)
        UU(NK+1)=(UU(NK)*UPOLD+U00(I,NK)*UER(NK))/UPNEW
91      VU(NK+1)=(VU(NK)*UPOLD+V00(I,NK)*UER(NK))/UPNEW
*
*
*
*                          Define variables above cloud top.
*
         DO 95 NK = LTOP1, KX
            UMF(NK) = 0.
            UDR(NK)=0.
            UU(NK)  = 0.
            VU(NK)  = 0.
            UER(NK)=0.
            QDT(NK)=0.
            RLIQ(NK)=0.
            RICE(NK)=0.
            QLQOUT(NK)=0.
            QICOUT(NK)=0.
            DETLQ(NK)=0.
            DETIC(NK)=0.
            PPTLIQ(NK)=0.
            PPTICE(NK)=0.
            IF(NK.GT.LTOP1)THEN
              TU(NK)=0.
              QU(NK)=0.
              TVU(NK)=0.
              WU(NK)=0.
            ENDIF
            THTA0(NK)=0.
            THTAU(NK)=0.
            EMS(NK)=DPP(I,NK)*DXSQ/GRAV
            EMSD(NK)=1./EMS(NK)
            UG(NK) = U00(I,NK)
            VG(NK) = V00(I,NK)
            TG(NK) = TT0(I,NK)
            QG(NK) = Q00(I,NK)
            DMS(NK)=0.
            DTFM(NK)=0.
*
            OMGA(NK)=0.
            NUP(NK)=NK
            THADV(NK)=0.
            QADV(NK)=0.
*
95          OMG(NK)=0.
            OMG(KX+1)=0.
       P165=PP0(I,KLCL)-1.65E4
       PPTMLT=0.
*
*
*                       Initialize some other variables to be used later
*                       in the vertical advection scheme (from the
*                       surface to the cloud top).
*
      DO 100 NK=1,LTOP
        EMS(NK)=DPP(I,NK)*DXSQ/GRAV
        EMSD(NK)=1./EMS(NK)
        DTFM(NK)=0.
*
        EXN(NK)=(P00/PP0(I,NK))**(0.2854*(1.-0.28*QDT(NK)))
        THTAU(NK)=TU(NK)*EXN(NK)
        EXN(NK)=(P00/PP0(I,NK))**(0.2854*(1.-0.28*Q00(I,NK)))
        THTA0(NK)=TT0(I,NK)*EXN(NK)
*
        IF(PP0(I,NK).GT.P165)LVF=NK
        PPTMLT=PPTMLT+PPTICE(NK)
*
100     OMG(NK)=0.
*
        CLVF=0.
*
        DO 101 NK = KLCL,LVF+1
          CLVF=CLVF+PPTLIQ(NK)+PPTICE(NK)
101     CONTINUE
*
        USR=UMF(LVF+1)*QU(LVF+1)+CLVF
        USR=AMIN1(USR,TRPPT)
*
*
*
*      9. CONVECTIVE TIME SCALE AND PRECIPITATION EFFICIENCY
*      =====================================================
*
*
*                              Compute convective time scale (TIMEC).
*                              The mean wind at the LCL and midtroposphere
*                              is used.
*
         WSPD(KLCL)=SQRT(U00(I,KLCL)*U00(I,KLCL)+V00(I,KLCL)*V00(I,KLCL))
         WSPD(L5)=SQRT(U00(I,L5)*U00(I,L5)+V00(I,L5)*V00(I,L5))
         WSPD(LTOP)=SQRT(U00(I,LTOP)*U00(I,LTOP)+V00(I,LTOP)*V00(I,LTOP))
*
*
*
         NIC   = NINT(TIMEC/DELT)
         TIMEC = FLOAT(NIC) * DELT
*
*                              Recalculate NIC using TIMEA
         NIC   = NINT(TIMEA/DELT)
*
*
*                              Compute wind shear and precipitation
*                              efficiency.
*
        IF(WSPD(LTOP).GT.WSPD(KLCL))THEN
          SHSIGN=1.
        ELSE
          SHSIGN=-1.
        ENDIF
*
        VWS=(U00(I,LTOP)-U00(I,KLCL))*(U00(I,LTOP)-U00(I,KLCL))+
     *      (V00(I,LTOP)-V00(I,KLCL))*(V00(I,LTOP)-V00(I,KLCL))
        VWS = 1.E3*SHSIGN*SQRT(VWS)/(Z0G(I,LTOP)-Z0G(I,LCL))
        PEF = 1.591+VWS*(-.639+VWS*(9.53E-2-VWS*4.96E-3))
        PEF = AMAX1(PEF,PEFMIN)
        PEF = AMIN1(PEF,PEFMAX)
*
*
*                              Precipitation efficiency as a
*                              function of cloud base
*
         CBH = (ZLCL-Z0G(I,1))*3.281E-3
*
         IF (CBH.LT.3.) THEN
            RCBH = .02
         ELSE
            RCBH = .96729352+CBH*(-.70034167+CBH*(.162179896+CBH*(-
     *         1.2569798E-2+CBH*(4.2772E-4-CBH*5.44E-6))))
         ENDIF
*
         IF (CBH.GT.25) RCBH = 2.4
         PEFCBH = 1./(1.+RCBH)
         PEFCBH=AMIN1(PEFCBH,.9)
*
*
*                              Mean precipitation efficiency used
*                              to compute rainfall.
*
         PEFF = .5*(PEF+PEFCBH)
         PEFFOUT(I) = PEFF
*
*
*
*      10. DOWNDRAFT PROPERTIES
*      ========================
*
*
*                      Let the representative downdraft originate at
*                      the level of minimum saturation equivalent
*                      potential temperature (SEQT) in the cloud layer.
*                      Extend downward toward the surface, down to the
*                      level of downdraft buoyancy (LDB), where SEQT is
*                      less than min(SEQT) in the cloud layer.  Let downdraft
*                      detrain over a layer of specified pressure-depth
*                      (i.e., DPDD).
*
      TDER = 0.
      DDPPT = 0.
*
*
*                          KMIN = level of minimum environmental saturation
*                                 equivalent potential temperature
*
*                          If the level KMIN is higher than the cloud top
*                          ==> track again the level between LCL and LTOP.
*
       IF(KMIN.GE.LTOP)THEN
         THTMIN=THTES(KLCL)
         KMIN=KLCL
         DO 104 NK=KLCL+1,LTOP-1
           THTMIN=AMIN1(THTMIN,THTES(NK))
           IF(THTMIN.EQ.THTES(NK))KMIN=NK
104      CONTINUE
       ENDIF
*
*
*                          The LFS is defined as KMIN
*
      LFS=KMIN
*
*
*
      IF(RATIO2(LFS).GT.0.) 
     1       CALL ENVIRTHT(PP0(I,LFS),TT0(I,LFS),Q00(I,LFS),
     *                     THETEE(LFS),0.,RL,
     *                     ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
*
*
*                          The EQFRC fraction again represents the fraction
*                          of environmental air in mixed subparcels
*                          (from updraft and environmental) at the LFS.
*
      EQFRC(LFS)=(THTES(LFS)-THETEU(LFS))/(THETEE(LFS)-THETEU(LFS)+1.E-20)
      EQFRC(LFS)=AMAX1(EQFRC(LFS),0.)
      EQFRC(LFS)=AMIN1(EQFRC(LFS),1.)
*
*                           Eq. pot. temperature of the downdraft at the
*                           LFS (saturated).
*
      THETED(LFS)=THTES(LFS)
*
*
*                           Correction of the temperature due to melting
*                           effects.
*
      IF(ML.GT.0)THEN
        DTMLTD=0.5*(QU(KLCL)-QU(LTOP))*CHLF/CPD
      ELSE
        DTMLTD=0.
      ENDIF
*
      TZ(LFS)=TT0(I,LFS)-DTMLTD
*
*
*                           Recalculate the eq. pot. temperature using
*                           this new temperature.
*
      ES = ALIQ*EXP((TZ(LFS)*BLIQ-CLIQ)/(TZ(LFS)-DLIQ))
      QS = 0.622*ES/(PP0(I,LFS)-ES)
      QD(LFS)=EQFRC(LFS)*Q00(I,LFS)+(1.-EQFRC(LFS))*QU(LFS)
      THTAD(LFS)=TZ(LFS)*(P00/PP0(I,LFS))**(0.2854*(1.-0.28*QD(LFS)))
*
      IF(QD(LFS).GE.QS)THEN
        THETED(LFS)=THTAD(LFS)*
     *            EXP((3374.6525/TZ(LFS)-2.5403)*QS*(1.+0.81*QS))
      ELSE
        CALL ENVIRTHT(PP0(I,LFS),TZ(LFS),QD(LFS),
     *                THETED(LFS),0.,RL,
     *                ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
      ENDIF
*
*
*
*                             Find the level of downdraft buoyancy (LDB)
*                             ==> level where THETAES for the downdraft
*                             at the LFS becomes larger then the environmental
*                             THETAES.
*
      LDB=1
106   DO 107 NK=1,LFS-1
        ND=LFS-NK
        IF(THETED(LFS).GT.THTES(ND) .OR. ND.EQ.1)THEN
          LDB=ND
          GOTO 110
        ENDIF
107     CONTINUE
*
110   DPDD=2.5E2
*
      DPT=0.
*
*
*                             Determine the LDT level (level where the
*                             downdraft detrains).
*
      DO 115 NK=LDB,LFS
        DPT=DPT+DPP(I,NK)
        IF(DPT.GT.DPDD)THEN
          LDT=NK
          FRC=(DPDD+DPP(I,NK)-DPT)/DPP(I,NK)
          GOTO 120
        ENDIF
115   CONTINUE
120   CONTINUE
*
*
*                            Properties of the downdrafts at the LFS:
*                            TVD   = moist virtual temperature
*                            RDD   = air density
*                            DMF   = downdraft mass flux
*                            DER   = downdraft entrainment rate
*                            DDR   = downdraft detrainment rate
*
      TVD(LFS)=TT0(I,LFS)*(1.+0.608*QST1(I,LFS))
      RDD=PP0(I,LFS)/(RGASD*TVD(LFS))
      A1=(1.-PEFF)*AU0
      DMF(LFS)=-A1*RDD
      DER(LFS)=EQFRC(LFS)*DMF(LFS)
      DDR(LFS)=0.
*
*
*                           Loop for the dowdraft mass flux
*
      DO 140 ND=LFS-1,LDB,-1
        ND1=ND+1
*
*                           At the lowest level
*
        IF(ND.LE.LDT)THEN
          DER(ND)=0.
          DDR(ND)=-DMF(LDT+1)*DPP(I,ND)*FRC/DPDD
          DMF(ND)=DMF(ND1)+DDR(ND)
          FRC=1.
          THETED(ND)=THETED(ND1)
          QD(ND)=QD(ND1)
          TZ(ND)=TPDD(PP0(I,ND),THETED(ND),TT0(I,ND),QS,QD(ND),1.0,
     *              XLV0,XLV1,
     *              ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
          EXN(ND)=(P00/PP0(I,ND))**(0.2854*(1.-0.28*QD(ND)))
          THTAD(ND)=TZ(ND)*EXN(ND)
        ELSE
*
*                           Before reaching its lowest level, downdraft
*                           entrains, but does not detrain.
*
          DER(ND)=DMF(LFS)*0.03*DPP(I,ND)/RAD
          DDR(ND)=0.
          DMF(ND)=DMF(ND1)+DER(ND)
*
*                           Recalculate THETEE
*
          IF(RATIO2(ND).GT.0.) 
     1           CALL ENVIRTHT(PP0(I,ND),TT0(I,ND),Q00(I,ND),
     *                         THETEE(ND),0.,RL,
     *                         ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
*
*                           Downdraft properties deduced from properties
*                           at the previous level and entrained air.
*
          THETED(ND)=(THETED(ND1)*DMF(ND1)+THETEE(ND)*DER(ND))/DMF(ND)
          QD(ND)=(QD(ND1)*DMF(ND1)+Q00(I,ND)*DER(ND))/DMF(ND)
          TZ(ND)=TPDD(PP0(I,ND),THETED(ND),TT0(I,ND),QS,QD(ND),1.0,
     *              XLV0,XLV1,
     *              ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
          EXN(ND)=(P00/PP0(I,ND))**(0.2854*(1.-0.28*QD(ND)))
          THTAD(ND)=TZ(ND)*EXN(ND)
        ENDIF
140   CONTINUE
*
      TDER=0.
*
*
*                          Effect of downdraft reaching the LDB
*                          (cooling and moistening).  Relative humidity
*                          of 90% at this level.
*
      DO 135 ND=LDB,LDT
        TZ(ND)=TPDD(PP0(I,ND),THETED(LDT),TT0(I,ND),QS,QD(ND),1.0,
     *              XLV0,XLV1,
     *              ALIQ,BLIQ,CLIQ,DLIQ,AICE,BICE,CICE,DICE)
        ES = ALIQ*EXP((TZ(ND)*BLIQ-CLIQ)/(TZ(ND)-DLIQ))
        QS = 0.622*ES/(PP0(I,ND)-ES)
        DQSDT=(CLIQ-BLIQ*DLIQ)/((TZ(ND)-DLIQ)*(TZ(ND)-DLIQ))
*
*
*                          Adjust temperature and humidity for a
*                          relative humidity of 90%.
*
        RL=XLV0-XLV1*TZ(ND)
        DTMP=RL*QS*(1.-RHBC)/(cpd+RL*RHBC*QS*DQSDT)
        T1RH=TZ(ND)+DTMP
        ES=RHBC*ALIQ*EXP((BLIQ*T1RH-CLIQ)/(T1RH-DLIQ))
        ES=MIN( ES , 0.5*PP0(I,ND) )
        QSRH=0.622*ES/(PP0(I,ND)-ES)
        QSRH=MAX( MIN( QSRH , 0.050 ) , 1.E-6 )
*
*
*                          Check to see if the mixing ratio at specified
*                          relative humidity is less than the actual
*                          mixing ratio.  If so, adjust to give zero
*                          evaporation.
*
        IF(QSRH.LT.QD(ND))THEN
          QSRH=QD(ND)
          T1RH=TZ(ND)
        ENDIF
*
*
*                          If this is not the case, use the adjusted
*                          values for temperature and humidity
*
        TZ(ND)=T1RH
        QS=QSRH
        TDER=TDER + (QS-QD(ND))*DDR(ND)
        QD(ND)=QS
135     THTAD(ND)=TZ(ND)*(P00/PP0(I,ND))**(0.2854*(1.-0.28*QD(ND)))
*
141     IF(TDER.LT.1.)THEN
*
*
*                          No evaporation then no downdraft.
*
*                          PPTFLX = precipitation flux
*                          CPR    = condensation production rate
*                          TDER   = total downdraft evaporation rate (???)
*
            PPTFLX=TRPPT
            CPR=TRPPT
            TDER=0.
            CNDTNF=0.
            UPDINC=1.
            LDB=LFS
            DO 117 NDK=1,LTOP
              UD(NDK)=0.            ! Clean-up added
              VD(NDK)=0.            ! Clean-up added
              DMS(NDK)=0.
              DMF(NDK)=0.
              DER(NDK)=0.
              DDR(NDK)=0.
              THTAD(NDK)=0.
              WD(NDK)=0.
              TZ(NDK)=0.
117           QD(NDK)=0.
            AINCM2=100.
            DMFMIN=0.
            GOTO 165
         ENDIF


*
*
*                            Adjust downdraft mass flux so that evaporation
*                            rate in downdraft is consistent with
*                            precipitation efficiency relationship
*
*                            PPTFLX = precipitation flux =
*                                     updraft supply rate times the
*                                     precipitation efficiency
*                            RCED   = Rate of condensate evaporation
*                                     in downdraft =
*                                     total precipitation rate -
*                                     precipitation flux
*                                     (this is the precip that evaporates
*                                     in downdraft).
*                            PPR    = total fallout of liquid water and
*                                     and ice in the updraft.
*                            DMFLFS = adjusted downward mass flux at
*                                     the LFS
*                            CNDTNF = condensate in updraft air at the LFS.
*                            DPPTDF = total fallout precip rate in updraft.
*
        DEVDMF=TDER/DMF(LFS)
        PPR=0.
*
        PPTFLX=PEFF*USR
        RCED=TRPPT-PPTFLX
*
        DO 132 NM=KLCL,LFS
132       PPR=PPR+PPTLIQ(NM)+PPTICE(NM)
*
        IF(LFS.GE.KLCL)THEN
*
        DPPTDF=(1.-PEFF)*PPR*(1.-EQFRC(LFS))/UMF(LFS)
*
        ELSE
          DPPTDF=0.
        ENDIF
        CNDTNF=(RLIQ(LFS)+RICE(LFS))*(1.-EQFRC(LFS))
*
        DMFLFS=RCED/(DEVDMF+DPPTDF+CNDTNF)
*
        IF(DMFLFS.GT.0.)THEN
          TDER=0.
          GOTO 141
        ENDIF
*
*
*                        Adjust the downdraft fluxes.
*
*                        DDINC = downdraft increase
*                        UPDINC = updraft increase
*
        DDINC=DMFLFS/DMF(LFS)
        IF(LFS.GE.KLCL)THEN
          UPDINC=(UMF(LFS)-(1.-EQFRC(LFS))*DMFLFS)/UMF(LFS)
        ELSE
          UPDINC=1.
        ENDIF
      DO 149 NK=LDB,LFS
        DMF(NK)=DMF(NK)*DDINC
        DER(NK)=DER(NK)*DDINC
149     DDR(NK)=DDR(NK)*DDINC
      CPR=TRPPT+PPR*(UPDINC-1.)
      TDER=TDER*DDINC
*
*
*                             Adjust upward mass flux, mass detrainment
*                             rate, and liquid water detrainment rates to
*                             be consistent with the transfer of the
*                             estimate from the updraft to the downdraft
*                             at the LFS.
*
      DO 155 NK=LC,LFS
        UMF(NK)=UMF(NK)*UPDINC
        UDR(NK)=UDR(NK)*UPDINC
        UER(NK)=UER(NK)*UPDINC
        PPTLIQ(NK)=PPTLIQ(NK)*UPDINC
        PPTICE(NK)=PPTICE(NK)*UPDINC
        DETLQ(NK)=DETLQ(NK)*UPDINC
155     DETIC(NK)=DETIC(NK)*UPDINC
*
*
*                            Set values below the downdraft buoyancy level...
*
      IF(LDB.GT.1)THEN
        DO 156 NK=1,LDB-1
          DMF(NK)=0.
          DER(NK)=0.
          DDR(NK)=0.
          WD(NK)=0.
          TZ(NK)=0.
          QD(NK)=0.
          THTAD(NK)=0.
          UD(NK)=0.
156       VD(NK)=0.
      ENDIF
*
*                           and above the LFS...
*
      DO 157 NK=LFS+1,KX
        DMF(NK)=0.
        DER(NK)=0.
        DDR(NK)=0.
        WD(NK)=0.
        TZ(NK)=0.
        QD(NK)=0.
        THTAD(NK)=0.
        UD(NK)=0.
157     VD(NK)=0.
      DO 158 NK=LDT+1,LFS-1
        TZ(NK)=0.
158     QD(NK)=0.
*
*
*                          Set limits on the updraft and downdraft mass
*                          fluxes so that the influx into convective drafts
*                          from a given layer is no more than is available
*                          in that layer initially.  Also, do not allow
*                          updraft detrainment to exceed twice the mass
*                          in a layer initially.  Or downdraft detrainment
*                          exceed one time the initial mass in a layer.
*
*                          LMAX is either the LCL or the LFS.
*
165   AINCMX=1000.
      LMAX=MAX0(KLCL,LFS)
*
*
*                          EMS = total mass of one model grid box
*
      DO 166 NK=LC,LMAX
          IF((UER(NK)-DER(NK)).GT.0.)
     * AINCM1=EMS(NK)/((UER(NK)-DER(NK))*TIMEC)
*
*                          If smaller than 1, entrainment exceeds the
*                          mass available in one model grid box.
*
       AINCMX=AMIN1(AINCMX,AINCM1)
166    CONTINUE
*
*
*
       UD(LFS)=EQFRC(LFS)*U00(I,LFS)+(1.-EQFRC(LFS))*UU(LFS+1)
       VD(LFS)=EQFRC(LFS)*V00(I,LFS)+(1.-EQFRC(LFS))*VU(LFS+1)
       DO 150 NK=1,LFS-LDB
         NJ=LFS-NK
         IF(NJ.GT.LDT)THEN
           UD(NJ)=(UD(NJ+1)*DMF(NJ+1)+U00(I,NJ)*DER(NJ))/DMF(NJ)
           VD(NJ)=(VD(NJ+1)*DMF(NJ+1)+V00(I,NJ)*DER(NJ))/DMF(NJ)
         ELSE
           UD(NJ)=UD(LDT+1)
           VD(NJ)=VD(LDT+1)
         ENDIF
150    CONTINUE
*
*
*                           If the entrainment rates for the updraft
*                           are reasonable physically speaking, then
*                           we should have AINCMX > 1, thus AINC=1 most
*                           of the time here.  If, on the other hand,
*                           the entrainment rates are so large so that
*                           AINCMX < 1, then AINC is equal to this fraction.
*                           (this correction is done to avoid removing
*                           more air than available).
*
      AINC=1.
      IF(AINCMX.LT.AINC)AINC=AINCMX
*
*
*                           Save the relevant variables for a unit
*                           updraft and downdraft.  They are adjusted by
*                           the factor AINC to satisfy the stabilization
*                           closure
*
      NCOUNT=0
      PPTMLT=0.
      TDER2=TDER
      PPTFL2=PPTFLX
*
      DO 170 NK=1,LTOP
         DETLQ2(NK)=DETLQ(NK)
         DETIC2(NK)=DETIC(NK)
         UDR2(NK)=UDR(NK)
         UER2(NK)=UER(NK)
         DDR2(NK)=DDR(NK)
         DER2(NK)=DER(NK)
         UMF2(NK)=UMF(NK)
         DMF2(NK)=DMF(NK)
         DMS(NK)=0.
         
         UMFOUT(I,KX-NK+1) = UMF(NK)
         DMFOUT(I,KX-NK+1) = DMF(NK)         

*
*                          Between the melting and cloud top levels.
*
         DPLIN=0.5*DPP(I,NK)/(PP0(I,NK)-PP0(I,NK+1))
         DLP=ALOG((PP0(I,NK)-0.5*DPP(I,NK))/PP0(I,NK))/ALOG(PP0(I,NK+1)/PP0(I,NK))
         THMID(NK+1)=THTA0(NK)+(THTA0(NK+1)-THTA0(NK))*DPLIN
170      QMID(NK+1)=Q00(I,NK)+(Q00(I,NK+1)-Q00(I,NK))*DLP
*
      DO NK=ML+1,LTOP-1
	PPTMLT=PPTMLT+PPTICE(NK+1)
      ENDDO
      PPTML2=PPTMLT
      THMID(1)=0.
      QMID(1)=0.
      DMFMIN=UER(LFS)-EMS(LFS)/TIMEC
      FABE=1.
      STAB=0.95
      IF(AINC/AINCMX.GT.0.999)GOTO 255
      ISTOP=0
*
*
*                          BEGINNING OF THE STABILIZATION ITERATION
*
175   NCOUNT=NCOUNT+1
*
*
*                          Evaluate the vertical velocity OMGA (Pa/s) from
*                          the entrainment and detrainment rates.  (vertical
*                          velocity for the environment).
*
*                          DOMGDP = D(omega) / Dp
*                          DTT    = timestep for the vertical advection
*                                   process (later).
*
185      CONTINUE
         DTT=TIMEC
         DO 200 NK = 1, LTOP
           DOMGDP(NK)=-(UER(NK)-DER(NK)-UDR(NK)-DDR(NK))*EMSD(NK)
           IF(NK.GT.1)THEN
             OMG(NK)=OMG(NK-1)-DPP(I,NK-1)*DOMGDP(NK-1)
             DTT1 = 0.75*DPP(I,NK-1)/(ABS(OMG(NK))+1.E-10)
             DTT=AMIN1(DTT,DTT1)
           ENDIF
200        CONTINUE
      DO 488 NK=1,LTOP
         THPA(NK)=THTA0(NK)
         QPA(NK)=Q00(I,NK)
         NSTEP=NINT(TIMEC/DTT+1)
         DTIME=TIMEC/FLOAT(NSTEP)
         FXM(NK)=OMG(NK)*DXSQ/GRAV
         IF(NK.LT.KLCL)THEN
           OMGA(NK)=(DMF(NK)-0.5*(DDR(NK)-DER(NK)))*GRAV/DXSQ
         ELSE
           OMGA(NK)=(UMF(NK)+0.5*(UDR(NK)-UER(NK))+
     *           DMF(NK)-0.5*(DDR(NK)-DER(NK)))*GRAV/DXSQ
         ENDIF
488      CONTINUE
      DO 495 NTC=1,NSTEP
*
*
*                             Assign THETA and Q values at the top and
*                             bottom of each layer based on the sigh of
*                             OMEGA
*
       DO 594 NK = 1,LTOP
          IF(OMGA(NK).LE.0.)THEN
            IF(NK.EQ.1)THEN
              NUP(NK)=NK+1
              THADV(NK)=THPA(NK)
              QADV(NK)=QPA(NK)
            ELSE
              NUP(NK)=NK-1
              THADV(NK)=THPA(NK-1)
              QADV(NK)=QPA(NK-1)
            ENDIF
          ELSE
            NUP(NK)=NK+1
            THADV(NK)=THPA(NK+1)
            QADV(NK)=QPA(NK+1)
          ENDIF
594     CONTINUE
*
*
*                           Compute new values for the potential temperature
*                           including the tendencies due vertical advection
*                           of environmental properties, as well as
*                           detrainment effect from the updraft and downdraft.
*
       DO 592 NK = 2, LTOPM1
         NUPNK = NUP(NK)
*
         THPA(NK) = (
     *                         (PP0(I,NUPNK)-PP0(I,NK)) *
     *                ( THPA(NK) + UDR(NK)*EMSD(NK)*THTAU(NK)*DTIME
     *                           + DDR(NK)*EMSD(NK)*THTAD(NK)*DTIME  )
     *                        - OMGA(NK)*THADV(NK)*DTIME
     *                                                                  )
     *                                       /
     *              (
     *                         (PP0(I,NUPNK)-PP0(I,NK)) *
     *                (       1. + UDR(NK)*EMSD(NK)*DTIME
     *                           + DDR(NK)*EMSD(NK)*DTIME            )
     *                             - OMGA(NK)*DTIME
     *                                                                  )
*
          QPA(NK) = (
     *                         (PP0(I,NUPNK)-PP0(I,NK)) *
     *                (  QPA(NK) + UDR(NK)*EMSD(NK)*QDT(NK)*DTIME
     *                           + DDR(NK)*EMSD(NK)*QD(NK) *DTIME  )
     *                        - OMGA(NK)*QADV(NK)*DTIME
     *                                                                  )
     *                                       /
     *              (
     *                         (PP0(I,NUPNK)-PP0(I,NK)) *
     *                (       1. + UDR(NK)*EMSD(NK)*DTIME
     *                           + DDR(NK)*EMSD(NK)*DTIME            )
     *                             - OMGA(NK)*DTIME
     *                                                                  )
*
592    CONTINUE
*
*                        At the surface, no contribution from the updraft.
*
       NK = 1
       NUPNK = NUP(NK)
*
       THPA(NK) = (
     *                       (PP0(I,NUPNK)-PP0(I,NK)) *
     *              ( THPA(NK) + DDR(NK)*EMSD(NK)*THTAD(NK)*DTIME  )
     *                      - OMGA(NK)*THADV(NK)*DTIME
     *                                                                )
     *                                     /
     *            (
     *                       (PP0(I,NUPNK)-PP0(I,NK)) *
     *              (       1. + DDR(NK)*EMSD(NK)*DTIME            )
     *                           - OMGA(NK)*DTIME
     *                                                                )
*
        QPA(NK) = (
     *                       (PP0(I,NUPNK)-PP0(I,NK)) *
     *              (  QPA(NK) + DDR(NK)*EMSD(NK)*QD(NK) *DTIME  )
     *                      - OMGA(NK)*QADV(NK)*DTIME
     *                                                                )
     *                                     /
     *            (
     *                       (PP0(I,NUPNK)-PP0(I,NK)) *
     *              (       1. + DDR(NK)*EMSD(NK)*DTIME            )
     *                           - OMGA(NK)*DTIME
     *                                                                )
*
*
*
*                        At the cloud top, only detrainment from the
*                        updraft.
*
       NK = LTOP
*
       THPA(NK) = ( THPA(NK) + UDR(NK)*THTAU(NK)*EMSD(NK)*DTIME )
     *                                   /
     *                    ( 1. + UDR(NK)*EMSD(NK)*DTIME )
*
        QPA(NK) = (  QPA(NK) + UDR(NK)*QDT(NK)  *EMSD(NK)*DTIME )
     *                                   /
     *                    ( 1. + UDR(NK)*EMSD(NK)*DTIME )
*
495   CONTINUE
*
*
*                         Specify the "G" grid values after convective
*                         adjustment.  New values after each stabilization
*                         iteration.
*
      DO 498 NK=1,LTOP
        THTAG(NK)=THPA(NK)
        QG(NK)=QPA(NK)
        QG(NK)=AMAX1(QG(NK),1.E-9)
498   CONTINUE
*
*                         TOPOMG = vertical motion at the cloud top.
*
      TOPOMG = (UDR(LTOP)-UER(LTOP))*DPP(I,LTOP)*EMSD(LTOP)
      IF(ABS(TOPOMG-OMG(LTOP)).GT. 1.E-3)THEN
        ISTOP=1
      ENDIF
*
*
*                               Convert THETA to T, freeze all supercooled
*                               detrained liquid water because no supercooled
*                               water is supposed to be allowed in the
*                               explicit condensation scheme (anyone of
*                               those available from the subroutine
*                               VKUOCON).
*
      DO 230 NK=1,LTOP
        EXN(NK)=(P00/PP0(I,NK))**(0.2854*(1.-0.28*QG(NK)))
        TG(NK)=THTAG(NK)/EXN(NK)
*
*                               Temperature effect of melting above the
*                               melting level (ML).
*
        IF(NK.GT.ML)THEN
           DTFM(NK)=DETLQ(NK)*CHLF*EMSD(NK)/CPD
        ENDIF
        TG(NK)=TG(NK)+DTFM(NK)
        TVG(NK)=TG(NK)*(1.+0.608*QG(NK))
230     CONTINUE
*
*
*                               Allow frozen precip to melt over a layer
*                               of 200 mb below the melting level if
*                               precipitation is not back to the explicit
*                               condensation scheme.
*                               In the current version, this melting effect
*                               is not considered (i.e., DTMLTE = 0).
*                               Note here that it should be considered.
*
      DTMLTE=0.
      TDP=0.
      DO 231 K = 1,ML
        NK = ML-K+1
        TDP=TDP+DPP(I,NK)
*
*                               Check for a 200 mb layer below the ML.
*
        IF(TDP.LT.2.E4)THEN
          DTFM(NK)=DTMLTE
          TG(NK)=TG(NK)+DTMLTE*TIMEC
        ELSE
          DTFM(NK)=DTMLTE*(2.E4+DPP(I,NK)-TDP)/DPP(I,NK)
          TG(NK)=TG(NK)+DTMLTE*TIMEC*(2.E4+DPP(I,NK)-TDP)/DPP(I,NK)
          GOTO 232
        ENDIF
231   CONTINUE
232     CONTINUE
*
*
*
*      11.  COMPUTE NEW CLOUD AND CHANGE IN AVAILABLE BUOYANT ENERGY
*      =============================================================
*
*
*                              The following computations are similar to
*                              those for the updraft, except they are
*                              done using the convectively adjusted
*                              TG and QG.
*
*                              Redo the calculations associated with the
*                              trigger function.
*
*                              (not much comments in the following -
*                               the reader is refered to the sections above).
*
*
        THMIXG(I)=0.
        QMIXG(I)=0.
        PMIXG(I)=0.
        DO 217 NK = LC,KPBL
          ROCPQ=0.2854*(1.-0.28*QG(NK))
          THMIXG(I)=THMIXG(I)+DPP(I,NK)*TG(NK)*(P00/PP0(I,NK))**ROCPQ
          QMIXG(I)=QMIXG(I)+DPP(I,NK)*QG(NK)
217       PMIXG(I)=PMIXG(I)+DPP(I,NK)*PP0(I,NK)
        THMIXG(I)=THMIXG(I)/DPTHMXG(I)
        QMIXG(I)=QMIXG(I)/DPTHMXG(I)
C
        QMIXG(I)=AMAX1( QMIXG(I),1.0E-10 )
C
        PMIXG(I)=PMIXG(I)/DPTHMXG(I)
        ROCPQ=0.2854*(1.-0.28*QMIXG(I))
        TMIXG(I)=THMIXG(I)*(PMIXG(I)/P00)**ROCPQ
        ES=ALIQ*EXP((TMIXG(I)*BLIQ-CLIQ)/(TMIXG(I)-DLIQ))
        ES=MIN( ES , 0.5*PMIXG(I) )
        QS=0.622*ES/(PMIXG(I)-ES)
        QS=MAX( MIN( QS , 0.050 ) , 1.E-6 )
        IF(QMIXG(I).GT.QS)THEN
          RL=XLV0-XLV1*TMIXG(I)
          CPM=CPD*(1.+0.887*QMIXG(I))
          DQSDT = QS*(CLIQ-BLIQ*DLIQ)/((TMIXG(I)-DLIQ)*(TMIXG(I)-DLIQ))
          DQ = (QMIXG(I)-QS)/(1.+RL*DQSDT/CPM)
          TMIXG(I) = TMIXG(I)+RL/CPD*DQ
          QMIXG(I) = QMIXG(I)-DQ
          ROCPQ = 0.2854*(1.-0.28*QMIXG(I))
          THMIXG(I) = TMIXG(I)*(P00/PMIXG(I))**ROCPQ
          TLCLG(I) = TMIXG(I)
          PLCLG(I) = PMIXG(I)
        ELSE
          QMIXG(I)=AMAX1(QMIXG(I),0.)
          EMIX=QMIXG(I)*PMIXG(I)/(0.622+QMIXG(I))
          TLOG=ALOG(EMIX/ALIQ)
          TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
          TLCLG(I)=TDPT-(.212+1.571E-3*(TDPT-TRPL)-4.36E-4*(TMIXG(I)-TRPL))*
     *        (TMIXG(I)-TDPT)
          TLCLG(I)=AMIN1(TLCLG(I),TMIXG(I))
          CPORQ=1./ROCPQ
          PLCLG(I)=P00*(TLCLG(I)/THMIXG(I))**CPORQ
        ENDIF
        TVLCL=TLCLG(I)*(1.+0.608*QMIXG(I))
        DO 235 NK = LC,KL
          KLCL=NK
235       IF(PLCLG(I).GE.PP0(I,NK))GO TO 240
240     K=KLCL-1
        DLP=ALOG(PLCLG(I)/PP0(I,K))/ALOG(PP0(I,KLCL)/PP0(I,K))
*
*
*                                 Estimate the environmental temperature
*                                 and mixing ratio at the LCL
*
        TENV=TG(K)+(TG(KLCL)-TG(K))*DLP
        QENV=QG(K)+(QG(KLCL)-QG(K))*DLP
        TVEN=TENV*(1.+0.608*QENV)
        TVBAR=0.5*(TVG(K)+TVEN)
*
*
*                                 Characteristics of the updraft at the
*                                 LCL.  (height, virtual temperature,
*                                 eq. pot. temperature, pressure,
*                                 temperature and detrainment).
*
        ZLCL=Z0G(I,K)+RGASD*TVBAR*ALOG(PP0(I,K)/PLCLG(I))/GRAV
        TVAVG=0.5*(TVEN+TG(KLCL)*(1.+0.608*QG(KLCL)))
        PLCLG(I)=PP0(I,KLCL)*EXP(GRAV/(RGASD*TVAVG)*(Z0G(I,KLCL)-ZLCL))
        THETEU(K)=TMIXG(I)*(1.E5/PMIXG(I))**(0.2854*(1.-0.28*QMIXG(I)))*
     *            EXP((3374.6525/TLCLG(I)-2.5403)*QMIXG(I)*
     *            (1.+0.81*QMIXG(I)))
        ES=ALIQ*EXP((TENV*BLIQ-CLIQ)/(TENV-DLIQ))
        ES=MIN( ES , 0.5*PLCLG(I) )
        QESE=0.622*ES/(PLCLG(I)-ES)
        QESE=MAX( MIN( QESE , 0.050 ) , 1.E-6 )
        THTESG(K)=TENV*(1.E5/PLCLG(I))**(0.2854*(1.-0.28*QESE))*
     *      EXP((3374.6525/TENV-2.5403)*QESE*(1.+0.81*QESE))
*
*
*                            Compute adjusted ABE (ABEG)
*
      ABEG=0.
      THTUDL=THETEU(K)
      THATA = TMIXG(I)*(1.E5/PMIXG(I))**0.286
      THTFC = THATA*EXP((XLV0-XLV1*TLCLG(I))*QMIXG(I)/(CPD*TLCLG(I)))
*
*
*                             Loop for ABEG (adjusted).
*
      DO 245 NK=K,LTOPM1
         NK1=NK+1
         ES=ALIQ*EXP((TG(NK1)*BLIQ-CLIQ)/(TG(NK1)-DLIQ))
         ES=MIN( ES , 0.5*PP0(I,NK1) )
         QESE=0.622*ES/(PP0(I,NK1)-ES)
         QESE=MAX( MIN( QESE , 0.050 ) , 1.E-6 )
         THTESG(NK1)=TG(NK1)*(1.E5/PP0(I,NK1))**(0.2854*(1.-0.28*QESE))*
     *      EXP((3374.6525/TG(NK1)-2.5403)*QESE*(1.+0.81*QESE))
         IF(NK.EQ.K)THEN
           DZZ=Z0G(I,KLCL)-ZLCL
         ELSE
           DZZ=DZP(I,NK)
         ENDIF
         BE=((2.*THTUDL)/(THTESG(NK1)+THTESG(NK))-1.)*DZZ
245      IF(BE.GT.0.)ABEG=ABEG+BE*GRAV
*
*
*                                Assume greater than 90% of CAPE is
*                                removed by convection during the
*                                period TIMEC
*
*                                DABE = difference between original ABE and
*                                       adjusted ABE.  Cannot be smaller
*                                       than 0.1 ABE).
*                                FABE = fraction of ABE left after the
*                                       convective adjustment.
*                                STAB = 0.95 = stabilization factor.
*
      CAPEOUT(I) = ABE
      DABE=AMAX1(ABE-ABEG,0.1*ABE)
      FABE=ABEG/(ABE+1.E-8)
*
      IF(AINC/AINCMX.GT.0.999 .AND. FABE.GT.1.05-STAB)THEN
        GOTO 265
      ENDIF
*
*
*                               IF THE COLUMN IS STABILIZED, THEN OUT
*                               OF THE ITERATION LOOP.
*
      IF(FABE.LE.1.05-STAB.AND.FABE.GE.0.95-STAB)GO TO 265
      IF(NCOUNT.GT.10)THEN
         GOTO 265
      ENDIF
*
*
*                                If more than 10% of the original CAPE
*                                remains, increase the convective mass
*                                flux by the factor AINC
*
      AINC=AINC*STAB*ABE/(DABE+1.E-8)
255   AINC=AMIN1(AINCMX,AINC)
      AINC=AMAX1(AINC,0.0)
*
*
*                                Adjustment of all the updraft/downdraft
*                                characteristics.
*
      PPTMLT=PPTML2*AINC
      TDER=TDER2*AINC
      PPTFLX=PPTFL2*AINC
*
      DO 260 NK=1,LTOP
        UMF(NK)=UMF2(NK)*AINC
        DMF(NK)=DMF2(NK)*AINC
        DETLQ(NK)=DETLQ2(NK)*AINC
        DETIC(NK)=DETIC2(NK)*AINC
        UDR(NK)=UDR2(NK)*AINC
        UER(NK)=UER2(NK)*AINC
        DER(NK)=DER2(NK)*AINC
        DDR(NK)=DDR2(NK)*AINC
        DTFM(NK)=0.
        DMS(NK)=0.
*
        UMFOUT(I,KX-NK+1) = UMF(NK)
        DMFOUT(I,KX-NK+1) = DMF(NK)
*
 260  CONTINUE
*
*
*                              If the downdraft overdraws the initial mass
*                              available at the LFS, allow PEFF to change
*                              so that updraft mass flux is not the
*                              limiting factor in the total convective
*                              mass flux.  This is usually necessary only
*                              when the downdraft is very shallow.
*
        DMFMIN=UER(LFS)-EMS(LFS)/TIMEC
*
*                              DER is large enough (don't forger that
*                              DER < 0).
*
        IF(DER(LFS).LT.DMFMIN .AND. DMFMIN.LT.0.)THEN
*
*                              RF is the proportionality constant for the
*                              decrease of downdraft fluxes.  (RF < 1).
*
          RF=DMFMIN/DER(LFS)
*
          DO 261 NK=LDB,LFS
            DER2(NK)=DER2(NK)*RF
            DDR2(NK)=DDR2(NK)*RF
            DMF2(NK)=DMF2(NK)*RF
            DER(NK)=DER2(NK)*AINC
            DDR(NK)=DDR2(NK)*AINC
            DMF(NK)=DMF2(NK)*AINC
*
            DMFOUT(I,KX-NK+1) = DMF(NK)
*
 261      CONTINUE
*
          TDER2=TDER2*RF
          TDER=TDER2*AINC
*
*
*                              Modify the UPDINC factor using the
*                              new downdraft fluxes.
*
          IF(LFS.GE.KLCL)THEN
            UPDIN2=1.-(1.-EQFRC(LFS))*DMF(LFS)*UPDINC/UMF(LFS)
          ELSE
            UPDIN2=1.
          ENDIF
*
*
*                              Recalculate the condensate production rate
*                              (CPR) and precipitation efficiency.
*
          CPR=TRPPT+PPR*(UPDIN2-1.)
          PEFF=1.-(TDER+(1.-EQFRC(LFS))*DMF(LFS)*(RLIQ(LFS)+RICE(LFS)))/
     *                                                        (CPR*AINC)
*
*                              Adjust precipitation fluxes.
*
          PPTFL2=PEFF*CPR
          PPTFLX=PPTFL2*AINC
          F1=UPDIN2/(AINC*UPDINC)
*
*
*                              Updraft characteristics have to change
*                              accordingly.
*
*VDIR NODEP(UMF)
          DO 361 NK=LC,LFS
            UMF2(NK)=UMF(NK)*F1
            UMF(NK)=UMF2(NK)*AINC
            UDR2(NK)=UDR(NK)*F1
            UDR(NK)=UDR2(NK)*AINC
            UER2(NK)=UER(NK)*F1
            UER(NK)=UER2(NK)*AINC
            DETLQ2(NK)=DETLQ(NK)*F1
            DETLQ(NK)=DETLQ2(NK)*AINC
            DETIC2(NK)=DETIC(NK)*F1
            DETIC(NK)=DETIC2(NK)*AINC
            PPTML2=PPTML2-PPTICE(NK)*(1.-UPDIN2/UPDINC)
            PPTLIQ(NK)=PPTLIQ(NK)*F1*AINC
            PPTICE(NK)=PPTICE(NK)*F1*AINC
*
            UMFOUT(I,NK) = UMF(KX-NK+1)
*
 361      CONTINUE
*
          PPTMLT=PPTML2*AINC
          UPDINC=UPDIN2
        ENDIF
*
*
*                               REDO THE CALCULATIONS FOR CONVECTIVE
*                               ADJUSTMENT.
*
      GO TO 175
*
265   CONTINUE
*
*
*
*                              Diagnostic outputs
*                              WUMAXOUT, RLIQOUT, RICEOUT, AREAUP
*
      WUMAXOUT(I) = 0.
      DO K=1,KX
        NK = KX-K+1
        RLIQOUT(I,NK)  = RLIQ(K)
        RICEOUT(I,NK)  = RICE(K)
*
*                              Vertical integral of rliqout and riceout (in-cloud values)
*
        RLIQ_INT(I) = RLIQ_INT(I) + RLIQOUT(I,NK)/GRAV * DPP(I,K)
        RICE_INT(I) = RICE_INT(I) + RICEOUT(I,NK)/GRAV * DPP(I,K)
*
        WUMAXOUT(I) = MAX( WU(K), WUMAXOUT(I) )
*
        IF (WU(K).GT.0.1) 
     1    AREAUP(I,NK) = ( UMF(K)*RGASD*TVU(K) ) /
     1                   ( PP0(I,K) * WU(K)    ) 
*
*
*                              Convert updraft areas into cloud fractions.
*                              Clip cloud fraction to eliminate negative values.
*
        CLOUDS (I,NK) = MAX(0.,AREAUP(I,NK)/DXDY(I))
*
*                              Normalize condensate mixing ratio
*
        RLIQOUT(I,NK) = RLIQOUT(I,NK)*CLOUDS(I,NK)
        RICEOUT(I,NK) = RICEOUT(I,NK)*CLOUDS(I,NK)
*
      END DO
*
*
*                              The iterative process is over.
*                              The precipitation flux is given by:
*                              (after removing the part that evaporates
*                              in the downdraft).
*
      PPTFLX=PPTFLX-DDPPT*DMF(LFS)
*
*
*
*                             Compute convective momentum tendencies
*
*                             First initialize the momentum variables
*                             for the vertical advection calculations
*
      DO 288 NK=1,LTOP
         UPA(NK)=U00(I,NK)
         VPA(NK)=V00(I,NK)
288   CONTINUE
*
      DO 599 NTC=1,NSTEP
*
*
*
*                             Assign THETA and Q values at the top and
*                             bottom of each layer based on the sigh of
*                             OMEGA
*
       DO 596 NK = 1,LTOP
          IF(OMGA(NK).LE.0.)THEN
            IF(NK.EQ.1)THEN
              NUP(NK)=NK+1
              UADV(NK)=UPA(NK)
              VADV(NK)=VPA(NK)
            ELSE
              NUP(NK)=NK-1
              UADV(NK)=UPA(NK-1)
              VADV(NK)=VPA(NK-1)
            ENDIF
          ELSE
            NUP(NK)=NK+1
            UADV(NK)=UPA(NK+1)
            VADV(NK)=VPA(NK+1)
          ENDIF
596     CONTINUE
*
*
*                           Compute new values for the potential temperature
*                           including the tendencies due vertical advection
*                           of environmental properties, as well as
*                           detrainment effect from the updraft and downdraft.
*
       DO 598 NK = 2, LTOPM1
         NUPNK = NUP(NK)
*
         UPA(NK) =  (
     *                         (PP0(I,NUPNK)-PP0(I,NK)) *
     *                ( UPA(NK) + UDR(NK)*EMSD(NK)*UU(NK)*DTIME
     *                           + DDR(NK)*EMSD(NK)*UD(NK)*DTIME  )
     *                        - 0.3*OMGA(NK)*UADV(NK)*DTIME
     *                                                                  )
     *                                       /
     *              (
     *                         (PP0(I,NUPNK)-PP0(I,NK)) *
     *                (       1. + UDR(NK)*EMSD(NK)*DTIME
     *                           + DDR(NK)*EMSD(NK)*DTIME            )
     *                             - 0.3*OMGA(NK)*DTIME
     *                                                                  )
*
         VPA(NK) =  (
     *                         (PP0(I,NUPNK)-PP0(I,NK)) *
     *                ( VPA(NK) + UDR(NK)*EMSD(NK)*VU(NK)*DTIME
     *                           + DDR(NK)*EMSD(NK)*VD(NK)*DTIME  )
     *                        - 0.3*OMGA(NK)*VADV(NK)*DTIME
     *                                                                  )
     *                                       /
     *              (
     *                         (PP0(I,NUPNK)-PP0(I,NK)) *
     *                (       1. + UDR(NK)*EMSD(NK)*DTIME
     *                           + DDR(NK)*EMSD(NK)*DTIME            )
     *                             - 0.3*OMGA(NK)*DTIME
     *                                                                  )
*
598    CONTINUE
*
*                        At the surface, no contribution from the updraft.
*
       NK = 1
       NUPNK = NUP(NK)
*
       UPA(NK) = (
     *                       (PP0(I,NUPNK)-PP0(I,NK)) *
     *              ( UPA(NK) + DDR(NK)*EMSD(NK)*UD(NK)*DTIME  )
     *                      - 0.3*OMGA(NK)*UADV(NK)*DTIME
     *                                                                )
     *                                     /
     *            (
     *                       (PP0(I,NUPNK)-PP0(I,NK)) *
     *              (       1. + DDR(NK)*EMSD(NK)*DTIME            )
     *                           - 0.3*OMGA(NK)*DTIME
     *                                                                )
*
*
       VPA(NK) = (
     *                       (PP0(I,NUPNK)-PP0(I,NK)) *
     *              ( VPA(NK) + DDR(NK)*EMSD(NK)*VD(NK)*DTIME  )
     *                      - 0.3*OMGA(NK)*VADV(NK)*DTIME
     *                                                                )
     *                                     /
     *            (
     *                       (PP0(I,NUPNK)-PP0(I,NK)) *
     *              (       1. + DDR(NK)*EMSD(NK)*DTIME            )
     *                           - 0.3*OMGA(NK)*DTIME
     *                                                                )
*
*
*
*
*                        At the cloud top, only detrainment from the
*                        updraft.
*
       NK = LTOP
*
       UPA(NK) = ( UPA(NK) + UDR(NK)*UU(NK)*EMSD(NK)*DTIME )
     *                                   /
     *                    ( 1. + UDR(NK)*EMSD(NK)*DTIME )
*
       VPA(NK) = ( VPA(NK) + UDR(NK)*VU(NK)*EMSD(NK)*DTIME )
     *                                   /
     *                    ( 1. + UDR(NK)*EMSD(NK)*DTIME )
*
*
*
599   CONTINUE
*
*
      DO 298 NK=1,LTOP
        UG(NK)=UPA(NK)
        VG(NK)=VPA(NK)
298   CONTINUE
*
*
*
*
*
*                             Update the convective counter FLAGCONV
*
      FLAGCONV(I) = NIC - 1
*
*
*                             Note that DTFM is the temperature change due
*                             to freezing of liquid condensate detrained
*                             above the freezing level and melting of
*                             precipitation in the environment below
*                             the melting level.
*
         DO 320 K = 1, KX
            NK = KX-K+1
            DTDT(I,NK) = (TG(K)-TT0(I,K))/TIMEC
            DQDT(I,NK) = (QG(K)-Q00(I,K))/TIMEC
            IF(IFEXFB.EQ.0)THEN
              DQRDT(I,NK)=0.
            ELSE
              IF(K.LT.KX)THEN
              DQRDT(I,NK)=(PPTLIQ(K+1)+PPTICE(K+1))*PEFF*
     *                       AINC*EMSD(K)
              ELSE
              ENDIF
            ENDIF
*
            DQCDT(I,NK)=(DETLQ(K)+DETIC(K))*EMSD(K)
            DQCDT(I,NK)=MAX( DQCDT(I,NK) , 0. )
*
*
 320    CONTINUE
*
*
*
*                              Produce outputs of precipitation fluxes
*                              for assimilation purposes
*
        SUMFLX = 0.
        RNFLX(I,1)  = 0.
        SNOFLX(I,1) = 0.
        DO K=KX-1,1,-1
          NK = KX-K+1
          LIQFRAC = ( TT0(I,K)-TBFRZ ) / ( TTFRZ - TBFRZ )
          ICEFRAC = 1 - LIQFRAC
          SUMFLX = SUMFLX + (PPTLIQ(K)+PPTICE(K)) / DXSQ
          RNFLX(I,NK)  = MAX( MIN( 1. , LIQFRAC ), 0. ) * SUMFLX
          SNOFLX(I,NK) = MAX( MIN( 1. , ICEFRAC ), 0. ) * SUMFLX
        END DO
*
*
*
*
*                              Using or not the transfer of momentum
*

           IF (KFCMOM) THEN

              DO 321 K= 1, KX
              NK = KX-K+1
              DUDT(I,NK) = ( UG(K)-U00(I,K) ) / TIMEC
              DVDT(I,NK) = ( VG(K)-V00(I,K) ) / TIMEC
 321     CONTINUE

           ENDIF
*
*
*                              Allow all of convective precipitation to be
*                              dumped on the grid scale.
*
        ZCRR(I) = PPTFLX/DXSQ
*
        IF (IKFCPCP.EQ.1) THEN

           DQDTDK = 0.
           DQCDTDK = 0.
           DO K=1,KX
              NK = KX-K+1
              DQDTDK  = DQDTDK  + DQDT(I,K)  / GRAV * DPP(I,NK)
              DQCDTDK = DQCDTDK + DQCDT(I,K) / GRAV * DPP(I,NK)
           END DO
*
           ZCRR(I) = MAX(0.0, -(DQDTDK + DQCDTDK))
*
*                              Normalize precipitation fluxes with new
*                              (i.e., CONSERVATIVE) precipitation at the
*                              surface
*
           DO K=1,KX
              NORM        = ( ZCRR(I)
     1                       / MAX(RNFLX(I,KX)+SNOFLX(I,KX),1.E-10) )
              RNFLX(I,K)  = NORM * RNFLX(I,K)
              SNOFLX(I,K) = NORM * SNOFLX(I,K)
           END DO
*
        ENDIF 
*
*
*
  325  CONTINUE
*
*
*      POST-PROCESSING
*      - - - - - - - -
*                              Convert updraft areas into cloud fractions.
*                              Must be done every timestep because CCFCP
*                              is an automatic array in vkuocon.
*
       DO K=1,KX
          DO I=1,IX
             CLOUDS(I,K) = AREAUP(I,K)/DXDY(I)
          END DO
       END DO
*
*
*      COUNTER FOR CONVECTION
*      ----------------------
*
*      COUNTER IS SET TO ZERO AT FIRST TIMESTEP FOR CONSISTENCY
*      SINCE PRECIPITATION RATE IS SET TO ZERO IN VKUOCON AND
*      TEMPERATURE/HUMIDITY TENDENCIES ARE NOT APPLIED IN DYNAMICS.
*      HOWEVER, CLOUD FRACTION AND LIQUID/SOLID WATER CONTENT
*      ARE KEPT FOR RADIATION CALCULATIONS AT KOUNT.EQ.1.
*       
       IF (KOUNT.EQ.0) THEN
          DO I=1,IX
             FLAGCONV(I) = 0.
          END DO
       ENDIF
*
       DO I=1,IX
         IF (FLAGCONV(I).GT.0.) KKFC(I)=1.
       END DO
*
*
      RETURN
      END