!OPTIONS XOPT(NOEVAL)
SUBROUTINE ACNEBR ( KIDIA,KFDIA,KLON,KTDIAT,KTDIAN,KLEV,&
 !-----------------------------------------------------------------------
 ! - INPUT  2D .
 & PAPHI,PAPHIF,PAPRS,PAPRSF,PLSCPE,PQ,&
 & PQSAT,PR,PT,PU,PV,PRDELP,PDELP,&
 ! - INPUT 1D .
 & PGZ0,PFPLCH,PPBLH,PQS,PTS,&
 ! - OUTPUT 2D .
 & PKTROV,PKUROV,PNBVNO,PNEB,PNEBS,PQICE,PQLI,&
 & PQLIS,&
 ! - LOCK ARGUMENTS .
 & CDLOCK)  

!**** *ACNEBR * - CALCUL DES DIAGNOSTICS NUAGEUX .

!     Sujet.
!     ------
!     - ROUTINE DE CALCUL ACTIF .
!       CALCUL DES DIAGNOSTICS NUAGEUX .
!     - CLOUD DIAGNOSTICS COMPUTATION.

!**   Interface.
!     ----------
!        *CALL* *ACNEBR*

!-----------------------------------------------------------------------
! WARNING: THE ENGLISH VERSION OF VARIABLES' NAME IS TO BE READ IN THE
! "APLPAR" CODE, EXCEPT TO KTDIAT AND KTDIAN.
!-----------------------------------------------------------------------

! -   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.
! KTDIAT     : INDICE DE DEPART DES BOUCLES VERTICALES (1 EN GENERAL)
!              POUR LES CALCULS DE TURBULENCE.
! KTDIAT     : START OF THE VERTICAL LOOP FOR THE TURBUL COMPUTATIONS.
! KTDIAN     : INDICE DE DEPART DES BOUCLES VERTICALES
!              POUR LES CALCULS DE NEBULOSITE.
! KTDIAN     : START OF THE VERTICAL LOOP FOR THE CLOUDINESS COMPUT. .
! KLEV       : DIMENSION VERTICALE DES TABLEAUX "FULL LEVEL".

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

! - 2D (0:KLEV) .

! PAPHI      : GEOPOTENTIEL AUX DEMI-NIVEAUX.
! PAPRS      : PRESSION AUX DEMI-NIVEAUX.

! - 2D (1:KLEV) .

! PAPHIF     : GEOPOTENTIEL AUX NIVEAUX DES COUCHES.
! PAPRSF     : PRESSION AUX NIVEAUX DES COUCHES.
! PLSCPE     : RAPPORT EFECTIF DES L ET CP EN CONDENSATION/EVAPORATION.
! PQ         : HUMIDITE SPECIFIQUE DE LA VAPEUR D'EAU.
! PQSAT      : HUMIDITE SPECIFIQUE DE SATURATION.
! PR         : CONSTANTE DES GAZ POUR L'AIR.
! PRDELP     : INVERSE DE L'EPAISSEUR EN PRESSION DE LA COUCHE.
! PDELP      : EPAISSEUR EN PRESSION DE LA COUCHE.
! PT         : TEMPERATURE.
! PU         : COMPOSANTE EN X DU VENT.
! PV         : COMPOSANTE EN Y DU VENT.

! PFPLCH     : PSEUDO-HISTORICAL ARRAY FOR CONVECTIVE PRECIPITATION (2D).
! PPBLH      : PSEUDO-HISTORICAL ARRAY FOR PBL HEIGHT (1D).

! - 1D (PROGNOSTIQUE) .

! PGZ0       : G FOIS LA LONGUEUR DE RUGOSITE COURANTE.
! PQS        : HUMIDITE SPECIFIQUE DE SURFACE.
! PTS        : TEMPERATURE DE SURFACE.

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

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

! - 2D (1:KLEV) .

! PNEB       : NEBULOSITE PARTIELLE "RADIATIVE".
! PNEBS      : NEBULOSITE STRATIFORME(SCHEMA DE GENERATION STATISTIQUE).
! PQICE      : HUMIDITE SPECIFIQUE SOLIDE "RADIATIVE".
! PQLI       : HUMIDITE SPECIFIQUE LIQUIDE "RADIATIVE".
! PQLIS      : QUANTITE D'EAU LIQUIDE(SCHEMA DE GENERATION STATISTIQUE).

! - 2D (0:KLEV) .

! PKTROV     : COEFFICIENTS D'ECHANGE VERTICAL DE T ET Q EN KG/(M*M*S).
! PKUROV     : COEFFICIENTS D'ECHANGE VERTICAL DE U ET V EN KG/(M*M*S).
! PNBVNO     : FREQUENCE DE BRUNT-VAISALA AU CARRE DIVISEE PAR G FOIS
!              LA DENSITE.

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

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

! COMMON/YOMPHY /
! COMMON/YOMPHY0/
! COMMON/YOMPHY2/
! COMMON/YOMPHY3/
! COMMON/YOMCST /
! COMMON/FCTTRM /

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

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

!     Methode.
!     --------
!        A STATISTICAL SCHEME FOR PREDICTING STRATIFORM CLOUDINESS AND
!        CLOUDY LIQUID WATER CONTENT (J.L. RICARD).
!     Auteur.
!     -------
!        92-01-13, CHRISTIAN CASTEJON ET ELISABETH GERARD.

!     Modifications.
!     --------------
!        96-09, Plus d'annulation de la nebulosite -  J.L. Ricard
!        97-05, diagnostics - J.L. Ricard
!        97-08, PZx variables > Zx, introduce CDLOCK - J.M. Piriou.
!        98-02, Valeurs correctes pour PNBVNO     - I. Beau ; P. Marquet
!        98-02, Valeurs correctes pour ZCTO,ZDD => ZTV,ZRIx - P. Marquet
!        98-02, Correction pour ZDTL : "/PCP -> RKAPPA/PR" - J.L. Ricard
!        98-02, La clef LRAYFM15 + NOVLP15                  - P. Marquet
!        98-02, Utilise ACCOEFK au dessus de KTDIAN         - M. Deque
!        98-02, Utilise un nouveau profil de long. de mlg.  - M. Deque
!        98-02, Nouvelle nebulosite convective (extr ACNEBN)- M. Deque
!        98-08, Nouvelle longueur de melange (LNEBCO+LNEBR) - V. Lorant 
!        02-02, Changement de module pour QSUSX - F. Bouyssel
!        02-10, Change definition of PQLI and PQICE: they become grid-size values - J.M. Piriou.
!        03-03, Remplacement de QSUSX par QSUSXC - F. Bouyssel
!        03-12, Modif ZKE pour cas tres stable (trop forts) - J.F. Gueremy
!                (introduit dans le CY26T1_op4 par Y. Bouteloup)               
!   2003-04-20, M. Bellus: new pseudo-historical arrays PPCCH and PPBLH
!                  (previously contained in PNEBH), removed unused
!                  arguments + cleaning
!   2003-09, M. Tudor: PPCCH -> PFPLCH and dimensioning
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
!        05-03, Introduction de FONICE / fctdoi.h  - F. Bouyssel
!   2007-02, R. Brozkova: externalisation du calcul des nebul. partielles
!        07-10, Use of Louis scheme if ZRI >= ZRICRIT  - P. Marquet/A. Alias
!               Remove KTURB argument - A. Alias
!        08-02, include the code for LMLH - P. Marquet

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

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

