SUBROUTINE ACCVIMPGY ( KIDIA,KFDIA,KLON,KTDIA,KLEV,&
 !-----------------------------------------------------------------------
 ! - INPUT  2D .
 & PALPH,PAPHIF,PAPRS,PAPRSF,PCP,&
 & PDELP,PLH,PLNPR,PQ,PQI,PQL,PQLIS,PQSAT,PQW,&
 & PR,PRDELP,PT,PTW,PU,PV,&
 ! - INPUT  1D .
 & PCPS,PGM,PSTAB,PTS,&
 ! - OUTPUT 2D .
 & PDIFCQ,PDIFCQL,PDIFCQN,PDIFCS,PFCCQL,PFCCQN,&
 & PFPFPCL,PFPFPCN,PFPEVPCL,PFPEVPCN,&
 & PFHMLTS,PFHEVPP,PFPEVPP,&
 & PFPLCL,PFPLCN,PNEBC,PQLIC,PSTRCU,PSTRCV,&
 & KCIS,KNLAB,&
 ! - OUTPUT 1D .
 & KNND,&
 ! - INPUT/OUTPUT 2D .
 & PVVERDM,&
 ! - LOCK ARGUMENTS .
 & CDLOCK)  

!**** *ACCVIMPGY * - SCHEMA DE CONVECTION PROFONDE A FLUX DE MASSE.

!     Sujet.
!     ------
!     - CALCUL DES FLUX DE CONDENSATION ET DE TRANSPORT CONVECTIFS
!       PAR UN SCHEMA DE CONVECTION PROFONDE A FLUX DE MASSE.

!     - MASS-FLUX DEEP CONVECTION SCHEME, COMPUTING CONVECTIVE
!       CONDENSATION AND TRANSPORT FLUXES.

!**   Interface.
!     ----------
!        *CALL* *ACCVIMPGY*

!-----------------------------------------------------------------------
! WARNING: THE ENGLISH VERSION OF VARIABLES' NAMES IS TO BE READ IN THE
!          "APLPAR" CODE.
!-----------------------------------------------------------------------

! -   ARGUMENTS D'ENTREE.
!     -------------------

! - NOM DES PARAMETRES DE DIMENSIONNEMENT DE LA PHYSIQUE.

! KIDIA      : INDICE DE DEPART DES BOUCLES VECTORISEES SUR L'HORIZONT..
! KFDIA      : INDICE DE FIN DES BOUCLES VECTORISEES SUR L'HORIZONTALE.
! KLON       : DIMENSION HORIZONTALE DES TABLEAUX.
! KTDIA      : INDICE DE DEPART DES BOUCLES VERTICALES (1 EN GENERAL).
! KLEV       : DIMENSION VERTICALE DES TABLEAUX "FULL LEVEL".

! - NOM DES VARIABLES DE LA PHYSIQUE (PAR ORDRE ALPHABETIQUE DANS CHAQUE
!   CATEGORIE).

! - 2D (0:KLEV) .

! PAPRS      : PRESSION AUX DEMI-NIVEAUX.

! - 2D (1:KLEV) .

