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

      SUBROUTINE KTRSNT3 ( CTT,CQT,ilab,CCF,QCKTL,QCKTI,DBDT,CRRL,CRRI, 1,4
     +                    QCN,TP,TM,QP,QM,GZM,TQDF,PSP,PSM,
     +                    SIGMA, TAU, KSHAL, NI, NK)
#include "impnone.cdk"
C
      INTEGER NI,NK
      REAL CTT(NI,NK),CQT(NI,NK)
      INTEGER ilab(NI,NK)
      REAL CCF(NI,NK),QCKTL(NI,NK),QCKTI(NI,NK),DBDT(NI),TQDF(NI,NK)
      REAL TP(NI,NK),TM(NI,NK),QP(NI,NK),QM(NI,NK),GZM(NI,NK)
      REAL PSP(NI),PSM(NI),SIGMA(NI,NK),CRRL(NI),CRRI(NI),QCN(NI,NK)
      REAL TAU
      REAL KSHAL(NI)
*
*Authors
*          Claude Girard and Gerard Pellerin 1995
*
*Revision
* 001      G.Pellerin (Nov 98) Added kuo65 option         
*                      and change accession closure       
* 002      C.Girard   (Dec 98) Added detrainement         
*
* 003      A-M.Leduc  (March 2002) Automatic arrays    
*
* 004      S.Belair, A-M. Leduc (nov 2002) added convective counter kshal
*                         as argument. ktrsnt--->ktrsnt2
* 005      G.Pellerin (Avril 2003) -  CVMG... Replacements
* 006      G. Pellerin (Mai 03) - Conversion IBM
*                     - calls to vexp routine (from massvp4 library)
*                     - calls to optimized routine MFOQST
*
* 005      S.Belair   (April 2003) Outputs for in-cloud water (QCKT)
*
* 006      S.Belair, A-M. Leduc (Mai 2003) calculation of ice fraction (ZFICE)
*                    and of saturation with respect to water and ice in
*                    temperature interval MAXFRZ and MINFRZ. Output 
*                    QCKTL and QCKTI.
* 007      A. Plante, C. Girard (Feb 2004) KTRSNT2 -> KTRSNT3 :
*                    Add precipitation and evaporation of precipitation under
*                    clouds. Output CRRL, CRRI and QCN.
*                    
*
*Object
*          To calculate the convective tendencies of T and Q
*          using a scheme with a "Kuo65-type closure".
*          Geleyn's method is used to obtain the cloud profiles.
*
*Arguments
*
*            - Outputs -
* CTT      convective temperature tendency
* CQT      convective specific humidity tendency
* ilab     flag array: an indication of convective activity
* CCF      estimated cumulus cloud fraction
* QCKTL    estimated cumulus cloud liquid water for radiation only
* QCKTI    estimated cumulus cloud solid water for radiation only
* DBDT     estimated averaged cloud fraction growth rate
* CRRL     Precipitation rate (liquid)
* CRRI     Precipitation rate (solid)
* QCN      estimated cumulus total cloud liquid for precipitation computation only
*          note that QCN is not equal to QCKTL + QCKTI
*            - Inputs -
* TP       temperature at (t+dt)
* TM       temperature at (t-dt)
* QP       specific humidity at (t+dt)
* QM       specific humidity at (t-dt)
* GZM      geopotential
* TQDF     tendance diffusive de couche limite (t+dt)
* PSP      surface pressure at (t+dt)
* PSM      surface pressure at (t-dt)
* SIGMA    sigma levels
* TAU      effective timestep (2*dt)
* NI       horizontal dimension
* NK       vertical dimension
*
*Notes
*          The routine is divided into 5 parts:
*           1)allocation and position for work space
*           2)preliminary computations
*           3)cloud ascent and flagging
*           4)total moisture accession calculations
*           5)cloud heating and moistening (drying) calculations
*
*           STPEVP      EVAPORATION COEFFICIENT FOR STRATIFORM PRECIPITATION
*           HDPMX       MAXIMUM PRECIPITATION CHANGE DUE TO EVAPORATION
*           PFRAC       FRACTION OF TILE THAT IS PRECIPITATING
**
      LOGICAL LO
      INTEGER IS,IKA,IKB,jk,jkm1,jl,MODP
      REAL ZTVC,rgrav3,rcpd,rcpv
      REAL ENTRM,TAUCU,DELTA2,DZETR
      REAL ZCOR,ZQSC,DETRN,ZQ0,ZT0,ZN0
      REAL ZQCD,ZK,ZDH,temp1,temp2, temp3
      REAL MAXFRZ, MINFRZ, DGZFIX
      REAL PRCP, XN, STPEVP, HKPEVP, HCIMPR, XX, YY, HDPMX, XP, XDP
      REAL PFRAC, ZPC
