!copyright (C) 2001  MSC-RPN COMM  %%%RPNKUO%%%
***S/P KUO2
*
#include "phy_macros_f.h"

      SUBROUTINE KUO2 ( TE,QE,CRR,CSR,ILAB,CCK,OMEGAP,CLDW, 2,6
     *                  TP1,TM1,QP1,QM1,GZM1,PSP1,PSM1,KBL,
     +                  SIGMA, TAU, N, NI, NK, DBGKUO, SATUCO)
#include "impnone.cdk"
*
      LOGICAL SATUCO
C
      INTEGER N,NK,NI
      INTEGER ILAB(NI,NK)
      LOGICAL DBGKUO
      REAL TAU
      REAL TP1(N,NK),TM1(N,NK),QP1(N,NK),QM1(N,NK),GZM1(N,NK)
      REAL PSP1(N),PSM1(N),KBL(N),SIGMA(NI,NK)
      REAL TE(NI,NK),QE(NI,NK),CRR(NI),CSR(NI)
      REAL CCK(NI,NK),OMEGAP(N,NK),CLDW(N,NK)
*
*Author
*          J.F.Geleyn E.C.M.W.F.     13/05/82.
*
*Revision
* 001      J. Mailhot   R.P.N. 08/02/85. Adaptation and
*          modification for EFR model.
* 002      J. Mailhot (Mar 1987) base of condensation
* 003      G.Pellerin (Oct87)Adaptation to revised code
* 004      J. Mailhot (Mar 1988) threshold of evaporation
* 005      G.Pellerin(August90)Adaptation to thermo functions
* 006      C. Girard(Nov 90)
*          Remove calculations related to the boundary layer
*          Introduction of the entrainment for the cloud profile
*          Modification of the heating/moistening partition:NFRAC**3
* 007      N. Brunet  (May91)
*          New version of thermodynamic functions
*          and file of constants
* 008      B. Bilodeau  (August 1991)- Adaptation to UNIX
* 009      J. Mailhot  (Dec 1992) - Bug correction to the
*          Newton Method
* 010      C. Girard (Nov92) - Clean-up, and implicit
*          calculation of evaporation and precipitation.
*          Recycling of evaporated precipitation for
*          modelling the increase in humidity and calculation
*          of cloud fraction
* 011      A. Methot (Sept 93) -
*          -Bug correction : L/Cp missing in precip. evap.
*          -Evap. set to zero : logical variable EVAP skips unnecessary
*           calculations when no evaporation of precip.
*          -Change heating/moistening partition :
*           BETA=((1-RH)/(1-RHC))**3;(1-RHC)**-3=4;;RHC~.37
*          -SATUCO set to .FALSE. locally by the use of SATUC.
*           Change the value of CHLS depending on SATUC.
* 012      G. Lemay (Oct 93) - Dynamic memory allocation with stkmemw
* 013      R. Benoit (Dec 93) - Restore the ILAB output for use by
*          Sundqvist scheme. Also use icvmgt to handle integer ILAB.
* 014      A. Methot (Dec 93) - SATUCO is back as before revision 011
*             but the value of CHLS is determined by SATUCO
*             Also ZTSATCO determine whether CHLS or CHLC is used
*             -criteria on vertical velocity (OMEGAP)at SIGMAK1 SIGMAK2
* 015      B. Bilodeau (Feb 94) - Cleanup - Change name from KUO to KUO2
* 018      R. Sarrazin (June 95) evap, beta, liquid water
* 016      B. Bilodeau (June 94) - New physics interface
* 017      G. Pellerin (Jan 94) - Omitted bugfix for ZTSATCO
* 018      R. Sarrazin (Summer 95) - Corrections; add diagnostic cloud water.
* 019      B. Bilodeau (Jan 2001) - Automatic arrays
* 020      M. Lepine (March 2003) -  CVMG... Replacements
* 021      G. Pellerin (Mai 03) - Conversion IBM
*            - calls to optimized routine MFOQST
*
*Object
*          to calculate the tendencies of T and Q by moist convective
*          adjustment according to KUO equations
*
*Arguments
*
*          - Output -
* TE       temperature tendency
* QE       specific humidity tendency
* CRR      rate of liquid precipitation
* CSR      rate of solid precipitation (not available)
* ILAB     label array from Kuo scheme
*
*          - Output -
* CCK      cloud fraction due to the Kuo scheme
*
*          - Input -
* OMEGAP   vertical velocity in pressure coordinates
*
*          - Output -
* CLDW     diagnostic cloud water
*
*          - Input/Output -
* TP1      temperature at (T+DT)
* TM1      temperature at (T-DT)
* QP1      specific humidity at (T+DT)
* QM1      specific humidity at (T-DT)
*
*          - Input -
* GZM1     geopotential (N,NK)
* PSP1     surface pressure at (T+DT)
* PSM1     surface pressure at (T-DT)
* KBL      index of 1st level of the boundary layer
* SIGMA    sigma levels
* TAU      FACTDT * timestep (see common block OPTIONS)
* N        dimension NI*NJ
* NI       1st horizontal dimension
* NK       vertical dimension
* DBGKUO   .TRUE. to debug KUO routine
*          .FALSE. to not debug
* SATUCO   .TRUE. if water/ice phase for saturation
*          .FALSE. if water phase only for saturation
*
*Notes
*          The process accounts for the moisture convergence for the
*          formation of cumulus clouds, the humidification of the
*          environment and the formation of precipitation. There is
*          an exact balance between these 3 features.  The process
*          adapts the T values at (T+DT) and Q values at (T-DT) (the
*          difference between T-DT and T+DT will give the moisture
*          convergence) and the proportional intensity to available
*          convergence.  The routine is divided into 5 different
*          steps:
*          1)allocation and position for work space
*          2)preliminary computations
*          3)cloud ascent and flagging
*          4)total moisture convergence and mean beta-parameter
*          5)moistening, condensation and evaporation of rain/snow
*
*
*REFERENCE
*     ECMWF RESEARCH MANUAL (VOLUME 3)
*     PHYSICAL PARAMETRIZATION  CHAPITRE 4
**
*
      real wc0, wmr, pc1, pc2