! PALPH      : LOG(PAPRS(JLEV)/PAPRSF(JLEV)) (POUR L'HYDROSTATIQUE).
! PAPHIF     : GEOPOTENTIEL AUX NIVEAUX DES COUCHES.
! PAPRSF     : PRESSION AUX NIVEAUX DES COUCHES.
! PCP        : CHALEUR MASSIQUE A PRESSION CONSTANTE DE L'AIR.
! PDELP      : EPAISSEUR EN PRESSION DE LA COUCHE.
! PLH        : CHALEUR LATENTE A LA TEMPERATURE DE L'AIR.
! PLNPR      : LOG(PAPRS(JLEV)/PAPRS(JLEV-1)) (POUR L'HYDROSTATIQUE).
! PQ         : HUMIDITE SPECIFIQUE DE LA VAPEUR D'EAU.
! PQI        : EAU SOLIDE.
! PQL        : EAU LIQUIDE.
! PQLIS      : EAU LIQUIDE OU SOLIDE STRATIFORME.
! PQSAT      : HUMIDITE SPECIFIQUE DE SATURATION.
! PQW        : HUMIDITE SPECIFIQUE DU THERMOMETRE MOUILLE.
! PR         : CONSTANTE DES GAZ POUR L'AIR.
! PRDELP     : INVERSE DE L'EPAISSEUR EN PRESSION DE LA COUCHE.
! PT         : TEMPERATURE.
! PTW        : TEMPERATURE DU THERMOMETRE MOUILLE.
! PU         : COMPOSANTE EN X DU VENT.
! PV         : COMPOSANTE EN Y DU VENT.

! - 1D (PROGNOSTIQUE) .

! PTS        : TEMPERATURE DE SURFACE.

! - 1D (DIAGNOSTIQUE) .

! PCPS       : CHALEUR MASSIQUE A PRESSION CONSTANTE DE L'AIR AU SOL.
! PGM        : FACTEUR D'ECHELLE.

!-----------------------------------------------------------------------

! -   ARGUMENTS DE SORTIE.
!     --------------------

! - NOM DES VARIABLES DE LA PHYSIQUE (PAR ORDRE ALPHABETIQUE DANS CHAQUE
!   CATEGORIE).

! - 2D (0:KLEV) .

! PDIFCQ     : FLUX CONVECTIF D'HUMIDITE SPECIFIQUE (HORS PLUIE/NEIGE).
! PDIFCQL    : FLUX CONVECTIF D'EAU LIQUIDE
! PDIFCQN    : FLUX CONVECTIF D'EAU SOLIDE
! PDIFCS     : FLUX CONVECTIF D'ENTHALPIE (HORS PLUIE/NEIGE).
! PFCCQL     : FLUX CONVECTIF DE CONDENSATION SOUS FORME LIQUIDE.
! PFCCQN     : FLUX CONVECTIF DE CONDENSATION SOUS FORME NEIGE.
! PFPFPCL    : FLUX DE PRECIPITATION CONVECTIVE: TERME DE GENERATION/FORMATION.
! PFPFPCN    : FLUX DE PRECIPITATION CONVECTIVE: TERME DE GENERATION/FORMATION.
! PFPEVPCL   : FLUX DE PRECIPITATIONS DU A L'EVAPORATION CONVECTIVE.
! PFPEVPCN   : FLUX DE PRECIPITATIONS DU A LA SUBLIMATION CONVECTIVE.
! PFHMLTS    : FLUX DE CHALEUR DU A LA FONTE/GEL.
! PFHEVPP    : FLUX DE CHALEUR DU A L'EVAPORATION DES PRECIPITATIONS.
! PFPEVPP    : EVAPORATION DES PRECIPITATIONS.
! PFPLCL     : PRECIPITATIONS CONVECTIVES SOUS FORME LIQUIDE.
! PFPLCN     : PRECIPITATIONS CONVECTIVES SOUS FORME NEIGE.
! PNEBC      : NEBULOSITE CONVECTIVE.
! PQLIC      : EAU LIQUIDE CONVECTIVE.
! PSTRCU     : FLUX CONVECTIF DE QUANTITE DE MOUVEMENT "U".
! PSTRCV     : FLUX CONVECTIF DE QUANTITE DE MOUVEMENT "V".

! - 2D (1:KLEV) .

! KCIS       : INDICE D'INSTABILITE SECHE (INSTABILITE SI EGAL A ZERO).
! KNLAB      : INDICE D'ACTIVITE CONVECTIVE (NUAGE SI EGAL A UN).
! PQLIC      : EAU LIQUIDE CONVECTIVE.

! - 1D (DIAGNOSTIQUE) .

! KNND       : ZERO SI LA SOLUTION EST NON-PHYSIQUE, UN SINON.

!-----------------------------------------------------------------------

! -   ARGUMENTS EN ENTREE/SORTIE.
!     ---------------------------

! - 2D (0:KLEV) .

! PVVERDM    : VITESSE VERT. DE LA COLONNE CONVECTIVE A T-DT.

!-----------------------------------------------------------------------

! -   ARGUMENTS IMPLICITES.
!     ---------------------

! COMMON/YOMDIM /
! COMMON/YOMGEM /
! COMMON/YOMPHY /
! COMMON/YOMCST /
! COMMON/YOMPHY0/
! COMMON/YOMPHY2/
! COMMON/FCTTRM /

!-----------------------------------------------------------------------

!     Externes.
!     ---------

!     *ACCTCPNF*

!     Methode.
!     --------
!        SCHEMA A FLUX DE MASSE (J.F. GUEREMY)

!        MASS-FLUX SCHEME (J.F. GUEREMY)

!     Auteur.
!     -------
!        02-09, J.F. GUEREMY (à partir de accvimp codé par J.F. GELEYN)

!     Modifications.
!     --------------
!        02-11, Flux convectifs d'eau liquide et solide - J.F. GUEREMY
!        02-11, Courants descendants - J.F. GUEREMY
!        04-10, Flux d'evap et de fonte/gel des precip - J.F. GUEREMY
!        04-11, Modification de l'appel des courants descendants
!               et nettoyage - J.F. GUEREMY
!        05-01, limitation entre ZEPS1 et 1-ZEPS1 pour PNEBC - P. Marquet
!        05-02, Thetae_bolton - J.F. GUEREMY
!        05-03, Modification variables de detrainement dans couche sèche
!               calcul du temps de relax de CAPE dans ce SP
!               limitation de PNEBC et nettoyage - J.F. GUEREMY
!        05-06, Parametres du schema dans NAMPHY0 - J.F. GUEREMY, A. ALIAS
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
!        05-09, Prise en compte de la convection seche - J.F. GUEREMY
!        06-01, Modif variables de detrainement dans la couche
!               seche et KCIS=1 - J.F. GUEREMY
!        06-02, suppression HCMIN, pas de limitation sur w downdraft,
!               gradient vertical s (q) positif (négatif) dans subs comp
!        06-03, KDN renamed to RKDN - A.Alias
!        06-05, Nettoyage - J.F. GUEREMY
!        06-07, Facteur d'evap des precip FEVAPC - J.F. GUEREMY
!        07-02, R. BROZKOVA: cleaning the delta_m option

!-----------------------------------------------------------------------

USE PARKIND1  ,ONLY : JPIM     ,JPRB
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK

USE YOMDIM   , ONLY : NDLON
USE YOMGEM   , ONLY : TEQC
USE YOMPHY   , ONLY : NBITER   ,NPHYREP  ,LNEIGE   ,LCONDWT  ,&
 & LCVDD
USE YOMCST   , ONLY : RG       ,RD       ,RV       ,RCPD     ,&
 & RCPV     ,RETV     ,RCW      ,RCS      ,RLVTT    ,&
 & RLSTT    ,RTT      ,RALPW    ,RBETW    ,RGAMW    ,&
 & RALPS    ,RBETS    ,RGAMS    ,RALPD    ,RBETD    ,&
 & RGAMD    ,RLVZER   ,RLSZER   ,RPI      ,&
 & RDT  
USE YOMPHY0  , ONLY : ECMNP   ,SCO      ,TENTR    ,TENTRX   ,&
 & TUDGP    ,GCVADS  ,EVAP    ,FONT     ,REVGSL   ,RCVEVAP   ,&
 & TCA      ,TCW     ,ALFX    ,TCTC     ,TVFC     ,&
 & GAMAP1   ,RKDN    ,VVN     ,VVX      ,FENTRT   ,&
 & FQLIC    ,FNEBC   ,FEVAPC 
USE YOMPHY2  , ONLY : TSPHY

IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KIDIA
INTEGER(KIND=JPIM),INTENT(IN)    :: KFDIA
INTEGER(KIND=JPIM),INTENT(IN)    :: KLON
INTEGER(KIND=JPIM),INTENT(IN)    :: KTDIA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KLEV
REAL(KIND=JPRB)   ,INTENT(IN)    :: PALPH(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPHIF(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPRS(KLON,0:KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPRSF(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCP(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDELP(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLH(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLNPR(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQ(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PQI(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PQL(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQLIS(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQSAT(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQW(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PR(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRDELP(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PT(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTW(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PU(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PV(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCPS(KLON)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGM(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSTAB(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTS(KLON)
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PDIFCQ(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PDIFCQL(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PDIFCQN(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PDIFCS(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PFCCQL(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PFCCQN(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PFPFPCL(KLON,0:KLEV)
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PFPFPCN(KLON,0:KLEV)
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PFPEVPCL(KLON,0:KLEV)
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PFPEVPCN(KLON,0:KLEV)
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFHMLTS(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFHEVPP(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PFPEVPP(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFPLCL(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFPLCN(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PNEBC(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PQLIC(KLON,KLEV)
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSTRCU(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSTRCV(KLON,0:KLEV) 
INTEGER(KIND=JPIM),INTENT(OUT)   :: KCIS(KLON,KLEV) 
INTEGER(KIND=JPIM),INTENT(OUT)   :: KNLAB(KLON,KLEV)
INTEGER(KIND=JPIM),INTENT(OUT)   :: KNND(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PVVERDM(KLON,KLEV) 
CHARACTER(LEN=9)  ,INTENT(IN)    :: CDLOCK 
!     DUMMY REAL
!     DUMMY INTEGER
INTEGER(KIND=JPIM) ::ILEVTEN(KLON),INCDN(KLON,KLEV)&
 & ,INIVBAC(KLON,KLEV),INLABD(KLON,KLEV)

REAL(KIND=JPRB) :: ZBET(KLON,KLEV),ZDELA(KLON,KLEV),ZDSE(KLON,KLEV)&
 & ,ZDWNDP(KLON,KLEV),ZEPSI(KLON,KLEV),ZEPSI1(KLON,KLEV)&
 & ,ZFQSC(KLON,KLEV),ZFSSC(KLON,KLEV),ZFUSC(KLON,KLEV)&
 & ,ZFVSC(KLON,KLEV),ZKD(KLON,KLEV),ZPOID(KLON,KLEV)&
 & ,ZQDN(KLON,KLEV),ZQN2(KLON,KLEV),ZSDN(KLON,KLEV)&
 & ,ZUM(KLON,KLEV),ZVM(KLON,KLEV)&
 & ,ZALF(KLON),ZCAPE(KLON),ZCAPEL(KLON),ZCP(KLON),ZFMDQ(KLON)&
 & ,ZFMDS(KLON),ZFMDU(KLON),ZFMDV(KLON),ZLB(KLON),ZLH(KLON)&
 & ,ZLN(KLON),ZMIX(KLON),ZNEIGE(KLON),ZPLH(KLON)&
 & ,ZQB(KLON),ZQBH(KLON),ZQN(KLON),ZQNH(KLON),ZRBB(KLON)&
 & ,ZRBH(KLON),ZRVH(KLON),ZRBBS(KLON),ZRBHS(KLON)&
 & ,ZS1(KLON),ZS3(KLON),ZS4(KLON),ZS10(KLON),ZS11(KLON)&
 & ,ZS13(KLON),ZS14(KLON),ZS15(KLON),ZS16(KLON),ZS17(KLON)&
 & ,ZS18(KLON),ZS19(KLON)&
 & ,ZTB(KLON),ZTBH(KLON),ZTEL(KLON),ZTEN(KLON)&
 & ,ZTN(KLON),ZTNH(KLON)&
 & ,ZCPF(KLON,0:KLEV),ZFORM(KLON,0:KLEV),ZSIGMA(KLON,0:KLEV)&
 & ,ZTF(KLON,0:KLEV),ZVVER(KLON,0:KLEV)&
 & ,ZFQLSC(KLON,KLEV),ZFQISC(KLON,KLEV),ZFMDQL(KLON),ZFMDQI(KLON)&
 & ,ZRME(KLON),ZTENDCL(KLON,KLEV)&
 & ,ZFORT(KLON,0:KLEV),ZFORD(KLON,0:KLEV),ZDELAD(KLON,KLEV)&
 & ,ZQDND(KLON,KLEV),ZQN2D(KLON,KLEV),ZSDND(KLON,KLEV)&
 & ,ZUMD(KLON,KLEV),ZVMD(KLON,KLEV),ZBETD(KLON,KLEV),ZTCTC(KLON)  
         
REAL(KIND=JPRB) :: ZCCHSL, ZCCHSN, ZTCAC, ZTCWC, ZTVFC&
 & , ZGAMA, ZKDX, ZVVN, ZVVX, ZFENTRT, ZFNEBC&
 & , ZRVMD, ZCPVMD, ZCPVMW, ZCPVMS, ZCPWMD, ZCPSMD, ZGDT, ZGDTI, ZEPS3&
 & , ZEPS4, ZEPS0, ZARLII, ZTD, ZDELTA, ZEW&
 & , ZESP, ZQW, ZENTR, ZDCP, ZDELT, ZDELQ, ZDQW&
 & , ZCPH, ZTNSEC, ZLIQ, ZEXP, ZTVN, ZTVE, ZFLOI, ZFLO&
 & , ZDELPF, ZENTRT, ZKDL, ZVVERDEN, ZB, ZDELTAP, ZVVERN&
 & , ZEPSI1L, ZENTRO, ZEPSI0, ZTLN, ZTLE&
 & , ZQSTLN, ZSN, ZSE, ZCHIS, ZTVLN, ZTVLE, ZNCHI0, ZDCHI0&
 & , ZCHI0, ZCHI02, ZDLOGM&
 & , ZFMDQN, ZFMDQLN, ZFMDQIN, ZFMDSN, ZFORMV, ZDELTA1, ZDETT, ZTAUX&
 & , ZFMDUN, ZFMDVN, ZAUX, ZNEBC, ZEVAPC, ZFONTC, ZPLHE, ZDELTAQ, ZEVA&
 & , ZPLC, ZCLTEND, ZPLB, ZGENN, ZFON, ZFONS, ZFONT, ZFTOTQ, ZLNTM&
 & , ZLNTPL, ZLNTPN, ZZA, ZTENDL, ZZB, ZZTVFC, ZZC, ZTENDI, ZTENDT&
 & , ZFTOTS, ZZVAL, ZDPLAB, ZALFX, ZH, ZHE, ZEPS1, ZGENE&
 & , ZFQLIC, ZDPLABD, ZFORDV, ZDETTD, ZTCTCDT, ZFDTTAUX&
 & , ZE, ZR, ZTCOND  

INTEGER(KIND=JPIM) ::  JLON, JLEV, ICDN, ITOP, JIT, IBAC, INXCIS&
 & , ISDELTAP, IVVER, IDOMDP, IVVN, IVVX, ICHIS&
 & , IENTR, IKUO5, IKUO6&
 & , INUA, ISUM, ILEVBAC, IE0  
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "abor1.intfb.h"
#include "actcpnf.intfb.h"
#include "accvimpdgy.intfb.h"

#include "fcttrm.h"

!     CHECK RELIABILITY OF INPUT ARGUMENTS.

IF (LHOOK) CALL DR_HOOK('ACCVIMPGY',0,ZHOOK_HANDLE)
IF(CDLOCK /= 'ACCVIMP') CALL ABOR1('BAD NUMBER OF ARGUMENTS IN ACCVIMPGY !')

!*
!     ------------------------------------------------------------------
!     I - CONSTANTES AUXILIAIRES.

!         AUXILIARY CONSTANTS.

ZCCHSL=RCW-RCPD
ZCCHSN=RCS-RCPD

! FRACTION D'ASCENDANCE CONVECTIVE MAXIMUM
ZALFX=ALFX

! PARAMETRES POUR LE SCHEMA DE PRECIPITATIONS CONVECTIVES.
ZTCAC=TCA
ZTCTCDT=TCTC*(1.2E-06_JPRB*TSPHY**2-4.7E-03_JPRB*TSPHY+5.6_JPRB)
DO JLON=KIDIA,KFDIA
  ZTCTC(JLON)=ZTCTCDT*1.0_JPRB/(4.3E-03_JPRB*(NDLON*PGM(JLON))+0.45_JPRB)
ENDDO
ZTCWC=TCW
ZTVFC=TVFC

! PARAMETRE DE MASSE VIRTUELLE + 1.
ZGAMA=GAMAP1
! COEFFICIENT DE RESISTANCE MINIMUM ET MAXIMUM.
ZKDX=RKDN*TENTRX/TENTR
! VITESSE VERTICALE MIN ET MAX POUR L'ENTRAINEMENT TURBULENT.
ZVVN=VVN
ZVVX=VVX
! FACTEUR DE L'ENTRAINEMENT TURBULENT POUR NIVEAU DE DETRAINEMENT.
ZFENTRT=FENTRT

! FACTEUR DE L'EAU LIQUIDE CONVECTIVE
ZFQLIC=FQLIC
! FACTEUR DE LA NEBULOSITE CONVECTIVE
ZFNEBC=FNEBC

ZRVMD=RV-RD
ZCPVMD=RCPV-RCPD
ZCPVMW=RCPV-RCW
ZCPVMS=RCPV-RCS
ZCPWMD=RCW-RCPD
ZCPSMD=RCS-RCPD

!*
!     ------------------------------------------------------------------
!     II - CALCUL DES PARAMETRES DERIVES, CONSTANTES DE SECURITE
!     ET INVERSE D'UN ARGUMENT LIMITE (POUR EVITER "L'UNDERFLOW" DANS
!     LES CALCULS D'EAU LIQUIDE (OU GLACE) EN SUSPENSION DANS
!     L'ASCENDANCE NUAGEUSE).

!          COMPUTATION OF DERIVED PARAMETERS, SECURITY CONSTANTS  AND
!     INVERSE OF A CRITICAL ARGUMENT (TO AVOID "UNDERFLOW" IN LIQUID
!     (OR ICE) WATER CALCULATIONS FOR SUSTENTATION IN CLOUDY ASCENTS).

ZGDT=RG*TSPHY
ZGDTI=1.0_JPRB/ZGDT

ZEPS1=1.E-10_JPRB
ZEPS3=1.E-01_JPRB
ZEPS4=1.E-05_JPRB
ZEPS0=1.E-12_JPRB

ZARLII=0.004_JPRB

!*
!     ------------------------------------------------------------------
!     III - MISE A ZERO DE TOUS LES FLUX (POUR LE CAS SANS CONVECTION)
!     ET CALCULS PRELIMINAIRES D'ENERGIE STATIQUE SECHE, D'EPAISSEUR
!     EN PRESSION DES COUCHES DIVISEE PAR G*DT ET DE SON INVERSE POUR
!     CHAQUE NIVEAU AINSI QUE DES PROPORTIONS IMPOSEES DE PRECIPITATIONS
!     NEIGEUSE EN FONCTION DE LA TEMPERATURE ET DE LA PRESSION.

!           SETTING ALL FLUXES TO ZERO (FOR THE CASE WITHOUT CONVECTION)
!     AND PRELIMINARY CALCULATIONS OF DRY STATIC ENERGY, OF LEVEL
!     PRESSURE THICKNESSES DIVIDED BY G*DT AND OF THEIR INVERSES AT ALL
!     LEVELS AS WELL AS OF IMPOSED PROPORTIONS OF SNOW PRECIPITATION IN
!     FUNCTION OF TEMPERATURE AND PRESSURE.

! - TEMPORAIRE(S) 2D (1:KLEV) .

! ZDSE      : TABLEAU LOCAL DES ENERGIES STATIQUE SECHES.
!            : LOCAL ARRAY FOR DRY STATIC ENERGIES.
! ZCPF      : CHALEUR MASSIQUE AU NIVEAU DES FLUX.
!            : FLUX LEVEL HEAT CAPACITY.
! ZPOID     : DP/(RG*DT) POUR UNE COUCHE ET UN PAS DE TEMPS DONNES.
!            : DP/(RG*DT) FOR A GIVEN LEVEL AND A GIVEN TIME STEP.
! ZTF      : TEMPERATURE AU NIVEAU DES FLUX.
!            : FLUX LEVEL TEMPERATURE.
! ZTEN     : TEMPERATURE POTENTIELLE EQUIVALENTE MINIMUM.
!            : MINIMUM EQUIVALENT POTENTIAL TEMPERATURE.

!     CALCUL DE T ET CP AUX NIVEAUX DES FLUX.
!     T AND CP COMPUTATION AT FLUX LEVELS.

CALL ACTCPNF ( KIDIA,KFDIA,KLON,KLEV,PCP,PT,PCPS,PTS,ZCPF,ZTF, 'ACTCPNF' )

DO JLON=KIDIA,KFDIA

!     MISE A ZERO DES FLUX AU SOMMET.
!     SETTING TO ZERO FLUXES AT THE TOP.

  PFPLCL(JLON,KTDIA-1)=0.0_JPRB
  PFPLCN(JLON,KTDIA-1)=0.0_JPRB
  PDIFCQ(JLON,KTDIA-1)=0.0_JPRB
  PDIFCS(JLON,KTDIA-1)=0.0_JPRB
  PSTRCU(JLON,KTDIA-1)=0.0_JPRB
  PSTRCV(JLON,KTDIA-1)=0.0_JPRB

  ILEVTEN(JLON)=0

  ZE=MAX(ZEPS0,PAPRSF(JLON,KTDIA)*PQ(JLON,KTDIA)&
   & /((1.0_JPRB-PQ(JLON,KTDIA))*RD/RV+PQ(JLON,KTDIA)))  
  ZR=PQ(JLON,KTDIA)/(1.0_JPRB-PQ(JLON,KTDIA))*1000._JPRB
  IE0=NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,ZEPS0-ZE)))
  ZTCOND=IE0*2840._JPRB/(3.5_JPRB*LOG(PT(JLON,KTDIA))-LOG(ZE/100._JPRB)&
   & -4.805_JPRB)+55._JPRB+(1-IE0)*PT(JLON,KTDIA)  
  ZTEN(JLON)=PT(JLON,KTDIA)*(100000._JPRB/PAPRSF(JLON,KTDIA))&
   & **(0.2854_JPRB*(1.0_JPRB-0.28E-3_JPRB*ZR))&
   & *EXP((3.376_JPRB/ZTCOND-0.00254_JPRB)*ZR*(1.0_JPRB+0.81E-3_JPRB*ZR))  

  ZPLH(JLON)=0.0_JPRB
  ZNEIGE(JLON)=0.0_JPRB
  ZRME(JLON)=0.0_JPRB
ENDDO

!     CALCULS A TOUS LES NIVEAUX.
!     COMPUTATIONS AT ALL LEVELS.

DO JLEV=KTDIA,KLEV
  DO JLON=KIDIA,KFDIA
    ZPOID(JLON,JLEV)=PDELP(JLON,JLEV)*ZGDTI
    ZDSE(JLON,JLEV)=PCP(JLON,JLEV)*PT(JLON,JLEV)+PAPHIF(JLON,JLEV)

    ZE=MAX(ZEPS0,PAPRSF(JLON,JLEV)*PQ(JLON,JLEV)&
     & /((1.0_JPRB-PQ(JLON,JLEV))*RD/RV+PQ(JLON,JLEV)))  
    ZR=PQ(JLON,JLEV)/(1.0_JPRB-PQ(JLON,JLEV))*1000._JPRB
    IE0=NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,ZEPS0-ZE)))
    ZTCOND=IE0*2840._JPRB/(3.5_JPRB*LOG(PT(JLON,JLEV))-LOG(ZE/100._JPRB)&
     & -4.805_JPRB)+55._JPRB+(1-IE0)*PT(JLON,JLEV)  
    ZTEL(JLON)=PT(JLON,JLEV)*(100000._JPRB/PAPRSF(JLON,JLEV))&
     & **(0.2854_JPRB*(1.0_JPRB-0.28E-3_JPRB*ZR))&
     & *EXP((3.376_JPRB/ZTCOND-0.00254_JPRB)*ZR*(1.0_JPRB+0.81E-3_JPRB*ZR))  

    ZTEN(JLON)=MIN(ZTEN(JLON),ZTEL(JLON))
    ILEVTEN(JLON)=MAX(JLEV*NINT(MAX(0.0_JPRB,SIGN(1.0_JPRB,ZTEN(JLON)&
     & -ZTEL(JLON)))),ILEVTEN(JLON))  

!     MISE A ZERO DES FLUX.
!     SETTING FLUXES TO ZERO.

    PFPLCL(JLON,JLEV)=0.0_JPRB
    PFPLCN(JLON,JLEV)=0.0_JPRB
    PDIFCQ(JLON,JLEV)=0.0_JPRB
    PDIFCS(JLON,JLEV)=0.0_JPRB
    PSTRCU(JLON,JLEV)=0.0_JPRB
    PSTRCV(JLON,JLEV)=0.0_JPRB

    PQLIC(JLON,JLEV)=0.0_JPRB
    ZBETD(JLON,JLEV)=1.0_JPRB
    ZDELAD(JLON,JLEV)=0.0_JPRB
    ZFORD(JLON,JLEV)=0.0_JPRB
    ZQDND(JLON,JLEV)=0.0_JPRB
    ZQN2D(JLON,JLEV)=0.0_JPRB
    ZSDND(JLON,JLEV)=0.0_JPRB
    ZUMD(JLON,JLEV)=0.0_JPRB
    ZVMD(JLON,JLEV)=0.0_JPRB
    INLABD(JLON,JLEV)=0
  ENDDO
ENDDO

!*
!     ------------------------------------------------------------------
!     IV - INITIALISATION A LA BASE.

!          BOTTOM INITIALISATION.

! - TEMPORAIRE(S) 2D (0:KLEV) .

! ZFORM     : PROFIL DE FLUX DE MASSE PUIS FLUX DE MASSE FOIS DT.
!            : PROFILE OF MASS FLUX AND LATER MASS FLUX TIME DT.

! - TEMPORAIRE(S) 2D (1:KLEV) .

! ZSDN      : ENERGIE STATIQUE SECHE DE DETRAINEMENT DU NUAGE.
!            : DETRAINING DRY STATIC ENERGY OF THE CLOUD.
! ZQDN      : HUMIDITE TOTALE DE DETRAINEMENT DU NUAGE.
!            : DETRAINING TOTAL CLOUD HUMIDITY.

DO JLON=KIDIA,KFDIA

!     CARACTERISTIQUES THERMODYNAMIQUES DU NUAGE.
!     THERMODYNAMIC CHARACTERISTICS OF THE CLOUD.

! - TEMPORAIRE(S) 1D .

! ZTN       : TEMPERATURE DE L'ASCENDANCE NUAGEUSE.
!            : TEMPERATURE OF THE CLOUDY ASCENT.
! ZTNH      : TEMPERATURE DE L'ASCENDANCE NUAGEUSE HUMIDE.
!            : TEMPERATURE OF THE MOIST CLOUDY ASCENT.
! ZQN       : HUMIDITE SPECIFIQUE VAPEUR DE L'ASCENDANCE NUAGEUSE.
!            : WATER VAPOUR SPECIFIC HUMIDITY OF THE CLOUDY ASCENT.
! ZQNH      : HUMIDITE VAPEUR DE L'ASCENDANCE NUAGEUSE HUMIDE.
!            : WATER VAPOUR HUMIDITY OF THE MOIST CLOUDY ASCENT.
! ZLN       : HUMIDITE SPECIFIQUE CONDENSEE DE L'ASCENDANCE NUAGEUSE.
!            : CONDENSED SPECIFIC HUMIDITY OF THE CLOUDY ASCENT.

  ZTN(JLON)=PT(JLON,KLEV)
  ZQN(JLON)=PQ(JLON,KLEV)
  ZQN2(JLON,KLEV)=ZQN(JLON)
  ZLN(JLON)=0.0_JPRB
  PQLIC(JLON,KLEV)=ZLN(JLON)
  ZTNH(JLON)=PTW(JLON,KLEV)
  ZQNH(JLON)=PQW(JLON,KLEV)

!     TEST DE SATURATION DU NIVEAU (NIVEAU DE CONDENSATION ATTEINT).
!     TEST OF LEVEL SATURATION (LCL REACHED).

! INCDN     : NIVEAU DU POINT DE CONDENSATION.
!             :LCL

  ICDN=NINT(MAX(0.0_JPRB,SIGN(1.0_JPRB,ZQN(JLON)-PQSAT(JLON,KLEV))))
  INCDN(JLON,KLEV)=KLEV*ICDN

  ZTD=PT(JLON,KLEV)*(1.0_JPRB-RETV*(PQSAT(JLON,KLEV)-PQ(JLON,KLEV))&
   & /(1.0_JPRB+RETV*PLH(JLON,KLEV)*PQSAT(JLON,KLEV)/(RV*PT(JLON,KLEV))))  
  IF (LNEIGE) THEN
    ZDELTA=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-ZTD))
  ELSE
    ZDELTA=0.0_JPRB
  ENDIF
  ZEW=FOEW(ZTD,ZDELTA)
  ZESP=ZEW/PAPRSF(JLON,KLEV)
  ZQW=FOQS(ZESP)
  ZTD=ICDN*ZTD+(1-ICDN)*ZTN(JLON)
  ZQW=ICDN*ZQW+(1-ICDN)*ZQN(JLON)
  ZQDN(JLON,KLEV)=ZQW
  ZSDN(JLON,KLEV)=(RCPD+ZCPVMD*ZQW)*ZTD+PAPHIF(JLON,KLEV)

!     CARACTERISTIQUES ACTIVES DU NUAGE.
!     ACTIVE CHARACTERISTICS OF THE CLOUD.

! - TEMPORAIRE(S) 1D .

! ZFMDS     : "0.5*ZFORML" FOIS LE DELTA VERTICAL DE S.
!            : "0.5*ZFORML" TIME THE VERTICAL S JUMP.
! ZFMDQ     : "0.5*ZFORML" FOIS LE DELTA VERTICAL D'HUMIDITE SPECIFIQUE.
!            : "0.5*ZFORML" TIME THE VERTICAL SPECIFIC HUMIDITY JUMP.

  KNLAB(JLON,KLEV)=0
  KNND(JLON)=0

! INIVBAC   : NIVEAU DE LA BASE DE L'ASCENDNACE CONVECTIVE.
  INIVBAC(JLON,KLEV)=KLEV

! KCIS      : INDICE DE NIVEAU D'INSTABILITE SECHE.
!  KCIS(JLON,KLEV)=NINT(PSTAB(JLON))
  KCIS(JLON,KLEV)=1
! ZVVER     : VITESSE VERT. DE LA COLONNE CONVECTIVE AUX INTERCOUCHES.
  ZVVER(JLON,KLEV)=0.0_JPRB
  ZVVER(JLON,KLEV-1)=0.0_JPRB
! ZDWNDP    : DERIVEE VERT. DE VITESSE VERT.
  ZDWNDP(JLON,KLEV)=0.0_JPRB
! ZCAPE     : CAPE DU NIVEAU.
  ZCAPE(JLON)=0.0_JPRB
! ZEPSI1    : ENTRAINEMENT TURBULENT.
  ZEPSI1(JLON,KLEV)=TENTRX
! ZEPSI     : ENTRAINEMENT ORGANISE.
  ZEPSI(JLON,KLEV)=TENTRX*PR(JLON,KLEV)*PT(JLON,KLEV)/PAPRSF(JLON,KLEV)
! ZDELA     : DETRAINEMENT ORGANISE
  ZDELA(JLON,KLEV)=0.0_JPRB
! ZKD       : COEFFICIENT DE RESISTANCE.
  ZKD(JLON,KLEV)=ZKDX
! ZSIGMA    : FRACTION DE MAILLE COUVERTE PAR L'ASCENDANCE CONVECTIVE.
  ZSIGMA(JLON,KLEV)=1.0_JPRB
  ZSIGMA(JLON,KLEV-1)=1.0_JPRB

  ZFORM(JLON,KLEV)=0.0_JPRB
  ZFORM(JLON,KTDIA-1)=0.0_JPRB
  ZFORT(JLON,KLEV)=0.0_JPRB
  ZFORT(JLON,KTDIA-1)=0.0_JPRB
  ZFMDQ(JLON)=0.0_JPRB
  ZFMDS(JLON)=0.0_JPRB

! -TEMPORAIRES 2D: VALEUR A LA SURFACE:
! ZBET: COEFFICIENT BETA DE LA VITESSE HORIZONTALE
! ZUM: MOYENNE PONDEREE DE LA VITESSE U DEPUIS LA SURFACE
! ZVM: MOYENNE PONDEREE DE LA VITESSE V DEPUIS LA SURFACE

  ZBET(JLON,KLEV)=1.0_JPRB
  ZUM(JLON,KLEV)=PU(JLON,KLEV)
  ZVM(JLON,KLEV)=PV(JLON,KLEV)

!     INTEGRALES INITIALISEES.
!     INITIALIZED INTEGRALS.

! - TEMPORAIRE(S) 1D .

! ZS3       : INTEGRALE PONDEREE DE LA TENDANCE EN VENT "U".
!            : WEIGHTED INTEGRAL OF THE "U" WIND TENDENCY.
! ZS4       : INTEGRALE PONDEREE DE LA TENDANCE EN VENT "V".
!            : WEIGHTED INTEGRAL OF THE "V" WIND TENDENCY.
!            : WEIGHTED INTEGRAL OF THE "PBL" "S=CP*T+PHI" TENDENCY.
! ZS10      : INTEGRALE PONDEREE DU VENT "U" DE L'ENVIRONEMENT.
!            : WEIGHTED INTEGRAL OF THE ENVIRONMENT "U" WIND.
! ZS11      : INTEGRALE PONDEREE DU VENT "V" DE L'ENVIRONEMENT.
!            : WEIGHTED INTEGRAL OF THE ENVIRONMENT "V" WIND.
! ZS13      : INTEGRALE PONDEREE DE (1-BETA)*UMOYENNE puis K*UC0
!            : WEIGHTED INTEGRAL OF (1-BETA)*Uaverage then K*UC0
! ZS14      : INTEGRALE PONDEREE DE (1-BETA)*Vmoyenne puis K*VC0
!            : WEIGHTED INTEGRAL OF (1-BETA)*Vaverage then K*VC0
! ZS15      : LA CAPE.
!            : CONDITIONAL AVAILABLE POTENTIAL ENERGY
! ZS16      : INTEGRALE PONDEREE DE LA TENDANCE UP DE CAPE.
!            : WEIGHTED INTEGRAL OF THE CAPE UP TENDENCY.

  ZS10(JLON)=0.0_JPRB
  ZS11(JLON)=0.0_JPRB
  ZS15(JLON)=0.0_JPRB
  ZS16(JLON)=0.0_JPRB
ENDDO

!*
!     ------------------------------------------------------------------
!     V - PREMIERE BOUCLE VERTICALE (VERS LE HAUT) INCLUANT LE CALCUL
!     "EN ADIABATIQUE SATUREE" DU PROFIL NUAGEUX.

!         FIRST VERTICAL LOOP (UPWARDS) INCLUDING THE SATURATED
!     ADIABATIC TYPE CALCULATION OF THE CLOUD PROFILE.

!     INITIALISATION DU PARAMETRE QUI SERVIRA EVENTUELLEMENT A EVITER
!     DES CALCULS INUTILES EN HAUT DE L'ATMOSPHERE ET DEBUT DE LA
!     BOUCLE.
!     INITIALIZATION OF THE PARAMETER THAT SHALL EVENTUALLY HELP
!     AVOIDING UNNECESSARY COMPUTATIONS IN THE UPPER PART OF THE
!     ATMOSPHERE AND START OF THE VERTICAL LOOP.

ITOP=KLEV+1
DO JLEV=KLEV-1,KTDIA,-1

!     ADIABATIQUE SATUREE AVEC ENTRAINEMENT ET SUSTENTATION D'EAU
!     LIQUIDE (OU GLACE).
!     SATURATED ADIABAT WITH ENTRAINMENT AND LIQUID (OR ICE) WATER
!     SUSTENTATION.

  DO JLON=KIDIA,KFDIA

!     ENTRAINEMENT.
!     ENTRAINEMENT.

! - TEMPORAIRE(S) 1D .

! ZTB       : "ZTN" A LA BASE DE LA COUCHE EN INCLUANT L'ENTRAINEMENT.
!            : "ZTN" AT THE BOTTOM OF THE SLAB WITH ENTRAINMENT "IN".
! ZQB       : "ZQN" A LA BASE DE LA COUCHE EN INCLUANT L'ENTRAINEMENT.
!            : "ZQN" AT THE BOTTOM OF THE SLAB WITH ENTRAINMENT "IN".
! ZLB       : "ZLN" A LA BASE DE LA COUCHE EN INCLUANT L'ENTRAINEMENT.
!            : "ZLN" AT THE BOTTOM OF THE SLAB WITH ENTRAINMENT "IN".

    ZENTR=ZEPSI(JLON,JLEV+1)*PAPRSF(JLON,JLEV+1)/(PR(JLON,JLEV+1)&
     & *PT(JLON,JLEV+1))  
    ZENTR=(ZENTR+ZEPSI1(JLON,JLEV+1))

    ZMIX(JLON)=ZENTR*(PAPHIF(JLON,JLEV)-PAPHIF(JLON,JLEV+1))
    ZMIX(JLON)=ZMIX(JLON)/(1.0_JPRB+ZMIX(JLON))
    ZTB(JLON)=ZTN(JLON)+ZMIX(JLON)*(PT(JLON,JLEV+1)-ZTN(JLON))
    ZQB(JLON)=ZQN(JLON)+ZMIX(JLON)*(PQ(JLON,JLEV+1)-ZQN(JLON))
    ZLB(JLON)=ZLN(JLON)*(1.0_JPRB-ZMIX(JLON))
    ZTBH(JLON)=ZTNH(JLON)+ZMIX(JLON)*(PT(JLON,JLEV+1)-ZTNH(JLON))
    ZQBH(JLON)=ZQNH(JLON)+ZMIX(JLON)*(PQ(JLON,JLEV+1)-ZQNH(JLON))

! ENTRAINEMENT DE LA VITESSE HORIZONTALE:
! NOUVELLE PARAMETRISATION (KERSHAW & GREGORY).
! MOMENTUM ENTRAINMENT:
! NEW PARAMETERIZATION (KERSHAW & GREGORY).

    ZBET(JLON,JLEV)=ZBET(JLON,JLEV+1)*(1.0_JPRB-ZMIX(JLON))
    ZUM(JLON,JLEV)=ZUM(JLON,JLEV+1)&
     & +(ZMIX(JLON)*(PU(JLON,JLEV+1)-ZUM(JLON,JLEV+1))&
     & +TUDGP*(PU(JLON,JLEV)-PU(JLON,JLEV+1)))&
     & /(1.0_JPRB-ZBET(JLON,JLEV))  
    ZVM(JLON,JLEV)=ZVM(JLON,JLEV+1)&
     & +(ZMIX(JLON)*(PV(JLON,JLEV+1)-ZVM(JLON,JLEV+1))&
     & +TUDGP*(PV(JLON,JLEV)-PV(JLON,JLEV+1)))&
     & /(1.0_JPRB-ZBET(JLON,JLEV))  

!     COEFFICIENTS DE L'HYDROSTATIQUE DU PROFIL NUAGEUX.
!     HYDROSTATIC COEFFICIENTS FOR THE CLOUD PROFILE.

! - TEMPORAIRE(S) 1D .

! ZRBB      : POIDS DE "ZTB" DANS L'EPAISSEUR EN GEOPOTENTIEL.
!            : WEIGHT OF "ZTB" IN THE GEOPOTENTIAL THICKNESS.
! ZRBH      : POIDS DE "ZTN" A "ZQN=ZQB" DANS LA MEME EPAISSEUR.
!            : WEIGHT OF "ZTN" AT "ZQN=ZQB" IN THE SAME THICKNESS.
! ZRBBS     : POIDS DE "ZTB" DANS L'EPAISSEUR EN GEOPOTENTIEL (SEC).
!            : WEIGHT OF "ZTB" IN THE GEOPOTENTIAL THICKNESS (DRY).
! ZRBHS     : POIDS DE "ZTN" A "ZQN=ZQB" DANS LA MEME EPAISSEUR (SEC).
!            : WEIGHT OF "ZTN" AT "ZQN=ZQB" IN THE SAME THICKNESS (DRY).
! ZRVH      : POUR LA CORRECTION DE VARIATION DE Q A ZRBH.
!            : FOR THE Q DEPENDENT CORRECTION OF ZRBH.

    ZRBB(JLON)=(PLNPR(JLON,JLEV+1)-PALPH(JLON,JLEV+1))*(RD*(1.0_JPRB &
     & -ZLB(JLON))+ZRVMD*ZQBH(JLON))  
    ZRBH(JLON)=PALPH(JLON,JLEV)*(RD*(1.0_JPRB-ZLB(JLON))+ZRVMD*ZQBH(JLON))
    ZRBBS(JLON)=(PLNPR(JLON,JLEV+1)-PALPH(JLON,JLEV+1))*(RD*(1.0_JPRB &
     & -ZLB(JLON))+ZRVMD*ZQB(JLON))  
    ZRBHS(JLON)=PALPH(JLON,JLEV)*(RD*(1.0_JPRB-ZLB(JLON))+ZRVMD*ZQB(JLON))
    ZRVH(JLON)=PALPH(JLON,JLEV)*RV

!     DANS LE CALCUL DE L'ADIABATIQUE SATUREE GCVADS PERRMET UNE
!     TRANSITION CONTINUE ENTRE LE TRAITEMENT EQUIPRESSION ET
!     EQUIGEOPOTENTIEL.

!     TO COMPUTATE ADIABATIC PROFILE GCVADS ALLOWS ALLOWS TO GO
!     CONTINUOUSLY FROM EQUIPRESSURE TO EQUIGEOPOTENTIAL APPROACH.

    ZRBB(JLON)=(1.0_JPRB-GCVADS)*ZRBB(JLON)+GCVADS*(PAPHIF(JLON,JLEV)&
     & -PAPHIF(JLON,JLEV+1))/ZTBH(JLON)    
    ZRBH(JLON)=(1.0_JPRB-GCVADS)*ZRBH(JLON)
    ZRBBS(JLON)=(1.0_JPRB-GCVADS)*ZRBBS(JLON)+GCVADS*(PAPHIF(JLON,JLEV)&
     & -PAPHIF(JLON,JLEV+1))/ZTB(JLON)    
    ZRBHS(JLON)=(1.0_JPRB-GCVADS)*ZRBH(JLON)
    ZRVH(JLON)=(1.0_JPRB-GCVADS)*ZRVH(JLON)

!     CALCULS DEPENDANT DE L'OPTION NEIGE.
!     SNOW OPTION DEPENDENT CALCULATIONS.

    IF (LNEIGE) THEN
      ZDELTA=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-ZTBH(JLON)))
    ELSE
      ZDELTA=0.0_JPRB
    ENDIF

!     APPEL A LA FONCTION DEFINIE POUR LE CALCUL DE LA PSEUDO CHALEUR
!     LATENTE A LA BASE (PARMI TROIS PARAMETRES CARACTERISTIQUES).
!     CALL TO THE DEFINED FUNCTION FOR THE COMPUTATION OF THE PSEUDO
!     LATENT HEAT AT THE BOTTOM (AMONG THREE CHARACTERISTIC PARAMETERS).

! - TEMPORAIRE(S) 1D .

! ZLH       : VALEUR COURANTE DU PSEUDO LH DURANT LA BOUCLE DE NEWTON.
!            : RUNNING VALUE OF THE PSEUDO LH DURING NEWTON'S LOOP.
! ZCP       : COMME ZLH MAIS POUR LA CHALEUR MASSIQUE CP.
!            : AS ZLH BUT FOR THE SPECIFIC HEAT CP.

    ZLH(JLON)=FOLH(ZTBH(JLON),ZDELTA)+ZRVH(JLON)*ZTBH(JLON)
    ZCP(JLON)=RCPD+ZCPVMD*ZQBH(JLON)+(ZCPWMD+ZDELTA*(ZCPSMD-&
     & ZCPWMD))&
     & *ZLB(JLON)+ZRBH(JLON)  
    ZDCP=ZRVH(JLON)+ZCPVMW+ZDELTA*(ZCPVMS-ZCPVMW)

!     CHANGEMENT DE NIVEAU POUR OBTENIR LA PREMIERE EBAUCHE, POINT DE
!     DEPART DE LA BOUCLE DE NEWTON.
!     CHANGE OF LEVEL TO OBTAIN A FIRST GUESS AS STARTING POINT FOR THE
!     NEWTON LOOP.

    ZDELT=PT(JLON,JLEV)-PT(JLON,JLEV+1)
    ZLH(JLON)=ZLH(JLON)+ZDCP*ZDELT
    ZDELQ=-((ZRBB(JLON)+ZRBH(JLON))*ZTBH(JLON)+ZCP(JLON)*ZDELT)/ZLH(JLON)
    ZCP(JLON)=ZCP(JLON)+ZDCP*ZDELQ
    ZTNH(JLON)=ZTBH(JLON)+ZDELT
    ZQNH(JLON)=ZQBH(JLON)+ZDELQ
  ENDDO

!     BOUCLE DE NEWTON.
!     NEWTON'S LOOP.

  DO JIT=1,NBITER
    DO JLON=KIDIA,KFDIA

!     CALCULS DEPENDANT DE L'OPTION NEIGE.
!     SNOW OPTION DEPENDENT COMPUTATIONS.

      IF (LNEIGE) THEN
        ZDELTA=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-ZTNH(JLON)))
      ELSE
        ZDELTA=0.0_JPRB
      ENDIF

!     CALCULS DE SATURATION UTILISANT LES FONCTIONS DEFINIES.
!     SATURATION CALCULATIONS USING DEFINED FUNCTIONS.

      ZEW= FOEW (ZTNH(JLON),ZDELTA)
      ZESP=ZEW/PAPRSF(JLON,JLEV)
      ZQW= FOQS (ZESP)
      ZDQW= FODQS (ZQW,ZESP, FODLEW (ZTNH(JLON),ZDELTA))

!     INCREMENTATIONS.
!     INCREMENTATIONS.

      ZDCP=ZRVH(JLON)+ZCPVMW+ZDELTA*(ZCPVMS-ZCPVMW)
      ZDELQ=(ZQW-ZQNH(JLON))*ZCP(JLON)/(ZCP(JLON)+ZLH(JLON)*ZDQW)
      ZCP(JLON)=ZCP(JLON)+ZDCP*ZDELQ
      ZDELT=-ZDELQ*ZLH(JLON)/ZCP(JLON)
      ZLH(JLON)=ZLH(JLON)+ZDCP*ZDELT
      ZQNH(JLON)=ZQNH(JLON)+ZDELQ
      ZTNH(JLON)=ZTNH(JLON)+ZDELT
    ENDDO
  ENDDO

  DO JLON=KIDIA,KFDIA

!     ADIABATIQUE SECHE.
!     DRY ADIABAT.

    ZCPH=RCPD*(1.0_JPRB-ZQB(JLON))+RCPV*ZQB(JLON)
    ZTNSEC=(ZCPH-ZRBBS(JLON))*ZTB(JLON)/(ZCPH+ZRBHS(JLON))

!     TEST DE SATURATION DU NIVEAU HAUT (NIVEAU DE CONDENSATION ATTEINT)
!     ET AFFECTATION DES VARIABLES DU NUAGE AU NIVEAU HAUT.
!     TOP LEVEL SATURATION TEST (LCL REACHED) AND CLOUD VARIABLE
!     AFFECTATION AT TOP LEVEL.

    ICDN=NINT(MAX(0.0_JPRB,SIGN(1.0_JPRB,ZTNH(JLON)-ZTNSEC)))
    ZTN(JLON)=ICDN*ZTNH(JLON)+(1-ICDN)*ZTNSEC
    ZQN(JLON)=ICDN*ZQNH(JLON)+(1-ICDN)*ZQB(JLON)

    INCDN(JLON,JLEV)=MAX(INCDN(JLON,JLEV+1),JLEV*ICDN)

!     SUSTENTATION DE L'EAU LIQUIDE (OU GLACE) NUAGEUSE.
!     SUSTENTATION OF LIQUID (OR ICE) WATER.

    ICDN=MAX(0,-ISIGN(1,-INCDN(JLON,JLEV)))
    ZLIQ=ECMNP/(ZRBB(JLON)*ZTBH(JLON)+(ZRBH(JLON)+ZRVH(JLON)&
     & *(ZQN(JLON)-ZQBH(JLON)))*ZTN(JLON))  
    ZEXP=EXP(-1.0_JPRB/MAX(ZARLII,ZLIQ))
    ZLN(JLON)=ICDN*MAX(0.0_JPRB,ZLB(JLON)*ZEXP &
     & +(ZQN(JLON)-ZQBH(JLON))*ZLIQ*(ZEXP-1.0_JPRB))  
    PQLIC(JLON,JLEV)=ZLN(JLON)

  ENDDO

!     TEST DE STABILITE, RECTIFICATION EVENTUELLE DU NIVEAU INFERIEUR,
!     CALCUL DU PROFIL DU FLUX DE MASSE ET DES DEUX
!     INTEGRALES INTERVENANT DANS LA CONDITION DE FERMETURE.
!     STABILITY TEST, OCCASIONAL CORRECTION OF THE BOTTOM LAYER,
!     COMPUTATION OF THE MASS FLUX PROFILE AND OF THE TWO
!     INTEGRALS CONNECTED WITH THE CLOSURE.

  DO JLON=KIDIA,KFDIA

    ZTVN=ZTN(JLON)*(1.0_JPRB+RETV*ZQN(JLON)-ZLN(JLON))
    ZTVE=PT(JLON,JLEV)*(1.0_JPRB+RETV*PQ(JLON,JLEV))
    ZCAPEL(JLON)=PDELP(JLON,JLEV)/PAPRSF(JLON,JLEV)*(ZTVN-ZTVE)

    IBAC=MAX(0,-ISIGN(1,-INIVBAC(JLON,JLEV+1)))
    ICDN=MAX(0,-ISIGN(1,-INCDN(JLON,JLEV)))

    ZFLOI=-RG*RG*PAPRSF(JLON,JLEV)/(RD*ZGAMA)
    ZFLO=(ZTVN-ZTVE)/ZTVE/ZTVE
    ZFLO=ZFLOI*ZFLO

!     CALCUL DE LA VITESSE VERTICALE CONVECTIVE.
!     CONVECTIVE VERTICAL VELOCITY COMPUTATION.

    ZDELPF=PDELP(JLON,JLEV)
    ZENTR=ZEPSI(JLON,JLEV+1)
    ZENTRT=ZEPSI1(JLON,JLEV+1)*PR(JLON,JLEV)*PT(JLON,JLEV)/PAPRSF(JLON,JLEV)
    ZENTR=ZENTR+ZENTRT

    ZKDL=ZKD(JLON,JLEV+1)

    ZVVERDEN=2.0_JPRB*TSPHY*(0.25_JPRB*(ZKDL+ZENTR)+0.5_JPRB/ZDELPF)
    ZB=0.5_JPRB*(1.0_JPRB-(ZKDL+ZENTR)*TSPHY*ZVVER(JLON,JLEV))
    ZDELTAP=ZB**2 &
     & -2.0_JPRB*ZVVERDEN*((ZFLO+(-0.5_JPRB/ZDELPF+0.25_JPRB*(ZKDL+ZENTR))&
     & *ZVVER(JLON,JLEV)**2)*TSPHY-0.5_JPRB*ZVVER(JLON,JLEV)&
     & +PVVERDM(JLON,JLEV))  

    ISDELTAP=NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,-ZDELTAP)))
    ZDELTAP=ZDELTAP*ISDELTAP
    ZVVERN=(ZB-SQRT(ZDELTAP))/ZVVERDEN
    ZVVERN=MIN(0.0_JPRB,ZVVERN)*ISDELTAP
    IVVER=NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,ZVVERN)))
    ZVVERN=ZVVERN*IVVER

    ZVVER(JLON,JLEV-1)=ZVVERN
    PVVERDM(JLON,JLEV)=0.5_JPRB*(ZVVER(JLON,JLEV)+ZVVER(JLON,JLEV-1))

    ZDELPF=PAPRSF(JLON,JLEV+1)-PAPRSF(JLON,JLEV)
    ZDWNDP(JLON,JLEV)=(PVVERDM(JLON,JLEV+1)-PVVERDM(JLON,JLEV))/ZDELPF

!     CALCUL DE L'ENTRAINEMENT TURBULENT ET DE CHI0.
!     TURBULENT ENTRAINMENT AND CHI0 COMPUTATION.

    IDOMDP=NINT(MAX(0.0_JPRB,SIGN(1.0_JPRB,ZDWNDP(JLON,JLEV))))

    IVVN=NINT(MAX(0.0_JPRB,SIGN(1.0_JPRB,PVVERDM(JLON,JLEV)-ZVVN)))
    IVVX=NINT(MAX(0.0_JPRB,SIGN(1.0_JPRB,PVVERDM(JLON,JLEV)-ZVVX)))
    ZEPSI1L=(TENTR+(TENTRX-TENTR)*SIN(RPI/2.0_JPRB*MAX(0.0_JPRB,MIN(1.0_JPRB&
     & ,((ZVVX-PVVERDM(JLON,JLEV))/(ZVVX-ZVVN)))))**2.0_JPRB)  
    ZEPSI1L=IVVN*TENTRX+(1-IVVN)*IVVX*ZEPSI1L+(1-IVVX)*TENTR

    INUA=KNLAB(JLON,JLEV+1)
    ZEPSI1(JLON,JLEV)=(1-IDOMDP)*ZEPSI1(JLON,JLEV+1)&
     & +IDOMDP*(INUA*MIN(ZEPSI1L,ZEPSI1(JLON,JLEV+1))&
     & +(1-INUA)*ZEPSI1L)  

    ZKDL=(RKDN+(ZKDX-RKDN)*SIN(RPI/2.0_JPRB*MAX(0.0_JPRB,MIN(1.0_JPRB&
     & ,((ZVVX-PVVERDM(JLON,JLEV))/(ZVVX-ZVVN)))))**2.0_JPRB)  
    ZKDL=IVVN*ZKDX+(1-IVVN)*IVVX*ZKDL+(1-IVVX)*RKDN

    ZKD(JLON,JLEV)=(1-IDOMDP)*ZKD(JLON,JLEV+1)&
     & +IDOMDP*(INUA*MIN(ZKDL,ZKD(JLON,JLEV+1))&
     & +(1-INUA)*ZKDL)  

    ZENTRT=ZEPSI1(JLON,JLEV)*PR(JLON,JLEV)*PT(JLON,JLEV)/PAPRSF(JLON,JLEV)
    IVVER=NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,PVVERDM(JLON,JLEV))))
    ZENTRO=-IVVER/MIN(-ZEPS0,PVVERDM(JLON,JLEV))*ZDWNDP(JLON,JLEV)&
     & +(1-IVVER)*ZENTRT  
    ZEPSI0=MAX(ABS(ZENTRO),ZENTRT)

    ZTLN=ZTN(JLON)-ZLH(JLON)*ZLN(JLON)/ZCP(JLON)
    ZTLE=PT(JLON,JLEV)
    IF (LNEIGE) THEN
      ZDELTA=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-ZTLN))
    ELSE
      ZDELTA=0.0_JPRB
    ENDIF
    ZEW=FOEW(ZTLN,ZDELTA)
    ZESP=ZEW/PAPRSF(JLON,JLEV)
    ZQSTLN=FOQS(ZESP)
    ZSN=ZQN(JLON)+ZLN(JLON)-ZQSTLN
    ZSE=PQ(JLON,JLEV)-PQSAT(JLON,JLEV)
    ZCHIS=ZSN/(ZSN-ZSE)
    ZCHIS=MIN(1.0_JPRB,MAX(0.0_JPRB,ZCHIS))
    ICHIS=NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,-ZCHIS)))
    ZTVLN=ZTLN*(1.0_JPRB+RETV*(ZQN(JLON)+ZLN(JLON)))
    ZTVLE=ZTLE*(1.0_JPRB+RETV*PQ(JLON,JLEV))
    ZNCHI0=MAX(0.0_JPRB,ZTVN-ZTVLE)
    ZDCHI0=MAX(ZEPS0,ZTVN-(1.0_JPRB-ZCHIS)*ZTVLN-ZCHIS*ZTVLE)
    ZCHI0=ZCHIS*ZNCHI0/ZDCHI0
    ZCHI0=ICHIS*ZCHI0+(1-ICHIS)*1.0_JPRB
    ZCHI0=IVVER*MIN(1.0_JPRB,MAX(0.0_JPRB,MIN(ZCHI0,0.5_JPRB*(1.0_JPRB+ZENTRO/ &
     & ZEPSI0))))&
     & +(1-IVVER)*1.0_JPRB  
    IENTR=NINT(MAX(0.0_JPRB,SIGN(1.0_JPRB,ZENTRO-ZFENTRT*ZENTRT)))
    ZCHI0=IENTR*1.0_JPRB+(1-IENTR)*ZCHI0

    ZCHI02=ZCHI0**2
    ZEPSI(JLON,JLEV)=MAX(ZEPSI0*ZCHI02,ZEPS0)
    ZDELA(JLON,JLEV)=MAX(ZEPSI0*(1.0_JPRB-ZCHI0)**2,ZEPS0)
    ZDLOGM=ZEPSI(JLON,JLEV)-ZDELA(JLON,JLEV)

!     CALCUL DE LA FRACTION ET DE L'INDICE D'ACTIVITE CONVECTIVE.
!     CONVECTIVE FRACTION AND ACTIVITY INDEX COMPUTATION.

    ZSIGMA(JLON,JLEV-1)=IVVER*(EXP(LOG(ZSIGMA(JLON,JLEV))&
     & +PDELP(JLON,JLEV)*(ZDLOGM+IVVER*ZDWNDP(JLON,JLEV)&
     & /MIN(-ZEPS0,PVVERDM(JLON,JLEV)))))&
     & +(1-IVVER)*1.0_JPRB  

    ILEVBAC=IBAC*INIVBAC(JLON,JLEV+1)+(1-IBAC)
    IKUO5=MAX(0,ISIGN(1,ILEVBAC-ILEVTEN(JLON)))
    IKUO6=MAX(NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,ZVVER(JLON,JLEV-1))))&
     & ,NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,ZVVER(JLON,JLEV)))))  

    KNLAB(JLON,JLEV)=IKUO6*IBAC*IKUO5

!    KCIS(JLON,JLEV)=1-KNLAB(JLON,JLEV)*(1-ICDN)
    KCIS(JLON,JLEV)=1
    PQLIC(JLON,JLEV)=PQLIC(JLON,JLEV)*KNLAB(JLON,JLEV)*ICDN

!     CALCULS DEPENDANT DE L'OPTION NEIGE.
!     SNOW OPTION DEPENDENT COMPUTATIONS.

    IF (LNEIGE) THEN
      ZDELTA=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-ZTN(JLON)))
    ELSE
      ZDELTA=0.0_JPRB
    ENDIF

!     VALEURS FINALES DE DETRAINEMENT AVEC APPEL A LA FONCTION DEFINIE
!     POUR REVENIR A LA VERITABLE CHALEUR LATENTE.
!     FINAL DETRAINMENT VALUES WITH A CALL TO THE DEFINED FUNCTION TO
!     COME BACK TO THE TRUE LATENT HEAT.

    ZTD=PT(JLON,JLEV)*(1.0_JPRB+(PQLIC(JLON,JLEV)-RETV*(PQSAT(JLON,JLEV)&
     & -PQ(JLON,JLEV)))/(1.0_JPRB+RETV*PLH(JLON,JLEV)*PQSAT(JLON,JLEV)&
     & /(RV*PT(JLON,JLEV))))  
    IF (LNEIGE) THEN
      ZDELTA=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-ZTD))
    ELSE
      ZDELTA=0.0_JPRB
    ENDIF
    ZEW=FOEW (ZTD,ZDELTA)
    ZESP=ZEW/PAPRSF(JLON,JLEV)
    ZQW=FOQS(ZESP)
    ZTD=ICDN*ZTD+(1-ICDN)*ZTN(JLON)
    ZQW=ICDN*ZQW+(1-ICDN)*ZQN(JLON)
    IF (LNEIGE) THEN
      ZDELTA=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-ZTD))
    ELSE
      ZDELTA=0.0_JPRB
    ENDIF

    INXCIS=KCIS(JLON,JLEV)
    ZQDN(JLON,JLEV)=ZQW+MAX(0.0_JPRB,PQLIC(JLON,JLEV)-PQLIS(JLON,JLEV)*INXCIS)
    ZQN2(JLON,JLEV)=ZQN(JLON)
    ZSDN(JLON,JLEV)=(RCPD+ZCPVMD*ZQW)*ZTD &
     & -FOLH(ZTD,ZDELTA)*MAX(0.0_JPRB,PQLIC(JLON,JLEV)-PQLIS(JLON,JLEV)*INXCIS)&
     & +PAPHIF(JLON,JLEV)  