*
**********************************************************
*     AUTOMATIC ARRAYS
**********************************************************
*
      AUTOMATIC ( ZPP     , REAL    , (NI,NK)  )
      AUTOMATIC ( ZPT     , REAL    , (NI   )  )
      AUTOMATIC ( ZDSG    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZDP     , REAL    , (NI,NK)  )
      AUTOMATIC ( ZSDP    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZQAC    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZSQAC   , REAL    , (NI,NK)  )
      AUTOMATIC ( ZLDCP   , REAL    , (NI,NK)  )
      AUTOMATIC ( ZQSE    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZTC     , REAL    , (NI,NK)  )
      AUTOMATIC ( ZQC     , REAL    , (NI,NK)  )
      AUTOMATIC ( ZQCNT   , REAL    , (NI   )  )
      AUTOMATIC ( ZTE     , REAL    , (NI,NK)  )
      AUTOMATIC ( ZQE     , REAL    , (NI,NK)  )
      AUTOMATIC ( ZTVE    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZDQ     , REAL    , (NI,NK)  )
      AUTOMATIC ( ZSDQ    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZDT     , REAL    , (NI,NK)  )
      AUTOMATIC ( ZSDT    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZSDH    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZFICE   , REAL    , (NI,NK)  )
      AUTOMATIC ( DFMX    , REAL    , (NI,NK)  )
      AUTOMATIC ( ZCP     , REAL    , (NI   )  )
      AUTOMATIC ( ZLDCP0  , REAL    , (NI   )  )
      AUTOMATIC ( CPR     , REAL    , (NI   )  )
      AUTOMATIC ( LO1     , LOGICAL , (NI   )  )

*
*****************************************************
C
C*    PHYSICAL CONSTANTS.
C     -------- ----------
C
#include "consphy.cdk"
#include "dintern.cdk"
#include "fintern.cdk"
      rcpd = 1./CPD
      rgrav3 = 1./(GRAV*1.E3)
C     typiquement entraine selon labda=1/GH (H=2km)
      DZETR = 2.E+03
      ENTRM = 1./(DZETR*GRAV)
      TAUCU = 900.  
      DELTA2 = CPV/CPD - 1.
      DGZFIX=200.*GRAV
c      HKPEVP = 4.15E-4
      HKPEVP = 2.E-4
      STPEVP = 2. * GRAV * HKPEVP
C
C     ------------------------------------------------------------------
C
C*         1.     ALLOCATION AND POSITION FOR WORK SPACE.
C                 ---------- --- -------- --- ---- ------
C

C***
C
C     METHOD.
C     -------
C
C          IN (3) A NEARLY ADIABATIC ASCENT IS ATTEMPTED FOR A CLOUD
C     PARCEL STARTING FROM THE LOWEST MODEL LAYER. THIS CLOUD ASCENT
C     IS COMPUTED IN TERMS OF TEMPERATURE AND SPECIFIC HUMIDITY.
C     ENTRAINMENT IS SIMULATED VIA AN ENTRAINMENT PARAMETER.
C     THE LAYERS ARE FLAGGED ACCORDING TO THE FOLLOWING CODE:
C     0 = STABLE OR INACTIVE LAYER,
C     1 = PART OF THE WELL MIXED BOUNDARY LAYER OR DRY UNSTABLE LAYER,
C     2 = MOIST UNSTABLE OR ACTIVE OR CLOUD LAYER.
C     THE 1-FLAGS ARE RESET TO 0-FLAGS FOR THE NEXT SECTION.
C          IN (4) THE INTEGRATED MOIST AND DRY ENTHALPY ACCESSIONS
C     FOR EACH CLOUD LAYER ARE STORED INTO ALL THE CORRESPONDING
C     LAYERS IF THE FIRST IS POSITIVE WHILE THE SECOND IS NEGATIVE,
C     OTHERWISE, THE 2-FLAGS ARE ALSO RESET TO 0-FLAGS.
C          IN (5) THE ACTUAL MODIFICATIONS OF TEMPERATURE AND SPECIFIC
C     HUMIDITY ARE COMPUTED. A CLOUD-COVER VALUE IS ESTIMATED BY
C     COMPARING THE TIME AT WHICH THE ENVIRONMENT WOULD REACH
C     EQUILIBRIUM WITH THE CLOUD TO A PRESCRIBED CLOUD LIFE-TIME.
C
C     ------------------------------------------------------------------
C
C*         2.     PRELIMINARY COMPUTATIONS.
C                 ----------- -------------
*
*
*          2.0     FRACTION OF TOTAL CONDENSATE THAT IS SOLID (ZFICE)
*
*                              Calculation of ice fraction with linear
*                              variation between maxfrz and minfrz.
*                              DFMX is the value of the derivative w/r to T. 
*                              Saturation is w/r to liquid for T > MAXFRZ and w/r 
*                              to solid for T < MINFRZ and mixed phased in between.
*
      MAXFRZ = 268.16
      MINFRZ = 258.16