*
      parameter (wc0=5.0E-4)
      parameter (wmr=5.0E-4)
      parameter (pc1=300.)
      parameter (pc2=0.5)
*
      LOGICAL LO,EVAP
      INTEGER IERR
      INTEGER NKP1,NKM1
      INTEGER IS,IKS,IKS2
      INTEGER JK,JL,MODP
      INTEGER HEAPERR
      REAL TEMP1, TEMP2, TEMP3, temp4, temp5, temp6
*
*
*
************************************************************************
*     AUTOMATIC ARRAYS
************************************************************************
*
      AUTOMATIC (LO1    , LOGICAL, (NI   ))
*
      AUTOMATIC (IQCD   , INTEGER, (NI   ))
      AUTOMATIC (KM1    , INTEGER, (NI   ))
      AUTOMATIC (KM2    , INTEGER, (NI   ))
      AUTOMATIC (KP1    , INTEGER, (NI   ))
      AUTOMATIC (KP2    , INTEGER, (NI   ))
*
      AUTOMATIC (ZCDP   , REAL   , (NI   ))
      AUTOMATIC (ZCPD   , REAL   , (NI   ))
      AUTOMATIC (ZRFL   , REAL   , (NI   ))
      AUTOMATIC (ZSFL   , REAL   , (NI   ))
      AUTOMATIC (ZCUCOV , REAL   , (NI   ))
      AUTOMATIC (ZRFLN  , REAL   , (NI   ))
      AUTOMATIC (ZSFLN  , REAL   , (NI   ))
      AUTOMATIC (SIGMAK1, REAL   , (NI   ))
      AUTOMATIC (SIGMAK2, REAL   , (NI   ))
      AUTOMATIC (KWW1   , REAL   , (NI   ))
      AUTOMATIC (KWW2   , REAL   , (NI   ))
      AUTOMATIC (ZQCD   , REAL   , (NI   ))
      AUTOMATIC (ZQSATC , REAL   , (NI,NK))
      AUTOMATIC (ZLDCPE , REAL   , (NI,NK))
      AUTOMATIC (ZPP1   , REAL   , (NI,NK))
      AUTOMATIC (ZDSG   , REAL   , (NI,NK))
      AUTOMATIC (ZDPP1  , REAL   , (NI,NK))
      AUTOMATIC (ZQAC   , REAL   , (NI,NK))
      AUTOMATIC (ZTP1   , REAL   , (NI,NK))
      AUTOMATIC (ZQP1   , REAL   , (NI,NK))
      AUTOMATIC (ZQSATE , REAL   , (NI,NK))
      AUTOMATIC (ZBETA  , REAL   , (NI,NK))
      AUTOMATIC (ZDQTOT , REAL   , (NI,NK))
      AUTOMATIC (ZTC    , REAL   , (NI,NK))
      AUTOMATIC (ZQC    , REAL   , (NI,NK))
      AUTOMATIC (ZTVP1  , REAL   , (NI,NK))
      AUTOMATIC (ZDQLOC , REAL   , (NI,NK))
      AUTOMATIC (ZDTLOC , REAL   , (NI,NK))
      AUTOMATIC (ZDTTOT , REAL   , (NI,NK))
*
************************************************************************
*
      REAL ZEVAP, ZMELT, ZCCTIM, ZRCYCL, ZEPFLM, ZEPFLS
      REAL ZEPCDP, ZEPCOV, ZTMST, ZCONS2, ZCONS3
      REAL ZCONS5, ZDPM1, ZLDCP0, ZCOR
      REAL ZDP, ZDQK, ZCUPRO, ZCPDL, ZDTK, ZSQFLN, ZNIMP
      REAL ZRFLN0, ZLVDCP, ENTRM
*     real cevap, ccctim, cmelt
*
C*    PHYSICAL CONSTANTS.
C     -------- ----------
C
#include "comphy.cdk"
*
      REAL CHLS, DELTA2
#include "consphy.cdk"
#include "dintern.cdk"
#include "fintern.cdk"
*
C     *NSTAB* REFERS TO THE MINIMUM NUMBER OF STABLE LAYERS BETWEEN THE
C     TOP AND THE CLOUD BASE.
C     IF *EVAP* IS TRUE: THE EVAPORATION OF PRECIPITATION IS ACTIVATED
C                        OTHERWISE THERE IS NO EVAPORATION
C     *ZEVAP* IS A CONSTANT FOR THE EVAPORATION OF PRECIPITATION
C     *ZCCTIM* IS THE CUMULUS LIFE-TIME VALUE TO COMPUTE ITS CLOUD COVER
C     *ZRCYCL* IS THE EVAPORATED PRECIP RECYCLED FRACTION
C
      NKP1=NK+1
      NKM1=NK-1
*
      EVAP=.TRUE. 
      IF ( EVAP ) THEN
       ZEVAP  = 6.0E-05
      ELSE
       ZEVAP  = 0.0
      ENDIF
      ZMELT  = CMELT
      ZCCTIM = CCCTIM
      ZRCYCL = 1.0
      ENTRM  = 5.E-6
C
C
C*    SECURITY PARAMETERS.
C     --------------------
C
C         *ZEPFLM* IS A MINIMUM FLUX TO AVOID DIVIDING BY ZERO IN THE IC
C     PROPORTION CALCULATIONS, *ZEPCDP* AVOIDS DIVIDING BY ZERO IN THE
C     ABSENCE OF CLOUD AND *ZEPCOV* IS A MINIMUM CLOUD COVER.
C
      ZEPFLM=1.E-24
      ZEPFLS=SQRT(ZEPFLM)
      ZEPCDP=1.E-12
      ZEPCOV=1.E-12
C
C*    COMPUTATIONAL CONSTANTS.
C     ------------- ----------
C
      ZTMST  = TAU
      DELTA2 = CPV/CPD - 1.

      IF (SATUCO) THEN
       CHLS   = CHLC + CHLF
      ELSE
       CHLS   = CHLC
      ENDIF
C
      ZCONS2 = 1./(ZTMST*GRAV)
      ZCONS3 = ZCCTIM/ZTMST
      ZCONS5 = 1./ZTMST
