!OPTIONS XOPT(NOEVAL)
SUBROUTINE ACMIXLENTM ( KIDIA,KFDIA,KLON,KTDIA,KLEV,&
 !-----------------------------------------------------------------------
 ! - INPUT  2D .
 & PAPHI,PAPHIF,&
 ! - INPUT 1D .
 & PGZ0,PGZ0H,PBLH,&
 ! - OUTPUT 2D .
 & PLMU,PLMT,&
 ! - LOCK ARGUMENTS .
 & CDLOCK)  

!**** *ACMIXLENTM * - CALCUL DE LA LONGUEUR DE MELANGE .
!                 EXTRAIT DU CALCUL FAIT DANS ACNEBR; MODIFICATION EFFECTUEE: T0 CALCULE LOCALEMENT.
!                 COMPUTE THE MIXING LENGTHS.
!                 CODES EXTRACTED FROM ACNEBR; MODIFICATION: T0 COMPUTED LOCALLY.

! -   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)
!              POUR LES CALCULS DE TURBULENCE.
! KTDIA     : START OF THE VERTICAL LOOP FOR THE TURBUL COMPUTATIONS.
! 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.

! - 2D (1:KLEV) .

! PAPHIF     : GEOPOTENTIEL AUX NIVEAUX DES COUCHES.

! - 1D (PROGNOSTIQUE) .

! PGZ0       : G FOIS LA LONGUEUR DE RUGOSITE COURANTE.
! PGZ0H      : G FOIS LA LONGUEUR DE RUGOSITE THERMIQUE COURANTE.
! PBLH       : Hauteur de couche limite.

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

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

! - 2D (0:KLEV) .
! PLMU        : LONGUEUR DE MELANGE POUR LE VENT.
! PLMT        : LONGUEUR DE MELANGE POUR T ET Q.

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

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

! COMMON/YOMPHY0/
! COMMON/YOMCST /

!-----------------------------------------------------------------------
! -     Auteur copieur de M. Deque : E. BAZILE 29/10/2003
!-----------------------------------------------------------------------

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

USE YOMPHY0  , ONLY : ALMAV    ,SENSL    ,VKARMN   ,EDD, BEDIFV       ,&
 & XMAXLM, XMINLM, USURID
USE YOMCST   , ONLY : RG       

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)    :: PAPHI(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPHIF(KLON,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGZ0(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGZ0H(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PBLH(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PLMU(KLON,0:KLEV) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PLMT(KLON,0:KLEV) 
CHARACTER(LEN=*)  ,INTENT(IN)    :: CDLOCK 
REAL(KIND=JPRB) ::ZBLH(KLON)
REAL(KIND=JPRB) :: ZGHU2(KLON),ZC2U(KLON),ZC2T(KLON),ZC3U(KLON),ZC3T(KLON)
INTEGER(KIND=JPIM) :: JLEV, JLON

REAL(KIND=JPRB) :: ZRLTLU, ZGLU, ZGLT, ZGLUZ,&
 & ZGLTZ, ZGZ, ZGZH, ZGHU1, ZGHT1,&
 & ZBIN  
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "abor1.intfb.h"

!     CHECK RELIABILITY OF INPUT ARGUMENTS.

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

PLMU(:,:)=0.0_JPRB
PLMT(:,:)=0.0_JPRB

IF(USURID == 0.0_JPRB) THEN
  ZRLTLU=1.5_JPRB*EDD
ELSE
  ZRLTLU=SQRT(3._JPRB)/2._JPRB*EDD
ENDIF

ZGLU=RG*ALMAV*BEDIFV
ZGLT=ZGLU*ZRLTLU
ZBLH(:)=MIN(XMAXLM,MAX(XMINLM,PBLH(:)))
DO JLEV=1,KLEV-1
  ZGLUZ=ZGLU
  ZGLTZ=ZGLT

  DO JLON=KIDIA,KFDIA
    ZGZ=0.5_JPRB*(PAPHIF(JLON,JLEV)+PAPHIF(JLON,JLEV+1))&
     & -PAPHI(JLON,KLEV)+PGZ0(JLON)  
    ZGZH=0.5_JPRB*(PAPHIF(JLON,JLEV)+PAPHIF(JLON,JLEV+1))&
     & -PAPHI(JLON,KLEV)+PGZ0H(JLON)  
  
    ZGHU2(JLON)=RG*ZBLH(JLON)
    ZGHU1=ZGHU2(JLON)**2/(3._JPRB*ZGHU2(JLON)-6._JPRB*ZGLU/VKARMN)
    ZGHT1=ZGHU2(JLON)**2/(3._JPRB*ZGHU2(JLON)-6._JPRB*ZGLT/VKARMN)
    ZC2U(JLON)=-(ZGHU1+ZGHU2(JLON))/(2.0_JPRB*ZGHU1*ZGHU2(JLON))
    ZC2T(JLON)=-(ZGHT1+ZGHU2(JLON))/(2.0_JPRB*ZGHT1*ZGHU2(JLON))
    ZC3U(JLON)=1.0_JPRB/(3._JPRB*ZGHU1*ZGHU2(JLON))
    ZC3T(JLON)=1.0_JPRB/(3._JPRB*ZGHT1*ZGHU2(JLON))

    ZBIN=MAX(0.0_JPRB,SIGN(1.0_JPRB,ZGHU2(JLON)-ZGZ))
    ZGLUZ=ZGLU*(1.0_JPRB-ZBIN)+ &
     & ZBIN*VKARMN*ZGZ*(1.0_JPRB+ZGZ*(ZC2U(JLON)+ZGZ*ZC3U(JLON)))  
    PLMU(JLON,JLEV)=SENSL*ZGLUZ/RG

    ZBIN=MAX(0.0_JPRB,SIGN(1.0_JPRB,ZGHU2(JLON)-ZGZH))
    ZGLTZ=ZGLT*(1.0_JPRB-ZBIN)+ &
     & ZBIN*VKARMN*ZGZH*(1.0_JPRB+ZGZH*(ZC2T(JLON)+ZGZH*ZC3T(JLON)))  
    PLMT(JLON,JLEV)=SENSL*ZGLTZ/RG
  ENDDO
ENDDO
IF (LHOOK) CALL DR_HOOK('ACMIXLENTM',1,ZHOOK_HANDLE)

END SUBROUTINE ACMIXLENTM