*
*
      ZFICE(:,:) =  ( MAXFRZ - TP(:,:)  ) / ( MAXFRZ - MINFRZ )
      ZFICE(:,:) = MIN( MAX( ZFICE(:,:) , 0. ) , 1. )
*
      WHERE( TP(:,:) < MINFRZ .OR. TP(:,:) > MAXFRZ )
        DFMX(:,:) = 0.
      ELSEWHERE
        DFMX(:,:) = - 1. / ( MAXFRZ - MINFRZ )
      END WHERE
*
*
C
C*         2.1     ENVIRONMENTAL PROFILES AND PARAMETERS,
C*                 DRY AND MOIST ENTHALPY ACCESSIONS (divided by cp)
C*                 AND INITIALIZATIONS.
C
      DO jl=1,NI
         ZDSG(jl,1)=0.5*(SIGMA(jl,2)-SIGMA(jl,1))
         ZDSG(jl,NK)=0.5*(1.-SIGMA(jl,NK-1))+0.5*(1.-SIGMA(jl,NK))
         DBDT(jl) = 0.
         ZLDCP0(jl) =  ( CHLC + ZFICE(jl,NK)*CHLF ) * rCPD
         ZSDT(jl,NK)=0.
         CRRI(jl)=0.
         CRRL(jl)=0.
      END DO
C
      DO jk=2,NK-1
         DO jl=1,NI
            ZDSG(jl,jk)=0.5*(SIGMA(jl,jk+1)-SIGMA(jl,jk-1))
         END DO
      END DO
C
      DO jk=1,NK
         DO jl=1,NI
            ZPP(jl,jk)=SIGMA(jl,jk)*PSP(jl)
            ZDP(jl,jk)=ZDSG(jl,jk)*PSP(jl)
            ZTE(jl,jk)=TP(jl,jk)
            ZQSE(jl,jk)=FQSMX( ZTE(jl,jk), ZPP(jl,jk), ZFICE(jl,jk) )
            ZQE(jl,jk)=amin1(ZQSE(jl,jk),QM(jl,jk))
            ZTVE(jl,jk) = FOTVT( ZTE(jl,jk), ZQE(jl,jk) )
            ZLDCP(jl,jk) = ( CHLC + ZFICE(jl,jk)*CHLF )
     +               / ( CPD*(1.+DELTA2*ZQE(jl,jk)) )
C
            ZQAC(jl,jk)=TQDF(jl,jk)*ZDP(jl,jk)
C
            if ( ilab(jl,jk) .ge. 1 ) ZQAC(jl,jk)=-1.
            ilab(jl,jk) = 0
            CTT(jl,jk) = 0.0
            CQT(jl,jk) = 0.0
            CCF(jl,jk) = 0.0
            QCN(jl,jk) = 0.0
         END DO
      END DO