C
C
C     ------------------------------------------------------------------
C
C*         1.     ALLOCATION AND POSITION FOR WORK SPACE.
C                 ---------- --- -------- --- ---- ------
C
  100 CONTINUE
C
C
*
*
C***
C
C     METHOD.
C     -------
C
C          IN ORDER TO KEEP THE CODE LINEAR THE ROUTINE HAS BEEN DIVIDED
C     INTO THREE PARTS THAT WE SHALL CALL HERE (A) (B) AND (C).
C          IN (A) PRELIMINARY COMPUTATIONS ARE FIRST PERFORMED. THEN A
C     NEARLY ADIABATIC ASCENT IS ATTEMPTED FOR A CLOUD PARCEL STARTING
C     FROM THE LOWEST MODEL LAYER. THIS CLOUD ASCENT IS COMPUTED
C     IN TERMS OF TEMPERATURE AND SPECIFIC HUMIDITY.
C     ENTRAINMENT IS SIMULATED VIA THE ENTRAINMENT PARAMETER.
C     THE LEVELS ARE FLAGGED ACCORDING TO THE FOLLOWING CODE:
C     0 = STABLE,
C     1 = PART OF THE WELL MIXED BOUNDARY LAYER OR DRY UNSTABLE SLAB,
C     2 = MOIST UNSTABLE SLAB (I.E. CLOUD LAYER) AND
C     3 = LIFTING LEVEL IF DIFFERENT FROM THE GROUND.
C          IN (B) THE TOTAL MOISTURE CONVERGENCE FOR EACH SLAB OF
C     NON-0-FLAGS IS STORED INTO ALL THE CORRESPONDING LAYERS IF IT IS
C     POSITIVE AND THE SAME IS DONE FOR THE MEAN OF 1-RELATIVE HUMIDITY
C     FOR EACH CORRESPONDING SLAB OF 2-FLAGS.
C          IN (C) THE ACTUAL MODIFICATIONS OF TEMPERATURE AND SPECIFIC
C     HUMIDITY ARE COMPUTED. FIRST THE ENVIRONMENTAL MOISTENING IS
C     TAKEN PROPORTIONAL TO THE MOISTURE CONVERGENCE WEIGHTED BY "BETA"
C     AND TO THE SATURATION DEFICIT OF SPECIFIC HUMIDITY. AT THE SAME
C     TIME THE MOISTURE CONVERGENCE IS TAKEN AWAY FROM THE HUMIDITY FIELD.
C     SECOND THE FORMATION OF PRECIPITATION IS TAKEN PROPORTIONAL TO THE
C     MOISTURE CONVERGENCE WEIGHTED BY "1 - BETA"  AND TO THE
C     TEMPERATURE DIFFERENCE BETWEEN THE CLOUD AND THE ENVIRONMENT.
C     "BETA" , THE MOISTENING PARAMETER, IS A FUNCTION OF MEAN REL. HUM.
C     A CLOUD-COVER VALUE IS OBTAINED BY COMPARING THE TIME AT WHICH THE
C     ENVIRONMENT WOULD REACH EQUILIBRIUM WITH THE CLOUD TO A PRESCRIBED
C     LIFE-TIME VALUE FOR THE CLOUD ITSELF.
C
C
C     ------------------------------------------------------------------
C
C*         2.     PRELIMINARY COMPUTATIONS.
C                 ----------- -------------
C
  200 CONTINUE
C
C*         2.1     NECESSARY SETTING FOR THE CASE THERE WOULD NOT BE
C*                 ANY CONVECTIVE POINT AROUND THE LATITUDE CIRCLE.
C
  210 CONTINUE
C
C*         2.2     MOISTURE ACCESSION, T+1 T,Q VARIABLES AND SATURATION
C*                 MIXING RATIO PLUS INITIAL VALUE FOR TEST FLAG, ETC.
C

C     The moisture accession is set to zero for all levels when the
C     vertical velocity in pressure coordinates OMEGAP is positive
C     (downward) at both sigma levels SIGMAK1 and SIGMAK2.
C
C     Since SIGMAK1 and 2 do not necessarly coincide with sigma levels
C     of the model, OMEGAP is linearly interpolated at levels SIGMAK1 and 2
C     using weighting factors KWW1 and KWW2. KP1 or KP2 and KM1 or KM2 are
C     the indices of the model's sigma levels from which the interpolation
C     takes place.

*
C     SIGMAK1 and SIGMAK2 are the sigma levels at which OMEGAP is tested

      DO 10 JL = 1,NI
         SIGMAK1(JL) = 0.9
         SIGMAK2(JL) = 0.7
         KM1    (JL) = NK
         KM2    (JL) = NK
10    CONTINUE
*
*     general case
      DO 20 JK = 1,NK
*
         DO 30 JL = 1,NI
*
            IF (SIGMA(JL,JK) .LE. SIGMAK1(JL)) KM1(JL) = JK
            IF (SIGMA(JL,JK) .LE. SIGMAK2(JL)) KM2(JL) = JK
*
            KP1(JL) = KM1(JL) + 1
            KP2(JL) = KM2(JL) + 1
*
            KWW1(JL)=(SIGMAK1(JL)-SIGMA(JL,KM1(JL)))/
     +               (SIGMA(JL,KP1(JL))-SIGMA(JL,KM1(JL)))
*
            KWW2(JL)=(SIGMAK2(JL)-SIGMA(JL,KM2(JL)))/
     +               (SIGMA(JL,KP2(JL))-SIGMA(JL,KM2(JL)))
*
30       CONTINUE
*
20    CONTINUE
*
*     loop 40 covers special cases
      DO 40 JL = 1,NI