!     EN CAS DE COUCHE NON CONVECTIVE ON REEGALISE
!     TEMPERATURE ET HUMIDITE DU NUAGE A CELLES DE
!     L'ENVIRONEMENT.

    INUA=KNLAB(JLON,JLEV)

    INIVBAC(JLON,JLEV)=MAX(INIVBAC(JLON,JLEV+1),JLEV)
    INIVBAC(JLON,JLEV)=INUA*INIVBAC(JLON,JLEV)+(1-INUA)*JLEV
    INIVBAC(JLON,JLEV+1)=INUA*INIVBAC(JLON,JLEV+1)

    ZCAPEL(JLON)=INUA*ZCAPEL(JLON)
    ZVVER(JLON,JLEV-1)=INUA*ZVVER(JLON,JLEV-1)

    ZTN(JLON)=INUA*ZTN(JLON)+(1-INUA)*PT(JLON,JLEV)
    ZQN(JLON)=INUA*ZQN(JLON)+(1-INUA)*PQ(JLON,JLEV)
    ZLN(JLON)=INUA*ZLN(JLON)
    ZTNH(JLON)=INUA*ZTNH(JLON)+(1-INUA)*PTW(JLON,JLEV)
    ZQNH(JLON)=INUA*ZQNH(JLON)+(1-INUA)*PQW(JLON,JLEV)