C
C*         2.2     SPECIFY TC AND QC AT THE LOWEST LAYER TO START THE
C*                 CLOUD ASCENT. CHECK FOR POSITIVE ACCESSION
C*                 BETWEEN SURFACE AND CLOUD BASE.
C*                 ZQC=0 INDICATES STABLE CONDITIONS.
C
      DO jl=1,NI
         CPR(jl) = 0.
         ZTC(jl,NK)=ZTE(jl,NK)
         ZQC(jl,NK)=0.
          LO=ZQAC(jl,NK).GT.0.
         IF (LO) THEN
            ZQC(jl,NK)=ZQE(jl,NK)
            ilab(jl,NK) = 1
         ENDIF
      END DO
C     
C     ------------------------------------------------------------------
C
C*         3.     CLOUD ASCENT AND FLAGGING.
C                 ----- ------ --- ---------
C
C*         3.1     CALCULATE TC AND QC AT UPPER LEVELS BY DRY ADIABATIC
C*                 LIFTING FOLLOWED BY LATENT HEAT RELEASE WHEN REQUIRED.
C*                 CONDENSATION CALCULATIONS ARE DONE WITH TWO ITERATIONS.
C***
      DO jk=NK-1,1,-1
C***
         DO jl=1,NI
            ZCP(jl)=CPD*(1.+DELTA2*ZQC(jl,jk+1))
            ZTC(jl,jk)=ZTC(jl,jk+1)+(GZM(jl,jk+1)-GZM(jl,jk))*
     *         (1./ZCP(jl)+ENTRM*MAX(0.,ZTC(jl,jk+1)-ZTE(jl,jk+1)))
            ZQC(jl,jk)=ZQC(jl,jk+1)+(GZM(jl,jk+1)-GZM(jl,jk))*
     *         (            ENTRM*MAX(0.,ZQC(jl,jk+1)-ZQE(jl,jk+1)))
            ZTVC = FOTVT( ZTC(jl,jk), ZQC(jl,jk) )
               LO= ZTVC.GT.ZTVE(jl,jk) .AND. ZQC(jl,jk).NE.0.
            IF (LO) ilab(jl,jk) = 1
         END DO
C
         DO jl=1,NI
             temp1 = ZTC(jl,jk)
             temp2 = ZPP(jl,jk)
            ZQSC=FQSMX( temp1, temp2, ZFICE(jl,jk) )
            temp3 = FDLESMX( temp1, ZFICE(jl,jk), DFMX(jl,jk) )
            ZCOR=ZLDCP(jl,jk)*FDQSMX( ZQSC, temp3 )
            ZQCD=AMAX1(0.,(ZQC(jl,jk)-ZQSC)/(1.+ZCOR))
            QCKTL(jl,jk) = ( 1.-ZFICE(jl,jk) ) * ZQCD
            QCKTI(jl,jk) = ZFICE(jl,jk) * ZQCD
            ZQC(jl,jk)=ZQC(jl,jk)-ZQCD
            ZTC(jl,jk)=ZTC(jl,jk)+ZQCD*ZLDCP(jl,jk)
               LO1(jl)=ZQCD.NE.0.
         END DO
C
         LO=.FALSE.
         DO jl=1,NI
            LO=LO.OR.LO1(jl)
         END DO
C
         IF (LO) THEN
            DO jl=1,NI
                temp1 = ZTC(jl,jk)
                temp2 = ZPP(jl,jk)
               ZQSC=FQSMX( temp1, temp2, ZFICE(jl,jk) )
               temp3 = FDLESMX( temp1, ZFICE(jl,jk), DFMX(jl,jk) )
               ZCOR=ZLDCP(jl,jk)*FDQSMX( ZQSC, temp3 )
               ZQCD=(ZQC(jl,jk)-ZQSC)/(1.+ZCOR)
               if (.not. LO1(jl)) ZQCD = 0.
               QCKTL(jl,jk) = ( 1.-ZFICE(jl,jk) ) * ZQCD   + QCKTL(jl,jk)
               QCKTI(jl,jk) = ZFICE(jl,jk) * ZQCD   +  QCKTI(jl,jk)
               ZQC(jl,jk)=ZQC(jl,jk)-ZQCD
               ZTC(jl,jk)=ZTC(jl,jk)+ZQCD*ZLDCP(jl,jk)
            END DO
         ENDIF