*
         IF (SIGMA(JL,1).GT.SIGMAK1(JL)) THEN
            SIGMAK1(JL) = SIGMA(JL,1)
            KM1(JL)     = 1
            KP1(JL)     = 1
            KWW1(JL)    = 1.0
         ENDIF

         IF (SIGMA(JL,1).GT.SIGMAK2(JL)) THEN
            SIGMAK2(JL) = SIGMA(JL,1)
            KM2(JL)     = 1
            KP2(JL)     = 1
            KWW2(JL)    = 1.0
         ENDIF

         IF ( KM1(JL)  .EQ. NK )         THEN
            KP1(JL)     = KM1(JL)
            KWW1(JL)    = 1.0
         ENDIF

         IF ( KM2(JL)  .EQ. NK )         THEN
            KP2(JL)     = KM2(JL)
            KWW2(JL)    = 1.0
         ENDIF
*
40    CONTINUE
*
*
      do 220 jl=1,ni
      ZDSG(jl,1)=0.5*(SIGMA(jl,2)-SIGMA(jl,1))
      DO 225 JK=2,NKM1
      ZDSG(jl,JK)=0.5*(SIGMA(jl,JK+1)-SIGMA(jl,JK-1))
  225 CONTINUE
      ZDSG(jl,NK)=0.5*(1.-SIGMA(jl,NKM1))+0.5*(1.-SIGMA(jl,NK))
  220 continue
C
      DO 221 JK=1,NK
      DO 221 JL=1,NI
      ZPP1(JL,JK)=SIGMA(jl,JK)*PSP1(JL)
      ZTP1(JL,JK)=TP1(JL,JK)
      ZQP1(JL,JK)=QP1(JL,JK)
      ZDPP1(JL,JK)=ZDSG(jl,JK)*PSP1(JL)
      ZDPM1       =ZDSG(jl,JK)*PSM1(JL)
      ZQAC(JL,JK)=ZQP1(JL,JK)*ZDPP1(JL,JK)-QM1(JL,JK)*ZDPM1
      LO=(OMEGAP(JL,KP1(JL))*KWW1(JL) +
     +    OMEGAP(JL,KM1(JL))*(1-KWW1(JL))).GT.0.
      LO=LO .AND. (OMEGAP(JL,KP2(JL))*KWW2(JL)+
     +             OMEGAP(JL,KM2(JL))*(1-KWW2(JL))).GT.0.
      if (LO) ZQAC(JL,JK)=0.
      ILAB(JL,JK)=0
      ZBETA(JL,JK)=0.
      ZDQTOT(JL,JK)=-1.
  221 CONTINUE
C
      MODP=3
      IF(SATUCO)THEN
       CALL MFOQST(ZQSATE,ZTP1,SIGMA,ZPP1,MODP,NI,NK,NI)
      ELSE
       CALL MFOQSA(ZQSATE,ZTP1,SIGMA,ZPP1,MODP,NI,NK,NI)
      ENDIF
C
C*         2.3     COMPUTATIONS WITHIN THE BOUNDARY LAYER.
C
  230 CONTINUE
C
C*         2.4     SPECIFY TC AND QC AT THE LOWEST LAYER TO START THE
C*                 CLOUD ASCENT. CHECK FOR POSITIVE MOISTURE ACCESSION
C*                 BETWEEN SURFACE AND CLOUD BASE.
C*                 ZQC=0 INDICATES STABLE CONDITIONS.
C
  240 CONTINUE
      DO 241 JL=1,NI
      LO=ZQAC(JL,NK).GT.0.
      ZTC(JL,NK)=ZTP1(JL,NK)
      if (LO) then
         ZQC(JL,NK) = QM1(JL,NK)
      else
         ZQC(JL,NK) = 0.
      endif
      IF (LO) ILAB(JL,NK) = 1
  241 CONTINUE
C
C
C     ------------------------------------------------------------------
C
C*         3.     CLOUD ASCENT AND FLAGGING.
C                 ----- ------ --- ---------
C
  300 CONTINUE
C
C*         3.1     CALCULATE TC AND QC AT NEXT LEVEL BY DRY ADIABATIC
C*                 LIFTING AND CONSIDERING LATENT HEAT RELEASE (THE
C*                 GEOPOTENTIAL DIFFERENCE IS CORRECTED TO TAKE INTO
C*                 ACCOUNT THE VIRTUAL TEMPERATURE DIFFERENCE BETWEEN
C*                 THE ASCENT AND THE ENVIRONMENT). THE CONDENSATION
C*                 CALCULATIONS ARE DONE WITH TWO ITERATIONS.
C
  310 CONTINUE
C
      DO 311 JL=1,NI
      ZCPD(JL)=CPD*(1.+DELTA2*ZQC(JL,NK))
      ZTVP1(JL,NK) = FOTVT(ZTP1(JL,NK),QM1(JL,NK))
  311 CONTINUE
C***
      DO 322 JK=NKM1,1,-1
C***
      DO 312 JL=1,NI
      ZTC(JL,JK)=ZTC(JL,JK+1)+(GZM1(JL,JK+1)-GZM1(JL,JK))*
     *   (1./ZCPD(JL)+ENTRM*MAX(0.,ZTC(JL,JK+1)-ZTP1(JL,JK+1)))
      ZQC(JL,JK)=ZQC(JL,JK+1)+(GZM1(JL,JK+1)-GZM1(JL,JK))*
     *   (            ENTRM*MAX(0.,ZQC(JL,JK+1)-QM1(JL,JK+1)))
      TEMP1 = ZTP1(JL,JK)
      ZTVP1(JL,JK) = FOTVT(ZTP1(JL,JK),QM1(JL,JK))
      LO=(FOTVT(ZTC(JL,JK),ZQC(JL,JK)).GT.ZTVP1(JL,JK)).AND
     *   .(ZQC(JL,JK).NE.0.)
      IF (LO) ILAB(JL,JK) = 1
      LO = ZTC(JL,JK).LT.TRPL .and. SATUCO
!      ZLDCPE = CVMGT(CHLS,CHLC,LO)/ZCPD(JL)
      if (LO) then
         ZLDCPE(jl,jk) = CHLS/ZCPD(JL)
      else
         ZLDCPE(jl,jk) = CHLC/ZCPD(JL)
      endif
  312 CONTINUE

      IF(SATUCO)THEN
      CALL MFOQST(ZQSATC(1,jk),ZTC(1,jk),SIGMA,ZPP1(1,jk),MODP,NI,1,NI)
      DO 313 JL=1,NI