!     TEST DE SATURATION DU NIVEAU HAUT (NIVEAU DE CONDENSATION
!     ATTEINT).

    ICDN=NINT(MAX(0.0_JPRB,SIGN(1.0_JPRB,ZQN(JLON)-PQSAT(JLON,JLEV))))
    INCDN(JLON,JLEV)=INUA*INCDN(JLON,JLEV)+(1-INUA)*JLEV*ICDN

!     PROFIL DE FLUX DE MASSE.
!     MASS FLUX PROFILE.

    ZFORM(JLON,JLEV)=-1.0_JPRB*KNLAB(JLON,JLEV)*ZVVER(JLON,JLEV)&
     & *ZSIGMA(JLON,JLEV)  

!     SOMMATIONS.
!     SUMMATIONS.

    ZFMDQN=0.5_JPRB*ZFORM(JLON,JLEV)&
     &*MAX(0._JPRB,(PQ(JLON,JLEV+1)-PQ(JLON,JLEV)))
    ZFMDSN=0.5_JPRB*ZFORM(JLON,JLEV)&
     &*MIN(0._JPRB,(ZDSE(JLON,JLEV+1)-ZDSE(JLON,JLEV)))
    ZFORMV=0.5_JPRB*(ZFORM(JLON,JLEV+1)+ZFORM(JLON,JLEV))
    ZDELTA1=ZEPSI1(JLON,JLEV+1)*PR(JLON,JLEV+1)*PT(JLON,JLEV+1)&
     & /PAPRSF(JLON,JLEV+1)+ZDELA(JLON,JLEV+1)  
    ZDETT=ZDELTA1*ZFORMV*PDELP(JLON,JLEV+1)
    ZS15(JLON)=ZS15(JLON)+KNLAB(JLON,JLEV+1)*ZCAPE(JLON)
    ZS16(JLON)=ZS16(JLON)-KNLAB(JLON,JLEV+1)&
     & *((1.0_JPRB+RETV*PQ(JLON,JLEV+1))/PCP(JLON,JLEV+1)&
     & *(ZFMDSN+ZFMDS(JLON)-ZDETT &
     & *(ZSDN(JLON,JLEV+1)-ZDSE(JLON,JLEV+1)))&
     & +RETV*PT(JLON,JLEV+1)*(ZFMDQN+ZFMDQ(JLON)&
     & -ZDETT*(ZQDN(JLON,JLEV+1)&
     & -PQ(JLON,JLEV+1))))/PAPRSF(JLON,JLEV+1)  
    ZDPLAB=KNLAB(JLON,JLEV+1)*PDELP(JLON,JLEV+1)
    ZS10(JLON)=ZS10(JLON)+ZDPLAB
    ZS11(JLON)=ZS11(JLON)+ZDPLAB*ABS(PVVERDM(JLON,JLEV+1))
    ZCAPE(JLON)=ZCAPEL(JLON)
    ZFMDQ(JLON)=ZFMDQN
    ZFMDS(JLON)=ZFMDSN
  ENDDO

