SUBROUTINE ACFLUSO (KIDIA,KFDIA,KLON,KLEV,&
 !-----------------------------------------------------------------------
 ! - INPUT  2D .
 & PAPHI,PAPHIF,PAPRS,PAPRSF,PQ,PT,PU,PV,&
 ! - INPUT  1D .
 & PDPHIT,PDPHIU,PGZ0,PLSM,PQSATS,PRTI,PTS,&
 ! - INPUT  LOGIQUE .
 & LDHMT,&
 ! - OUTPUT 1D .
 & PCD,PCDN,PCDROV,PCE,PCEROV,PCH,PCHROV,&
 & PQCLS,PRHCLS,PTCLS,PUCLS,PVCLS,&
 & PURAF,PVRAF,&
 ! - LOCK ARGUMENTS .
 & CDLOCK)  

!     Sujet.
!     ------

!     - ROUTINE DE CALCUL ACTIF .
!       DETERMINATION DES COEFFICIENTS D'ECHANGE EN SURFACE 
!       SUR LA MER (MEMO)
!     - SI L'OPTION 'HMT' EST SELECTIONNEE :
!          INTERPOLATION DES TEMPERATURES, HUMIDITES (SPECIFIQUES ET
!          RELATIVES) ET VENTS AUX HAUTEURS "METEO"

!     - COMPUTATION SEA SURFACE EXCHANGE COEFFICIENTS (MEMO)
!     - IF THE SWITCH 'HMT' IS ON :
!          TEMPERATURE, MOISTURE (SPECIFIC AND RELATIVE) AND WIND
!          INTERPOLATION AT STANDARD "METEOROLOGICAL" LEVELS

!**   Interface.
!     ----------
!        *CALL* *ACFLUSO*

!-----------------------------------------------------------------------
! 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.
! 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.
! PQ         : HUMIDITE SPECIFIQUE DE LA VAPEUR D'EAU.
! PT         : TEMPERATURE.
! PU         : COMPOSANTE EN X DU VENT.
! PV         : COMPOSANTE EN Y DU VENT.

! - 1D

! PDPHIT     : HAUTEUR D INTERPOLATION POUR T ET Q (EN GEOPOTENTIEL).
! PDPHIU     : HAUTEUR D INTERPOLATION POUR U ET V (EN GEOPOTENTIEL).
! PGZ0       : G FOIS LA LONGUEUR DE RUGOSITE COURANTE.
! PQSATS     : HUMIDITE SPECIFIQUE DE SATURATION EN SURFACE.
! PRTI       : INVERSE DE R*T.
! PTS        : TEMPERATURE DE SURFACE.

! - 1D (GEOGRAPHIQUE) .

! PLSM       : INDICE TERRE/MER.

! - LOGIQUES .

! LDHMT      : CALCULS NECESSAIRES A L'INTERPOLATION AUX HAUTEURS METEO
!              DU VENT, DE LA TEMPERATURE ET DE L'HUMIDITE.

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

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

! PCD        : COEFFICIENT D'ECHANGE EN SURFACE POUR U ET V.
! PCDN       : COEFFICIENT NEUTRE D'ECHANGE EN SURFACE.
! PCDROV     : PCD RENORME EN DENSITE FOIS VITESSE.
! PCE        : COEFFICIENT D'ECHANGE EN SURFACE POUR Q.
! PCEROV     : PCE RENORME EN DENSITE FOIS VITESSE.
! PCH        : COEFFICIENT D'ECHANGE EN SURFACE POUR T.
! PCHROV     : PCH RENORME EN DENSITE FOIS VITESSE.
! PQCLS      : SORTIE DIAGNOSTIQUE DE L'HUMIDITE SPECIFIQUE A HTQ METEO.
! PRHCLS     : SORTIE DIAGNOSTIQUE DE L'HUMIDITE RELATIVE A HTQ METEO.
! PTCLS      : SORTIE DIAGNOSTIQUE DE LA TEMPERATURE A HTQ METEO.
! PUCLS      : SORTIE DIAGNOSTIQUE DU VENT EN X A HUV METEO.
! PVCLS      : SORTIE DIAGNOSTIQUE DU VENT EN Y A HUV METEO.
! PURAF      : SORTIE DIAGNOSTIQUE DU VENT DE RAFALES TURBULENTES EN X
! PVRAF      : SORTIE DIAGNOSTIQUE DU VENT DE RAFALES TURBULENTES EN Y

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

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

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

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

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