*      ZQSATC(jl,jk)=FOQST(ZTC(JL,JK),ZPP1(JL,JK))
      ZCOR=ZLDCPE(jl,jk)*FODQS(ZQSATC(jl,jk),ZTC(JL,JK))
      ZQCD(jl)=AMAX1(0.,(ZQC(JL,JK)-ZQSATC(jl,jk))/(1.+ZCOR))
  313 CONTINUE
      ELSE
      CALL MFOQSA(ZQSATC(1,jk),ZTC(1,jk),SIGMA,ZPP1(1,jk),MODP,NI,1,NI)
      DO 317 JL=1,NI
*      ZQSATC(jl,jk)=FOQSA(ZTC(JL,JK),ZPP1(JL,JK))
      ZCOR=ZLDCPE(jl,jk)*FODQA(ZQSATC(jl,jk),ZTC(JL,JK))
      ZQCD(jl)=AMAX1(0.,(ZQC(JL,JK)-ZQSATC(jl,jk))/(1.+ZCOR))
  317 CONTINUE
      ENDIF

       DO JL=1,NI
       LO=ZQCD(jl).EQ.0.
       IQCD(JL) = 1
       IF (LO) IQCD(JL) = 0
       ZQC(JL,JK)=ZQC(JL,JK)-ZQCD(jl)
       ZTC(JL,JK)=ZTC(JL,JK)+ZQCD(jl)*ZLDCPE(jl,jk)
       LO1(JL)=.FALSE.
       LO = ZTC(JL,JK).LT.TRPL
       if (LO) then
         ZLDCPE(jl,jk) = CHLS/ZCPD(JL)
       else
         ZLDCPE(jl,jk) = CHLC/ZCPD(JL)
       endif
       ENDDO

      IS=0
      DO 314 JL=1,NI
      IS=IS+IQCD(JL)
  314 CONTINUE
      IF (IS.NE.0) THEN
      IF(SATUCO)THEN
      CALL MFOQST(ZQSATC(1,jk),ZTC(1,jk),SIGMA,ZPP1(1,jk),MODP,NI,1,NI)
      DO 315 JL=1,NI
*      ZQSATC(jl,jk)=FOQST(ZTC(JL,JK),ZPP1(JL,JK))
      ZCOR=ZLDCPE(jl,jk)*FODQS(ZQSATC(jl,jk),ZTC(JL,JK))
      ZQCD(jl)=(ZQC(JL,JK)-ZQSATC(jl,jk))/(1.+ZCOR)
  315 CONTINUE
      ELSE
      CALL MFOQSA(ZQSATC(1,jk),ZTC(1,jk),SIGMA,ZPP1(1,jk),MODP,NI,1,NI)
      DO 318 JL=1,NI
*      ZQSATC(jl,jk)=FOQSA(ZTC(JL,JK),ZPP1(JL,JK))
      ZCOR=ZLDCPE(jl,jk)*FODQA(ZQSATC(jl,jk),ZTC(JL,JK))
      ZQCD(jl)=(ZQC(JL,JK)-ZQSATC(jl,jk))/(1.+ZCOR)
  318 CONTINUE
      ENDIF
       DO JL=1,NI
       LO1(JL)=IQCD(JL).NE.0
       if (.not. LO1(JL)) ZQCD(jl) = 0.
       ZQC(JL,JK)=ZQC(JL,JK)-ZQCD(jl)
       ZTC(JL,JK)=ZTC(JL,JK)+ZQCD(jl)*ZLDCPE(jl,jk)
       ENDDO
      ENDIF

      DO 316 JL=1,NI
      LO=(FOTVT(ZTC(JL,JK),ZQC(JL,JK)).GT.ZTVP1(JL,JK))
     *   .AND.LO1(JL)
      IF (LO) ILAB(JL,JK) = 2
      LO1(JL)=ILAB(JL,JK).EQ.0
      if (LO1(JL)) ZTC(JL,JK) = ZTP1(JL,JK)
      if (LO1(JL)) ZQC(JL,JK) = 0.
  316 CONTINUE
C
C
C*         3.2     IF NOT AT THE TOP CHECK FOR NEW LIFTING LEVEL, I.E.
C*                 MOISTURE CONVERGENCE IN A STABLE LAYER.
C
C***
      IF (JK.NE.1) THEN
C***
      DO 321 JL=1,NI
      LO=LO1(JL).AND.(ZQAC(JL,JK).GT.0.)
      if (LO) ZTC(JL,JK) = ZTP1(JL,JK)
      if (LO) ZQC(JL,JK) = QM1(JL,JK)
      ZCPD(JL)=CPD*(1.+DELTA2*ZQC(JL,JK))
  321 CONTINUE
C***
      ENDIF
  322 CONTINUE
C
C***
C
C*         3.3     ILAB=0 FOR DRY UNSTABLE LAYERS IF NO CLOUD IS ABOVE
C*                 ILAB=3 FOR LIFTING LEVEL IF LAYER ABOVE IS UNSTABLE.
C*                 IKS2 INDICATES THE HIGHEST TOP OF A CLOUD AROUND THE
C*                 LATITUDE CIRCLE (TO AVOID UNNECESSARY COMPUTATIONS
C*                 LATER).
C
  330 CONTINUE
      IKS2=NKP1
      DO 331 JL=1,NI
      LO=ILAB(JL,1).EQ.1
      IF (LO) ILAB(JL,1) = 0
  331 CONTINUE
      IS=0
      DO 332 JL=1,NI
      IS=IS+ILAB(JL,1)
  332 CONTINUE
      IF (IS.NE.0) IKS2=1
      DO 335 JK=2,NK
      DO 333 JL=1,NI
      LO=(ILAB(JL,JK).EQ.1).AND.(ILAB(JL,JK-1).EQ.0)
      IF (LO) ILAB(JL,JK) = 0
  333 CONTINUE
      IF (IKS2.EQ.NKP1) THEN
      IS=0
      DO 334 JL=1,NI
      IS=IS+ILAB(JL,JK)
  334 CONTINUE
      IF (IS.NE.0) IKS2=JK
      ENDIF
  335 CONTINUE