C
         DO jl=1,NI
             temp1 = ZTC(jl,jk)
             temp2 = ZQC(jl,jk)
            ZTVC = FOTVT( temp1, temp2 )
               LO= ZTVC.GT.ZTVE(jl,jk)  .AND. LO1(jl)
            IF (LO) ilab(jl,jk) = 2
               LO1(jl)=ilab(jl,jk).EQ.0
            if (LO1(jl)) ZTC(jl,jk) = ZTE(jl,jk)
            if (LO1(jl)) ZQC(jl,jk) = 0.
         END DO
C
C*         3.2     IF NOT AT THE TOP CHECK FOR NEW LIFTING LEVEL, I.E.
C*                 MOISTURE ACCESSION IN A STABLE LAYER.
C***
         IF (jk.NE.1) THEN
            DO jl=1,NI
                  LO=LO1(jl).AND.(ZQAC(jl,jk).GT.0.)
               if (LO)  ZTC(jl,jk) = ZTE(jl,jk)
               if (LO) ZQC(jl,jk) = ZQE(jl,jk)
            END DO
         ENDIF
C***
      END DO
C***
C*         3.3     ilab=0 UNLESS ilab=2
C*                 IKA INDICATES THE HIGHEST TOP OF A CLOUD
C*                 (TO AVOID UNNECESSARY COMPUTATIONS LATER).
C
      IKA=NK+1
C
      DO jk=1,NK
C
         DO jl=1,NI
               LO=(ilab(jl,jk).EQ.1)
            IF (LO) ilab(jl,jk) = 0
         END DO
C
         IF (IKA.EQ.NK+1) THEN
            IS=0
            DO jl=1,NI
               IS=IS+ilab(jl,jk)
            END DO
            IF (IS.NE.0) IKA=jk
         ENDIF
C
      END DO

C***
      IF (IKA.EQ.NK+1) GO TO 600
C***
C     ------------------------------------------------------------------
C
C*         4.     TOTAL MOISTURE ACCESSION
C                 ----- ------ ---------
C*                 TOTAL MOISTURE ACCESSION BE > 0
C*                 IKB IS AN UPDATE OF IKA.
C
      DO jl=1,NI
         ZSQAC(jl,NK) = 0.0
         ZSDP(jl,NK) = 0.0
      END DO
C
      DO jk=NK-1,IKA,-1
         DO jl=1,NI
            LO=ilab(jl,jk).eq.2
            if (LO) then
               ZSQAC(jl,jk) = ZSQAC(jl,jk+1)+ZQAC(jl,jk)
               ZSDP(jl,jk) = ZSDP(jl,jk+1)+ZDP(jl,jk)
            else
               ZSQAC(jl,jk) = 0.
               ZSDP(jl,jk) = 0.
            endif
         END DO
      END DO
C
      IKB=NK+1
C
      DO jk=IKA,NK-1
      jkm1=max0(jk-1,1)
C
         DO jl=1,NI
            LO=(ilab(jl,jk).EQ.2).AND.(ilab(jl,jkm1).EQ.2)
            if (LO) then
               ZSQAC(jl,jk) = ZSQAC(jl,jkm1)
               ZSDP(jl,jk) = ZSDP(jl,jkm1)
            endif
               LO = ZSQAC(jl,jk).gt.0. .and. ZSDP(jl,jk).gt.0.
            IF (.not.LO) ilab(jl,jk) = 0
         END DO
C
         IF (IKB.EQ.NK+1) THEN
            IS=0
            DO jl=1,NI
               IS=IS+ilab(jl,jk)
            END DO
            IF (IS.NE.0) IKB=jk
         ENDIF
C
      END DO
C***  
      IF (IKB.EQ.NK+1) GO TO 600      
*
C     Estimation of total cloud water content for precipitation.
C     Method : from the lowest level in the cloud we rise a particule
C              for the constant height DGZFIX and compute the condensation
C              like in 3.1. This becomes the total cloud water which is
C              then supposed constant through the cloud. Therefore there is
C              not dependency on the modele level distribution. The value is
C              then adjusted if needed in order to avoid negative
C              precipitation. An optinal linear profile is also available.

      DO jk=NK-1,IKB,-1
         jkm1=max0(jk-1,1)
         DO jl=1,NI
            LO=ilab(jl,jk+1).eq.0.and.ilab(jl,jk).eq.2            
            if(LO)then
c              First cloud level.
c              Compute tentative total cloud water.
               ZN0=0.
               ZQ0=FQSMX(ZTC(jl,jk),ZPP(jl,jk), ZFICE(jl,jk) )
               ZT0=ZTC(jl,jk)-DGZFIX/CPD