!     VERIFICATION DE LA PRESENCE D'AU MOINS UN NUAGE LE LONG DU VECTEUR
!     "JLON" ET MODIFICATION SI NECESSAIRE DE ITOP.
!     VERIFICATION OF THE PRESENCE OF AT LEAST ONE CLOUD ALONG THE
!     "JLON" VECTOR AND MODIFICATION OF ITOP IF NECESSARY.

  ISUM=0
  DO JLON=KIDIA,KFDIA
    ISUM=ISUM+KNLAB(JLON,JLEV)
  ENDDO

  IF (ISUM /= 0) THEN
    ITOP=JLEV
  ENDIF
ENDDO

!     ABANDON DU CALCUL EN CAS D'ABSENCE DE CONVECTION. LA SEQUENCE SOUS
!     "IF THEN / ENDIF" NE SERA PAS INDENTEE VU SA LONGUEUR ET SON
!     CARACTERE PARTICULIER (PSEUDO "RETURN").
!     QUITTING IN CASE OF NO CONVECTION EVERYWHERE. THE "IF THEN /
!     ENDIF" ENCOMPASSED SEQUENCE WILL NOT BE INDENTED GIVEN ITS LENGTH
!     AND ITS SPECIAL CHARACTER (PSEUDO "RETURN" STATEMENT).

IF(NPHYREP /= 0 .AND. NPHYREP /= -1) ITOP=KTDIA

IF (ITOP < KLEV+1) THEN

!     SOMMATION AU DERNIER NIVEAU (SOMMET).
!     LAST LEVEL SUMMATION (TOP).

  DO JLON=KIDIA,KFDIA
    ZFORMV=ZFORM(JLON,KTDIA)
    ZDELTA1=ZEPSI1(JLON,KTDIA)*PR(JLON,KTDIA)*PT(JLON,KTDIA)&
     & /PAPRSF(JLON,KTDIA)+ZDELA(JLON,KTDIA)  
    ZDETT=ZDELTA1*ZFORMV*PDELP(JLON,KTDIA)
    ZS15(JLON)=ZS15(JLON)+KNLAB(JLON,KTDIA)*ZCAPE(JLON)
    ZS16(JLON)= ZS16(JLON)-KNLAB(JLON,KTDIA)&
     & *((1.0_JPRB+RETV*PQ(JLON,KTDIA))/PCP(JLON,KTDIA)&
     & *(ZFMDS(JLON)-ZDETT*(ZSDN(JLON,KTDIA)&
     & -ZDSE(JLON,KTDIA)))+RETV*PT(JLON,KTDIA)&
     & *(ZFMDQ(JLON)-ZDETT*(ZQDN(JLON,KTDIA)&
     & -PQ(JLON,KTDIA))))/PAPRSF(JLON,KTDIA)  
    ZDPLAB=KNLAB(JLON,KTDIA)*PDELP(JLON,KTDIA)
    ZS10(JLON)=ZS10(JLON)+ZDPLAB
    ZS11(JLON)=ZS11(JLON)+ZDPLAB*ABS(PVVERDM(JLON,KTDIA))
  ENDDO