C***
      IF (IKS2.EQ.NKP1) GO TO 600
C***
      DO 337 JK=NK,2,-1
      DO 336 JL=1,NI
      LO=(ILAB(JL,JK).EQ.0).AND.(ILAB(JL,JK-1).NE.0)
      IF (LO) ILAB(JL,JK) = 3
  336 CONTINUE
  337 CONTINUE
C
C
C     ------------------------------------------------------------------
C
C*         4.     TOTAL MOISTURE CONVERGENCE AND MEAN BETA-PARAMETER.
C                 ----- -------- ----------- --- ---- ---------------
C
  400 CONTINUE
C
C*         4.1     CALCULATE TOTAL MOISTURE ACCESSION FOR UNSTABLE
C*                 LAYERS AND THE PARTITION PARAMETER BETA
C*                 AVERAGED OVER CLOUD LAYERS.
C
  410 CONTINUE
      DO 411 JL=1,NI
      LO=ILAB(JL,NK).GT.0
      if (.not. LO) ZQAC(JL,NK) = 0.
      ZQSATE(JL,NK) = AMAX1(ZQSATE(JL,NK),QM1(JL,NK))
      ZBETA(JL,NK)=0.
      ZCDP(JL)=0.
  411 CONTINUE
      DO 413 JK=NKM1,IKS2,-1
      DO 412 JL=1,NI
      LO=ILAB(JL,JK).GT.0
      if (.not. LO) ZQAC(JL,JK) = 0.
      LO=LO.AND.(ILAB(JL,JK).NE.3)
      if (LO) ZQAC(JL,JK) = ZQAC(JL,JK+1)+ZQAC(JL,JK)
      ZQSATE(JL,JK) = AMAX1(ZQSATE(JL,JK),QM1(JL,JK))
      ZBETA(JL,JK) = AMAX1(0.,QM1(JL,JK))/ZQSATE(JL,JK)
      LO=ILAB(JL,JK).EQ.2
      if (.not. LO) ZBETA(JL,JK) = 0.
      if (LO) then
         ZDP = ZDPP1(JL,JK)
      else
         ZDP = 0.
      endif
      LO=LO.AND.(ILAB(JL,JK+1).EQ.2)
      if (LO) then
         ZBETA(JL,JK) = (ZCDP(JL)*ZBETA(JL,JK+1)+ZDP*ZBETA(JL,JK))
     %                  /AMAX1(ZCDP(JL)+ZDP,ZEPCDP)
      endif
      if (LO) then
         ZCDP(JL) = ZCDP(JL)+ZDP
      else
         ZCDP(JL) = ZDP
      endif
  412 CONTINUE
  413 CONTINUE
C
C
C*         4.2     REPLACE THE MOISTURE ACCESSION AT CLOUD LAYERS BY THE
C*                 TOTAL MOISTURE ACCESSION OF THE WHOLE UNSTABLE LAYER
C*                 AND DO THE SAME FOR THE BETA-PARAMETER MEAN VALUE.
C*                 UPDATE IKS2 DURING THE PROCESS.
C
  420 CONTINUE
      IKS2=NKP1
      DO 421 JL=1,NI
      LO=ZQAC(JL,1).GT.0.
      IF (.NOT.LO) ILAB(JL,1) = 0
  421 CONTINUE
      IS=0
      DO 422 JL=1,NI
      IS=IS+ILAB(JL,1)
  422 CONTINUE
      IF (IS.NE.0) IKS2=1
      DO 425 JK=2,NK
      DO 423 JL=1,NI
      LO=(ILAB(JL,JK).EQ.2).AND.(ILAB(JL,JK-1).EQ.2)
      if (LO) ZQAC(JL,JK) = ZQAC(JL,JK-1)
       temp1=(1-ZBETA(JL,JK))*(1-ZBETA(JL,JK))
        temp1=temp1*(1-ZBETA(JL,JK))
      ZBETA(JL,JK) = MIN( 1.0, 6.0*temp1 )
      if (LO) ZBETA(JL,JK) = ZBETA(JL,JK-1)
      LO=(ZQAC(JL,JK).LE.0.).AND.(ILAB(JL,JK).EQ.2)
      IF (LO) ILAB(JL,JK) = 0
      LO=(ILAB(JL,JK).NE.2).AND.(ILAB(JL,JK-1).EQ.0)
      IF (LO) ILAB(JL,JK) = 0
  423 CONTINUE
      IF (IKS2.EQ.NKP1) THEN
      IS=0
      DO 424 JL=1,NI
      IS=IS+ILAB(JL,JK)
  424 CONTINUE
      IF (IS.NE.0) IKS2=JK
      ENDIF
  425 CONTINUE
C
C
C***
      IF (IKS2.EQ.NKP1) GO TO 600
C***
C
C     ------------------------------------------------------------------
C
C*         5.     MOISTENING, CONDENSATION AND EVAPORATION OF RAIN/SNOW.
C                 ----------- ------------ --- ----------- -- ----------
C
  500 CONTINUE
C
C*         5.1     COMPUTE THE TOTAL MOISTURE DEFICIT IN THE CLOUD
C*                 LAYERS.
C
  510 CONTINUE
      DO 511 JL=1,NI
      ZDQLOC(JL,NK)=0.
      ZDQTOT(JL,NK)=0.
  511 CONTINUE
      DO 513 JK=NKM1,IKS2,-1
      DO 512 JL=1,NI
      ZDQLOC(JL,JK) = ZQSATE(JL,JK)-QM1(JL,JK)
      ZDQK = ZDQLOC(JL,JK)*ZDPP1(JL,JK)
      LO=ILAB(JL,JK).EQ.2
      if (LO) then
         ZDQTOT(JL,JK) = ZDQK
      else
         ZDQTOT(JL,JK) = 0.
      endif
      LO=LO.AND.(ILAB(JL,JK+1).EQ.2)
      if (LO) ZDQTOT(JL,JK) = ZDQTOT(JL,JK+1)+ZDQK
  512 CONTINUE
  513 CONTINUE
      IF (IKS2.EQ.1) THEN
      DO 514 JL=1,NI
      LO=ZDQTOT(JL,1).GT.0.
      if (.not. LO) ZDQTOT(JL,1) = -1.
  514 CONTINUE
      ENDIF
      IKS=MAX0(2,IKS2)
      DO 516 JK=IKS,NK
      DO 515 JL=1,NI
      LO=(ILAB(JL,JK).EQ.2).AND.(ILAB(JL,JK-1).EQ.2)
      if (LO) ZDQTOT(JL,JK) = ZDQTOT(JL,JK-1)
      LO=ZDQTOT(JL,JK).GT.0.
      if (.not. LO) ZDQTOT(JL,JK) = -1.
  515 CONTINUE
  516 CONTINUE