!     *fnct_psi*

!     Methode.
!     --------

!     Auteur.
!     -------
!        07-03, J.F. Gueremy d'apres S. Belamari.

!     Modifications.
!     --------------
!      2007-03, P. Marquet : introduction of ZICHCE=1 if LFLCHCE=.TRUE. 
!                            => PCE=PCH as output
!      2007-04, P. Marquet : introduction of NITERFL, LFLWEG
!      2007-10, P. Marquet : NITERFL, LFLWEG, LFLCHCE : definis localement 
!                            pour les tests UDC de octobre 2007 
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
!      2008-03, F. Bouyssel : NITERFL, LFLWEG, LFLCHCE en namelist
!      2008-09, F. Bouyssel : Vectorisation de la routine
!                             Suppression LFLCHCE, LFLWEG. Ajout RFLCHCE
!      2009-02, E. Bazile: Bug correction for wind gust.

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

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

USE YOMPHY   , ONLY : LNEIGE   ,NITERFL
USE YOMCST   , ONLY :       RG       ,RV       ,&
 & RCPD     ,RCPV     ,RETV     ,RCW      ,&
 & RCS      ,RLVTT    ,RLSTT    ,RTT      ,RALPW    ,&
 & RBETW    ,RGAMW    ,RALPS    ,RBETS    ,RGAMS    ,&
 & RALPD    ,RBETD    ,RGAMD  