!     ------------------------------------------------------------------
!     VI - APPEL DES DOWNDRAFTS.
!         CALL TO DOWNDRAFT COMPUTATION.

  IF(LCVDD) THEN
    CALL ACCVIMPDGY( KIDIA,KFDIA,KLON,ITOP,KLEV,&
     & INCDN,KNLAB,&
     & PALPH,PAPHIF,PAPRS,PAPRSF,&
     & PDELP,PLH,PLNPR,PQ,PQLIC,PQLIS,PQSAT,PQW,&
     & PR,PT,PTW,PU,PV,&
     & ZBETD,ZDELAD,ZFORD,ZQDND,ZQN2D,ZSDND,ZUMD,ZVMD,&
     & INLABD,&
     & 'ACCVIMPD')  
  ENDIF

!*
!     ------------------------------------------------------------------
!     VII - CONDITION DE FERMETURE.

!          CLOSURE ASSUMPTION.

! - TEMPORAIRE(S) 1D .

! ZALF      : FACTEUR DE NORMALISATION POUR "ZFORML".
!            : NORMALIZATION FACTOR FOR "ZFORML".

  ZFDTTAUX=(1.E-3_JPRB/3._JPRB*TSPHY+1.2_JPRB)/1.8_JPRB
  DO JLON=KIDIA,KFDIA
    ZTAUX=1.0_JPRB/(TEQC*PGM(JLON))*ZFDTTAUX&
     & *ZS10(JLON)*ZS10(JLON)/MAX(ZS11(JLON),ZEPS0)  

    ZS15(JLON)=MAX(ZS15(JLON),1.E-3_JPRB)
    ZALF(JLON)=TSPHY*MIN(ZALFX,ZS15(JLON)/MAX(ZEPS4,ZS16(JLON))&
     & /MAX(ZTAUX,ZEPS0))  

    ZS1(JLON)=0.0_JPRB
    ZS3(JLON)=0.0_JPRB
    ZS4(JLON)=0.0_JPRB
    ZS10(JLON)=0.0_JPRB
    ZS11(JLON)=0.0_JPRB
    ZS16(JLON)=0.0_JPRB
    ZS17(JLON)=0.0_JPRB
    ZS18(JLON)=0.0_JPRB
    ZS19(JLON)=0.0_JPRB

  ENDDO

!*
!     ------------------------------------------------------------------
!     VIII - DEUXIEME BOUCLE VERTICALE (VERS LE BAS) SERVANT A RESOUDRE
!     L'ALGORITHME IMPLICITE POUR L'ADVECTION DE SUBSIDENCE
!     COMPENSATOIRE ET A EFFECTUER TOUTES LES SOMMATIONS PONDEREES SUR
!     L'EPAISSEUR DU NUAGE. ON STOCKERA EGALEMENT AU PASSAGE LES VALEURS
!     FINALES PROVISOIRES DE L'HUMIDITE, DE L'ENERGIE STATIQUE SECHE ET
!     DES DEUX COMPOSANTES DU VENT.

!           SECOND VERTICAL LOOP (DOWNWARDS) TO SOLVE THE IMPLICIT
!     ALGORITHM FOR COMPENSATING SUBSIDENCE ADVECTION AND TO DO ALL
!     WEIGHTED SUMS ACROSS THE CLOUD DEPTH. ONE WILL AT THE SAME TIME
!     STORE PROVISIONAL FINAL VALUES FOR HUMIDITY, DRY STATIC ENERGY AND
!     FOR THE TWO WIND COMPONENTS.

! - TEMPORAIRE(S) 2D (1:KLEV) .

