!OPTIONS XOPT(NOEVAL)
SUBROUTINE ACHMTTL ( KIDIA,KFDIA,KLON,KTDIA,KLEV,&
 !-----------------------------------------------------------------------
 ! - TRAJECTORY .
 & PAPHI5,PAPHIF5,PAPRS5,PAPRSF5,PCP5,PQ5,PR5,PT5,&
 & PU5,PV5,PGZ0F5,PHV5,&
 & PNEIJG5,PNEIJV5,PSNS5,PTS5,PWS5,PWSI5,&
 ! - INPUT  2D .
 & PAPHI,PAPHIF,PAPRS,PAPRSF,PCP,PQ,PR,PT,PU,PV,&
 ! - INPUT  1D .
 & PDPHIT,PDPHIV,PGZ0F,PGZ0HF,PGZ0RLF,PHV,PLSM,&
 & PNEIJG,PNEIJV,PSNS,PTS,PVEG0,PWFC,PWS,PWSI,&
 ! - INPUT  LOGIQUE .
 & LDCLS,LDHMT,LDZ0H,&
 ! - OUTPUT 2D .
 & PNBVNO,&
 ! - OUTPUT 1D .
 & PCD,PCDN,PCDROV,PCH,PCHROV,PCPS,PDQSTS,PGWDCS,&
 & PGZ0,PHQ,PHU,PNEIJ,PQCLS,PQS,PQSATS,&
 & PRHCLS,PRS,PSTAB,PTCLS,PUCLS,PVCLS,PUCLN,PVCLN,PZPCLS,PVEG,&
 & PXDROV,PXHROV,&
 ! - OUTPUT .
 & PNBVNO5,&
 & PCD5,PCDN5,PCDROV5,PCH5,PCHROV5,PCPS5,PDQSTS5,&
 & PGWDCS5,&
 & PGZ05,PHQ5,PHU5,PNEIJ5,PQCLS5,PQS5,PQSATS5,&
 & PRHCLS5,PRS5,PTCLS5,PUCLS5,PVCLS5,PZPCLS5,PVEG5,&
 & PXDROV5,PXHROV5,&
 ! - LOCK ARGUMENTS .
 & CDLOCK)  

!**** *ACHMTTL   * - DETERMINATION DES CARACTERISTIQUES DE SURFACE.
!**** *ACHMTTL   * - INTERP. DES PARAMETRES U,V,T,Q AUX HAUTEURS CHOISIES.

!     Sujet.
!     ------

!     - ROUTINE DE CALCUL ACTIF .
!       DETERMINATION DE CARACTERISTIQUES DE SURFACE CONCERNANT LA
!       NEIGE, L'HUMIDITE DU SOL ET LES COEFFICIENTS D'ECHANGE EN
!       SURFACE PLUS LEUR AMPLIFICATION SI "ANTI-FIBRILLATION" ACTIVEE .
!     - SI L'OPTION 'CLS' EST SELECTIONNEE :
!          DETERMINATION DE PARAMETRES SUPPLEMENTAIRES NECESSAIRES POUR
!          LES CALCULS DE DIFFUSION VERTICALE ET DE TRAINEE DES ONDES DE
!          GRAVITE OROGRAPHIQUES .
!     - SI L'OPTION 'HMT' EST SELECTIONNEE :
!          INTERPOLATION DES TEMPERATURES, HUMIDITES (SPECIFIQUES ET
!          RELATIVES) ET VENTS AUX HAUTEURS "METEO" .

!     - COMPUTATION OF SURFACE CHARACTERISTICS FOR SNOW, SOIL HUMIDITY
!       AND SURFACE EXCHANGE COEFFICIENTS PLUS THEIR AMPLIFICATION
!       FACTOR IF "ANTI-FIBRILLATION" IS ACTIVATED .
!     - IF THE SWITCH 'CLS' IS ON :
!          COMPUTATION OF ADDITIONNAL PARAMETERS NECESSARY FOR THE
!          VERTICAL DIFFUSION AND GRAVITY WAVE DRAG PARAMETERIZATIONS .
!     - IF THE SWITCH 'HMT' IS ON :
!          TEMPERATURE, MOISTURE (SPECIFIC AND RELATIVE) AND WIND
!          INTERPOLATION AT STANDARD "METEOROLOGICAL" LEVELS .

!**   Interface.
!     ----------
!        *CALL* *ACHMTTL*

!-----------------------------------------------------------------------
! 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) .

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

! - 2D (1:KLEV) .

! PAPHIF     : GEOPOTENTIEL AUX NIVEAUX DES COUCHES.
! PAPRSF     : PRESSION AUX NIVEAUX.
! PCP        : CHALEUR MASSIQUE A PRESSION CONSTANTE DE L'AIR.
! PQ         : HUMIDITE SPECIFIQUE DE LA VAPEUR D'EAU.
! PR         : CONSTANTE DES GAZ POUR L'AIR.
! PT         : TEMPERATURE.
! PU         : COMPOSANTE EN X DU VENT.
! PV         : COMPOSANTE EN Y DU VENT.

! - 1D (PROGNOSTIQUE) .

! PSNS       : MASSE PAR UNITE DE SURFACE DE LA COUCHE NEIGEUSE.
! PTS        : TEMPERATURE DE SURFACE.
! PWS        : CONTENU EN EAU DU RESERVOIR DE SURFACE.
! PWSI       : CONTENU EN EAU GELEE DU RESERVOIR DE SURFACE.