c               print*,ZT0+ZLDCP0(jl)*ZQ0,ZQ0+ZN0

               temp2=exp(alog(ZPP(jl,jk))-DGZFIX/
     $              (RGASD*.5*(ZTC(jl,jk)+ZT0)))
               ZQSC=FQSMX( ZT0, temp2, ZFICE(jl,jk) )
               temp3 = FDLESMX( ZT0, ZFICE(jl,jk), DFMX(jl,jk) )
               ZCOR=ZLDCP(jl,jk)*FDQSMX( ZQSC, temp3 )
               ZQCD=(ZQ0-ZQSC)/(1.+ZCOR)
               ZT0=ZT0+ZQCD*ZLDCP0(jl)
               ZQ0=ZQ0-ZQCD
               ZN0=ZN0+ZQCD
*                  
C              Second iteration (out of loop for vectorization)
               temp2=exp(alog(ZPP(jl,jk))-DGZFIX/
     $              (RGASD*.5*(ZTC(jl,jk)+ZT0)))
               ZQSC=FQSMX( ZT0, temp2, ZFICE(jl,jk) )
               temp3 = FDLESMX( ZT0, ZFICE(jl,jk), DFMX(jl,jk) )
               ZCOR=ZLDCP(jl,jk)*FDQSMX( ZQSC, temp3 )
               ZQCD=(ZQ0-ZQSC)/(1.+ZCOR)
               ZT0=ZT0+ZQCD*ZLDCP0(jl)
               ZQ0=ZQ0-ZQCD
               ZN0=ZN0+ZQCD
c               print*,ZT0+ZLDCP0(jl)*ZQ0,ZQ0+ZN0
c               print*,'T,P,QS,QC=',ZT0-tcdk,temp2*.01,ZQ0,ZN0
               QCN(jl,jk)=ZN0
            else
               QCN(jl,jk)=0.
            endif
            LO=ilab(jl,jk+1).eq.2.and.ilab(jl,jk).eq.2
            if(LO)then
c              In the cloud but not the first level.
               QCN(jl,jk)=QCN(jl,jk+1)
            endif
         ENDDO
      ENDDO

C     Check if tentative total cloud water is too large.
      DO jk=NK-1,IKB,-1
         jkm1=max0(jk-1,1)         
         DO jl=1,NI
            LO=ilab(jl,jk).EQ.2
            IF(LO)THEN
               temp1 = ZTC(jl,jk)
               temp2 = ZQC(jl,jk)
               ZTVC = FOTVT( temp1, temp2 )
               ZSDT(jl,jk)=ZSDT(jl,jk+1)+(ZTVC-ZTVE(jl,jk))*ZDP(jl,jk)
            ELSE
               ZSDT(jl,jk)=0.
            ENDIF
            LO=ilab(jl,jk).eq.2.and.ilab(jl,jkm1).eq.0
            IF(LO)THEN
c              Cloud top, time to check
               QCN(jl,jk)=MIN(QCN(jl,jk),ZSDT(jl,jk)/
     $              (ZSDP(jl,jk)*ZLDCP0(jl)))
            ENDIF
         ENDDO
      ENDDO
C     Update cloud water
c      if(.false.)then
c        Constant profile
c         DO jk=IKB,NK-1
c            DO jl=1,NI
c               LO=ilab(jl,jk).eq.2.and.ilab(jl,jk-1).eq.2
c               IF(LO)THEN
c                 In cloud but not cloud top.
c                  QCN(jl,jk)=QCN(jl,jk-1)
c               ENDIF
c           ENDDO
c         ENDDO
c      else
c        Linear profile
         DO jk=IKB,NK-1
            jkm1=max0(jk-1,1)
            DO jl=1,NI
               LO=ilab(jl,jk).eq.2.and.ilab(jl,jkm1).eq.0
               IF(LO)THEN
c                 Top of cloud
                  ZPT(jl)=.5*(ZPP(jl,jkm1)+ZPP(jl,jk))
                  ZQCNT(jl)=2.*QCN(jl,jk)
               ENDIF
               LO=ilab(jl,jk).eq.2
               IF(LO)THEN