C
C
C*         5.2     REMOVE THE MOISTURE ACCESSION IN THE RELEVANT LAYERS
C*                 (BY RETURNING TO THE PREVIOUS TIMESTEP VALUES)
C*                 AND DO THE ENVIRONMENTAL MOISTENING.
C
  520 CONTINUE
      DO 523 JK=IKS2,NK
      DO 522 JL=1,NI
      LO=ILAB(JL,JK).GT.0
      ZDPM1 = ZDSG(jl,JK)*PSM1(JL)
      if (LO) ZQP1(JL,JK) = QM1(JL,JK)*ZDPM1/ZDPP1(JL,JK)
      ZCUPRO = ZDQLOC(JL,JK)*ZBETA(JL,JK)*ZQAC(JL,JK)/ZDQTOT(JL,JK)
      LO=ILAB(JL,JK).EQ.2
      if (.not. LO) ZCUPRO = 0.
      ZQP1(JL,JK) = ZQP1(JL,JK)+ZCUPRO
  522 CONTINUE
  523 CONTINUE
C
C
C*         5.3     COMPUTATION OF THE TOTAL VIRTUAL TEMPERATURE DEFICIT
C*                 IN CLOUD LAYERS.
C
  530 CONTINUE
      DO 531 JL=1,NI
      ZTC(JL,NK)=ZTP1(JL,NK)
      ZQC(JL,NK)=QM1(JL,NK)
      ZDTLOC(JL,NK)=0.
      ZDTTOT(JL,NK)=0.
  531 CONTINUE
      DO 533 JK=NKM1,IKS2,-1
      DO 532 JL=1,NI
      LO = ZTC(JL,JK).LT.TRPL
!      ZCPDL=CPD*(1.+DELTA2*QM1(JL,JK))/(CVMGT(CHLS,CHLC,LO)*(1.+DELTA
!     *      *QM1(JL,JK)))
      if (LO) then
         ZCPDL=CPD*(1.+DELTA2*QM1(JL,JK))/(CHLS*(1.+DELTA*QM1(JL,JK)))
      else
         ZCPDL=CPD*(1.+DELTA2*QM1(JL,JK))/(CHLC*(1.+DELTA*QM1(JL,JK)))
      endif
      LO=ILAB(JL,JK).EQ.2
!      ZTC(JL,JK) = CVMGT(ZTC(JL,JK),ZTP1(JL,JK),LO)
      if (.not. LO) ZTC(JL,JK) = ZTP1(JL,JK)
!      ZQC(JL,JK) = CVMGT(ZQC(JL,JK),QM1(JL,JK),LO)
      if (.not. LO) ZQC(JL,JK) = QM1(JL,JK)
!      ZQSATE(JL,JK) = CVMGT(ZQC(JL,JK),ZQSATE(JL,JK),LO)
      if (LO) ZQSATE(JL,JK) = ZQC(JL,JK)
      ZDTLOC(JL,JK)=(FOTVT(ZTC(JL,JK),ZQC(JL,JK))-ZTVP1(JL,JK))
     *              *ZCPDL
      ZDTK = ZDTLOC(JL,JK)*ZDPP1(JL,JK)
!      ZDTTOT(JL,JK) = CVMGT(ZDTK,0.,LO)
      if (LO) then
         ZDTTOT(JL,JK) = ZDTK
      else
         ZDTTOT(JL,JK) = 0.
      endif
      LO=LO.AND.(ILAB(JL,JK+1).EQ.2)
      if (LO) ZDTTOT(JL,JK) = ZDTTOT(JL,JK+1)+ZDTK
  532 CONTINUE
  533 CONTINUE
      IF (IKS2.EQ.1) THEN
      DO 534 JL=1,NI
      LO=ZDTTOT(JL,1).GT.0.
      if (.not. LO) ZDTTOT(JL,1) = -1.
  534 CONTINUE
      ENDIF
      DO 536 JK=IKS,NK
      DO 535 JL=1,NI
      LO=(ILAB(JL,JK).EQ.2).AND.(ILAB(JL,JK-1).EQ.2)
      if (LO) ZDTTOT(JL,JK) = ZDTTOT(JL,JK-1)
      LO=ZDTTOT(JL,JK).GT.0.
      if (.not. LO) ZDTTOT(JL,JK) = -1.
  535 CONTINUE
  536 CONTINUE
C
C
C*         5.4     FORMATION OF PRECIPITATIONS.
C
  540 CONTINUE
      DO 541 JL=1,NI
      ZRFL(JL)=0.
      ZSFL(JL)=0.
      ZCUCOV(JL)=ZEPCOV
  541 CONTINUE
C
C***
C
      DO 582 JK=IKS2,NK
C***
      DO 542 JL=1,NI
      LO=ILAB(JL,JK).EQ.2
      if (.not. LO) ZQAC(JL,JK) = 0.
      temp6 = ((1.-ZBETA(JL,JK))*ZQAC(JL,JK)/ZDTTOT(JL,JK))*ZCONS3
      ZCUCOV(JL) = AMIN1(AMAX1(ZCUCOV(JL),temp6),0.5)
      ZCUPRO = AMAX1(ZDTLOC(JL,JK)*((1.-ZBETA(JL,JK))*ZQAC(JL,JK)
     *           /ZDTTOT(JL,JK)),0.)
      ZRFLN(JL)= ZRFL(JL)+(ZCUPRO*ZDPP1(JL,JK)*ZCONS2)
      ZSFLN(JL)= ZSFL(JL)+(ZCUPRO*ZDPP1(JL,JK)*ZCONS2)