USE YOMPHY   , ONLY : LNEIGE   ,LRNUMX   ,LNEBCO   ,LRAY     ,&
 & LRAYFM, LRAYFM15, LMLH
USE YOMPHY0  , ONLY : TYM      ,ALMAV    ,GALP     ,&
 & SENSL    ,TURB     ,VKARMN   ,XNBMAX   ,&
 & EDB      ,EDC      ,EDD      ,USURIC   ,&
 & QSSUSC   ,QSNEBC   ,QSUSXC   ,&
 & AHCLPV   ,RDTFAC   ,&
 & RLMLH1
USE YOMPHY2  , ONLY : NTSHM    ,NTSML    ,TSPHY
USE YOMCST   , ONLY : RG       ,RV       ,RCPV     ,&
 & RETV     ,RCW      ,RCS      ,RLVTT    ,RLSTT    ,&
 & RTT      ,RDT      ,RALPW    ,RBETW    ,RGAMW    ,&
 & RALPS    ,RBETS    ,RGAMS    ,RALPD    ,RBETD    ,&
 & RGAMD    ,RKAPPA  
USE YOERAD   , ONLY : NOVLP
USE YOMRAD15 , ONLY : NOVLP15


IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KLON 
INTEGER(KIND=JPIM),INTENT(IN)    :: KLEV 
INTEGER(KIND=JPIM),INTENT(IN)    :: KIDIA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KFDIA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KTDIAT 
INTEGER(KIND=JPIM),INTENT(IN)    :: KTDIAN 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPHI(KLON,0: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)    :: PLSCPE(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQ(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQSAT(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PR(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PT(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PU(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PV(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRDELP(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDELP(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGZ0(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PFPLCH(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PPBLH(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQS(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTS(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PKTROV(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PKUROV(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PNBVNO(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PNEB(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PNEBS(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PQICE(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PQLI(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PQLIS(KLON,KLEV) 
CHARACTER(LEN=7)  ,INTENT(IN)    :: CDLOCK 
REAL(KIND=JPRB) :: ZA(KLON,KLEV),ZDELTQ(KLON,KLEV),ZDTL(KLON,KLEV)&
 & ,ZGKT(KLON,KLEV),ZGKU(KLON,KLEV),ZIGMAS(KLON,KLEV)&
 & ,ZQ11(KLON,KLEV),ZRI(KLON,KLEV),ZTV(KLON,KLEV)
REAL(KIND=JPRB) :: ZDIFF(KLON),ZDPHI(KLON),ZDVENT(KLON)&
 & ,ZLE(KLON),ZQ1MAX(KLON)&
 & ,ZQ1MIN(KLON),ZRIC(KLON),ZRIH(KLON)&
 & ,ZTTB(KLON)  
REAL(KIND=JPRB) :: ZNBVNO(KLON)
REAL(KIND=JPRB) :: ZHCLPV(KLON),ZGHU2(KLON),ZC2U(KLON),ZC3U(KLON),ZI0(KLON)
REAL(KIND=JPRB) ::              ZGHT2(KLON),ZC2T(KLON),ZC3T(KLON)

#include "fcttrm.h"
#include "fctdoi.h"

!   LOCAL FUNCTIONS
REAL(KIND=JPRB) :: PA, PB, PRF, PRI
REAL(KIND=JPRB) :: FOEXP, FOF0, FOF1, FOF2
REAL(KIND=JPRB) :: FODD, FORF
REAL(KIND=JPRB) :: FOGAMMA
REAL(KIND=JPRB) :: FOSH
REAL(KIND=JPRB) :: FOSM0, FOSM


INTEGER(KIND=JPIM) :: IJLEVM1, IJLEVP1, INIV, INIVN, ITER, JJ, JLEV, JLON

REAL(KIND=JPRB) :: Z2B, Z3B, Z3BCF, ZALPHA, ZB1, ZBETA0, ZBETA1,&
 & ZBETA2, ZBETA3, ZCIS, ZCK, ZCNCP, ZCTO, ZDD, &
 & ZDELTA, ZDI, ZDPHI0, ZDQW, ZDS, ZDT, ZDTETA, &
 & ZEPDELT, ZEPNEBS, ZEPS, ZEPS1, ZEPSQ, ZEW, &
 & ZGALP2, ZGAMMA1, ZGAMMA2, ZGAX1, &
 & ZGAX2, ZGAX3, ZGAX4, ZGAX5, ZGH, ZGHU1, ZGLMT2, &
 & ZGLMU2, ZGLT, ZGLTZ, ZGLU, ZGLUZ, &
 & ZGZ, ZH, ZHE, ZIS, ZKE, ZKH, ZKM, ZLEMAX, &
 & ZLOI, ZLOS, ZQ12, ZQ13, ZQLI, ZQLIC, &
 & ZQSLT, ZQW, ZRESUL, ZRF, ZRFCRIT, ZRICRIT, &
 & ZRLTLU, ZRTI, ZSH, ZSHCRIT, ZSHMAX, &
 & ZSM, ZSMCRIT, ZSTA, ZTL, ZTTBMIN, &
 & ZU, ZZA, ZROSDPHI, ZZDPHI, ZZRTV  
REAL(KIND=JPRB) :: ZGHT1, ZULOUIS, ZTLOUIS
REAL(KIND=JPRB) :: ZS2, ZN2
REAL(KIND=JPRB) :: ZHOOK_HANDLE

! LOCAL REAL SCALARS (LMLH option) :
REAL(KIND=JPRB) :: ZLMCS, ZGLMIN, ZGLMIN2, ZGLINT

!   INTRODUCTION DE FONCTIONS.
!   INTRODUCTION OF FUNCTIONS.

!     FUNCTIONS F0, F1 ET F2 (ASYMETRIQUES)
FOEXP(PA,PB)=EXP(SIGN(1.0_JPRB,PA-PB)*MIN(ABS(PA-PB),100._JPRB))
FOF0(PA,PB)=MAX(0.0_JPRB,SIGN(1.0_JPRB,PA-PB)) -&
 & FOEXP(PA,PB)*MIN(0.0_JPRB,SIGN(1.0_JPRB,PA-PB))  
FOF1(PA,PB)=PA*MAX(0.0_JPRB,SIGN(1.0_JPRB,PA-PB)) -&
 & FOEXP(PA,PB)*MIN(0.0_JPRB,SIGN(1.0_JPRB,PA-PB))  
FOF2(PA,PB)=MAX(0.0_JPRB,SIGN(1.0_JPRB,PA-PB)) -&
 & (2.0_JPRB-PA)*FOEXP(PA,PB)*MIN(0.0_JPRB,SIGN(1.0_JPRB,PA-PB))  

!     FUNCTION RF(RI)
FODD(PRI)=PRI**2+2.0_JPRB*(ZBETA2-ZBETA3/ZBETA1)*PRI+ZBETA2**2
FORF(PRI)=ZBETA1*(PRI+ZBETA2-SQRT(FODD(PRI)))

!     FUNCTION GAMMA(RF)
FOGAMMA(PRF)=MIN(PRF,0.99_JPRB)/(1.0_JPRB-MIN(PRF,0.99_JPRB))

!     FUNCTION SH(RF)
FOSH(PRF)=-MAX(3._JPRB*TYM(2)*(ZGAMMA1-ZGAMMA2*FOGAMMA(PRF)),ZSHCRIT)&
 & *MIN(0.0_JPRB,SIGN(1.0_JPRB,PRF-ZRFCRIT))+&
 & ZSHCRIT*MAX(0.0_JPRB,SIGN(1.0_JPRB,PRF-ZRFCRIT))  

!     FUNCTION SM(RF)
FOSM0(PRF)=TYM(1)/TYM(2)*(ZGAMMA1-TYM(5)-(3._JPRB*TYM(2)&
 & +6._JPRB*TYM(1))/TYM(3)*FOGAMMA(PRF))&
 & /(ZGAMMA1-(ZGAMMA2-3._JPRB*TYM(1)/TYM(3))&
 & *FOGAMMA(PRF))*FOSH(PRF)  
FOSM(PRF)=MAX(FOSM0(PRF),ZSMCRIT)

#include "abor1.intfb.h"

!     CHECK RELIABILITY OF INPUT ARGUMENTS.

IF (LHOOK) CALL DR_HOOK('ACNEBR',0,ZHOOK_HANDLE)
IF(CDLOCK /= 'ACNEBR ') CALL ABOR1('ACNEBR: BAD NUMBER OF ARGUMENTS!')

!*
!     ------------------------------------------------------------------
!     I - DECLARATION DES CONSTANTES.

!         CONSTANTS DECLARATION.

!   OPTIONS DE RECOUVREMENT

!     NOVPL <--  1  RECOUVREMENT MAX-RANDOM (LRNUMX.EQ.TRUE.)
!     NOVPL <--  2  RECOUVREMENT MAX 
!     NOVPL <--  3  RECOUVREMENT RANDOM (LRNUMX.EQ.FALSE)
IF(LRAY) THEN
  IF(LRNUMX) THEN
    NOVLP=1
  ELSE
    NOVLP=3
  ENDIF
ENDIF
IF(LRAYFM) THEN
  IF(NOVLP == 1.OR.NOVLP == 2) THEN
    LRNUMX=.TRUE.
  ELSE
    LRNUMX=.FALSE.
  ENDIF
ENDIF
IF(LRAYFM15) THEN
  IF(NOVLP15 == 1.OR.NOVLP15 == 2) THEN
    LRNUMX=.TRUE.
  ELSE
    LRNUMX=.FALSE.
  ENDIF
ENDIF

!   VALEURS CRITIQUES DE RF, RI, SH, SM ET SH_MAX.
!   CRITICAL VALUES OF RF, RI, SH, SM, ET SH_MAX.

ZGAMMA1=1.0_JPRB/3._JPRB-2.0_JPRB*TYM(1)/TYM(3)
ZGAMMA2=(TYM(4)+6._JPRB*TYM(1))/TYM(3)

ZBETA0=ZGAMMA1+ZGAMMA2-3._JPRB*TYM(1)/TYM(3)
ZBETA1=TYM(2)/2.0_JPRB/TYM(1)*ZBETA0/(ZGAMMA1-TYM(5)&
 & +(6._JPRB*TYM(1)+3._JPRB*TYM(2))/TYM(3))  
ZBETA2=TYM(1)/TYM(2)*(ZGAMMA1-TYM(5))/ZBETA0
ZBETA3=ZGAMMA1/ZBETA0

ZGAX1=TYM(2)*(1.0_JPRB-6._JPRB*TYM(1)/TYM(3))
ZGAX2=-3._JPRB*TYM(2)*(6._JPRB*TYM(1)+TYM(4))
ZGAX3=TYM(1)*(1.0_JPRB-3._JPRB*TYM(5)-6._JPRB*TYM(1)/TYM(3))
ZGAX4=-3._JPRB*TYM(1)*TYM(2)*((TYM(4)-3._JPRB*TYM(2))*(1.0_JPRB-6._JPRB*TYM(1)/ &
 & TYM(3))&
 & -3._JPRB*TYM(5)*(TYM(4)+6._JPRB*TYM(1)))  
ZGAX5=-9._JPRB*TYM(1)*TYM(2)

ZGALP2=GALP*GALP/TURB

ZRFCRIT=ZGAMMA1/(ZGAMMA1+ZGAMMA2)
ZRICRIT=ZRFCRIT*(ZBETA2-ZRFCRIT/2.0_JPRB/ZBETA1)/(ZBETA3-ZRFCRIT)
ZSHCRIT=ZGAX1/(1.0_JPRB-ZGALP2*ZGAX2)
ZSMCRIT=(ZGAX3-ZGALP2*ZGAX4)/(1.0_JPRB-ZGALP2*ZGAX2)/(1.0_JPRB-ZGALP2*ZGAX5)
ZSHMAX=3._JPRB*TYM(2)*(ZGAMMA1+ZGAMMA2)

!   CONSTANTES DE SECURITE ET DE PARAMETRISATION.
!   SECURITY AND PARAMETRIZATION CONSTANTS.

ZEPS=1.E-6_JPRB
ZEPSQ=1.E-10_JPRB
ZEPNEBS=1.E-12_JPRB
ZEPDELT=1.E-12_JPRB
ZEPS1=1.E-04_JPRB

!   ASYMETRIE
!   ASYMETRY

ZZA=1.0_JPRB

!   NOMBRE D'ITERATIONS SUCCESSIVES.
!   NUMBER OF SUCCESSIVE ITERATIONS.

ITER=2
! ZNBVNO    : VALEURS DE PNBVNO(KLEV) PROVENANT DE ACHMT (A PRESERVER)
!            : VALUES OF PNBVNO(KLEV) COMING FROM ACHMT (TO KEEP)
! ZI0 : CUMUL DE PRESSION DANS LA CLP
!     : ACCUMULATED PRESSURE IN THE PBL
DO JLON=KIDIA,KFDIA
  ZNBVNO(JLON)=PNBVNO(JLON,KLEV)
  ZI0(JLON)=0.0_JPRB
ENDDO

!*
!     ------------------------------------------------------------------
!     I bis ACCOEFK SIMPLIFIE AU DESSUS DE KTDIAN.

!     I bis ACCOEFK ABOVE KTDIAN .

!         COMPUTATION OF DERIVED PARAMETERS AND SECURITY CONSTANTS (FOR
!     THE SQUARE OF THE WIND SHEAR).

Z2B=2.0_JPRB*EDB
Z3B=3._JPRB*EDB
Z3BCF=EDB*EDC*VKARMN**2/SQRT(3._JPRB)
ZRLTLU=SQRT(1.5_JPRB*EDD)

ZGLU=RG*ALMAV
ZGLT=ZGLU*ZRLTLU

!     ------------------------------------------------------------------
!     BOUCLE PASSIVE SUR LES NIVEAUX VERTICAUX.

!           PASSIVE LOOP ON VERTICAL LEVELS.

DO JLEV=KTDIAT,KTDIAN-1

!     ------------------------------------------------------------------
!     CALCULS PROPREMENT DITS.

!          EFFECTIVE CALCULATIONS.
  ZGLUZ=ZGLU
  ZGLMU2=ZGLUZ**2
  ZGLTZ=ZGLT
  ZGLMT2=ZGLTZ**2

  DO JLON=KIDIA,KFDIA

!     PROFIL DE LONGUEUR DE MELANGE CONSTANT
!     CONSTANT MIXING LENGTH PROFILE 
    ZGZ=0.5_JPRB*(PAPHIF(JLON,JLEV)+PAPHIF(JLON,JLEV+1))&
     & -PAPHI(JLON,KLEV)+PGZ0(JLON)  
    ZCK=Z3BCF*(ZGLTZ/(VKARMN*ZGZ))**2
    ZDPHI0=PAPHIF(JLON,JLEV)-PAPHIF(JLON,JLEV+1)

!     CISAILLEMENT DE VENT.
!     WIND SHEAR.

    ZCIS=MAX(ZEPS1,(PU(JLON,JLEV)-PU(JLON,JLEV+1))**2 &
     &            +(PV(JLON,JLEV)-PV(JLON,JLEV+1))**2)  
    ZU=SQRT(ZCIS)

!     PRECALCUL DE STABILITE.
!     PRELIMINARY STABILITY COMPUTATION.

    ZDTETA=PR(JLON,JLEV  )*PT(JLON,JLEV  ) &
     &    -PR(JLON,JLEV+1)*PT(JLON,JLEV+1)&
     &    +RKAPPA*ZDPHI0  

!     CALCUL DE STABILITE.
!     STABILITY COMPUTATION.

    ZRTI=2.0_JPRB/(PR(JLON,JLEV)*PT(JLON,JLEV)+PR(JLON,JLEV+1)*PT(JLON,JLEV+1))
    ZSTA=ZDPHI0*ZDTETA*ZRTI
    ZSTA=ZSTA/(1.0_JPRB+MAX(0.0_JPRB,ZSTA)*USURIC/ZCIS)
    ZIS=MAX(0.0_JPRB,SIGN(1.0_JPRB,ZSTA))

!     CALCULS COMMUNS POUR QUANTITE DE MOUVEMENT ET ENERGIE.
!     COMMON COMPUTATIONS FOR MOMENTUM AND ENERGY.

    ZDS=SQRT(ZCIS+EDD*ABS(ZSTA))
    ZDI=1.0_JPRB/(ZU+ZCK*SQRT(ABS(ZSTA)))

!     CALCULS POUR LES COMPOSANTES DU VENT.
!     COMPUTATIONS FOR THE WIND COMPONENTS.

    ZLOS=ZCIS*ZDS/(ZU*ZDS+Z2B*ABS(ZSTA))
    ZLOI=ZU-Z2B*ZSTA*ZDI
    PKUROV(JLON,JLEV)=(ZLOI+ZIS*(ZLOS-ZLOI))*ZGLMU2*PAPRS(JLON,JLEV)&
     &                                      *ZRTI/ZDPHI0**2  

!     CALCULS POUR LA TEMPERATURE ET L'HUMIDITE.
!     COMPUTATIONS FOR TEMPERATURE AND HUMIDITY.

    ZLOS=ZCIS**2/(ZU*ZCIS+Z3B*ABS(ZSTA)*ZDS)
    ZLOI=ZU-Z3B*ZSTA*ZDI
    PKTROV(JLON,JLEV)=(ZLOI+ZIS*(ZLOS-ZLOI))*ZGLMT2*PAPRS(JLON,JLEV)&
     &                                      *ZRTI/ZDPHI0**2  

!     CALCUL DE UN SUR G FOIS LA FREQUENCE DE BRUNT-VAISALA DIVISEE PAR
!     LA DENSITE LE TOUT AU CARRE.
!     COMPUTATION OF ONE OVER G TIME THE BRUNT-VAISALA FREQUENCY DIVIDED
!     BY DENSITY THE WHOLE BEING SQUARED.

    PNBVNO(JLON,JLEV)=ZSTA/(PAPRS(JLON,JLEV)*ZRTI*ZDPHI0)**2
  ENDDO
ENDDO

!       FIN DE ACCOEFK SIMPLIFIE

!*
!     ------------------------------------------------------------------
!     II - INTRODUCTION DE NOUVELLES VARIABLES ET GRADIENTS VERTICAUX.

!          INTRODUCTION OF NEW VARIABLES AND VERTICAL GRADIENTS.

! - TEMPORAIRES 1D.

! ZA        : COEFFICIENT TEL QUE ZA*PDELTQ REPRESENTE L'ECART
!              ALGEBRIQUE A LA SATURATION EN MOYENNE SUR LA MAILLE.
!            : COEFFICIENT SO THAT ZA*PDELTQ REPRESENTS THE ALGEBRIC
!              MEASUREMENT TO THE SATURATION ON THE AVERAGE ON THE
!              GRID-BOX.
! ZDELTQ    : DIFFERENCE ENTRE L'HUMIDITE SPECIFIQUE ET L'HUMIDITE
!              SPECIFIQUE A SATURATION.
!            : DIFFERENCE BETWEEN THE SPECIFIC HUMIDITY AND THE
!              SPECIFIC HUMIDITY AT SATURATION.
! ZDTL      : DERIVEE DE LA TEMPERATURE POTENTIELLE LIQUIDE PAR
!              RAPPORT A LA VERTICALE.
!            : VERTICAL DERIVED TERM OF THE LIQUID POTENTIAL
!              TEMPERATURE.
! ZGKT      : COEFFICIENTS D'ECHANGE VERTICAL DE T ET Q AUX NIVEAUX.
!            : VERTICAL EXCHANGE COEFF. OF T AND Q ON FULL LEVELS.
! ZGKU      : COEFFICIENTS D'ECHANGE VERTICAL DE U ET V AUX NIVEAUX.
!            : VERTICAL EXCHANGE COEFF. OF U AND V ON FULL LEVELS.
! ZIGMAS    : ECART-TYPE DE LA VARIABLE S.
!            : STANDARD DEVIATION OF THE VARIABLE S.
! ZQ11      : MESURE ALGEBRIQUE DE L'ECART A LA COURBE DE SATURATION.
!            : ALGEBRIC MEASUREMENT OF THE DISTANCE TO THE SATURATION
!              CURVE.
! ZRI       : NOMBRE DE RICHARSON "MODIFIE".
!            : "MODIFIED" RICHARDSON NUMBER.
! ZTV       : TEMPERATURE VIRTUELLE.
!            : VIRTUAL TEMPERATURE.

! - TEMPORAIRES 2D.

! ZDIFF     : TERME INTERVENANT DANS L'EXPRESSION DE L'ECART-TYPE DE S
!            : TERM INTERVENING IN THE EXPRESSION OF THE STANDARD
!              DEVIATION OF S.
! ZDPHI     : ECART EN GEOPOTENTIEL ENTRE TROIS COUCHES SUCCESSIVES.
!            : GEOPOTENTIAL DISTANCE BETWEEN THREE SUCCESSIVE FULL
!              LEVELS.
! ZDVENT    : CISAILLEMENT DE VENT.
!            : WIND SHEAR.
! ZLE       : LONGUEUR DE MELANGE.
!            : MIXING LENGTH.
! ZQ1MAX    : VALEUR MAXIMALE DE ZQ11.
!            : MAXIMUM VALUE OF ZQ11.
! ZQ1MIN    : VALEUR MINIMALE DE ZQ11.
!            : MINIMUM VALUE OF ZQ11.
! ZRIC      : NOMBRE DE RICHARDSON "COMPLEMENTAIRE" TENANT COMPTE DES
!              EFFETS DE L'EAU LIQUIDE.
!            : "COMPLEMENTARY" RICHARDSON NUMBER TAKING INTO ACCOUNT
!              THE EFFECTS OF THE LIQUID WATER.
! ZRIH      : NOMBRE DE RICHARDSON "HABITUEL" TENANT COMPTE DES EFFETS
!              DE LA VAPEUR D'EAU.
!            : "USUAL" RICHARDSON NUMBER TAKING INTO ACCOUNT THE
!              EFFECTS OF THE WATER VAPOR.
! ZTTB      : SECOND MEMBRE DE L'EQUATION IMPLICITE.
!            : SECOND MEMBER OF THE IMPLICIT EQUATION.

IF(LNEBCO.AND.AHCLPV < 1.0_JPRB)THEN
  DO JLON=KIDIA,KFDIA
    ZHCLPV(JLON)=PPBLH(JLON)
  ENDDO
ELSE
  DO JLON=KIDIA,KFDIA
    ZHCLPV(JLON)=AHCLPV
  ENDDO
ENDIF

DO JLON=KIDIA,KFDIA
  
  ! HAUTEURS CRITIQUES Z1 ET Z2 POUR LA LONGUEUR DE MELANGE
  ! CRITICAL HEIGHTS FOR MIXING LENGTH
  
  ZGHU2(JLON)=RG*ZHCLPV(JLON)
  ZGHT2(JLON)=RG*ZHCLPV(JLON)
  
  ZGHU1=ZGHU2(JLON)**2/(3._JPRB*ZGHU2(JLON)-6._JPRB*ZGLU/VKARMN)
  ZGHT1=ZGHT2(JLON)**2/(3._JPRB*ZGHT2(JLON)-6._JPRB*ZGLT/VKARMN)
  
  ! COEFFICIENTS DE LA FORMULE CUBIQUE POUR LA LONGUEUR DE MELANGE
  ! COEFFICIENTS FOR MIXING LENGTH
  
  ZC2U(JLON)=-(ZGHU1+ZGHU2(JLON))/(2.0_JPRB*ZGHU1*ZGHU2(JLON))
  ZC2T(JLON)=-(ZGHT1+ZGHT2(JLON))/(2.0_JPRB*ZGHT1*ZGHT2(JLON))
  
  ZC3U(JLON)=1.0_JPRB/(3._JPRB*ZGHU1*ZGHU2(JLON))
  ZC3T(JLON)=1.0_JPRB/(3._JPRB*ZGHT1*ZGHT2(JLON))
  
ENDDO

!-------------------------
! The main vertical loop :
!-------------------------
DO JLEV=KLEV,KTDIAN,-1
!-------------------------
  
  ! INDICE INIVN TESTANT SI LE CALCUL DES PROPRIETES OPTIQUES EST ACTIVE
  ! MAINTENANT INIVN=1 TOUJOURS
  !   KTDIAT <= JLEV <= KTDIAN-1 ---> INIVN=0 
  !   JLEV >= KTDIAN             ---> INIVN=1
  
  INIVN=1-MAX(0,SIGN(1,KTDIAN-JLEV-1))
  
 !- - - - - - - - - - -
  DO JLON=KIDIA,KFDIA
 !- - - - - - - - - - -

!   NOUVELLES VARIABLES.
!   NEW VARIABLES.

    ZTL=PT(JLON,JLEV)
    ZH=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-ZTL))
    ZQW=PQ(JLON,JLEV)
    ZQW=MAX(ABS(ZQW),ZEPSQ)
    ZEW=FOEW(ZTL,ZH)/PAPRSF(JLON,JLEV)
    ZQSLT=FODQS(FOQS(ZEW),ZEW,FODLEW(ZTL,ZH))
    ZA(JLON,JLEV)=1.0_JPRB/(1.0_JPRB+PLSCPE(JLON,JLEV)*ZQSLT)
    ZDD=PLSCPE(JLON,JLEV)-(1.0_JPRB+RETV)*ZTL
    ZCTO=RETV*ZTL
    ZTV(JLON,JLEV)=ZTL+ZCTO*ZQW
    ZDELTQ(JLON,JLEV)=ZQW-PQSAT(JLON,JLEV)
    ZDELTQ(JLON,JLEV)=SIGN(MAX(ABS(ZDELTQ(JLON,JLEV)),ZEPDELT)&
     & ,ZDELTQ(JLON,JLEV))  

!   CALCUL DES GRADIENTS VERTICAUX.
!   COMPUTATION OF VERTICAL GRADIENTS.

!     DA         DA
!     --- = RG * ---
!     DZ         DPHI

!   INDICE INIV TESTANT LE PLUS BAS NIVEAU DU MODELE
!     1 <= JLEV <= KLEV-1      ---> INIV=1 
!     JLEV = KLEV              ---> INIV=0
    INIV=MAX(0,SIGN(1,KLEV-JLEV-1))
    IJLEVM1=MAX(1,JLEV-1)
    IJLEVP1=MIN(KLEV,JLEV+1)

    ZDPHI(JLON)=PAPHIF(JLON,IJLEVM1) &
     &         -PAPHIF(JLON,IJLEVP1)*REAL(  INIV,JPRB)&
     &         -PAPHI (JLON,KLEV   )*REAL(1-INIV,JPRB)  
    ZDQW=PQ(JLON,IJLEVM1) &
     &  -PQ (JLON,IJLEVP1)*REAL(  INIV,JPRB)&
     &  -PQS(JLON        )*REAL(1-INIV,JPRB)  
    ZDT=PT(JLON,IJLEVM1) &
     & -PT (JLON,IJLEVP1)*REAL(  INIV,JPRB)&
     & -PTS(JLON        )*REAL(1-INIV,JPRB)  
    ZDTL(JLON,JLEV)=ZDT+ZDPHI(JLON)*RKAPPA/PR(JLON,JLEV)
    ZDVENT(JLON)= &
     &  (PU(JLON,IJLEVM1)-PU(JLON,IJLEVP1)*REAL(INIV,JPRB))**2 &
     & +(PV(JLON,IJLEVM1)-PV(JLON,IJLEVP1)*REAL(INIV,JPRB))**2  
    ZDVENT(JLON)=MAX(ABS(ZDVENT(JLON)),ZEPSQ)
    ZDIFF(JLON)=ZDQW-ZQSLT*ZDTL(JLON,JLEV)

!*
!     ------------------------------------------------------------------
!     III - CALCUL DE Q1 ET DE SIGMA_S.

!           COMPUTATION OF Q1 AND SIGMA_S.

!   CALCUL DE RIH ET DE RIC.
!   COMPUTATION OF RIH AND RIC.

    ZRIH(JLON)=ZDPHI(JLON)/ZTV(JLON,JLEV)&
     & *(ZDTL(JLON,JLEV)+ZCTO*ZDQW)/ZDVENT(JLON)  
    ZRIC(JLON)=ZDPHI(JLON)/ZTV(JLON,JLEV)* ZA(JLON,JLEV)*ZDD &
     & *ZDIFF(JLON)/ZDVENT(JLON)  

!   CALCUL DE Q1MIN, TTBMIN ET DE LEMAX.
!   COMPUTATION OF Q1MIN, TTBMIN AND LEMAX.

    ZQ1MIN(JLON)=SQRT(3._JPRB)*ZDELTQ(JLON,JLEV)*ABS(ZDQW)&
     & /(ZQW*ABS(ZDIFF(JLON)))  
    ZQ1MIN(JLON)=SIGN(MAX(ABS(ZQ1MIN(JLON)),ZEPS),ZQ1MIN(JLON))
    ZRI(JLON,JLEV)=ZRIH(JLON)+FOF2(ZQ1MIN(JLON),ZZA)*ZRIC(JLON)
    ZRF=FORF(ZRI(JLON,JLEV))
    ZSH=FOSH(ZRF)
    ZTTBMIN=ZQ1MIN(JLON)*SQRT(ZSH)
    ZLEMAX=ABS(ZDELTQ(JLON,JLEV))*ZDPHI(JLON)/SQRT(TYM(4))/RG &
     & /ABS(ZDIFF(JLON))/SQRT(ZSH)/ABS(ZQ1MIN(JLON))  

!   CALCUL DE LONGUEUR DE MELANGE (LE) ET DE TTB.
!   COMPUTATION OF MIXING LENGTH AND TTB.

    ZGZ=0.5_JPRB*(PAPHIF(JLON,JLEV)+PAPHIF(JLON,IJLEVP1))&
     & -PAPHI(JLON,KLEV)+PGZ0(JLON)  

  !- - - - - - - - - - -
    IF (.NOT.LMLH) THEN
  !- - - - - - - - - - -
    ! - - - - - - - - - - - - - - - -
    !  The cubic profile (M. Deque):
    ! - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    !     The maximum for Lmix in the PBL is Z_i/3
    !     with a continous and diferenciable profile
    ! - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    IF(ZGZ > ZGHU2(JLON))THEN
      ZGLUZ=ZGLU
    ELSE
      ZGLUZ=VKARMN*ZGZ*(1.0_JPRB+ZGZ*(ZC2U(JLON)+ZGZ*ZC3U(JLON)))
      ZI0(JLON)=ZI0(JLON)+PDELP(JLON,JLEV)
    ENDIF
    
  !- - - -
    ELSE
  !- - - -
    
    ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    !  Lenderink & Holtslag (QJRMS, vol-130, 3405-3427. Oct. 2004 Part C):
    ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    !   Adapted from a more general formulas published in their paper,
    !   with F(Ri) depending on Ri and with the stable cases included...
    
    !   Hypothesis : F(Ri) = RLMLH1 is constant from z=0 to z=Z_i,
    !                          where Z_i = Top PBL height.
    
    !     => L_int (z, Z_i) = RLMLH1 * z*(Z_i-z)/Z_i
    
    !     The asymptotic laws 1/L_min = 1/ALMAV + 1/(0.5*cn*z)
    !     are set by       : Lmix    = sqrt( L_int**2 + L_min**2 ) 
    
    !     The security        L_min2 = MIN(ALMAV, 0.5*cn*z)
    !     is set by        : Lmix   = MAX(Lmix, L_min2)
    
    !     The constant "cn" is equal to 1/sqrt(3.75)=0.5164
    !     and the tuning parameter RLMLH1 could  typically vary
    !     between 0.25 and 0.6, RLMLH1=0.4 being a good guess.
    !  
    !     The asymptotic value ALMAV=20. is set for "z > Z_i"
    
    !     Close to the surface, L_min vary as 0.5*cn*VKARMN*z
    !     and L_int vary as RLMLH1*z, with a limit for Lmix in
    !     sqrt[ RLMLH1**2 +(0.5*cn*VKARMN)**2 ]*z
    !     \approx RLMLH1*z (because 0.5*cn*VKARMN=0.011 << RLMLH1)
    
    !     The maximum for Lmix in the PBL swithes from Z_i/3
    !     (Deque's formulae) to Z_i/2 with the present formulation.
    
    !     The global control of the vertical profile 
    !     for Lmix is realized by increasing or decreasing
    !     RLMLH1 (greater or lower than 0.4).
    !  
    ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    
    IF(ZGZ > ZGHU2(JLON))THEN
      ZGLUZ=ZGLU
    ELSE
      ZLMCS=0.5_JPRB*0.5164_JPRB
      ZGLMIN=ZGLU/(1.0_JPRB+ZGLU/(ZLMCS*VKARMN*ZGZ))
      ZGLMIN2=min(ZGLU,ZLMCS*VKARMN*ZGZ)
      ZGLINT=RLMLH1*ZGZ*(ZGHU2(JLON)-ZGZ)/ZGHU2(JLON)
      ZGLUZ=max(ZGLMIN2, sqrt(ZGLINT**2+ZGLMIN**2))
      ZI0(JLON)=ZI0(JLON)+PDELP(JLON,JLEV)
    ENDIF
    
  !- - - -
    ENDIF
  !- - - -

    ZLE(JLON)=SENSL*ZGLUZ/RG
    ZLE(JLON)=MIN(ZLE(JLON),ZLEMAX)

    ZTTB(JLON)=ZDELTQ(JLON,JLEV)*ZDPHI(JLON)&
     & /ZLE(JLON)/SQRT(TYM(4))/RG/ABS(ZDIFF(JLON))  
    ZTTB(JLON)=SIGN(MAX(ABS(ZTTB(JLON)),ABS(ZTTBMIN)),ZTTB(JLON))

!   CALCUL DE Q1MAX.
!   COMPUTATION OF Q1MAX.

    ZQ1MAX(JLON)=ZDELTQ(JLON,JLEV)*ZDPHI(JLON)/&
     & (RG*ZLE(JLON)*SQRT(TYM(4)*ZSHCRIT)*ABS(ZDIFF(JLON)))  

!   INITIALISATION DE Q1.
    ZQ11(JLON,JLEV)=0.0_JPRB

! - FIN DE LA BOUCLE HORIZONTALE.
!   END OF THE HORIZONTAL LOOP.

  ENDDO

!   CALCUL DE Q1 PAR ITERATIONS SUCCESSIVES ET CONVERGENCE DE WEGSTEIN.
!   COMPUTATION OF Q1 (SUCCESSIVE ITERATIONS AND WEIGSTEIN CONVERGENCE).

  IF (INIVN == 1) THEN
    DO JJ=1,ITER
      DO JLON=KIDIA,KFDIA
        ZRI(JLON,JLEV)=ZRIH(JLON)+FOF2(ZQ11(JLON,JLEV),ZZA)*ZRIC(JLON)
        ZRF=FORF(ZRI(JLON,JLEV))
        ZQ12=ZTTB(JLON)/SQRT(FOSH(ZRF))
        ZRI(JLON,JLEV)=ZRIH(JLON)+FOF2(ZQ12,ZZA)*ZRIC(JLON)
        ZRF=FORF(ZRI(JLON,JLEV))
        ZQ13=ZTTB(JLON)/SQRT(FOSH(ZRF))
        ZDELTA=(ZQ13-ZQ12)/SIGN(MAX(ABS(ZQ12-ZQ11(JLON,JLEV)),&
         & ZEPS)&
         & ,ZQ12-ZQ11(JLON,JLEV))  
        ZALPHA=1.0_JPRB/SIGN(MAX(ABS(1.0_JPRB-ZDELTA),ZEPS),1.0_JPRB-ZDELTA)
        ZALPHA=1.0_JPRB+(ZALPHA-1.0_JPRB)*MAX(0.0_JPRB,SIGN(1.0_JPRB,ZALPHA-0.5_JPRB-ZEPS))
        ZQ11(JLON,JLEV)=ZQ12+ZALPHA*(ZQ13-ZQ12)
      ENDDO
    ENDDO
  ENDIF

!   DEBUT DE LA BOUCLE HORIZONTALE.
!   BEGINNING OF THE HORIZONTAL LOOP.

  DO JLON=KIDIA,KFDIA
    ZQ11(JLON,JLEV)=SIGN(MAX(ABS(ZQ11(JLON,JLEV))&
     & ,ABS(ZQ1MIN(JLON))),ZQ11(JLON,JLEV))  
    ZQ11(JLON,JLEV)=SIGN(MIN(ABS(ZQ11(JLON,JLEV))&
     & ,ABS(ZQ1MAX(JLON))),ZQ11(JLON,JLEV))  

    ZIGMAS(JLON,JLEV)=ZA(JLON,JLEV)*ZDELTQ(JLON,JLEV)/(2.0_JPRB*ZQ11(JLON,JLEV))

!*
!     ------------------------------------------------------------------
!     IV - CALCUL DES COEFFICIENTS D'ECHANGE VERTICAL ET
!          DE LA FREQUENCE DE BRUNT-VAISALA AUX NIVEAUX DES COUCHES.
!          COMPUTATION OF THE VERTICAL TURBULENT EXCHANGE COEFFICIENTS
!          AND BRUNT-VAISSALA FREQUENCY ON FULL LEVELS.
!     ------------------------------------------------------------------
    
    ZRI(JLON,JLEV)=ZRIH(JLON)&
     &            +ZRIC(JLON)*FOF2(ZQ11(JLON,JLEV),ZZA)*REAL(INIVN,JPRB)
    
    ZRF=FORF(ZRI(JLON,JLEV))*REAL(1-INIVN,JPRB)
    
    IF (ZRI(JLON,JLEV) >= ZRICRIT) THEN
      
      !- - - - - - - - - - - - - - - - - - - - - - -
      !  SCHEMA DE LOUIS POUR LES CAS TRES STABLES
      !  THE LOUIS SCHEME FOR VERY STABLES CASES
      !  (modifications of P. Marquet) :
      !- - - - - - - - - - - - - - - - - - - - - - -
      
      ! CALCUL DE LA LONGUEUR DE MELANGE (NIVEAUX PLEINS).
      ! COMPUTATION OF THE MIXING LENGTH (ON FULL LEVELS).
      
      ZGZ=PAPHIF(JLON,JLEV)-PAPHI(JLON,KLEV)+PGZ0(JLON)
      
      IF(ZGZ > ZGHU2(JLON))THEN
        ZGLUZ=ZGLU
        ZGLTZ=ZGLT
      ELSE
        ZGLUZ=VKARMN*ZGZ*(1._JPRB+ZGZ*(ZC2U(JLON)+ZGZ*ZC3U(JLON)))
        ZGLTZ=VKARMN*ZGZ*(1._JPRB+ZGZ*(ZC2T(JLON)+ZGZ*ZC3T(JLON)))
      ENDIF
      
      ! LE CISAILLEMENT DE VENT (NIVEAUX PLEINS).
      ! COMPUTE THE WIND SHEAR  (ON FULL LEVELS).
      
      ZCIS = SQRT(ZDVENT(JLON))
      
      ! LE RICHARDSON MODIFIE   : Ri_max=1./USURIC (NIVEAUX PLEINS).
      ! THE MODIFIED RICHARDSON : Ri_max=1./USURIC (ON FULL LEVELS).
      
      ZSTA = ZRI(JLON,JLEV)/(1._JPRB+USURIC*ZRI(JLON,JLEV))
      
      ! "g*K" POUR : VENT + TEMPERATURE + HUMIDITE (NIVEAUX PLEINS).
      ! "g*K" FOR    WIND + TEMPERATURE + HUMIDITY (FULL LEVELS).
      
      ZULOUIS = 1._JPRB/(1._JPRB+Z2B*ZSTA/SQRT(1._JPRB+EDD*ZSTA))
      ZTLOUIS = 1._JPRB/(1._JPRB+Z3B*ZSTA*SQRT(1._JPRB+EDD*ZSTA))
      
      ZGKU(JLON,JLEV) = (ZGLUZ)**2*ZCIS*ZULOUIS/ZDPHI(JLON)
      ZGKT(JLON,JLEV) = (ZGLTZ)**2*ZCIS*ZTLOUIS/ZDPHI(JLON)
      
      ! VALEURS "BIDON" POUR LES SORTIES DIAGNOSTIQUES :
      ! "DUMMY" VALUES FOR THE DIAGNOSTIC OUTPUTS :
      
      ZLE(JLON) =  ZGLUZ/RG
      ZKE       = 0._JPRB
      ZSM       = 0._JPRB
      ZSH       = 0._JPRB
      
    ELSE ! ZRI < ZRICRIT
      
      !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      !  SCHEMA DE MELLOR-YAMADA POUR LES CAS INSTABLES/NEUTRE/PEU-STABLES
      !  THE MELLOR-YAMADA SCHEME FOR INSTABLE/NEUTRAL/SLIGHTLY-STABLE CASES
      !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      
      ZSH=(ZTTB(JLON)/ZQ11(JLON,JLEV))**2
      ZSH=MAX(ZSH,ZSHCRIT)
      ZSH=MIN(ZSH,ZSHMAX)*REAL(INIVN,JPRB)+FOSH(ZRF)*REAL(1-INIVN,JPRB)
      ZGH=(ZGAX1-ZSH)/ZGAX2/ZSH
      ZGH=SIGN(MAX(ABS(ZGH),ZEPDELT),ZGH)
      ZKE=ZLE(JLON)*SQRT(ABS(ZRI(JLON,JLEV)/ZGH)*ZDVENT(JLON))*RG/ZDPHI(JLON)
      ZSM=(ZGAX3+ZGAX4*ZGH)/(1.0_JPRB+ZGAX2*ZGH)/(1.0_JPRB+ZGAX5*ZGH)&
       & *REAL(INIVN,JPRB)+FOSM(ZRF)*REAL(1-INIVN,JPRB)
      
      ! Modifications for very stable cases (J.F. Gueremy) :
      ZS2=ZDVENT(JLON)*(RG/ZDPHI(JLON))**2
      ZN2=ZRI(JLON,JLEV)*ZS2
      IF (ZGH < -ZGALP2+ZEPS) THEN
        ZKE=ZLE(JLON)*SQRT(TYM(3)*MAX(ZEPDELT**2,(ZS2*ZSM-ZN2*ZSH)))
      ENDIF
      
      ZKH=ZLE(JLON)*ZKE*ZSH
      ZKM=ZLE(JLON)*ZKE*ZSM
      
      ZGKT(JLON,JLEV)=ZKH*RG
      ZGKU(JLON,JLEV)=ZKM*RG
      
    ENDIF ! test of : ZRI < or > ZRICRIT
    
    PNBVNO(JLON,JLEV)=ZDTL(JLON,JLEV)*PT(JLON,JLEV)/ZDPHI(JLON)&
     &               *(PR(JLON,JLEV)/PAPRSF(JLON,JLEV))**2
    

 !- - - - - - - - - - - - -
  ENDDO ! JLON=KIDIA,KFDIA
 !- - - - - - - - - - - - -

!---------------------------
ENDDO ! JLEV=KLEV,KTDIAN,-1
!---------------------------

!*
!     ------------------------------------------------------------------
!     V - CALCUL DE LA NEBULOSITE ET DE LA QUANTITE D'EAU LIQUIDE
!     DANS LE CAS DE NUAGES STRATIFORMES.

!          COMPUTATION OF THE CLOUDINESS AND THE LIQUID WATER AMOUNT
!     IN CASE OF STRATIFORM CLOUDS.

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

    ZRESUL=MAX(0.0_JPRB,SIGN(1.0_JPRB,ZRICRIT-ZRI(JLON,JLEV)))
    PNEBS(JLON,JLEV)=FOF0(ZQ11(JLON,JLEV),ZZA) *ZRESUL &
     & + MAX(0.0_JPRB,SIGN(1.0_JPRB,ZDELTQ(JLON,JLEV))) *(1.0_JPRB-ZRESUL)  

    PQLIS(JLON,JLEV)=2.0_JPRB*ZIGMAS(JLON,JLEV)&
     & *FOF1(ZQ11(JLON,JLEV),ZZA) *ZRESUL &
     & + ABS(ZA(JLON,JLEV)*ZDELTQ(JLON,JLEV))&
     & * MAX(0.0_JPRB,SIGN(1.0_JPRB,ZDELTQ(JLON,JLEV))) *(1.0_JPRB-ZRESUL)  

    PNEBS(JLON,JLEV)=MAX(ZEPNEBS,MIN(1.0_JPRB-ZEPNEBS,PNEBS(JLON,JLEV)))

    PQLIS(JLON,JLEV)=PQLIS(JLON,JLEV)&
     & *(1.0_JPRB-MAX(0.0_JPRB,SIGN(1.0_JPRB,ZEPNEBS-PNEBS(JLON,JLEV))))  
!*
!     ------------------------------------------------------------------
!     VI - CALCUL DE LA NEBULOSITE TOTALE ET DE LA QUANTITE D'EAU
!     LIQUIDE TOTALE.

!         COMPUTATION OF THE TOTAL CLOUDINESS AND THE TOTAL LIQUID WATER
!     AMOUNT.

    IF(LNEBCO)THEN
      
      ZQLIC=MAX(0.0_JPRB,PFPLCH(JLON,JLEV)-PFPLCH(JLON,JLEV-1))&
       & *PRDELP(JLON,JLEV)*RG*QSSUSC*TSPHY  
      
      ZQLIC=QSUSXC*(1.0_JPRB-EXP(-ZQLIC/QSUSXC))
      
      ZCNCP=MAX(ZEPNEBS,MIN(1.0_JPRB-ZEPNEBS,QSNEBC*ZQLIC))
      
      IF (LRNUMX) THEN
        PNEB(JLON,JLEV)=MAX(PNEBS(JLON,JLEV),ZCNCP)
        ZQLI=MAX(PQLIS(JLON,JLEV),ZQLIC)
      ELSE
        PNEB(JLON,JLEV)=PNEBS(JLON,JLEV)+(1.0_JPRB-PNEBS(JLON,JLEV))*ZCNCP
        ZQLI=PQLIS(JLON,JLEV)+ZQLIC
      ENDIF
      
    ELSE
      
      ZQLI=PQLIS(JLON,JLEV)
      PNEB(JLON,JLEV)=PNEBS(JLON,JLEV)
      
    ENDIF

    PNEB(JLON,JLEV)=MIN(XNBMAX,PNEB(JLON,JLEV))
    ZQLI=ZQLI/PNEB(JLON,JLEV)

    IF (LNEIGE) THEN
      ZHE=FONICE(PT(JLON,JLEV))
      PQLI(JLON,JLEV)=ZQLI*(1.0_JPRB-ZHE)*PNEB(JLON,JLEV)
      PQICE(JLON,JLEV)=ZQLI*ZHE*PNEB(JLON,JLEV)
    ELSE
      PQLI(JLON,JLEV)=ZQLI*PNEB(JLON,JLEV)
      PQICE(JLON,JLEV)=0.0_JPRB
    ENDIF

  ENDDO
ENDDO
!*
!     ------------------------------------------------------------------
!     VII - CALCUL DES COEFFICIENTS D'ECHANGE ET DE LA FREQUENCE DE
!     BRUNT-VAISALA AUX DEMI-NIVEAUX. ATTENTION, IL FAUT UTIILISER
!     LE "ZZDPHI" DEFINI ENTRE DEUX NIVEAUX (CAR LES FLUX SONT DEFINIS
!     AUX DEMI NIVEAUX, COMME DES DIFFERENCES ENTRE DEUX NIVEAUX
!     ADJACENTS). LES "PKxROV" SONT ALORS EGAUX A "Rho*G*Kx/d(Phi)",
!     CES QUANTITES ETANT DIRCTEMENT UTILISABLES DANS ACDIFUS.

!          COMPUTATION OF THE VERTICAL TURBULENT EXCHANGE COEFFICIENTS
!     AND BRUNT-VAISSALA FREQUENCY ON HALF-LEVELS.

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

    PKTROV(JLON,JLEV)=(ZGKT(JLON,JLEV)+ZGKT(JLON,JLEV+1))/2.0_JPRB
    PKUROV(JLON,JLEV)=(ZGKU(JLON,JLEV)+ZGKU(JLON,JLEV+1))/2.0_JPRB
    PNBVNO(JLON,JLEV)=(PNBVNO(JLON,JLEV)+PNBVNO(JLON,JLEV+1))/2.0_JPRB
    ZZDPHI=PAPHIF(JLON,JLEV)-PAPHIF(JLON,JLEV+1)
    ZZRTV=0.5_JPRB*(PR(JLON,JLEV)  *PT(JLON,JLEV)+&
     &              PR(JLON,JLEV+1)*PT(JLON,JLEV+1))  
    ZROSDPHI=PAPRS(JLON,JLEV)/(ZZDPHI*ZZRTV)
    PKTROV(JLON,JLEV)=PKTROV(JLON,JLEV)*ZROSDPHI
    PKUROV(JLON,JLEV)=PKUROV(JLON,JLEV)*ZROSDPHI
  ENDDO
ENDDO

DO JLON=KIDIA,KFDIA
  PNBVNO(JLON,KLEV)=ZNBVNO(JLON)
ENDDO

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