c                 In cloud
                  ZPC=.25*(ZPP(jl,jkm1)+2.*ZPP(jl,jk)+ZPP(jl,jk+1))
                  QCN(jl,jk)=ZQCNT(jl)/ZSDP(jl,jk)*
     $                 (ZSDP(jl,jk)+ZPT(jl)-ZPC)
               ENDIF
            ENDDO
         ENDDO
c      endif
C***  

C***
C     ------------------------------------------------------------------
C
C*         5.     HEATING AND MOISTENING
C                 ----------------------
C
C*         5.1     COMPUTE THE TOTAL CLOUD-ENVIRONMENT ENTHALPY
C*                 DIFFERENCE IN CLOUD LAYERS.
C
      DO jl=1,NI
         ZSDH(jl,NK)=0.
         ZSDQ(jl,NK)=0.
      END DO
C
      DO jk=NK-1,IKB,-1
         DO jl=1,NI
             temp1 = ZTC(jl,jk)
             temp2 = ZQC(jl,jk)
            ZTVC = FOTVT( temp1, temp2 )
            ZDQ(jl,jk)=(ZQSE(jl,jk)+QCN(jl,jk)-ZQE(jl,jk))*ZDP(jl,jk)
            ZDT(jl,jk)=(ZTVC-ZTVE(jl,jk)-ZLDCP0(jl)*QCN(jl,jk))
     $           *ZDP(jl,jk)
c            ZDQ(jl,jk)=(ZQSE(jl,jk)-ZQE(jl,jk))*ZDP(jl,jk)
c            ZDT(jl,jk)=(ZTVC-ZTVE(jl,jk))*ZDP(jl,jk)
            ZDH = ZDT(jl,jk)+ZLDCP0(jl)*ZDQ(jl,jk)
               LO=ilab(jl,jk).EQ.2
            if (LO) then
               ZSDH(jl,jk) = ZSDH(jl,jk+1)+ZDH
               ZSDQ(jl,jk) = ZSDQ(jl,jk+1)+ZDQ(jl,jk)
            else
               ZSDH(jl,jk) = 0.
               ZSDQ(jl,jk) = 0.
            endif
         END DO
      END DO
C
      DO jk=IKB+1,NK-1
         DO jl=1,NI
               LO=(ilab(jl,jk).EQ.2).AND.(ilab(jl,jk-1).EQ.2)
            if (LO) then
               ZSDH(jl,jk) = ZSDH(jl,jk-1)
               ZSDQ(jl,jk) = ZSDQ(jl,jk-1)
            endif
         END DO
      END DO
C
C*         5.2     COMPUTE CONVECTIVE HEATING AND MOISTENING.
C*                 ESTIMATE CONVECTIVE CLOUD FRACTION.
C
      DO jk=IKB,NK-1
         DO jl=1,NI
C
            LO=ilab(jl,jk).eq.0
            if (LO) then
               ZQAC(jl,jk) = 0.
               ZSQAC(jl,jk) = 0.
            endif

               LO=ZSDH(jl,jk).GT.0.
            if (.not. LO) ZSDH(jl,jk) = -1.
               LO=ZSDQ(jl,jk).GT.0. 
            if (.not. LO) ZSDQ(jl,jk) = -1.
C
            ZK = ZLDCP0(jl)*ZSQAC(jl,jk)/ZSDH(jl,jk) 
C
            CQT(jl,jk) = (ZK*ZDQ(jl,jk)-ZQAC(jl,jk))/ZDP(jl,jk)
            CTT(jl,jk) = (ZK*ZDT(jl,jk)            )/ZDP(jl,jk) 
C*  ajouter du detrainement
            DETRN=0.0
            CQT(jl,jk) = CQT(jl,jk)+DETRN*CTT(jl,jk)/ZLDCP0(jl)
            CTT(jl,jk) = CTT(jl,jk)-DETRN*CTT(jl,jk)
C
            CPR(jl) = CPR(jl) + CTT(jl,jk)/ZLDCP0(jl)*ZDP(jl,jk)
C
            DBDT(jl) = AMAX1(DBDT(jl),ZK)
C
c           Precipitation computation
            CRRL(jl)=CRRL(jl)+CTT(jl,jk)/(GRAV*ZLDCP0(jl))*ZDP(jl,jk)