*
*
*     diagnostic d'eau liquide
*     ------------------------
*
      if( ilab(jl,jk) .eq. 2 ) then
*
      temp6 = amax1(1.E-12,amin1(temp6,0.5))
      temp4 = ((zrfln(jl)-zrfl(jl)) * (grav/zdpp1(jl,jk))) / 
     +             (temp6*wc0*wmr)
      temp1 = temp4
*
      temp5 = temp1*temp1
      temp2 = temp1*(1.0-exp(-temp5)) - temp4
      temp3 = 1.0 + (2.0*temp5 - 1.0)*exp(-temp5)
      temp1 = amax1(temp1 - ( temp2/(temp3+1.E-12) ), 0.0)
*
      temp5 = temp1*temp1
      temp2 = temp1*(1.0-exp(-temp5)) - temp4
      temp3 = 1.0 + (2.0*temp5 - 1.0)*exp(-temp5)
      temp1 = amax1(temp1 - ( temp2/(temp3+1.E-12) ), 0.0)
*
      if(ztc(jl,jk) .lt. 268.) then
        temp2 = wmr / (1.0+pc2*(268.-ztc(jl,jk))**0.5)
      else
        temp2 = wmr
      endif
*
      temp2 = temp2 / (1.0 + pc1*(0.5*(zrfln(jl)+zrfl(jl)))**0.5)
*
      cldw(jl,jk) = temp1 * temp6 * temp2
*
      endif
*
  542 CONTINUE
C
C***
      IF (JK.GT.1 .AND. EVAP ) THEN
C***
      DO 561 JL=1,NI
C
C*         5.5     EVAPORATION OF PRECIPITATIONS.
C                  WITH RECYCLING.
C
      ZSQFLN = SQRT( ZRFLN(JL)/ZCUCOV(JL) )
      TEMP1 = ZQSATE(JL,JK)
      TEMP2 = ZTP1(JL,JK)
       ZCPD(JL)=CPD*(1.+DELTA2*ZQC(JL,JK))
      LO = TEMP2.LT.TRPL .AND. ZTP1(JL,NK).LT.TRPL
      if (LO) then
         ZLDCP0 = CHLS/ZCPD(JL)
      else
         ZLDCP0 = CHLC/ZCPD(JL)
      endif
      ZNIMP = 1. + 2.*(1.+ ZLDCP0*FODQS(TEMP1,TEMP2))
     *              *ZEVAP*ZSQFLN/ZCONS2
C
      ZRFLN0 = ZRFLN(JL)
*      ZRFLN(JL) = ZCUCOV(JL)*(AMAX1(0.,ZSQFLN-ZEVAP*ZDPP1(JL,JK)
*     *           *AMAX1(0.,ZQSATE(JL,JK)-ZQC(JL,JK))/ZNIMP ))**2
       temp2=AMAX1(0.,ZQSATE(JL,JK)-ZQC(JL,JK))
        temp3=AMAX1(0.,ZSQFLN-ZEVAP*ZDPP1(JL,JK)*temp2/ZNIMP)
       ZRFLN(JL) = ZCUCOV(JL)*temp3*temp3
C
      ZQP1(JL,JK) = ZQP1(JL,JK)-(1.-ZRCYCL)*
     +               (ZRFLN(JL)-ZRFLN0)/(ZDPP1(JL,JK)*ZCONS2)
C
C*         5.6     MELTING/FREEZING OF PRECIPITATIONS.
C                  NO MORE CONSIDERED.
C
  561 CONTINUE
C***
      ENDIF
C***
C
C*         5.7     ADD CONVECTIVE TENDENCIES FOR T AND Q.
C
  570 CONTINUE
C
      DO 571 JL=1,NI
      LO = ZTC(JL,JK).LT.TRPL .AND. ZTP1(JL,NK).LT.TRPL
      if (LO) then
         ZLVDCP = CHLS/ZCPD(JL)
      else
         ZLVDCP = CHLC/ZCPD(JL)
      endif
      TE(JL,JK)=ZLVDCP*(ZRFLN(JL)-ZRFL(JL))
     +         *(GRAV/ZDPP1(JL,JK))
      QE(JL,JK)=(ZQP1(JL,JK)-QP1(JL,JK))*ZCONS5
  571 CONTINUE
C
C*         5.8     SWAP OF FLUXES, END OF VERTICAL LOOP
C
      DO 581 JL=1,NI
      ZRFL(JL)=ZRFLN(JL)
      ZSFL(JL)=ZSFLN(JL)
  581 CONTINUE
C***
  582 CONTINUE
C
C***
C*        5.9    EFFECTS OF RECYCLING,
C*               CONVECTIVE CLOUD FRACTION AND
C*               CONVECTIVE RAIN RATE.
C
  590 CONTINUE
C
      DO 591 JK=IKS2,NK
      DO 591 JL=1,NI
      TE(JL,JK) = TE(JL,JK)+MAX(TE(JL,JK),0.)*ZRCYCL
     +            *(ZSFL(JL)-ZRFL(JL))/MAX(1.E-12,ZSFL(JL))
      LO=ILAB(JL,JK).EQ.2
      if (lo) then
         cck(jl,jk) = zcucov(jl)
      else
         cck(jl,jk) = 0.
      endif
  591 CONTINUE
*
C
      DO 592 JL=1,NI
      CRR(JL)=ZRFL(JL)+(ZSFL(JL)-ZRFL(JL))*ZRCYCL
      CSR(JL)=0.0
  592 CONTINUE
C
C
C
C     ------------------------------------------------------------------
C
C*         6.     NECESSARY COMPUTATIONS IF SUBROUTINE IS BY-PASSED.
C                 --------- ------------ -- ---------- -- ----------
C
  600 CONTINUE
C***
C
C     ------------------------------------------------------------------
C
C*         7.     RETURN WORKSPACE.
C                 ------ ----------
C
  700 CONTINUE
C
*
      RETURN
      END