! ZFQSC     : VALEUR FINALE DE Q (D'ABORD SUBSIDENCE COMPENSATOIRE).
!            : FINAL Q VALUE (AT FIRST ONLY COMPENSATING SUBSIDENCE).
! ZFQLSC    : VALEUR FINALE DE QL (D'ABORD SUBSIDENCE COMPENSATOIRE).
!            : FINAL QL VALUE (AT FIRST ONLY COMPENSATING SUBSIDENCE).
! ZFQISC    : VALEUR FINALE DE QI (D'ABORD SUBSIDENCE COMPENSATOIRE).
!            : FINAL QI VALUE (AT FIRST ONLY COMPENSATING SUBSIDENCE).
! ZFSSC     : VALEUR FINALE DE S (D'ABORD SUBSIDENCE COMPENSATOIRE).
!            : FINAL S VALUE (AT FIRST ONLY COMPENSATING SUBSIDENCE).
! ZFUSC     : VALEUR FINALE DE U (D'ABORD SUBSIDENCE COMPENSATOIRE).
!            : FINAL U VALUE (AT FIRST ONLY COMPENSATING SUBSIDENCE).
! ZFVSC     : VALEUR FINALE DE V (D'ABORD SUBSIDENCE COMPENSATOIRE).
!            : FINAL V VALUE (AT FIRST ONLY COMPENSATING SUBSIDENCE).

!     ADITIONAL VERTICAL LOOP (UPWARDS) TO MODIFY THE PREVIOUSLY
!     COMPUTED MASS FLUX.

  DO JLEV=KLEV-1,KTDIA,-1
    DO JLON=KIDIA,KFDIA

!     NORMALISATION DE "ZFORM" A LA DIMENSION D'UNE PRESSION.
!     NORMALIZATION OF "ZFORM" TO PRESSURE DIMENSION.

      ZFORT(JLON,JLEV)=MAX(0.0_JPRB,ZFORM(JLON,JLEV)-ZALF(JLON)/TSPHY&
       & *ZFORD(JLON,JLEV))  
      ZFORT(JLON,JLEV)=ZALF(JLON)*ZFORT(JLON,JLEV)
      ZFORM(JLON,JLEV)=ZALF(JLON)*ZFORM(JLON,JLEV)
      ZFORD(JLON,JLEV)=ZALF(JLON)*ZALF(JLON)/TSPHY*ZFORD(JLON,JLEV)

!     PROTECTION CONTRE L'INSTABILITE NON-LINEAIRE QUI PEUT SE
!     SE DECLENCHER OCCASIONELLEMENT MALGRE L'ALGORITHME IMPLICITE.
!     PROTECTION AGAINST NON-LINEAR INSTABILITY THAT CAN OCCASIONALLY
!     APPEAR DESPITE THE IMPLICIT ALGORITHM.

      ZFORT(JLON,JLEV)=MAX(0.0_JPRB,ZFORT(JLON,JLEV+1)+(ZFORT(JLON,JLEV)&
       & -ZFORT(JLON,JLEV+1))/(1.0_JPRB+PRDELP(JLON,JLEV+1)&
       & *MAX(0.0_JPRB,ZFORT(JLON,JLEV)-ZFORT(JLON,JLEV+1))))  
      ZFORM(JLON,JLEV)=MAX(0.0_JPRB,ZFORM(JLON,JLEV+1)+(ZFORM(JLON,JLEV)&
       & -ZFORM(JLON,JLEV+1))/(1.0_JPRB+PRDELP(JLON,JLEV+1)&
       & *MAX(0.0_JPRB,ZFORM(JLON,JLEV)-ZFORM(JLON,JLEV+1))))  
      ZFORD(JLON,JLEV)=MAX(0.0_JPRB,ZFORD(JLON,JLEV+1)+(ZFORD(JLON,JLEV)&
       & -ZFORD(JLON,JLEV+1))/(1.0_JPRB+PRDELP(JLON,JLEV+1)&
       & *MAX(0.0_JPRB,ZFORD(JLON,JLEV)-ZFORD(JLON,JLEV+1))))  

    ENDDO
  ENDDO

!     CAS PARTICULIER DU PREMIER NIVEAU.
!     SPECIAL CASE OF THE FIRST LEVEL.

  DO JLON=KIDIA,KFDIA

!     SOLUTION DU SYSTEME LINEAIRE IMPLICITE PAR SIMPLE ELIMINATION
!     (MATRICE BI-DIAGONALE).
!     STRAIGHTFORWARD ELIMINATION-TYPE SOLUTION OF THE LINEAR SYSTEM
!     (BI-DIAGONAL MATRIX).

! - TEMPORAIRE(S) 1D .

! ZFMDQ     : DEMI FLUX DE MASSE FOIS DELTA DE Q.
!            : HALF THE MASS FLUX TIME THE JUMP IN Q.
! ZFMDQL    : DEMI FLUX DE MASSE FOIS DELTA DE QL.
!            : HALF THE MASS FLUX TIME THE JUMP IN QL.
! ZFMDQI    : DEMI FLUX DE MASSE FOIS DELTA DE QI.
!            : HALF THE MASS FLUX TIME THE JUMP IN QI.
! ZFMDS     : DEMI FLUX DE MASSE FOIS DELTA DE S.
!            : HALF THE MASS FLUX TIME THE JUMP IN S.
! ZFMDU     : DEMI FLUX DE MASSE FOIS DELTA DE U.
!            : HALF THE MASS FLUX TIME THE JUMP IN U.
! ZFMDV     : DEMI FLUX DE MASSE FOIS DELTA DE V.
!            : HALF THE MASS FLUX TIME THE JUMP IN V.

    INXCIS=KCIS(JLON,ITOP)
    PQL(JLON,ITOP)=PQL(JLON,ITOP)*INXCIS
    PQI(JLON,ITOP)=PQI(JLON,ITOP)*INXCIS
    ZFMDQ(JLON)=0.5_JPRB*ZFORT(JLON,ITOP)&
     &*MAX(0._JPRB,(PQ(JLON,ITOP+1)-PQ(JLON,ITOP)))
    ZFMDQL(JLON)=0.5_JPRB*ZFORT(JLON,ITOP)*(PQL(JLON,ITOP+1)-PQL(JLON,ITOP))
    ZFMDQI(JLON)=0.5_JPRB*ZFORT(JLON,ITOP)*(PQI(JLON,ITOP+1)-PQI(JLON,ITOP))
    ZFMDS(JLON)=0.5_JPRB*ZFORT(JLON,ITOP)&
     &*MIN(0._JPRB,(ZDSE(JLON,ITOP+1)-ZDSE(JLON,ITOP)))
    ZFMDU(JLON)=0.5_JPRB*ZFORT(JLON,ITOP)*(PU(JLON,ITOP+1)-PU(JLON,ITOP))
    ZFMDV(JLON)=0.5_JPRB*ZFORT(JLON,ITOP)*(PV(JLON,ITOP+1)-PV(JLON,ITOP))
    ZFQSC(JLON,ITOP)=PQ(JLON,ITOP)-PRDELP(JLON,ITOP)*ZFMDQ(JLON)
    ZFQLSC(JLON,ITOP)=PQL(JLON,ITOP)-PRDELP(JLON,ITOP)*ZFMDQL(JLON)
    ZFQISC(JLON,ITOP)=PQI(JLON,ITOP)-PRDELP(JLON,ITOP)*ZFMDQI(JLON)
    ZFSSC(JLON,ITOP)=ZDSE(JLON,ITOP)-PRDELP(JLON,ITOP)*ZFMDS(JLON)
    ZFUSC(JLON,ITOP)=PU(JLON,ITOP)-PRDELP(JLON,ITOP)*ZFMDU(JLON)
    ZFVSC(JLON,ITOP)=PV(JLON,ITOP)-PRDELP(JLON,ITOP)*ZFMDV(JLON)

!     SOMMATIONS.
!     SUMMATIONS.

    ZDPLAB=KNLAB(JLON,ITOP)*PDELP(JLON,ITOP)
    ZFORMV=-ZFORM(JLON,ITOP)
    ZDELTA1=ZEPSI1(JLON,ITOP)*PR(JLON,ITOP)*PT(JLON,ITOP)&
     & /PAPRSF(JLON,ITOP)+ZDELA(JLON,ITOP)  
    ZDETT=ZDELTA1*ZFORMV*ZDPLAB
    ZS1(JLON)=ZS1(JLON)+ZDETT*ZBET(JLON,ITOP)
    ZS3(JLON)=ZS3(JLON)+ZDPLAB*(ZFUSC(JLON,ITOP)-PU(JLON,ITOP))
    ZS4(JLON)=ZS4(JLON)+ZDPLAB*(ZFVSC(JLON,ITOP)-PV(JLON,ITOP))
! INTEGRALES SUPPLEMENTAIRES POUR UC, VC VARIABLES:
    ZS16(JLON)=ZS16(JLON)+ZDETT*PU(JLON,ITOP)
    ZS17(JLON)=ZS17(JLON)+ZDETT*PV(JLON,ITOP)
    ZS18(JLON)=ZS18(JLON)+ZDETT*(1.0_JPRB-ZBET(JLON,ITOP))*ZUM(JLON,ITOP)
    ZS19(JLON)=ZS19(JLON)+ZDETT*(1.0_JPRB-ZBET(JLON,ITOP))*ZVM(JLON,ITOP)
  ENDDO

!     BOUCLE VERTICALE.
!     VERTICAL LOOP.

  DO JLEV=ITOP+1,KLEV-1
    DO JLON=KIDIA,KFDIA

!     SOLUTION DU SYSTEME LINEAIRE IMPLICITE PAR SIMPLE ELIMINATION
!     (MATRICE BI-DIAGONALE).
!     STRAIGHTFORWARD ELIMINATION-TYPE SOLUTION OF THE LINEAR SYSTEM
!     (BI-DIAGONAL MATRIX).

      INXCIS=KCIS(JLON,JLEV)
      PQL(JLON,JLEV)=PQL(JLON,JLEV)*INXCIS
      PQI(JLON,JLEV)=PQI(JLON,JLEV)*INXCIS
      ZFMDQN=0.5_JPRB*ZFORT(JLON,JLEV)&
       &*MAX(0._JPRB,(PQ(JLON,JLEV+1)-PQ(JLON,JLEV)))
      ZFMDQLN=0.5_JPRB*ZFORT(JLON,JLEV)*(PQL(JLON,JLEV+1)-PQL(JLON,JLEV))
      ZFMDQIN=0.5_JPRB*ZFORT(JLON,JLEV)*(PQI(JLON,JLEV+1)-PQI(JLON,JLEV))
      ZFMDSN=0.5_JPRB*ZFORT(JLON,JLEV)&
       &*MIN(0._JPRB,(ZDSE(JLON,JLEV+1)-ZDSE(JLON,JLEV)))
      ZFMDUN=0.5_JPRB*ZFORT(JLON,JLEV)*(PU(JLON,JLEV+1)-PU(JLON,JLEV))
      ZFMDVN=0.5_JPRB*ZFORT(JLON,JLEV)*(PV(JLON,JLEV+1)-PV(JLON,JLEV))
      ZAUX=1.0_JPRB/(1.0_JPRB+PRDELP(JLON,JLEV)*ZFORT(JLON,JLEV-1))
      ZFQSC(JLON,JLEV)=ZAUX*(PQ(JLON,JLEV)+PRDELP(JLON,JLEV)&
       & *(ZFMDQ(JLON)-ZFMDQN+ZFORT(JLON,JLEV-1)&
       & *ZFQSC(JLON,JLEV-1)))  
      ZFQLSC(JLON,JLEV)=ZAUX*(PQL(JLON,JLEV)+PRDELP(JLON,JLEV)&
       & *(ZFMDQL(JLON)-ZFMDQLN+ZFORT(JLON,JLEV-1)&
       & *ZFQLSC(JLON,JLEV-1)))  
      ZFQISC(JLON,JLEV)=ZAUX*(PQI(JLON,JLEV)+PRDELP(JLON,JLEV)&
       & *(ZFMDQI(JLON)-ZFMDQIN+ZFORT(JLON,JLEV-1)&
       & *ZFQISC(JLON,JLEV-1)))  
      ZFSSC(JLON,JLEV)=ZAUX*(ZDSE(JLON,JLEV)+PRDELP(JLON,JLEV)&
       & *(ZFMDS(JLON)-ZFMDSN+ZFORT(JLON,JLEV-1)&
       & *ZFSSC(JLON,JLEV-1)))  
      ZFUSC(JLON,JLEV)=ZAUX*(PU(JLON,JLEV)+PRDELP(JLON,JLEV)&
       & *(ZFMDU(JLON)-ZFMDUN+ZFORT(JLON,JLEV-1)&
       & *ZFUSC(JLON,JLEV-1)))  
      ZFVSC(JLON,JLEV)=ZAUX*(PV(JLON,JLEV)+PRDELP(JLON,JLEV)&
       & *(ZFMDV(JLON)-ZFMDVN+ZFORT(JLON,JLEV-1)&
       & *ZFVSC(JLON,JLEV-1)))  
      ZFMDQ(JLON)=ZFMDQN
      ZFMDQL(JLON)=ZFMDQLN
      ZFMDQI(JLON)=ZFMDQIN
      ZFMDS(JLON)=ZFMDSN
      ZFMDU(JLON)=ZFMDUN
      ZFMDV(JLON)=ZFMDVN

!     SOMMATIONS.
!     SUMMATIONS.

      ZDPLAB=KNLAB(JLON,JLEV)*PDELP(JLON,JLEV)
      ZFORMV=-0.5_JPRB*(ZFORM(JLON,JLEV)+ZFORM(JLON,JLEV-1))
      ZDELTA1=ZEPSI1(JLON,JLEV)*PR(JLON,JLEV)*PT(JLON,JLEV)&
       & /PAPRSF(JLON,JLEV)+ZDELA(JLON,JLEV)  
      ZDETT=ZDELTA1*ZFORMV*ZDPLAB
      ZDPLABD=INLABD(JLON,JLEV)*PDELP(JLON,JLEV)
      ZFORDV=0.5_JPRB*(ZFORD(JLON,JLEV)+ZFORD(JLON,JLEV-1))
      ZDELTA1=TENTRX*PR(JLON,JLEV)*PT(JLON,JLEV)&
       & /PAPRSF(JLON,JLEV)+ZDELAD(JLON,JLEV)  
      ZDETTD=ZDELTA1*ZFORDV*ZDPLABD
      ZS1(JLON)=ZS1(JLON)+ZDETT*ZBET(JLON,JLEV)+ZDETTD*ZBETD(JLON,JLEV)
      ZS3(JLON)=ZS3(JLON)+ZDPLAB*(ZFUSC(JLON,JLEV)-PU(JLON,JLEV))
      ZS4(JLON)=ZS4(JLON)+ZDPLAB*(ZFVSC(JLON,JLEV)-PV(JLON,JLEV))
! INTEGRALES SUPPLEMENTAIRES POUR UC, VC VARIABLES:
      ZS16(JLON)=ZS16(JLON)+(ZDETT+ZDETTD)*PU(JLON,JLEV)
      ZS17(JLON)=ZS17(JLON)+(ZDETT+ZDETTD)*PV(JLON,JLEV)
      ZS18(JLON)=ZS18(JLON)+ZDETT*(1.0_JPRB-ZBET(JLON,JLEV))&
       & *ZUM(JLON,JLEV)+ZDETTD*(1.0_JPRB-ZBETD(JLON,JLEV))*ZUMD(JLON,JLEV)  
      ZS19(JLON)=ZS19(JLON)+ZDETT*(1.0_JPRB-ZBET(JLON,JLEV))&
       & *ZVM(JLON,JLEV)+ZDETTD*(1.0_JPRB-ZBETD(JLON,JLEV))*ZVMD(JLON,JLEV)  
    ENDDO
  ENDDO

!     CAS PARTICULIER DU DERNIER NIVEAU.
!     SPECIAL CASE OF THE LAST LEVEL.

  DO JLON=KIDIA,KFDIA

!     SOLUTION DU SYSTEME LINEAIRE IMPLICITE PAR SIMPLE ELIMINATION
!     (MATRICE BI-DIAGONALE).
!     STRAIGHTFORWARD ELIMINATION-TYPE SOLUTION OF THE LINEAR SYSTEM
!     (BI-DIAGONAL MATRIX).

    INXCIS=KCIS(JLON,KLEV)
    PQL(JLON,KLEV)=PQL(JLON,KLEV)*INXCIS
    PQI(JLON,KLEV)=PQI(JLON,KLEV)*INXCIS
    ZAUX=1.0_JPRB/(1.0_JPRB+PRDELP(JLON,KLEV)*ZFORT(JLON,KLEV-1))
    ZFQSC(JLON,KLEV)=ZAUX*(PQ(JLON,KLEV)+PRDELP(JLON,KLEV)&
     & *(ZFMDQ(JLON)+ZFORT(JLON,KLEV-1)&
     & *ZFQSC(JLON,KLEV-1)))  
    ZFQLSC(JLON,KLEV)=ZAUX*(PQL(JLON,KLEV)+PRDELP(JLON,KLEV)&
     & *(ZFMDQL(JLON)+ZFORT(JLON,KLEV-1)&
     & *ZFQLSC(JLON,KLEV-1)))  
    ZFQISC(JLON,KLEV)=ZAUX*(PQI(JLON,KLEV)+PRDELP(JLON,KLEV)&
     & *(ZFMDQI(JLON)+ZFORT(JLON,KLEV-1)&
     & *ZFQISC(JLON,KLEV-1)))  
    ZFSSC(JLON,KLEV)=ZAUX*(ZDSE(JLON,KLEV)+PRDELP(JLON,KLEV)&
     & *(ZFMDS(JLON)+ZFORT(JLON,KLEV-1)&
     & *ZFSSC(JLON,KLEV-1)))  
    ZFUSC(JLON,KLEV)=ZAUX*(PU(JLON,KLEV)+PRDELP(JLON,KLEV)&
     & *(ZFMDU(JLON)+ZFORT(JLON,KLEV-1)&
     & *ZFUSC(JLON,KLEV-1)))  
    ZFVSC(JLON,KLEV)=ZAUX*(PV(JLON,KLEV)+PRDELP(JLON,KLEV)&
     & *(ZFMDV(JLON)+ZFORT(JLON,KLEV-1)&
     & *ZFVSC(JLON,KLEV-1)))  

!     SOMMATIONS.
!     SUMMATIONS.

    ZDPLAB=KNLAB(JLON,KLEV)*PDELP(JLON,KLEV)
    ZFORMV=-0.5_JPRB*(ZFORM(JLON,KLEV)+ZFORM(JLON,KLEV-1))
    ZDELTA1=ZEPSI1(JLON,KLEV)*PR(JLON,KLEV)*PT(JLON,KLEV)&
     & /PAPRSF(JLON,KLEV)+ZDELA(JLON,KLEV)  
    ZDETT=ZDELTA1*ZFORMV*ZDPLAB
    ZDPLABD=INLABD(JLON,KLEV)*PDELP(JLON,KLEV)
    ZFORDV=0.5_JPRB*(ZFORD(JLON,KLEV)+ZFORD(JLON,KLEV-1))
    ZDELTA1=TENTRX*PR(JLON,KLEV)*PT(JLON,KLEV)&
     & /PAPRSF(JLON,KLEV)+ZDELAD(JLON,KLEV)  
    ZDETTD=ZDELTA1*ZFORDV*ZDPLABD
    ZS1(JLON)=ZS1(JLON)+ZDETT*ZBET(JLON,KLEV)+ZDETTD*ZBETD(JLON,KLEV)
    ZS3(JLON)=ZS3(JLON)+ZDPLAB*(ZFUSC(JLON,KLEV)-PU(JLON,KLEV))
    ZS4(JLON)=ZS4(JLON)+ZDPLAB*(ZFVSC(JLON,KLEV)-PV(JLON,KLEV))
! INTEGRALES SUPPLEMENTAIRES POUR UC, VC VARIABLES:
    ZS16(JLON)=ZS16(JLON)+(ZDETT+ZDETTD)*PU(JLON,KLEV)
    ZS17(JLON)=ZS17(JLON)+(ZDETT+ZDETTD)*PV(JLON,KLEV)
    ZS18(JLON)=ZS18(JLON)+ZDETT*(1.0_JPRB-ZBET(JLON,KLEV))*ZUM(JLON,KLEV)&
     & +ZDETTD*(1.0_JPRB-ZBETD(JLON,KLEV))*ZUMD(JLON,KLEV)  
    ZS19(JLON)=ZS19(JLON)+ZDETT*(1.0_JPRB-ZBET(JLON,KLEV))*ZVM(JLON,KLEV)&
     & +ZDETTD*(1.0_JPRB-ZBETD(JLON,KLEV))*ZVMD(JLON,KLEV)  
  ENDDO

!*
!     ------------------------------------------------------------------
!     IX - CALCUL DU VENT A LA BASE DU NUAGE.
!            COMPUTATION OF THE WIND AT CLOUD BOTTOM.

  DO JLON=KIDIA,KFDIA
! ZS13 CONTIENT UC0, ZS14 CONTIENT VC0:

    ZS13(JLON)=(-ZS3(JLON)-ZS16(JLON)+ZS18(JLON))/MAX(ZEPS3,-ZS1(JLON))
    ZS14(JLON)=(-ZS4(JLON)-ZS17(JLON)+ZS19(JLON))/MAX(ZEPS3,-ZS1(JLON))

    ZALF(JLON)=ZALF(JLON)/TSPHY
  ENDDO

!*
!     ------------------------------------------------------------------
!     X - CALCUL DES FLUX.
!          FLUX COMPUTATION.

!     FLUX DIFFUSIF D'HUMIDITE ET CHALEUR LATENTE DE FLUX INTERPOLEE.
!     DIFFUSIVE HUMIDITY FLUX AND INTERPOLATED LATENT HEAT OF FLUXES.

  DO JLEV=ITOP,KLEV-1
    DO JLON=KIDIA,KFDIA
      ICDN=MAX(0,-ISIGN(1,-INCDN(JLON,JLEV)))

      PDIFCQ(JLON,JLEV)=ZGDTI*ZFORM(JLON,JLEV)*0.5_JPRB &
       & *(ZFQSC(JLON,JLEV)+ZFQSC(JLON,JLEV+1)&
       & -ZQN2(JLON,JLEV)-ZQN2(JLON,JLEV+1))&
       & -ZGDTI*ZFORD(JLON,JLEV)*0.5_JPRB&
       & *(ZFQSC(JLON,JLEV)+ZFQSC(JLON,JLEV+1)&
       & -ZQN2D(JLON,JLEV)-ZQN2D(JLON,JLEV+1))  

    ENDDO
  ENDDO

!     CALCUL FINAL DES FLUX.
!     FINAL COMPUTATION OF FLUXES.

  DO JLEV=ITOP,KLEV
    DO JLON=KIDIA,KFDIA
      ICDN=MAX(0,-ISIGN(1,-INCDN(JLON,JLEV)))

      ZH=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-PT(JLON,JLEV)))
      ZFORMV=-0.5_JPRB*(ZFORM(JLON,JLEV)+ZFORM(JLON,JLEV-1))
      ZDELTA1=ZEPSI1(JLON,JLEV)*PR(JLON,JLEV)*PT(JLON,JLEV)&
       & /PAPRSF(JLON,JLEV)+ZDELA(JLON,JLEV)  
      ZDETT=ZDELTA1*ZFORMV
      ZFORDV=0.5_JPRB*(ZFORD(JLON,JLEV)+ZFORD(JLON,JLEV-1))
      ZDELTA1=TENTRX*PR(JLON,JLEV)*PT(JLON,JLEV)&
       & /PAPRSF(JLON,JLEV)+ZDELAD(JLON,JLEV)  
      ZDETTD=ZDELTA1*ZFORDV

!     FLUX DIFFUSIFS DE QUANTITE DE MOUVEMENT.
!     DIFFUSIVE MOMENTUM FLUXES.

      PSTRCU(JLON,JLEV)=PSTRCU(JLON,JLEV-1)&
       & -KNLAB(JLON,JLEV)*ZPOID(JLON,JLEV)&
       & *( ZFUSC(JLON,JLEV)-PU(JLON,JLEV)*(1.0_JPRB &
       & -ZDETT)-ZDETT*((1.0_JPRB-ZBET(JLON,JLEV))&
       & *ZUM(JLON,JLEV)+ZBET(JLON,JLEV)*ZS13(JLON)) )&
       & -INLABD(JLON,JLEV)*ZPOID(JLON,JLEV)&
       & *(PU(JLON,JLEV)*ZDETTD-ZDETTD*((1.0_JPRB-ZBETD(JLON,JLEV))&
       & *ZUMD(JLON,JLEV)+ZBETD(JLON,JLEV)*ZS13(JLON)) )  

      PSTRCV(JLON,JLEV)=PSTRCV(JLON,JLEV-1)&
       & -KNLAB(JLON,JLEV)*ZPOID(JLON,JLEV)&
       & *( ZFVSC(JLON,JLEV)-PV(JLON,JLEV)*(1.0_JPRB &
       & -ZDETT)-ZDETT*((1.0_JPRB-ZBET(JLON,JLEV))&
       & *ZVM(JLON,JLEV)+ZBET(JLON,JLEV)*ZS14(JLON)) )&
       & -INLABD(JLON,JLEV)*ZPOID(JLON,JLEV)&
       & *(PV(JLON,JLEV)*ZDETTD-ZDETTD*((1.0_JPRB-ZBETD(JLON,JLEV))&
       & *ZVMD(JLON,JLEV)+ZBETD(JLON,JLEV)*ZS14(JLON)) )  

!     FLUX DIFFUSIFS D'EAU LIQUIDE ET SOLIDE.
!     DIFFUSIVE LIQUID AND SOLID WATER FLUXES.

      IF (LCONDWT) THEN
        PDIFCQL(JLON,JLEV)=PDIFCQL(JLON,JLEV-1)&
         & -KNLAB(JLON,JLEV)*ZPOID(JLON,JLEV)&
         & *(ZFQLSC(JLON,JLEV)-PQL(JLON,JLEV))  
        PDIFCQN(JLON,JLEV)=PDIFCQN(JLON,JLEV-1)&
         & -KNLAB(JLON,JLEV)*ZPOID(JLON,JLEV)&
         & *(ZFQISC(JLON,JLEV)-PQI(JLON,JLEV))  
      ENDIF

!     FLUX D'HUMIDITE (TOTAL ET CONDENSATION).
!     HUMIDITY FLUXES (TOTAL AND CONDENSATION).

      ZFTOTQ=PDIFCQ(JLON,JLEV-1)&
       & +PFCCQL(JLON,JLEV-1)+PFCCQN(JLON,JLEV-1)&
       & -KNLAB(JLON,JLEV)*ZPOID(JLON,JLEV)*(ZFQSC(JLON,JLEV)&
       & -PQ(JLON,JLEV)-ZDETT &
       & *(ZQDN(JLON,JLEV)-PQ(JLON,JLEV)))&
       & +INLABD(JLON,JLEV)*ZPOID(JLON,JLEV)&
       & *ZDETTD*(ZQDND(JLON,JLEV)-PQ(JLON,JLEV))  

      PFCCQL(JLON,JLEV)=(ZFTOTQ-PDIFCQ(JLON,JLEV))*(1.0_JPRB-ZH)&
       &*ICDN+PFCCQL(JLON,JLEV-1)*(1-ICDN) 
      PFCCQN(JLON,JLEV)=(ZFTOTQ-PDIFCQ(JLON,JLEV))*ZH&
       &*ICDN+PFCCQN(JLON,JLEV-1)*(1-ICDN)

!     FLUX DE PRECIPITATION.
!     PRECIPITATION FLUX.

      PNEBC(JLON,JLEV)=MAX(ZEPS0,ICDN*ZALF(JLON)&
       & *0.5_JPRB*(ZSIGMA(JLON,JLEV)+ZSIGMA(JLON,JLEV-1)))  
      ZLNTM=PQLIC(JLON,JLEV)*PNEBC(JLON,JLEV)

      ZLNTPL=MAX(0.0_JPRB,ZLNTM*(1.0_JPRB-ZH)+&
       & (PFCCQL(JLON,JLEV)-PFCCQL(JLON,JLEV-1))&
       & *RG/PDELP(JLON,JLEV)&
       & *TSPHY)*ICDN  

      ZLNTPN=MAX(0.0_JPRB,ZLNTM*ZH+&
       & (PFCCQN(JLON,JLEV)-PFCCQN(JLON,JLEV-1))&
       & *RG/PDELP(JLON,JLEV)&
       & *TSPHY)*ICDN  

      ZZA=ZTCTC(JLON)*MAX(0.0_JPRB,1.0_JPRB-EXP(-(ZLNTPL/(PNEBC(JLON,JLEV) &
       & *ZTCWC))**2))+ZTCAC*ZPLH(JLON)  
      ZTENDL=ZZA*ZLNTPL/(1.0_JPRB+TSPHY*ZZA)

      ZZB=RG/PDELP(JLON,JLEV)*PFPLCN(JLON,JLEV-1)
      ZZTVFC=ZTVFC*(ZLNTPN/PNEBC(JLON,JLEV)*1000._JPRB)**0.2_JPRB
      ZZC=RG/PDELP(JLON,JLEV)*PAPRSF(JLON,JLEV)*ZZTVFC &
       & /(PR(JLON,JLEV)*PT(JLON,JLEV))  
      ZTENDI=-MIN(0.0_JPRB,ZZB-ZZC*ZLNTPN)/(1.0_JPRB+TSPHY*ZZC)

      ZTENDT=(ZTENDL+ZTENDI)*KNLAB(JLON,JLEV)
      ZPLB=ZTENDT*PDELP(JLON,JLEV)/RG+ZPLH(JLON)

      PQLIC(JLON,JLEV)=PQLIC(JLON,JLEV)*ZFQLIC*PNEBC(JLON,JLEV)
      PNEBC(JLON,JLEV)=PNEBC(JLON,JLEV)*ZFNEBC
      PNEBC(JLON,JLEV)=MAX(ZEPS0,MIN(1.-ZEPS0,PNEBC(JLON,JLEV)&
       & *NINT(MAX(0.0_JPRB,-SIGN(1.0_JPRB,-PQLIC(JLON,JLEV))))))  

      ZNEBC=MAX(ZEPS0,ZALF(JLON))
      ZEVAPC=EVAP*SQRT(ZNEBC/FEVAPC)
      ZFONTC=FONT*SQRT(ZNEBC/FEVAPC)

!     EVAPORATION DES PRECIPITATIONS DANS LES COUCHES SOUS-NUAGEUSES.
!     EVAPORATION OF PRECIPITATIONS IN SUB-CLOUD LAYERS.

      IF(RCVEVAP == 1.) THEN
        ZPLHE=(1-KNLAB(JLON,JLEV)*ICDN)&
         & *MAX(0.0_JPRB,(PFPLCL(JLON,JLEV-1)+PFPLCN(JLON,JLEV-1)))  
        ZDELTAQ=PQW(JLON,JLEV)-PQ(JLON,JLEV)
        ZEVA=ZEVAPC*(1.0_JPRB-ZRME(JLON)*(1.0_JPRB-REVGSL))
        ZPLC=SQRT(ZPLHE)-ZEVA*MAX(ZDELTAQ,0.0_JPRB)&
         & *PDELP(JLON,JLEV)/PAPRSF(JLON,JLEV)**2  
        ZPLC=MAX(ZPLC,0.0_JPRB)
        ZPLC=ZPLC**2
        ZCLTEND=(ZPLC-ZPLHE)*RG/PDELP(JLON,JLEV)
        ZTENDCL(JLON,JLEV)=ZCLTEND
        ZTENDCL(JLON,JLEV)=-MIN(ABS(ZDELTAQ/TSPHY),-ZTENDCL(JLON,JLEV))
        ZPLB=(1-KNLAB(JLON,JLEV)*ICDN)*ZPLC&
         & +KNLAB(JLON,JLEV)*ICDN*ZPLB  
      ENDIF

!     CALCULS DE CHANGEMENT DE LA PROPORTION NEIGEUSE (NOUVELLES
!     PRECIPITATIONS GENEREES ET FONTE OU GEL) DANS L'OPTION "NEIGE".

      IF (LNEIGE) THEN
        ZGENN=ZNEIGE(JLON)
        ZGENN=(ZNEIGE(JLON)*ZPLH(JLON)&
         & +ZH*ZTENDT*PDELP(JLON,JLEV)/RG)&
         & /MAX(ZEPS1,(ZPLH(JLON)+ZTENDT*PDELP(JLON,JLEV)/RG))  
        ZHE=ZH*(1.0_JPRB-EXP(-(RTT-PT(JLON,JLEV))**2/(2.0_JPRB*RDT**2)))
        ZGENE=(ZRME(JLON)*ZPLH(JLON)&
         & +ZHE*ZTENDT*PDELP(JLON,JLEV)/RG)&
         & /MAX(ZEPS1,(ZPLH(JLON)+ZTENDT*PDELP(JLON,JLEV)/RG))  
        ZFONT=ZFONTC*(1.0_JPRB-ZRME(JLON)*(1.0_JPRB-REVGSL))
        ZFON=-2.0_JPRB*ZFONT*(PT(JLON,JLEV)-RTT)*PDELP(JLON,JLEV)&
         & /PAPRSF(JLON,JLEV)**2 &
         & /MAX(ZEPS4,SQRT(ZPLB)+SQRT(ZPLH(JLON)))  
        ZGENN=(1-KNLAB(JLON,JLEV)*ICDN)*ZNEIGE(JLON)&
         & +KNLAB(JLON,JLEV)*ICDN*ZGENN  
        ZGENE=(1-KNLAB(JLON,JLEV)*ICDN)*ZRME(JLON)&
         & +KNLAB(JLON,JLEV)*ICDN*ZGENE  
        ZFONS=MAX(0.0_JPRB,MIN(1.0_JPRB,ZGENN))
        ZNEIGE(JLON)=MAX(0.0_JPRB,MIN(1.0_JPRB,ZGENN+ZFON))
        ZFONS=ZNEIGE(JLON)-ZFONS
        ZRME(JLON)=MAX(0.0_JPRB,MIN(1.0_JPRB,ZGENE+ZFON))
      ELSE
        ZNEIGE(JLON)=0.0_JPRB
        ZFONS=0.0_JPRB
      ENDIF

      ZPLH(JLON)=MAX(0.0_JPRB,ZPLH(JLON)+ZTENDT*PDELP(JLON,JLEV)/RG)
      PFHMLTS(JLON,JLEV)=ZFONS*ZPLH(JLON)*(RLSZER-RLVZER)
      PFPLCL(JLON,JLEV)=(1.0_JPRB-ZNEIGE(JLON))*ZPLH(JLON)
      PFPLCN(JLON,JLEV)=ZNEIGE(JLON)*ZPLH(JLON)

!     FLUX D'ENTHALPIE (TOTAL ET DIFFUSIF).
!     ENTHALPY FLUXES (TOTAL AND DIFFUSIVE).

      ZFTOTS=PDIFCS(JLON,JLEV-1)-RLVZER*PFCCQL(JLON,JLEV-1)&
       & -RLSZER*PFCCQN(JLON,JLEV-1)+ZTF(JLON,JLEV-1)*ZCCHSL &
       & *PFPLCL(JLON,JLEV-1)+ZTF(JLON,JLEV-1)*ZCCHSN &
       & *PFPLCN(JLON,JLEV-1)&
       & -KNLAB(JLON,JLEV)*ZPOID(JLON,JLEV)*(ZFSSC(JLON,JLEV)&
       & -ZDSE(JLON,JLEV)-ZDETT*(ZSDN(JLON,JLEV)-ZDSE(JLON,JLEV)))&
       & +INLABD(JLON,JLEV)*ZPOID(JLON,JLEV)&
       & *ZDETTD*(ZSDND(JLON,JLEV)-ZDSE(JLON,JLEV))  

      PDIFCS(JLON,JLEV)=ZFTOTS &
       & +RLVZER*PFCCQL(JLON,JLEV)+RLSZER*PFCCQN(JLON,JLEV)&
       & -ZTF(JLON,JLEV)*ZCCHSL*PFPLCL(JLON,JLEV)&
       & -ZTF(JLON,JLEV)*ZCCHSN*PFPLCN(JLON,JLEV)

      IF(RCVEVAP == 1) THEN
        ZTENDCL(JLON,JLEV)=(1-KNLAB(JLON,JLEV)*ICDN)*ZTENDCL(JLON,JLEV)*PDELP(JLON,JLEV)/RG
        PFPEVPP(JLON,JLEV)=PFPEVPP(JLON,JLEV-1)+ZTENDCL(JLON,JLEV)
        PFHEVPP(JLON,JLEV)=ZH*RLSZER*PFPEVPP(JLON,JLEV)&
         & +(1.0_JPRB-ZH)*RLVZER*PFPEVPP(JLON,JLEV)  
        PFPLCL(JLON,JLEV)=MAX(0.0_JPRB,PFPLCL(JLON,JLEV)+ZTENDCL(JLON,JLEV)*(1.0_JPRB-ZH))
        PFPLCN(JLON,JLEV)=MAX(0.0_JPRB,PFPLCN(JLON,JLEV)+ZTENDCL(JLON,JLEV)*ZH)
      ENDIF

    ENDDO
  ENDDO

!     MISE A ZERO DE TOUS LES RESULTATS EN CAS DE PRECIP
!     CONVECTIVES INFERIEURES A UN SEUIL DONNE.
!     SETTING ALL RESULTS TO ZERO IN CASE OF
!     CONVECTIVE PRECIP LESS THAN A GIVEN THRESHOLD.

  DO JLON=KIDIA,KFDIA
    ZZVAL=PFPLCL(JLON,KLEV)+PFPLCN(JLON,KLEV)-SCO
    KNND(JLON)=MAX(0.0_JPRB,-SIGN(1.0_JPRB,-(ZZVAL)))
  ENDDO

  DO JLEV=ITOP,KLEV
    DO JLON=KIDIA,KFDIA
      ICDN=MAX(0,-ISIGN(1,-(INCDN(JLON,JLEV)-JLEV)))
      KNLAB(JLON,JLEV)=KNND(JLON)*KNLAB(JLON,JLEV)
      PFPLCL(JLON,JLEV)=KNND(JLON)*PFPLCL(JLON,JLEV)
      PFPLCN(JLON,JLEV)=KNND(JLON)*PFPLCN(JLON,JLEV)
      PDIFCQ(JLON,JLEV)=KNND(JLON)*PDIFCQ(JLON,JLEV)
      PDIFCS(JLON,JLEV)=KNND(JLON)*PDIFCS(JLON,JLEV)
      PSTRCU(JLON,JLEV)=KNND(JLON)*PSTRCU(JLON,JLEV)
      PSTRCV(JLON,JLEV)=KNND(JLON)*PSTRCV(JLON,JLEV)
      PFCCQL(JLON,JLEV)=KNND(JLON)*PFCCQL(JLON,JLEV)
      PFCCQN(JLON,JLEV)=KNND(JLON)*PFCCQN(JLON,JLEV)
      PFPEVPP(JLON,JLEV)=KNND(JLON)*PFPEVPP(JLON,JLEV)
      PFHEVPP(JLON,JLEV)=KNND(JLON)*PFHEVPP(JLON,JLEV)
      PQLIC(JLON,JLEV)=KNND(JLON)*PQLIC(JLON,JLEV)
      PNEBC(JLON,JLEV)=MAX(ZEPS0,KNND(JLON)*PNEBC(JLON,JLEV))

      PVVERDM(JLON,JLEV)=KNND(JLON)*PVVERDM(JLON,JLEV)
    ENDDO
  ENDDO

!     RETOUR DU PSEUDO-RETURN D'APRES LA BOUCLE 570.
!     RETURN FROM THE PSEUDO-RETURN SITUATED AFTER LOOP 570.

ENDIF

PFPFPCL(:,:)=PFCCQL(:,:)
PFPFPCN(:,:)=PFCCQN(:,:)
PFPEVPCL(:,:)=0._JPRB
PFPEVPCN(:,:)=0._JPRB

IF (LHOOK) CALL DR_HOOK('ACCVIMPGY',1,ZHOOK_HANDLE)
END SUBROUTINE ACCVIMPGY