c           
C           Evaporation of precipitation (See Appendix 5 in Scientific
c           Description of RPN Physics Library -Version 3.6- )
c            print*,CRRL(jl)
            LO=ilab(jl,jk).eq.0.and.CRRL(jl).gt.0..and.DBDT(jl).ne.0.
            if(LO)then
c              Fraction of tile that is precipitating.
               PFRAC=DBDT(jl)*TAUCU
c               print*,'Fraction',PFRAC
c              Precipitation flux in that fraction.
               PRCP=CRRL(jl)/PFRAC
c              Compute (1+beta).
               HCIMPR = FDLESMX(ZTE(jl,jk),ZFICE(jl,jk),DFMX(jl,jk))
               HCIMPR = 1.+ZLDCP(jl,jk)*HCIMPR
c              Compute N (A5.2).
               XN = STPEVP*TAU*HCIMPR
c              Avoid division by zero.
               XX = MAX(PRCP,1.E-16)
               XX = SQRT(XX)
c              Compute Delta Pmax (A5.4)
               HDPMX = 2.*HKPEVP*
     $              MAX(0.,ZQSE(jl,jk)-ZQE(jl,jk))*ZDP(jl,jk)/XN
c              Explicit estimate.
               YY = 0.5*XN*HDPMX/XX
c              Implicit correction.
               YY = YY / ( 1. + 0.5*XN*XX)
c              YY=1 => complete evaporation.
               YY = MIN(YY ,1.)
               XP = PRCP*( 1.-YY)**2
c              Avoid over saturartion.
               XDP = -MIN(PRCP-XP,HDPMX)*PFRAC               
c               temp1=CRRL(jl)
c               temp2=CTT(jl,jk)
c               temp3=CQT(jl,jk)
c              Update precip. flux temp. and specific hum. trend du to evaporation.
               CRRL(jl)=CRRL(jl)+XDP
               CTT(jl,jk) = CTT(jl,jk)+XDP*GRAV*ZLDCP0(jl)/ZDP(jl,jk)
               CQT(jl,jk) = CQT(jl,jk)-XDP*GRAV/ZDP(jl,jk)
c               print*,'DP,DT,DQ=',
c     $              CRRL(jl)-temp1,
c     $              CTT(jl,jk)-temp2,CQT(jl,jk)-temp3
            endif
         END DO
      END DO
C
      DO jl=1,NI
         CRRL(jl)=max(0.,CRRL(jl))
         CRRI(jl)=ZFICE(jl,NK)*CRRL(jl)
         CRRL(jl)=max(0.,CRRL(jl)-CRRI(jl))
         CPR(jl) = max( 1.E-12, CPR(jl)*rGRAV3 )
      END DO
         call vslog (cpr,cpr,ni)
      DO jl=1,NI
         CPR(jl) = 2.5 + .125 * CPR(jl)
         CPR(jl) = min( max( DBDT(jl) * TAUCU / ( 1. + DBDT(jl)*TAUCU ) ,
     1                                         CPR(jl) ) , 0.8 )
      END DO
C
      DO jk=IKB,NK-1
         DO jl=1,NI
             LO=ilab(jl,jk).ne.2
             if (LO) then
                CCF(jl,jk) = 0.
             else
                CCF(jl,jk) = CPR(jl)
             endif
!!        CCF(jl,jk) = CCF(jl,jk)* min((SIGMA(jl,jk)/0.8)**2, 1.0 )
             temp1=(SIGMA(jl,jk)*1.25)*(SIGMA(jl,jk)*1.25)
             CCF(jl,jk) = CCF(jl,jk)* min(temp1, 1.0 )   
         END DO
      END DO
*
*
*       consistency check between the cloud fraction and cloud water
*
      DO jk=1,NK
      DO jl=1,NI
        lo=CCF(jl,jk).GE.0.01
        if ( .not. lo) QCKTL(jl,jk) = 0.
        if ( .not. lo) QCKTI(jl,jk) = 0.
      END DO
      END DO
*
*
*       tendency check

          DO jk=1,NK
             DO jl=1,NI
               if (cqt(jl,jk).gt.1.E-10) KSHAL(jl)=1. 
             END DO
          END DO

C***
C     ------------------------------------------------------------------
C
C*         6.     RETURN WORKSPACE.
C                 ------ ----------
  600 CONTINUE
C
*
      RETURN
      END