! - 1D (SPECIFIQUE SELON L'UTILISATION DE ACHMT) .

! PDPHIT     : HAUTEUR D INTERPOLATION POUR T ET Q (EN GEOPOTENTIEL).
! PDPHIV     : HAUTEUR D INTERPOLATION POUR U ET V (EN GEOPOTENTIEL).
! PHV        : RESISTANCE AU FLUX D'EVAPOTRANSPIRATION.
! PWFC       : TENEUR EN EAU A LA CAPACITE AU CHAMPS.

! - 1D (DIAGNOSTIQUE) .

! PNEIJG     : PROPORTION DE SOL RECOUVERTE DE NEIGE.
! PNEIJV     : PROPORTION DE VEGETATION RECOUVERTE DE NEIGE.

! - 1D (GEOGRAPHIQUE) .

! PGZ0F      : CHAMP TEMPOREL DE G FOIS LA LONGUEUR DE RUGOSITE.
! PGZ0HF     : CHAMP TEMPOREL DE G FOIS LA LONGUEUR DE RUGOSITE THERM.
! PGZ0RLF    : GRAVITE * LONGUEUR DE RUGOSITE DUE AU RELIEF.
! PLSM       : INDICE TERRE/MER.
! PVEG0      : PROPORTION DE SOL COUVERTE DE VEGETATION.

! - LOGIQUES .

! LDCLS      : DETERMINATION COMPLETE DES CARACTERISTIQUES DE SURFACE.
! LDHMT      : CALCULS NECESSAIRES A L'INTERPOLATION AUX HAUTEURS METEO
!              DU VENT, DE LA TEMPERATURE ET DE L'HUMIDITE.
! LDZ0H      : DIFFERENTES LONGUEURS DE RUGOSITE DYN/THER.

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

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

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

! - 2D (0:KLEV) .

! PNBVNO     : CARRE DE FR. BRUNT-VAISALA DIVISEE PAR G FOIS LA DENSITE.

! - 1D (DIAGNOSTIQUE) .

! PCD        : COEFFICIENT D'ECHANGE EN SURFACE POUR U ET V.
! PCDN       : COEFFICIENT NEUTRE D'ECHANGE EN SURFACE.
! PCDROV     : PCD RENORME EN DENSITE FOIS VITESSE.
! PCH        : COEFFICIENT D'ECHANGE EN SURFACE POUR T ET Q.
! PCHROV     : PCH RENORME EN DENSITE FOIS VITESSE.
! PCPS       : CHALEUR MASSIQUE A PRESSION CONSTANTE DE L'AIR AU SOL.
! PDQSTS     : DERIVEE DE PQSATS PAR RAPPORT A LA TEMPERATURE.
! PGWDCS     : DENSITE EN SURFACE POUR LE DRAG OROGRAPHIQUE.
! PGZ0       : G FOIS LA LONGUEUR DE RUGOSITE COURANTE.
! PHQ        : POIDS DE L'HUMIDITE DE L'AIR DANS L'HUMIDITE DE SURFACE.
! PHU        : POIDS DE L'HUMIDITE SATURANTE DANS L'HUMIDITE DE SURFACE.
! PNEIJ      : PROPORTION DE LA MAILLE RECOUVERTE DE NEIGE.
! PQCLS      : SORTIE DIAGNOSTIQUE DE L'HUMIDITE SPECIFIQUE A HTQ METEO.
! PQS        : HUMIDITE SPECIFIQUE DE SURFACE.
! PQSATS     : HUMIDITE SPECIFIQUE DE SATURATION EN SURFACE.
! PRHCLS     : SORTIE DIAGNOSTIQUE DE L'HUMIDITE RELATIVE A HTQ METEO.
! PRS        : CONSTANTE DES GAZ POUR L'AIR AU SOL.
! PSTAB      : INDICE DE STABILITE A LA SURFACE.
! 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.
! PUCLN      : SORTIE DIAGNOSTIQUE DU VENT NEUTRE EN X A HUV METEO.
! PVCLN      : SORTIE DIAGNOSTIQUE DU VENT NEUTRE EN Y A HUV METEO.
! PZPCLS     : SORTIE DIAGNOSTIQUE DE PRESSION A HTQ METEO.
! PVEG       : PROPORTION DE VEGETATION APPARENTE (NON RECOUVERTE DE NEIGE).
! PXDROV     : MULTIPLICATEUR "ANTI-FIBRILLATION" DE PCDROV.
! PXHROV     : MULTIPLICATEUR "ANTI-FIBRILLATION" DE PCHROV.

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

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

! COMMON/YOMPHY /
! COMMON/YOMCST /
! COMMON/YOMPHY0/
! COMMON/YOMPHY1/
! COMMON/FCTTRM /

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

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

!     *ACNTCLSTL*

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

!     Auteur.
!     -------
!        99-07, F. Bouyssel.

!     Modifications
!     -------------
!        2001-01, New use of the Richardson critical number (USURID) - F. Bouyssel.
!        R. El Khatib : 01-08-07 Pruning options
!        04-06, introduction of EDK for Fm and Fh in stable case - F Bouyssel
!      2008-11, Neutral Wind - C Payan
!-----------------------------------------------------------------------

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

USE YOMPHY   , ONLY : LNEIGE   ,LSNV     ,LSOLV    ,LFGEL
USE YOMCST   , ONLY : RPI      ,RG       ,RD       ,RV       ,&
 & RCPD     ,RCPV     ,RKAPPA   ,RETV     ,RCW      ,&
 & RCS      ,RLVTT    ,RLSTT    ,RTT      ,RALPW    ,&
 & RBETW    ,RGAMW    ,RALPS    ,RBETS    ,RGAMS    ,&
 & RALPD    ,RBETD    ,RGAMD  
USE YOMPHY0  , ONLY : EDB      ,EDC      ,EDD      ,USURIC   ,VKARMN,&
 & USURICL, USURID    ,EDK, VZIUSTAR0
USE YOMPHY1  , ONLY : GCZ0H    ,ALRCN1   ,ALRCN2   ,GCONV    ,&
 & RD1      ,WCRIN    ,WSMX     ,RZHZ0M  

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)               :: KTDIA ! Argument NOT used
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPHI5(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPHIF5(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPRS5(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPRSF5(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCP5(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQ5(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PR5(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PT5(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PU5(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PV5(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGZ0F5(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PHV5(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PNEIJG5(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PNEIJV5(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSNS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PWS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PWSI5(KLON) 
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)    :: PCP(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PQ(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PR(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PT(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PU(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PV(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDPHIT(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDPHIV(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGZ0F(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGZ0HF(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGZ0RLF(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PHV(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLSM(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PNEIJG(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PNEIJV(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSNS(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTS(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PVEG0(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PWFC(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PWS(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PWSI(KLON) 
LOGICAL           ,INTENT(IN)    :: LDCLS 
LOGICAL           ,INTENT(IN)    :: LDHMT 
LOGICAL           ,INTENT(IN)    :: LDZ0H 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PNBVNO(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCD(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCDN(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCDROV(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCH(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCHROV(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCPS(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PDQSTS(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PGWDCS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PGZ0(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PHQ(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PHU(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PNEIJ(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PQCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PQS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PQSATS(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PRHCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PRS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PSTAB(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PUCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PVCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PUCLN(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PVCLN(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PZPCLS(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PVEG(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PXDROV(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PXHROV(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PNBVNO5(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCD5(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCDN5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCDROV5(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCH5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCHROV5(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCPS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PDQSTS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PGWDCS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PGZ05(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PHQ5(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PHU5(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PNEIJ5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PQCLS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PQS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PQSATS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PRHCLS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PRS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTCLS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PUCLS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PVCLS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PZPCLS5(KLON) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PVEG5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PXDROV5(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PXHROV5(KLON) 
CHARACTER(LEN=7)  ,INTENT(IN)    :: CDLOCK 
REAL(KIND=JPRB) :: ZCDNH(KLON),ZDELT(KLON),ZDPHI(KLON),ZESP(KLON)&
 & ,ZRTI(KLON),ZSTA(KLON),ZU(KLON),ZWSMX(KLON),ZGZ0H(KLON)&
 & ,ZSTAC(KLON),ZSTABV(KLON),ZSTAH(KLON),ZSTAHC(KLON)  

REAL(KIND=JPRB) :: ZCDNH5(KLON),ZDPHI5(KLON),ZESP5(KLON)&
 & ,ZRTI5(KLON),ZSTA5(KLON),ZU5(KLON),ZGZ0H5(KLON)&
 & ,ZSTAC5(KLON),ZSTABV5(KLON),ZSTAH5(KLON),ZSTAHC5(KLON)  

INTEGER(KIND=JPIM) :: JLON

REAL(KIND=JPRB) :: Z0CR, Z2B, Z3B, Z3BC,&
 & ZCD, ZCD0, ZCD05, &
 & ZCD5, ZCH, ZCH0, ZCH05, ZCH5, ZCIS, ZCIS5, &
 & ZCPVMD, &
 & ZDEW, ZDID, ZDID5, ZDIH, ZDIH5, ZDS, ZDS5, &
 & ZEPS1, ZEW, ZEW5, &
 & ZLOI, ZLOI5, ZLOS, ZLOS5, ZMU, &
 & ZMU5, ZPD, ZPD5, ZPH, ZPH5, &
 & ZRVMD, ZRZD, ZRZD5, &
 & ZRZH, ZRZH5, &
 & ZUZ0CN, ZWFC, ZWS, ZWS5, &
 & ZUSURIC, ZHS, ZHS5, ZIXP
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "abor1.intfb.h"
#include "acntclstl.intfb.h"

#include "fcttrm.h"
#include "fcttrmtl.h"

!     CHECK RELIABILITY OF INPUT ARGUMENTS.

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

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

!         AUXILIARY CONSTANTS.

ZEPS1=1.E-04_JPRB

ZCPVMD=RCPV-RCPD
ZRVMD=RV-RD
ZUSURIC=USURIC*USURICL

!*
!     ------------------------------------------------------------------
!     II - CALCUL DES PARAMETRES DERIVES ET CONSTANTE DE SECURITE (POUR
!     LE CARRE DU CISAILLEMENT DE VENT).

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

Z2B=2.0_JPRB*EDB
Z3B=3._JPRB*EDB
Z3BC=3._JPRB*EDB*EDC

!*
!     ------------------------------------------------------------------
!     III - PASSAGE EN GEOPOTENTIEL POUR LES CONSTANTES RELATIVES A LA
!     LONGUEUR DE RUGOSITE EN CAS DE NEIGE.

!           GOING TO GEOPOTENTIAL FOR CONSTANTS RELATIVE TO ROUGHNESS
!     LENGTH IN CASE OF SNOW COVER.

Z0CR=RG*ALRCN1
ZUZ0CN=1.0_JPRB/(RG*ALRCN2)

!*
!     ------------------------------------------------------------------
!     IV - CALCUL DE L EPAISSEUR DE LA CLS (EN GEOPOTENTIEL).

!          COMPUTATION OF THE THICKNESS OF THE SBL (IN GEOPOTENTIAL).

! - TEMPORAIRE(S) 1D .

! ZDPHI     : EPAISSEUR EN GEOPOTENTIEL DU NIVEAU DE SURFACE.
!            : GEOPOTENTIAL THICKNESS OF THE SURFACE LEVEL.

DO JLON=KIDIA,KFDIA
  ZDPHI(JLON)=PAPHIF(JLON,KLEV)-PAPHI(JLON,KLEV)
  ZDPHI5(JLON)=PAPHIF5(JLON,KLEV)-PAPHI5(JLON,KLEV)
ENDDO

!*
!     ------------------------------------------------------------------
!     V - MISE A UNE VALEUR CONSTANTE DU CONTENU MAXIMUM EN EAU DU
!     RESERVOIR DE SURFACE (PHYSIQUE DU SOL HYPER-SIMPLIFIEE).

!         SETTING TO A CONSTANT VALUE THE MAXIMUM CONTENT OF THE
!     SURFACE WATER RESERVOIR (HYPER-SIMPLIFIED SOIL PHYSICS).

! - TEMPORAIRE(S) 1D .

! ZWSMX     : CONTENU MAXIMAL EN EAU DU RESERVOIR SUPERFICIEL.
!            : MAXIMUM CONTENT OF THE SURFACE RESERVOIR.

IF (.NOT.LSOLV) THEN
  DO JLON=KIDIA,KFDIA
    ZWSMX(JLON)=WSMX
  ENDDO
ENDIF

!*
!     ------------------------------------------------------------------
!     VI - CALCULS PROPREMENT DITS DES CARACTERISTIQUES DE SURFACE.

!          EFFECTIVE CALCULATIONS OF THE SURFACE CHARACTERISTICS.

IF(USURID == 0.0_JPRB) THEN
  ZIXP=1.0_JPRB
ELSE
  ZIXP=3._JPRB
ENDIF

DO JLON=KIDIA,KFDIA

!     CALCULS CONCERNANT LA PRESENCE OU NON DE NEIGE AU SOL.
!     COMPUTATIONS CONCERNING THE PRESENCE OR ABSENCE OF SNOW ON GROUND.

! - TEMPORAIRE(S) 1D .

! ZDELT     : UN POUR CALCULS DE SATURATION SUR GLACE, ZERO SINON.
!            : ONE FOR SATURATION CALCULATION FOR ICE, ZERO OTHERWISE.

  IF (LNEIGE) THEN
    IF (LSNV) THEN
      PNEIJ(JLON)=PLSM(JLON) *&
       & ( (1.0_JPRB-PVEG0(JLON))*PNEIJG(JLON)+PVEG0(JLON)*PNEIJV(JLON) )  
      PNEIJ5(JLON)=PLSM(JLON) *&
       & ( (1.0_JPRB-PVEG0(JLON))*PNEIJG5(JLON)+PVEG0(JLON)*PNEIJV5(JLON) )  
      PVEG(JLON)=-PNEIJV(JLON)*PVEG0(JLON)
      PVEG5(JLON)=(1.0_JPRB-PNEIJV5(JLON))*PVEG0(JLON)
      PGZ0(JLON)=( -PNEIJV(JLON)*PGZ0F5(JLON)**2 &
       & +(1.0_JPRB-PNEIJV5(JLON))*2.0_JPRB*PGZ0F(JLON)*PGZ0F5(JLON)&
       & +PNEIJV(JLON)*(Z0CR**2+PGZ0RLF(JLON)**2) )&
       & /(2.0_JPRB*SQRT((1.0_JPRB-PNEIJV5(JLON))*PGZ0F5(JLON)**2+&
       & PNEIJV5(JLON)*(Z0CR**2+PGZ0RLF(JLON)**2)))  
      PGZ05(JLON)=SQRT((1.0_JPRB-PNEIJV5(JLON))*PGZ0F5(JLON)**2+&
       & PNEIJV5(JLON)*(Z0CR**2+PGZ0RLF(JLON)**2))  
    ELSE
      PNEIJ(JLON)=PLSM(JLON)*WCRIN*PSNS(JLON)/(PSNS5(JLON)+WCRIN)**2
      PNEIJ5(JLON)=PLSM(JLON)*PSNS5(JLON)/(PSNS5(JLON)+WCRIN)
      PVEG(JLON)=0.0_JPRB
      PVEG5(JLON)=PVEG0(JLON)
      PGZ0(JLON)=PGZ0F(JLON)&
       & +PLSM(JLON)*((Z0CR-PGZ0F5(JLON))*PSNS(JLON)&
       & -PGZ0F(JLON)*PSNS5(JLON))&
       & /(PSNS5(JLON)+WCRIN*(1+ZUZ0CN*PGZ0F5(JLON)))&
       & -(Z0CR-PGZ0F5(JLON))*PLSM(JLON)*PSNS5(JLON)&
       & *(PSNS(JLON)+WCRIN*ZUZ0CN*PGZ0F(JLON))&
       & /(PSNS5(JLON)+WCRIN*(1+ZUZ0CN*PGZ0F5(JLON)))**2  
      PGZ05(JLON)=PGZ0F5(JLON)&
       & +(Z0CR-PGZ0F5(JLON))*PLSM(JLON)*PSNS5(JLON)&
       & /(PSNS5(JLON)+WCRIN*(1+ZUZ0CN*PGZ0F5(JLON)))  
    ENDIF
    ZDELT(JLON)=MAX(0.0_JPRB,SIGN(1.0_JPRB,RTT-PTS5(JLON)))
  ELSE
    PNEIJ (JLON)=0.0_JPRB
    PNEIJ5(JLON)=0.0_JPRB
    PVEG  (JLON)=0.0_JPRB
    PVEG5 (JLON)=PVEG0 (JLON)
    PGZ0  (JLON)=PGZ0F (JLON)
    PGZ05 (JLON)=PGZ0F5(JLON)
    ZDELT (JLON)=0.0_JPRB
  ENDIF

!     CAS DE DEUX LONGUEURS DE RUGOSITE (SUR CONTINENT NON TOTALEMENT
!     COUVERT DE NEIGE).
!     CASE OF TWO ROUGHNESS LENGTHS (ON PARTIALLY SNOW-FREE LAND ONLY).

! ZGZ0H      : G FOIS LA LONGUEUR DE RUGOSITE THERMIQUE COURANTE.

  IF (LDZ0H) THEN

    IF (LNEIGE) THEN
      IF (LSNV) THEN
        ZGZ0H(JLON)=(-PNEIJV(JLON)*PGZ0HF(JLON)**2 &
         & +PNEIJV(JLON)*(Z0CR**2+&
         & (PGZ0RLF(JLON)*PGZ0HF(JLON)/PGZ0F5(JLON))**2)&
         & -2.0_JPRB*PGZ0F(JLON)*PNEIJV5(JLON)&
         & *(PGZ0HF(JLON)*PGZ0RLF(JLON))**2 &
         & /PGZ0F5(JLON)**3 )&
         & /( 2.0_JPRB*SQRT((1.0_JPRB-PNEIJV5(JLON))*PGZ0HF(JLON)**2+&
         & PNEIJV5(JLON)*(Z0CR**2+&
         & (PGZ0RLF(JLON)*PGZ0HF(JLON)/PGZ0F5(JLON))**2)) )  
        ZGZ0H5(JLON)=SQRT((1.0_JPRB-PNEIJV5(JLON))*PGZ0HF(JLON)**2+&
         & PNEIJV5(JLON)*(Z0CR**2+&
         & (PGZ0RLF(JLON)*PGZ0HF(JLON)/PGZ0F5(JLON))**2))  
      ELSE
        ZGZ0H(JLON)=(Z0CR-PGZ0HF(JLON))*PLSM(JLON)&
         & *WCRIN*(1+ZUZ0CN*PGZ0HF(JLON))*PSNS(JLON)&
         & /(PSNS5(JLON)+WCRIN*(1+ZUZ0CN*PGZ0HF(JLON)))**2  
        ZGZ0H5(JLON)=PGZ0HF(JLON)+(Z0CR-PGZ0HF(JLON))*PLSM(JLON)&
         & *PSNS5(JLON)/(PSNS5(JLON)+WCRIN*(1+ZUZ0CN &
         & *PGZ0HF(JLON)))  
      ENDIF
    ELSE
      ZGZ0H( JLON)=0.0_JPRB
      ZGZ0H5(JLON)=PGZ0HF(JLON)
    ENDIF

! ZGZ0H = ZGZ0 OVER SEA UNLESS REQUIRED IN NAMPHY1 (CLIMATE RUNS)

    IF (VZIUSTAR0 > 0) THEN
      ZGZ0H(JLON)=PLSM(JLON)*ZGZ0H(JLON)
      ZGZ0H5(JLON)=PLSM(JLON)*ZGZ0H5(JLON)+(1.0_JPRB-PLSM(JLON))*PGZ0HF(JLON)
    ELSE   
      ZGZ0H(JLON)=PLSM(JLON)*ZGZ0H(JLON)+(1.0_JPRB-PLSM(JLON))*PGZ0(JLON)*RZHZ0M
      ZGZ0H5(JLON)=PLSM(JLON)*ZGZ0H5(JLON)+(1.0_JPRB-PLSM(JLON))*PGZ05(JLON)*RZHZ0M
    ENDIF 

  ENDIF

!     CALCUL DE SATURATION UTILISANT LES FONCTIONS DEFINIES.
!     SATURATION CALCULATION WITH CALL TO DEFINED FUNCTIONS.

! - TEMPORAIRE(S) 1D .

! ZESP      : PRESSION DE VAPEUR SATURANTE SUR PRESSION.
!            : SATURATION WATER VAPOUR PRESSURE OVER PRESSURE.

  ZEW = FOEWTL (PTS (JLON),PTS5(JLON),ZDELT(JLON))
  ZEW5= FOEW   (PTS5(JLON),ZDELT(JLON))
  ZESP (JLON)=ZEW/PAPRS5(JLON,KLEV)-PAPRS(JLON,KLEV)*ZEW5 &
   & /PAPRS5(JLON,KLEV)**2  
  ZESP5(JLON)=ZEW5/PAPRS5(JLON,KLEV)
  IF ((1.0_JPRB-ZESP5(JLON)) > 0.0_JPRB) THEN
    PQSATS (JLON)= FOQSTL1(ZESP (JLON),ZESP5(JLON))
  ELSE
    PQSATS (JLON)= FOQSTL2(ZESP (JLON),ZESP5(JLON))
  ENDIF
  PQSATS5(JLON)= FOQS   (ZESP5(JLON))

!     CALCULS RELATIFS A L'HUMIDITE DE SURFACE.
!     COMPUTATIONS CONCERNING SURFACE HUMIDITY.

!     CALCULS OPTIONNELS SUIVANT LE TYPE DE SCHEMA SOL/VEG CHOISI.
!     OPTIONAL COMPUTATIONS ACCORDING TO THE CHOSEN SOIL/VEG SCHEME.

  IF (LSOLV) THEN
    ZWFC=PWFC(JLON)*RD1*GCONV
    IF (LFGEL) THEN
      ZWS =PWS (JLON)+PWSI (JLON)
      ZWS5=PWS5(JLON)+PWSI5(JLON)
    ELSE
      ZWS =PWS (JLON)
      ZWS5=PWS5(JLON)
    ENDIF
    IF (LSNV) THEN
      IF (ZWS5 < ZWFC) THEN
        PHU(JLON)=PLSM(JLON)*( -PNEIJG(JLON)*&
         & (0.5_JPRB*(1.0_JPRB-COS(RPI*ZWS5/ZWFC))-1.0_JPRB)&
         & +(1.0_JPRB-PNEIJG5(JLON))*0.5_JPRB*RPI*ZWS/ZWFC &
         & *SIN(RPI*ZWS5/ZWFC) )  
        PHU5(JLON)=1.0_JPRB+PLSM(JLON)*(1.0_JPRB-PNEIJG5(JLON))*&
         & (0.5_JPRB*(1.0_JPRB-COS(RPI*ZWS5/ZWFC))-1.0_JPRB)  
      ELSE
        PHU(JLON)=0.0_JPRB
        PHU5(JLON)=1.0_JPRB
      ENDIF
      IF (MIN(PQ5(JLON,KLEV)/PQSATS5(JLON),1.0_JPRB) > PHU5(JLON)) THEN
        IF ((PQ5(JLON,KLEV)/PQSATS5(JLON)) < (1.0_JPRB)) THEN
          PHU(JLON)=PQ(JLON,KLEV)/PQSATS5(JLON)&
           & -PQSATS(JLON)*PQ5(JLON,KLEV)/PQSATS5(JLON)**2  
          PHU5(JLON)=PQ5(JLON,KLEV)/PQSATS5(JLON)
        ELSE
          PHU(JLON)=0.0_JPRB
          PHU5(JLON)=1.0_JPRB
        ENDIF
      ENDIF
      PQS(JLON)= (PVEG(JLON)*PHV5(JLON)+PVEG5(JLON)*PHV(JLON)&
       & +PVEG0(JLON)*PNEIJV(JLON)+(1.0_JPRB-PVEG0(JLON))*PHU(JLON))&
       & *PQSATS5(JLON)&
       & +(PVEG5(JLON)*PHV5(JLON)+PVEG0(JLON)*PNEIJV5(JLON)&
       & +(1.0_JPRB-PVEG0(JLON))*PHU5(JLON))&
       & *PQSATS(JLON)&
       & -PHV(JLON)*PVEG5(JLON)*PQ5(JLON,KLEV)&
       & +(1.0_JPRB-PHV5(JLON))*PVEG(JLON)*PQ5(JLON,KLEV)&
       & +(1.0_JPRB-PHV5(JLON))*PVEG5(JLON)*PQ(JLON,KLEV)  
      PQS5(JLON)= (PVEG5(JLON)*PHV5(JLON)&
       & +PVEG0(JLON)*PNEIJV5(JLON)&
       & +(1.0_JPRB-PVEG0(JLON))*PHU5(JLON))*PQSATS5(JLON)&
       & +(1.0_JPRB-PHV5(JLON))*PVEG5(JLON)* PQ5(JLON,KLEV)  
    ELSE
      IF (ZWS5 < ZWFC) THEN
        PHU(JLON)=PLSM(JLON)*( -PNEIJ(JLON)*&
         & (0.5_JPRB*(1.0_JPRB-COS(RPI*ZWS5/ZWFC))-1.0_JPRB)&
         & +(1.0_JPRB-PNEIJ5(JLON))*0.5_JPRB*RPI*ZWS/ZWFC &
         & *SIN(RPI*ZWS5/ZWFC) )  
        PHU5(JLON)=1.0_JPRB+PLSM(JLON)*(1.0_JPRB-PNEIJ5(JLON))*&
         & (0.5_JPRB*(1.0_JPRB-COS(RPI*ZWS5/ZWFC))-1.0_JPRB)  
      ELSE
        PHU(JLON)=0.0_JPRB
        PHU5(JLON)=1.0_JPRB
      ENDIF
      IF (MIN(PQ5(JLON,KLEV)/PQSATS5(JLON),1.0_JPRB) > PHU5(JLON)) THEN
        IF ((PQ5(JLON,KLEV)/PQSATS5(JLON)) < (1.0_JPRB)) THEN
          PHU(JLON)=PQ(JLON,KLEV)/PQSATS5(JLON)&
           & -PQSATS(JLON)*PQ5(JLON,KLEV)/PQSATS5(JLON)**2  
          PHU5(JLON)=PQ5(JLON,KLEV)/PQSATS5(JLON)
        ELSE
          PHU(JLON)=0.0_JPRB
          PHU5(JLON)=1.0_JPRB
        ENDIF
      ENDIF
      PQS(JLON)= (PVEG(JLON)*PHV5(JLON)+PVEG5(JLON)*PHV(JLON)&
       & +(1.0_JPRB-PVEG5(JLON))*PHU(JLON)-PVEG(JLON)*PHU5(JLON))&
       & *PQSATS5(JLON)&
       & +(PVEG5(JLON)*PHV5(JLON)+(1.0_JPRB-PVEG5(JLON))*PHU5(JLON))&
       & *PQSATS(JLON)&
       & -PHV(JLON)*PVEG5(JLON)*PQ5(JLON,KLEV)&
       & +(1.0_JPRB-PHV5(JLON))*PVEG(JLON)*PQ5(JLON,KLEV)&
       & +(1.0_JPRB-PHV5(JLON))*PVEG5(JLON)*PQ(JLON,KLEV)  
      PQS5(JLON)=(PVEG5(JLON)*PHV5(JLON)&
       & +(1.0_JPRB-PVEG5(JLON))*PHU5(JLON))&
       & *PQSATS5(JLON)&
       & +(1.0_JPRB-PHV5(JLON))*PVEG5(JLON)*PQ5(JLON,KLEV)  
    ENDIF
  ELSE
    PHU(JLON)=PLSM(JLON)*(-PNEIJ(JLON)&
     & *(0.5_JPRB*(1.0_JPRB-COS(RPI*PWS5(JLON)/ZWSMX(JLON)))-1.0_JPRB)&
     & +(1.0_JPRB-PNEIJ5(JLON))*0.5_JPRB*RPI*PWS(JLON)/ZWSMX(JLON)&
     & *SIN(RPI*PWS5(JLON)/ZWSMX(JLON)))  
    PHU5(JLON)=1.0_JPRB+PLSM(JLON)*(1.0_JPRB-PNEIJ5(JLON))&
     & *(0.5_JPRB*(1.0_JPRB-COS(RPI*PWS5(JLON)/ZWSMX(JLON)))-1.0_JPRB)  
    PHQ(JLON)=-PHU(JLON)*PVEG5(JLON)+(1.0_JPRB-PHU5(JLON))*PVEG(JLON)
    PHQ5(JLON)=(1.0_JPRB-PHU5(JLON))*PVEG5(JLON)
    ZDEW=MAX(0.0_JPRB,SIGN(1.0_JPRB,PQ5(JLON,KLEV)-PQSATS5(JLON)))
    PHU(JLON)=PHU(JLON)+ZDEW*PHQ(JLON)
    PHU5(JLON)=PHU5(JLON)+ZDEW*PHQ5(JLON)
    PHQ(JLON)=PHQ(JLON)-ZDEW*PHQ(JLON)
    PHQ5(JLON)=PHQ5(JLON)-ZDEW*PHQ5(JLON)
    PQS(JLON)=PHU5(JLON)*PQSATS(JLON)+PHU(JLON)*PQSATS5(JLON)&
     & +PHQ5(JLON)*PQ(JLON,KLEV)+PHQ(JLON)*PQ5(JLON,KLEV)  
    PQS5(JLON)=PHU5(JLON)*PQSATS5(JLON)+PHQ5(JLON)*PQ5(JLON,KLEV)
  ENDIF

  PCPS(JLON)=ZCPVMD*PQS(JLON)
  PCPS5(JLON)=RCPD+ZCPVMD*PQS5(JLON)
  PRS(JLON)=ZRVMD*PQS(JLON)
  PRS5(JLON)=RD+ZRVMD*PQS5(JLON)

!     CALCULS GEOMETRIQUES.
!     GEOMETRIC CALCULATIONS.

  ZRZD=ZDPHI(JLON)/PGZ05(JLON)-PGZ0(JLON)*ZDPHI5(JLON)/PGZ05(JLON)**2
  ZRZD5=1.0_JPRB+ZDPHI5(JLON)/PGZ05(JLON)
  PCDN(JLON)=-2*ZRZD*VKARMN**2/(ZRZD5*(LOG(ZRZD5))**3)
  PCDN5(JLON)=(VKARMN/LOG(ZRZD5))**2

!     CALCUL PRELIMINAIRES NECESSAIRES A LA DETERMINATION DES
!     COEFFICIENTS D'ECHANGE CD ET CH DANS LE CAS DE DEUX RUGOSITES
!     DYNAMIQUE Z0 ET THERMIQUE ZOH.

!     PRELIMINARY COMPUTATIONS NECESSARY FOR THE DETERMINATION OF
!     EXCHANGE COEFFICIENTS CD AND CH IN THE CASE OF TWO ROUGHNESS
!     LENGTHS Z0 DYNAMICAL AND ZOH THERMAL.

! - TEMPORAIRE(S) 1D .

! ZCDNH     : COEFFICIENT THERMIQUE NEUTRE D'ECHANGE EN SURFACE.
!            : NEUTRAL SURFACE THERMAL EXCHANGE COEFFICIENT.

  IF (LDZ0H) THEN
    ZRZH=ZDPHI(JLON)/ZGZ0H5(JLON)-ZGZ0H(JLON)*ZDPHI5(JLON)/ZGZ0H5(JLON)**2
    ZRZH5=1.0_JPRB+ZDPHI5(JLON)/ZGZ0H5(JLON)
    ZCDNH(JLON)=-VKARMN**2*(LOG(ZRZH5)*ZRZD/ZRZD5+ZRZH/ZRZH5 &
     & *LOG(ZRZD5))/(LOG(ZRZH5)*LOG(ZRZD5))**2  
    ZCDNH5(JLON)=VKARMN**2/(LOG(ZRZH5)*LOG(ZRZD5))
    ZMU=PGZ0(JLON)/PGZ05(JLON)-ZGZ0H(JLON)/ZGZ0H5(JLON)
    ZMU5=LOG(PGZ05(JLON)/ZGZ0H5(JLON))
    ZCD0=ZMU*(GCZ0H(1,1)+2.0_JPRB*ZMU5*GCZ0H(2,1)&
     & +3._JPRB*ZMU5**2*GCZ0H(3,1))/(1.5_JPRB*EDC)  
    ZCD05=(GCZ0H(0,1)+ZMU5*(GCZ0H(1,1)+ZMU5*(GCZ0H(2,1)+ZMU5 &
     & *GCZ0H(3,1))))/(1.5_JPRB*EDC)  
    ZPD=ZMU*(GCZ0H(1,2)+2.0_JPRB*ZMU5*GCZ0H(2,2)+3._JPRB*ZMU5**2*GCZ0H(3,2))
    ZPD5=(GCZ0H(0,2)+ZMU5*(GCZ0H(1,2)+ZMU5*(GCZ0H(2,2)+ZMU5 &
     & *GCZ0H(3,2))))-0.5_JPRB  
    ZCH0=ZMU*(GCZ0H(1,3)+2.0_JPRB*ZMU5*GCZ0H(2,3)&
     & +3._JPRB*ZMU5**2*GCZ0H(3,3))/EDC  
    ZCH05=(GCZ0H(0,3)+ZMU5*(GCZ0H(1,3)+ZMU5*(GCZ0H(2,3)+ZMU5 &
     & *GCZ0H(3,3))))/EDC  
    ZPH=ZMU*(GCZ0H(1,4)+2.0_JPRB*ZMU5*GCZ0H(2,4)+3._JPRB*ZMU5**2*GCZ0H(3,4))
    ZPH5=(GCZ0H(0,4)+ZMU5*(GCZ0H(1,4)+ZMU5*(GCZ0H(2,4)+ZMU5 &
     & *GCZ0H(3,4))))-0.5_JPRB  
    ZCD=ZCD0*ZRZD5**ZPD5+ZCD05*LOG(ZRZD5)*ZPD*ZRZD5**ZPD5 &
     & +ZCD05*ZPD5*ZRZD*ZRZD5**(ZPD5-1)  
    ZCD5=ZCD05*ZRZD5**ZPD5
    ZCH=ZCH0*ZRZH5**ZPH5+ZCH05*LOG(ZRZH5)*ZPH*ZRZH5**ZPH5 &
     & +ZCH05*ZPH5*ZRZH*ZRZH5**(ZPH5-1)  
    ZCH5=ZCH05*ZRZH5**ZPH5
    ZCD=PLSM(JLON)*ZCD
    ZCD5=1.0_JPRB+PLSM(JLON)*(ZCD5-1.0_JPRB)
    ZCH=PLSM(JLON)*ZCH
    ZCH5=1.0_JPRB+PLSM(JLON)*(ZCH5-1.0_JPRB)
  ELSE
    ZRZH=ZRZD
    ZRZH5=ZRZD5
    ZCDNH(JLON)=PCDN(JLON)
    ZCDNH5(JLON)=PCDN5(JLON)
    ZCD=0.0_JPRB
    ZCD5=1.0_JPRB
    ZCH=0.0_JPRB
    ZCH5=1.0_JPRB
  ENDIF

!     CISAILLEMENT DE VENT.
!     WIND SHEAR.

! - TEMPORAIRE(S) 1D .

! ZU        : MODULE DU VENT DE SURFACE.
!            : SURFACE WIND SPEED.

  IF ((PU5(JLON,KLEV)**2+PV5(JLON,KLEV)**2) <= ZEPS1) THEN
    ZCIS=0.0_JPRB
    ZCIS5=ZEPS1
  ELSE
    ZCIS=2.0_JPRB*PU(JLON,KLEV)*PU5(JLON,KLEV)&
     & +2.0_JPRB*PV(JLON,KLEV)*PV5(JLON,KLEV)  
    ZCIS5=PU5(JLON,KLEV)**2+PV5(JLON,KLEV)**2
  ENDIF
  ZU(JLON)=ZCIS/(2.0_JPRB*SQRT(ZCIS5))
  ZU5(JLON)=SQRT(ZCIS5)

!     CALCUL DE STABILITE.
!     STABILITY COMPUTATION.

! - TEMPORAIRE(S) 1D .

! ZRTI      : INVERSE DE R*T.
!            : INVERSE OF R*T.
! ZSTA      : APPROXIMATION DE DELTA(PHI)*DELTA(LN(THETA)).
!            : APPROXIMATION OF DELTA(PHI)*DELTA(LN(THETA)).

  ZRTI(JLON)=-2.0_JPRB*(PR5(JLON,KLEV)*PT(JLON,KLEV)+PR(JLON,KLEV)&
   & *PT5(JLON,KLEV)+RKAPPA*ZDPHI(JLON)+PRS5(JLON)&
   & *PTS(JLON)+PRS(JLON)*PTS5(JLON))/(PR5(JLON,KLEV)&
   & *PT5(JLON,KLEV)+RKAPPA*ZDPHI5(JLON)&
   & +PRS5(JLON)*PTS5(JLON))**2  
  ZRTI5(JLON)=2.0_JPRB/(PR5(JLON,KLEV)*PT5(JLON,KLEV)&
   & +RKAPPA*ZDPHI5(JLON)+PRS5(JLON)*PTS5(JLON))  
  ZSTA(JLON)=ZDPHI(JLON)*(PR5(JLON,KLEV)*PT5(JLON,KLEV)+RKAPPA &
   & *ZDPHI5(JLON)-PRS5(JLON)*PTS5(JLON))*ZRTI5(JLON)&
   & +ZDPHI5(JLON)*(PR5(JLON,KLEV)*PT5(JLON,KLEV)+RKAPPA &
   & *ZDPHI5(JLON)-PRS5(JLON)*PTS5(JLON))*ZRTI(JLON)&
   & +ZDPHI5(JLON)*(PR5(JLON,KLEV)*PT(JLON,KLEV)&
   & +PR(JLON,KLEV)*PT5(JLON,KLEV)+RKAPPA*ZDPHI(JLON)&
   & -PRS5(JLON)*PTS(JLON)-PRS(JLON)*PTS5(JLON))&
   & *ZRTI5(JLON)  
  ZSTA5(JLON)=ZDPHI5(JLON)*(PR5(JLON,KLEV)*PT5(JLON,KLEV)+RKAPPA &
   & *ZDPHI5(JLON)-PRS5(JLON)*PTS5(JLON))*ZRTI5(JLON)  
  ZSTABV(JLON)=ZSTA(JLON)
  ZSTABV5(JLON)=ZSTA5(JLON)
  IF (ZSTA5(JLON) > 0.0_JPRB) THEN
    ZSTAH (JLON)=( ZSTA(JLON) &
     & -ZSTA5(JLON)*ZUSURIC*(ZCIS5*ZSTA(JLON)-ZCIS*ZSTA5(JLON)) &
     & /((1.0_JPRB+ZIXP*ZUSURIC*ZSTA5(JLON)/ZCIS5)*ZCIS5**2) ) &
     & /(1.0_JPRB+ZIXP*ZUSURIC*ZSTA5(JLON)/ZCIS5)**(1.0_JPRB/ZIXP)  
    ZSTAH5(JLON)=ZSTA5(JLON) &
     & /(1.0_JPRB+ZIXP*ZUSURIC*ZSTA5(JLON)/ZCIS5)**(1.0_JPRB/ZIXP)  
    ZSTA(JLON)=ZSTA(JLON)/(1.0_JPRB+ZSTA5(JLON)*ZUSURIC/ZCIS5)&
     & -ZUSURIC*(ZSTA(JLON)/ZCIS5-ZCIS*ZSTA5(JLON)&
     & /ZCIS5**2)*ZSTA5(JLON)&
     & /(1.0_JPRB+ZSTA5(JLON)*ZUSURIC/ZCIS5)**2  
    ZSTA5(JLON)=ZSTA5(JLON)/(1.0_JPRB+ZSTA5(JLON)*ZUSURIC/ZCIS5)
  ELSE
    ZSTAH (JLON)=ZSTA (JLON)
    ZSTAH5(JLON)=ZSTA5(JLON)
  ENDIF
  PSTAB(JLON)=MAX(0.0_JPRB,SIGN(1.0_JPRB,ZSTA5(JLON)))

  IF (ZSTA5(JLON) < 0.0_JPRB) THEN
    ZSTAC(JLON)=-ZSTA(JLON)
  ELSE
    ZSTAC(JLON)= ZSTA(JLON)
  ENDIF
  ZSTAC5(JLON)=ABS(ZSTA5(JLON))

  IF (ZSTAH5(JLON) < 0.0_JPRB) THEN
    ZSTAHC(JLON)=-ZSTAH(JLON)
  ELSE
    ZSTAHC(JLON)= ZSTAH(JLON)
  ENDIF
  ZSTAHC5(JLON)=ABS(ZSTAH5(JLON))

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

  ZDS=(ZCIS+EDD/EDK*ZSTAC(JLON))/(2.0_JPRB*SQRT(ZCIS5+EDD/EDK*ZSTAC5(JLON)))
  ZDS5=SQRT(ZCIS5+EDD/EDK*ZSTAC5(JLON))
  ZHS=(ZCIS+EDD*EDK*ZSTAHC(JLON))/(2.0_JPRB*SQRT(ZCIS5+EDD*EDK*ZSTAHC5(JLON)))
  ZHS5=SQRT(ZCIS5+EDD*EDK*ZSTAHC5(JLON))
  ZDID=-(ZU(JLON)+ZCD*Z3BC*PCDN5(JLON)*SQRT(ZSTAC5(JLON)&
   & *ZRZD5)+ZCD5*Z3BC*PCDN(JLON)*SQRT(ZSTAC5(JLON)*ZRZD5)&
   & +ZCD5*Z3BC*PCDN5(JLON)*(ZSTAC5(JLON)*ZRZD &
   & +ZSTAC(JLON)*ZRZD5)/(2.0_JPRB*SQRT(ZSTAC5(JLON)*ZRZD5)))&
   & /(ZU5(JLON)+ZCD5*Z3BC*PCDN5(JLON)*SQRT(ZSTAC5(JLON)&
   & *ZRZD5))**2  
  ZDID5=1.0_JPRB/(ZU5(JLON)+ZCD5*Z3BC*PCDN5(JLON)*SQRT(ZSTAC5(JLON)*ZRZD5))
  ZDIH=-(ZU(JLON)+ZCH*Z3BC*ZCDNH5(JLON)*SQRT(ZSTAC5(JLON)&
   & *ZRZH5)+ZCH5*Z3BC*ZCDNH(JLON)*SQRT(ZSTAC5(JLON)*ZRZH5)&
   & +ZCH5*Z3BC*ZCDNH5(JLON)*(ZSTAC5(JLON)*ZRZH &
   & +ZSTAC(JLON)*ZRZH5)/(2.0_JPRB*SQRT(ZSTAC5(JLON)*ZRZH5)))&
   & /(ZU5(JLON)+ZCH5*Z3BC*ZCDNH5(JLON)*SQRT(ZSTAC5(JLON)&
   & *ZRZH5))**2  
  ZDIH5=1.0_JPRB/(ZU5(JLON)+ZCH5*Z3BC*ZCDNH5(JLON)*SQRT(ZSTAC5(JLON)*ZRZH5))

!     CALCULS POUR LES COMPOSANTES DU VENT DE CD ET DE SON PRODUIT PAR
!     DENSITE FOIS MODULE DU VENT.
!     COMPUTATIONS FOR MOMENTUM OF CD AND OF ITS PRODUCT BY DENSITY
!     TIME WIND SPEED.

  ZLOS=(ZCIS5*ZDS+ZCIS*ZDS5)/(ZU5(JLON)*ZDS5+Z2B*ZSTAC5(JLON))&
   & -(ZU5(JLON)*ZDS+ZU(JLON)*ZDS5+Z2B*ZSTAC(JLON))&
   & *ZCIS5*ZDS5/(ZU5(JLON)*ZDS5+Z2B*ZSTAC5(JLON))**2  
  ZLOS5=ZCIS5*ZDS5/(ZU5(JLON)*ZDS5+Z2B*ZSTAC5(JLON))
  ZLOI=ZU(JLON)-Z2B*(ZSTA5(JLON)*ZDID+ZSTA(JLON)*ZDID5)
  ZLOI5=ZU5(JLON)-Z2B*ZSTA5(JLON)*ZDID5
  PCD(JLON)=((ZLOI+PSTAB(JLON)*(ZLOS-ZLOI))*PCDN5(JLON)&
   & +(ZLOI5+PSTAB(JLON)*(ZLOS5-ZLOI5))*PCDN(JLON))&
   & /ZU5(JLON)&
   & -ZU(JLON)*(ZLOI5+PSTAB(JLON)*(ZLOS5-ZLOI5))&
   & *PCDN5(JLON)/ZU5(JLON)**2  
  PCD5(JLON)=(ZLOI5+PSTAB(JLON)*(ZLOS5-ZLOI5))*PCDN5(JLON)/ZU5(JLON)

!     IDEM POUR LA TEMPERATURE ET L'HUMIDITE.
!     THE SAME FOR TEMPERATURE AND HUMIDITY.

  ZLOS=2.0_JPRB*ZCIS*ZCIS5/(ZU5(JLON)*ZCIS5+Z3B*ZSTAHC5(JLON)*ZHS5)&
   & -(ZU5(JLON)*ZCIS+ZU(JLON)*ZCIS5+Z3B*ZSTAHC5(JLON)*ZHS &
   & +Z3B*ZSTAHC(JLON)*ZHS5)*ZCIS5**2 &
   & /(ZU5(JLON)*ZCIS5+Z3B*ZSTAHC5(JLON)*ZHS5)**2  
  ZLOS5=ZCIS5**2/(ZU5(JLON)*ZCIS5+Z3B*ZSTAHC5(JLON)*ZHS5)
  ZLOI=ZU(JLON)-Z3B*(ZSTA5(JLON)*ZDIH+ZSTA(JLON)*ZDIH5)
  ZLOI5=ZU5(JLON)-Z3B*ZSTA5(JLON)*ZDIH5
  PCH(JLON)=((ZLOI+PSTAB(JLON)*(ZLOS-ZLOI))*ZCDNH5(JLON)&
   & +(ZLOI5+PSTAB(JLON)*(ZLOS5-ZLOI5))*ZCDNH(JLON))&
   & /ZU5(JLON)&
   & -ZU(JLON)*(ZLOI5+PSTAB(JLON)*(ZLOS5-ZLOI5))&
   & *ZCDNH5(JLON)/ZU5(JLON)**2  
  PCH5(JLON)=(ZLOI5+PSTAB(JLON)*(ZLOS5-ZLOI5))*ZCDNH5(JLON)/ZU5(JLON)

  PXDROV (JLON)=0.0_JPRB
  PXDROV5(JLON)=1.0_JPRB
  PXHROV (JLON)=0.0_JPRB
  PXHROV5(JLON)=1.0_JPRB

ENDDO

IF (LDCLS) THEN
  DO JLON=KIDIA,KFDIA

!     CALCUL DE LA DERIVEE PAR RAPPORT A TS DE QSATS ET DES COEFFICIENTS
!     D'ECHANGE MULTIPLIES PAR DENSITE ET MODULE DU VENT.
!     COMPUTATION OF THE DERIVATIVE OF QSATS WITH RESPECT TO TS AND OF
!     THE EXCHANGE COEFFICIENTS MULTIPLIED BY DENSITY AND WIND SPEED.

    PDQSTS(JLON)= FODQSTL (PQSATS(JLON),PQSATS5(JLON),&
     & ZESP(JLON),ZESP5(JLON),&
     & FODLEWTL (PTS(JLON),PTS5(JLON),ZDELT(JLON)),&
     & FODLEW (PTS5(JLON),ZDELT(JLON)))  
    PDQSTS5(JLON)= FODQS (PQSATS5(JLON),ZESP5(JLON),&
     & FODLEW (PTS5(JLON),ZDELT(JLON)))  
    PCDROV(JLON)=PCD(JLON)*ZU5(JLON)*PAPRS5(JLON,KLEV)&
     & *ZRTI5(JLON)+PCD5(JLON)*ZU(JLON)&
     & *PAPRS5(JLON,KLEV)*ZRTI5(JLON)+PCD5(JLON)&
     & *ZU5(JLON)*PAPRS(JLON,KLEV)*ZRTI5(JLON)&
     & +PCD5(JLON)*ZU5(JLON)*PAPRS5(JLON,KLEV)&
     & *ZRTI(JLON)  
    PCDROV5(JLON)=PCD5(JLON)*ZU5(JLON)*PAPRS5(JLON,KLEV)*ZRTI5(JLON)
    PCHROV(JLON)=PCH(JLON)*ZU5(JLON)*PAPRS5(JLON,KLEV)&
     & *ZRTI5(JLON)+PCH5(JLON)*ZU(JLON)&
     & *PAPRS5(JLON,KLEV)*ZRTI5(JLON)+PCH5(JLON)&
     & *ZU5(JLON)*PAPRS(JLON,KLEV)*ZRTI5(JLON)&
     & +PCH5(JLON)*ZU5(JLON)*PAPRS5(JLON,KLEV)&
     & *ZRTI(JLON)  
    PCHROV5(JLON)=PCH5(JLON)*ZU5(JLON)*PAPRS5(JLON,KLEV)*ZRTI5(JLON)

!     CALCULS DE UN SUR G FOIS LA FREQUENCE DE BRUNT-VAISALA DIVISEE PAR
!     LA DENSITE LE TOUT AU CARRE DE MEME QUE LA DENSITE (POUR G.W.D.).
!     COMPUTATION OF ONE OVER G TIME THE BRUNT-VAISALA FREQUENCY DIVIDED
!     BY DENSITY THE WHOLE BEING SQUARED AS WELL AS DENSITY (FOR G.W.D.)

    PNBVNO(JLON,KLEV)=ZSTABV(JLON)/(PAPRS5(JLON,KLEV)*ZRTI5(JLON)&
     & *ZDPHI5(JLON))**2-2*ZSTABV5(JLON)&
     & *(PAPRS(JLON,KLEV)*ZRTI5(JLON)&
     & *ZDPHI5(JLON)&
     & +PAPRS5(JLON,KLEV)*ZRTI(JLON)&
     & *ZDPHI5(JLON)+PAPRS5(JLON,KLEV)&
     & *ZRTI5(JLON)*ZDPHI(JLON))&
     & /(PAPRS5(JLON,KLEV)*ZRTI5(JLON)&
     & *ZDPHI5(JLON))**3  
    PNBVNO5(JLON,KLEV)=ZSTABV5(JLON)/(PAPRS5(JLON,KLEV)&
     & *ZRTI5(JLON)*ZDPHI5(JLON))**2  
    PGWDCS(JLON)=PAPRS5(JLON,KLEV)*ZRTI(JLON)+PAPRS(JLON,KLEV)*ZRTI5(JLON)
    PGWDCS5(JLON)=PAPRS5(JLON,KLEV)*ZRTI5(JLON)
  ENDDO
ENDIF

!*
!     ------------------------------------------------------------------
!     VII - INTERPOLATION.

!           INTERPOLATION.

IF (LDHMT) THEN

  CALL ACNTCLSTL ( KIDIA,KFDIA,KLON,KTDIA,KLEV,&
   & PAPRS5,PAPRSF5,PCP5,PQ5,PT5,PU5,PV5,&
   & PCD5,PCDN5,ZCDNH5,PCH5,PCPS5,ZDPHI5,PQS5,PTS5,&
   & PAPRS,PAPRSF,PCP,PQ,PT,PU,PV,&
   & PCD,PCDN,ZCDNH,PCH,PCPS,ZDPHI,PDPHIT,PDPHIV,&
   & PQS,PSTAB,PTS,&
   & LDZ0H,&
   & PQCLS,PRHCLS,PTCLS,PUCLS,PVCLS,PUCLN,PVCLN,PZPCLS,&
   & PQCLS5,PRHCLS5,PTCLS5,PUCLS5,PVCLS5,PZPCLS5,'ACNTCLSTL' )  

ENDIF

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