USE YOMPHY0  , ONLY : VKARMN   ,GCISMIN  ,RFLCHCE
USE YOMPHY1  , ONLY : TMERGL 
USE YOMPHY2  , ONLY : LRAFTUR  ,GZ0RAF   ,FACRAF

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 
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)    :: PQ(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)    :: PDPHIT(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDPHIU(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGZ0(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLSM(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQSATS(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRTI(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTS(KLON) 
LOGICAL           ,INTENT(IN)    :: LDHMT 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCD(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCDN(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCDROV(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCE(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCEROV(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCH(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCHROV(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PQCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PRHCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PTCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PUCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PVCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PURAF(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PVRAF(KLON) 
CHARACTER(LEN=7)  ,INTENT(IN)    :: CDLOCK 

REAL(KIND=JPRB) :: ZCEN(KLON),ZCHN(KLON),ZDELTAQ10N(KLON),ZDELTAT10N(KLON)&
 & ,ZDELTAU10N(KLON),ZDQ(KLON),ZDTH(KLON),ZDU(KLON),ZHT(KLON)&
 & ,ZQ(KLON),ZQSR(KLON),ZT(KLON),ZTS(KLON),ZTSR(KLON),ZUSR(KLON)&
 & ,ZDPHI(KLON),ZCIS(KLON),ZLSM(KLON)

INTEGER(KIND=JPIM) :: JJ,JLON

REAL(KIND=JPRB) :: ZDELTA,ZDQCLS,ZDTCLS,ZDUCLS,ZEPS,ZEPS1,ZEW,ZLMO&
 & ,ZLMOMAX,ZLMOMIN,ZLMOTCLS,ZLMOUCLS,ZLOGHS10,ZPCLS,ZPSI_T&
 & ,ZPSI_U,ZQSR1,ZQSR2,ZSCRAF,ZTSR1,ZTSR2,ZUSR1,ZUSR2,ZICHCE&
 & ,ZCHIK,ZPSIK,ZPSIKU,ZPSIKT,ZCHIC,ZPSIC,ZPIS2,ZPI,ZSQR3

REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "fcttrm.h"

!     CHECK RELIABILITY OF INPUT ARGUMENTS.

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

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

!         AUXILIARY CONSTANTS.

ZEPS    = 1.E-12_JPRB
ZEPS1   = 1.E-04_JPRB
ZLMOMAX = 0.25_JPRB
ZLMOMIN = -200._JPRB
ZPIS2   = 2.0_JPRB * ATAN(1.0_JPRB)
ZPI     = 2.0_JPRB * ZPIS2
ZSQR3   = SQRT(3.0_JPRB)
ZICHCE  = RFLCHCE

!         INITIALISATIONS BEFORE ITERATIVE LOOP.

DO JLON=KIDIA,KFDIA
  ZLSM (JLON) = PLSM(JLON) + ( 1.0_JPRB - PLSM(JLON) ) &
              & * MAX(0.0_JPRB, SIGN(1.0_JPRB,TMERGL-PTS(JLON)) )
  ZDPHI(JLON) = PAPHIF(JLON,KLEV) - PAPHI(JLON,KLEV)
  ZCIS (JLON) = PU(JLON,KLEV)**2 + PV(JLON,KLEV)**2 &
              & + ( GCISMIN * ZDPHI(JLON) / RG )**2
  ZDU  (JLON) = SQRT( ZCIS(JLON) )
  ZT   (JLON) = PT(JLON,KLEV) - RTT
  ZTS  (JLON) = PTS(JLON)     - RTT
  ZQ   (JLON) = PQ(JLON,KLEV)
  ZHT  (JLON) = ( PAPHIF(JLON,KLEV) - PAPHI(JLON,KLEV) ) / RG
  ZDQ  (JLON) = ZQ(JLON) - PQSATS(JLON)
  ZDTH (JLON) = ZT(JLON) - ZTS(JLON) + ZHT(JLON) * RG / RCPD
  ZUSR (JLON) = 0.04_JPRB * ZDU (JLON)
  ZTSR (JLON) = 0.04_JPRB * ZDTH(JLON)
  ZQSR (JLON) = 0.04_JPRB * ZDQ (JLON)
  ZDELTAU10N(JLON) = ZDU (JLON)
  ZDELTAT10N(JLON) = ZDTH(JLON)
  ZDELTAQ10N(JLON) = ZDQ (JLON)
ENDDO

!         ITERATIVE LOOP TO COMPUTE U*, T*, Q*.

DO JJ=1,NITERFL
  DO JLON=KIDIA,KFDIA

    !cdir iexpand(FNCT_PSI)
    ZUSR1=ZUSR(JLON)
    ZTSR1=ZTSR(JLON)
    ZQSR1=ZQSR(JLON)
    ! Neutral coefficient for wind speed cdn
    IF (ZDELTAU10N(JLON) <= 16.8_JPRB) THEN
      PCDN(JLON) = (-2.2261E-07_JPRB * ZDELTAU10N(JLON)**3) &
               & + ( 1.3067E-05_JPRB * ZDELTAU10N(JLON)**2) &
               & + (-1.2719E-04_JPRB * ZDELTAU10N(JLON)   ) &
               & + ( 1.3013E-03_JPRB                      )
    ELSEIF (ZDELTAU10N(JLON) <= 50._JPRB) THEN
      PCDN(JLON) = ( 4.2684E-09_JPRB * ZDELTAU10N(JLON)**4) &
               & + (-4.8208E-07_JPRB * ZDELTAU10N(JLON)**3) &
               & + ( 1.6212E-05_JPRB * ZDELTAU10N(JLON)**2) &
               & + (-0.00013056_JPRB * ZDELTAU10N(JLON)   ) &
               & + (  0.0013633_JPRB                      )
    ELSE
      PCDN(JLON) = 1.7828E-3_JPRB
    ENDIF
    ! Neutral coefficient for temperature chn
    IF (ZDELTAU10N(JLON) <= 33._JPRB) THEN
      ZCHN(JLON) = (     3.5763E-12_JPRB * ZDELTAU10N(JLON)**5) &
               & + (     3.4517E-09_JPRB * ZDELTAU10N(JLON)**4) &
               & + (-0.00043701E-03_JPRB * ZDELTAU10N(JLON)**3) &
               & + (   0.016038E-03_JPRB * ZDELTAU10N(JLON)**2) &
               & + (   -0.12455E-03_JPRB * ZDELTAU10N(JLON)   ) &
               & + (     1.2536E-03_JPRB                      )
    ELSE
      ZCHN(JLON) = 3.1374E-3_JPRB
    ENDIF
    ! Neutral coefficient for humidity cen
    IF (ZDELTAU10N(JLON) <= 29._JPRB) THEN
      ZCEN(JLON) = ( 5.0864E-09_JPRB * ZDELTAU10N(JLON)**4) &
               & + (-3.9144E-07_JPRB * ZDELTAU10N(JLON)**3) &
               & + ( 1.1467E-05_JPRB * ZDELTAU10N(JLON)**2) &
               & + (-0.00011384_JPRB * ZDELTAU10N(JLON)   ) &
               & + (  0.0012687_JPRB                      )  
    ELSEIF (ZDELTAU10N(JLON) <= 33._JPRB) THEN
      ZCEN(JLON) = (-2.6995E-06_JPRB * ZDELTAU10N(JLON)**2) &
               & + ( 1.8229E-04_JPRB * ZDELTAU10N(JLON)   ) &
               & + (-1.3526E-03_JPRB                      )  
    ELSE
      ZCEN(JLON) = 1.7232E-03_JPRB
    ENDIF
    ZUSR2=SQRT(PCDN(JLON))*ZDELTAU10N(JLON)
    ZTSR2= ZCHN(JLON)/SQRT(PCDN(JLON))*ZDELTAT10N(JLON)
    ZQSR2=(ZCEN(JLON)*(1.0_JPRB-ZICHCE)+ZCHN(JLON)*ZICHCE)&
     & /SQRT(PCDN(JLON))*ZDELTAQ10N(JLON)  
    ZLMO=RG*VKARMN*ZHT(JLON)*(ZTSR2*(1.0_JPRB+RETV*ZQ(JLON))+RETV&
     & *(ZT(JLON)+RTT)*ZQSR2)/((ZT(JLON)+RTT)*(1.0_JPRB+RETV*ZQ(JLON))&
     & *ZUSR2*ZUSR2)  
    ZLMO=MAX(MIN(ZLMO,ZLMOMAX),ZLMOMIN)
    IF (ZLMO == 0._JPRB) THEN
      ZPSI_U = 0._JPRB
      ZPSI_T = 0._JPRB
    ELSEIF (ZLMO > 0._JPRB) THEN
      ZPSI_U = -7.0_JPRB*ZLMO
      ZPSI_T = -7.0_JPRB*ZLMO
    ELSE
      ZCHIK = (1.0_JPRB-16.0_JPRB*ZLMO)**0.25_JPRB
      ZPSIKU = 2.0_JPRB*LOG((1.0_JPRB+ZCHIK)/2.0_JPRB) &
          & +LOG((1.0_JPRB+ZCHIK**2)/2.0_JPRB)      &
          & -2.0_JPRB*ATAN(ZCHIK)+ZPIS2
      ZPSIKT = 2.0_JPRB*LOG((1.0_JPRB+ZCHIK**2)/2.0_JPRB)
      ZCHIC = (1.0_JPRB-12.87_JPRB*ZLMO)**0.333_JPRB
      ZPSIC = 1.5_JPRB*LOG((ZCHIC**2+ZCHIC+1.0_JPRB)/3.0_JPRB) &
          & -ZSQR3*ATAN((2.0_JPRB*ZCHIC+1.0_JPRB)/ZSQR3)+ZPI/ZSQR3
      ZPSI_U = ZPSIC+(ZPSIKU-ZPSIC)/(1.0_JPRB+ZLMO**2)
      ZPSI_T = ZPSIC+(ZPSIKT-ZPSIC)/(1.0_JPRB+ZLMO**2)
    ENDIF
    ZLOGHS10=LOG(ZHT(JLON)/10._JPRB)
    ZDELTAU10N(JLON)=ZDU (JLON)-ZUSR2*(ZLOGHS10-ZPSI_U)/VKARMN
    ZDELTAT10N(JLON)=ZDTH(JLON)-ZTSR2*(ZLOGHS10-ZPSI_T)/VKARMN
    ZDELTAQ10N(JLON)=ZDQ (JLON)-ZQSR2*(ZLOGHS10-ZPSI_T)/VKARMN
    ZUSR(JLON)=ZUSR2
    ZTSR(JLON)=ZTSR2
    ZQSR(JLON)=ZQSR2

  ENDDO
ENDDO

!         COMPUTATION OF EXCHANGE COEFFICIENTS AND VARIABLES AT
!         STANDARD "METEOROLOGICAL" LEVELS.

DO JLON=KIDIA,KFDIA
  PCD(JLON)=ZLSM(JLON)*PCD(JLON)&
   & +(1.0_JPRB-ZLSM(JLON))*(ZUSR(JLON)/ZDU(JLON))**2  
  PCH(JLON)=ZLSM(JLON)*PCH(JLON)&
   & +(1.0_JPRB-ZLSM(JLON))* ZUSR(JLON)*ZTSR(JLON)/(ZDU(JLON)*ZDTH(JLON))  
  PCE(JLON)=ZLSM(JLON)*PCH(JLON)&
   & +(1.0_JPRB-ZLSM(JLON))*(ZUSR(JLON)*ZQSR(JLON)/(ZDU(JLON)*ZDQ(JLON)) &
   & *(1.0_JPRB-ZICHCE)+PCH(JLON)*ZICHCE)  
  PCDROV(JLON)=ZLSM(JLON)*PCDROV(JLON)&
   & +(1.0_JPRB-ZLSM(JLON))* PCD(JLON)*ZDU(JLON) &
   & *PAPRS(JLON,KLEV)*PRTI(JLON)  
  PCHROV(JLON)=ZLSM(JLON)*PCHROV(JLON)&
   & +(1.0_JPRB-ZLSM(JLON))* PCH(JLON)*ZDU(JLON) &
   & *PAPRS(JLON,KLEV)*PRTI(JLON)  
  PCEROV(JLON)=ZLSM(JLON)*PCHROV(JLON)&
   & +(1.0_JPRB-ZLSM(JLON))*(PCE(JLON)*ZDU(JLON) &
   & *PAPRS(JLON,KLEV)*PRTI(JLON) &
   & *(1.0_JPRB-ZICHCE)+PCHROV(JLON)*ZICHCE)  

  IF (LDHMT) THEN
    ZLMOUCLS=VKARMN*PDPHIU(JLON)*(ZTSR(JLON)*(1.0_JPRB+RETV*ZQ(JLON))+RETV&
     & *(ZT(JLON)+RTT)*ZQSR(JLON))/((ZT(JLON)+RTT)*(1.0_JPRB+RETV*ZQ(JLON))&
     & *ZUSR(JLON)*ZUSR(JLON))  
    ZLMOTCLS=ZLMOUCLS*PDPHIT(JLON)/PDPHIU(JLON)
    ZLMOUCLS=MAX(MIN(ZLMOUCLS,ZLMOMAX),ZLMOMIN)
    ZLMOTCLS=MAX(MIN(ZLMOTCLS,ZLMOMAX),ZLMOMIN)
    IF (ZLMOUCLS == 0._JPRB) THEN
      ZPSI_U = 0._JPRB
    ELSEIF (ZLMOUCLS > 0._JPRB) THEN
      ZPSI_U = -7.0_JPRB*ZLMOUCLS
    ELSE
      ZCHIK = (1.0_JPRB-16.0_JPRB*ZLMOUCLS)**0.25_JPRB
      ZPSIK = 2.0_JPRB*LOG((1.0_JPRB+ZCHIK)/2.0_JPRB) &
          & +LOG((1.0_JPRB+ZCHIK**2)/2.0_JPRB)      &
          & -2.0_JPRB*ATAN(ZCHIK)+ZPIS2
      ZCHIC = (1.0_JPRB-12.87_JPRB*ZLMOUCLS)**0.333_JPRB
      ZPSIC = 1.5_JPRB*LOG((ZCHIC**2+ZCHIC+1.0_JPRB)/3.0_JPRB) &
          & -ZSQR3*ATAN((2.0_JPRB*ZCHIC+1.0_JPRB)/ZSQR3)+ZPI/ZSQR3
      ZPSI_U = ZPSIC+(ZPSIK-ZPSIC)/(1.0_JPRB+ZLMOUCLS**2)
    ENDIF
    IF (ZLMOTCLS == 0._JPRB) THEN
      ZPSI_T = 0._JPRB
    ELSEIF (ZLMOTCLS > 0._JPRB) THEN
      ZPSI_T = -7.0_JPRB*ZLMOTCLS
    ELSE
      ZCHIK = (1.0_JPRB-16.0_JPRB*ZLMOTCLS)**0.25_JPRB
      ZPSIK = 2.0_JPRB*LOG((1.0_JPRB+ZCHIK**2)/2.0_JPRB)
      ZCHIC = (1.0_JPRB-12.87_JPRB*ZLMOTCLS)**0.333_JPRB
      ZPSIC = 1.5_JPRB*LOG((ZCHIC**2+ZCHIC+1.0_JPRB)/3.0_JPRB) &
          & -ZSQR3*ATAN((2.0_JPRB*ZCHIC+1.0_JPRB)/ZSQR3)+ZPI/ZSQR3
      ZPSI_T = ZPSIC+(ZPSIK-ZPSIC)/(1.0_JPRB+ZLMOTCLS**2)
    ENDIF
    ZLOGHS10=LOG(PDPHIU(JLON)/10._JPRB/RG)
    ZDUCLS=ZDELTAU10N(JLON)+ZUSR(JLON)*(ZLOGHS10-ZPSI_U)/VKARMN
    PUCLS(JLON)=ZLSM(JLON)*PUCLS(JLON)&
     & +(1.0_JPRB-ZLSM(JLON))*PU(JLON,KLEV)*ZDUCLS/ZDU(JLON)  
    PVCLS(JLON)=ZLSM(JLON)*PVCLS(JLON)&
     & +(1.0_JPRB-ZLSM(JLON))*PV(JLON,KLEV)*ZDUCLS/ZDU(JLON)  
    ZLOGHS10=LOG(PDPHIT(JLON)/10._JPRB/RG)
    ZDTCLS=ZDELTAT10N(JLON)+ZTSR(JLON)*(ZLOGHS10-ZPSI_T)/VKARMN
    PTCLS(JLON)=ZLSM(JLON)*PTCLS(JLON)&
     & +(1.0_JPRB-ZLSM(JLON))*(ZDTCLS+PTS(JLON)-PDPHIT(JLON)/RCPD)  
    ZDQCLS=ZDELTAQ10N(JLON)+ZQSR(JLON)*(ZLOGHS10-ZPSI_T)/VKARMN
    PQCLS(JLON)=ZLSM(JLON)*PQCLS(JLON)&
     & +(1.0_JPRB-ZLSM(JLON))*(ZDQCLS+PQSATS(JLON))  
    IF (LNEIGE) THEN
      ZDELTA=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-PTCLS(JLON)))
    ELSE
      ZDELTA=0.0_JPRB
    ENDIF
    ZPCLS=PAPRS(JLON,KLEV)+PDPHIT(JLON)/(RG*ZHT(JLON))&
     & *(PAPRSF(JLON,KLEV)-PAPRS(JLON,KLEV))  
    ZEW= FOEW (PTCLS(JLON),ZDELTA)
    PRHCLS(JLON)=ZLSM(JLON)*PRHCLS(JLON)&
     & +(1.0_JPRB-ZLSM(JLON))*(ZPCLS*PQCLS(JLON)*(RETV+1.0_JPRB))&
     & /(ZEW*(1.0_JPRB+RETV*PQCLS(JLON)))  
  ENDIF

ENDDO

!         GUSTINESS.

IF (LRAFTUR) THEN
  DO JLON=KIDIA,KFDIA
    ZSCRAF=(PCD(JLON)*(PU(JLON,KLEV)**2+PV(JLON,KLEV)**2)/ &
     & MAX(ZEPS1,PUCLS(JLON)**2+PVCLS(JLON)**2))/ &
     & (1.0_JPRB+(LOG(1.0_JPRB+PDPHIU(JLON)/GZ0RAF)/ &
     & LOG(1.0_JPRB+PDPHIU(JLON)/PGZ0(JLON)))**2)  
    ZSCRAF=1.0_JPRB+FACRAF*SQRT(ZSCRAF)
    PURAF(JLON)=ZLSM(JLON)*PURAF(JLON)&
     & +(1.0_JPRB-ZLSM(JLON))*ZSCRAF*PUCLS(JLON)  
    PVRAF(JLON)=ZLSM(JLON)*PVRAF(JLON)&
     & +(1.0_JPRB-ZLSM(JLON))*ZSCRAF*PVCLS(JLON)  
  ENDDO
ENDIF

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

