!OPTIONS XOPT(NOEVAL)
SUBROUTINE ACEVMEL ( KIDIA,KFDIA,KLON,&
 !-----------------------------------------------------------------------
 ! - INPUT LOGICAL
 & LDSIMP,&
 ! - INPUT 1D .
 & PDQ,PHPLSL,PHPLSN,PIPB,PIPH,PIPOI,PLPLSL,PLPLSN,PPOID,PQNST,PQRST,&
 & PQVST,PSTAL3,PSTAN3,PTST,PLPRSF,PLSCP,PRHOAIR,&
 ! - OUTPUT 1D .
 & PEVAN,PEVAR,PFONT,PTEST,&
 ! - LOCK ARGUMENTS .
 & CDLOCK)  

!**** *ACEVMEL* - CALCULS D'AUTO-CONVERSION.

!     Sujet.
!     ------
!     - ROUTINE DE CALCUL ACTIF (SUR UN NIVEAU).
!       CALCUL DE TROIS INCREMENTS D'EVAPORATION-FONTE/GEL.
!     - COMPUTATION OF THREE EVAPORATION-MELTING/FREEZING INCREMENTS.

!**   Interface.
!     ----------
!        *CALL* *ACEVMEL*

!-----------------------------------------------------------------------
! WARNING: THE ENGLISH VERSION OF VARIABLES' NAMES IS TO BE READ IN THE
!          "APLMPHYS" 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.

! - ARGUMENT DE CONTROLE D'UNE VERSION SIMPLIFIEE (FONTE/GEL SEULS).

! LDSIMP     : IF .TRUE., CAS SIMPLIFIE.

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

! - 1D .

! PDQ        : DEFICIT DE SATURATION (EN TERME DE 'QW-Q').
! PHPLSL     : FLUX DE PRECIPITATION LIQUIDE AU SOMMET DE LA COUCHE.
! PHPLSN     : FLUX DE PRECIPITATION NEIGEUSE AU SOMMET DE LA COUCHE.
! PIPB       : INVERSE DE LA PRESSION AU BAS DE LA COUCHE.
! PIPH       : INVERSE DE LA PRESSION AU SOMMET DE LA COUCHE.
! PIPOI      : FACTEUR DE CONVERSION DE D_P FLUX VERS D_T Q_X.
! PLPLSL     : FLUX DE PRECIPITATION LIQUIDE AU BAS DE LA COUCHE.
! PLPLSL     : FLUX DE PRECIPITATION NEIGEUSE AU BAS DE LA COUCHE.
! PPOID      : FACTEUR DE CONVERSION DE D_T Q_X VERS D_P FLUX.
! PQNST      : QUANTITE COURANTE D'EAU SOLIDE PRECIPITANTE.
! PQRST      : QUANTITE COURANTE D'EAU LIQUIDE PRECIPITANTE.
! PQVST      : QUANTITE COURANTE D'EAU VAPEUR.
! PSTAL3     : PROBABILITE SOURCE 'PLUIE' POUR LA SEDIMENTATION.
! PSTAN3     : PROBABILITE SOURCE 'NEIGE' POUR LA SEDIMENTATION.
! PTST       : VALEUR COURANTE DE LA TEMPERATURE A L'ECHELLE DE LA MAILLE.
! PLPRSF     : PRESSION AU MILIEU DE LA COUCHE.
! PLSCP      : CHALEUR LATENTE DE FUSION DIVISEE PAR CP.
! PRHOAIR    : DENSITE DE L'AIR.

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

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

! - 1D .

! PEVAN      : INCREMENT D'EVAPORATION DE LA NEIGE.
! PEVAR      : INCREMENT D'EVAPORATION DE LA PLUIE.
! PFONT      : INCREMENT DE FONTE DE LA NEIGE (-GEL DE LA PLUIE).
! PTEST      : TEST POUR LA PERPETUATION DU FLUX DE PRECIPITATION.

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

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

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

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

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

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

!     Auteur.
!     -------
!        07-02, J.-F. Geleyn (extraction from APLMPHYS).

!     Modifications.
!     --------------
!        07-05, Help for corr. of logical 'P1' bug - R. Brozkova & J.-F. Geleyn
!        07-06, No more fallspeed impact on EVA/FON - R. Brozkova & J.-F. Geleyn
!        07-07, Option of the ARPEGE scheme - J.-F. Geleyn & J.-M. Piriou
!        07-08, Progressive extinction of EVA/FON - R. Brozkova & J.-F. Geleyn
!        07-08, Local computation of the ice proportion - J.-F. Geleyn
!        07-10, Differentiation melting vs. freezing - D. Banciu & J.-F. Geleyn
!        07-12, Full evaporation simplification - R. Brozkova
!        08-02, ARPEGE limitation of the evaporation rate - J.-F. Geleyn
!        08-10, Correction (ZQS-ZQ rather than ZDQ) in ARPEGE case - B. Catry

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

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

USE YOMPHY   , ONLY : NPHYREP
USE YOMCST   , ONLY : RTT      ,RV       ,RCS      ,RCW      ,RCPV     ,&
 &                    RLVTT    ,RLSTT    ,RETV     ,RALPW    ,RALPS    ,&
 &                    RALPD    ,RBETW    ,RBETS    ,RBETD    ,RGAMW    ,&
 &                    RGAMS    ,RGAMD
USE YOMPHY0  , ONLY : EVAP     ,FONT     ,RNINTR   ,RNINTS
USE YOMPHY2  , ONLY : TSPHY

IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KLON 
INTEGER(KIND=JPIM),INTENT(IN)    :: KIDIA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KFDIA 
LOGICAL           ,INTENT(IN)    :: LDSIMP 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDQ(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PHPLSL(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PHPLSN(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PIPB(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PIPH(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PIPOI(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLPLSL(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLPLSN(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PPOID(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQNST(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQRST(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQVST(KLON)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSTAL3(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSTAN3(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTST(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLPRSF(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLSCP(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRHOAIR(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PEVAN(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PEVAR(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFONT(KLON) 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTEST(KLON) 
CHARACTER(LEN=7)  ,INTENT(IN)    :: CDLOCK 

INTEGER(KIND=JPIM) :: JLON

LOGICAL :: LLA0MPS, LLARPSC, LLEVAPX

REAL(KIND=JPRB) :: ZEVA, ZFON, ZRPTH, ZRPTB, &
 & ZEVAPO, ZFONTLP, ZFONTLM, ZFPLSL, ZFPLSN, ZEPS1, ZCOEFFC, &
 & ZCOEFFD, ZCOEFFE, ZCOEFFF, ZEXPD, ZEXPE, ZEXPP, ZCEXPN, ZFACT, ZFACT1, &
 & ZFACT2, ZIDARV, ZDELT, ZQRST, ZQNST, ZESW, ZSSATW, ZCONDT, ZCEV, ZARG, &
 & ZNINTS, ZINT, ZRME, ZGELSFON, ZEVASX, ZSSATI, ZQSATW, ZQSATI, ZINTW, ZINTI

REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "abor1.intfb.h"
! -------------------------
#include "fcttrm.h"

!     CHECK RELIABILITY OF INPUT ARGUMENTS.

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

LLA0MPS=.TRUE.
LLARPSC=.FALSE.
LLEVAPX=.TRUE.

ZEVASX=2.E-07_JPRB

IF (LLA0MPS) THEN

  ZEPS1=1.E-14

  ZGELSFON=0.0125_JPRB

  DO JLON=KIDIA,KFDIA

!     EVAPORATION.
!     EVAPORATION.

    IF (.NOT.LDSIMP) THEN
      ZRME=PHPLSN(JLON)/MAX(ZEPS1,PHPLSL(JLON)+PHPLSN(JLON))
      ZRPTH=SQRT(MAX(0.0_JPRB,PHPLSL(JLON)+PHPLSN(JLON)))
      ZRPTB=SQRT(MAX(0.0_JPRB,PLPLSL(JLON)+PLPLSN(JLON)))
      ZEVA=EVAP
      ZARG=ZEVA*(PIPH(JLON)-PIPB(JLON))*(ZRPTH+ZRPTB)*PIPOI(JLON)
      ZEVAPO=MAX(0.0_JPRB,PDQ(JLON)*ZARG/(1.0_JPRB+ZARG))
      PEVAR(JLON)=ZEVAPO*(1.0_JPRB-ZRME)
      PEVAN(JLON)=ZEVAPO*ZRME
    ELSE
      ZRPTH=SQRT(MAX(0.0_JPRB,PHPLSL(JLON)+PHPLSN(JLON)))
      ZRPTB=SQRT(MAX(0.0_JPRB,PLPLSL(JLON)+PLPLSN(JLON)))
      PEVAR(JLON)=0.0_JPRB
      PEVAN(JLON)=0.0_JPRB
    ENDIF

!     FONTE.
!     MELTING.

    ZFPLSL=MAX(0.0_JPRB,PLPLSL(JLON)-PEVAR(JLON)*PPOID(JLON)*PSTAL3(JLON))
    ZFPLSN=MAX(0.0_JPRB,PLPLSN(JLON)-PEVAN(JLON)*PPOID(JLON)*PSTAN3(JLON))
    ZRPTB=SQRT(MAX(0.0_JPRB,ZFPLSL+ZFPLSN))
    ZFON=FONT*(ZGELSFON+(1.0_JPRB-ZGELSFON)&
     &*MAX(0.0_JPRB,SIGN(1.0_JPRB,PTST(JLON)-RTT)))
    ZARG=PLSCP(JLON)*ZFON*(PIPH(JLON)-PIPB(JLON))*(ZRPTH+ZRPTB)*0.5_JPRB&
     &*PIPOI(JLON)
    PFONT(JLON)=((PTST(JLON)-RTT)/PLSCP(JLON))*ZARG/(1.0_JPRB+ZARG)
  ENDDO

ENDIF

IF (LLARPSC) THEN

  ZEPS1=1.E-20

  ZCOEFFC=0.08744_JPRB
  ZCOEFFD=1.1206_JPRB
  ZEXPD=17._JPRB/24._JPRB
  ZCOEFFE=9.736_JPRB
  ZEXPE=2._JPRB/3._JPRB
  ZCOEFFF=2373.7_JPRB
  ZEXPP=1._JPRB/3._JPRB
  ZCEXPN=-0.1222_JPRB
  ZFACT=RV/2.0_JPRB
  ZIDARV=1.0_JPRB/(0.0231_JPRB*RV)

  DO JLON=KIDIA,KFDIA

    IF (.NOT.LDSIMP) THEN
      ZDELT=PTST(JLON)-RTT
      ZQRST=MAX(0.0_JPRB,PQRST(JLON))
      ZQNST=MAX(0.0_JPRB,PQNST(JLON))

!     EVAPORATION.
!     EVAPORATION.

      ZFACT1=ZFACT*PTST(JLON)*PLPRSF(JLON)
      ZFACT2=PLPRSF(JLON)**ZEXPP

      ZESW=FOEW(PTST(JLON),0.0_JPRB)
      ZQSATW=FOQS(ZESW/PLPRSF(JLON))
      ZSSATW=MAX(0.0_JPRB,1.0_JPRB-PQVST(JLON)/ZQSATW)
      ZCONDT=ZIDARV*(FOLH(PTST(JLON),0.0_JPRB)/PTST(JLON))**2
      ZCEV=ZSSATW*RNINTR/(PRHOAIR(JLON)*(ZCONDT+ZFACT1/ZESW))
      ZARG=PRHOAIR(JLON)*ZQRST/RNINTR
      PEVAR(JLON)=ZCEV*(ZCOEFFC*SQRT(ZARG)+ZCOEFFD*ZFACT2*ZARG**ZEXPD)*TSPHY

      ZESW=FOEW(PTST(JLON),1.0_JPRB)
      ZQSATI=FOQS(ZESW/PLPRSF(JLON))
      ZSSATI=MAX(0.0_JPRB,1.0_JPRB-PQVST(JLON)/ZQSATI)
      ZCONDT=ZIDARV*(FOLH(PTST(JLON),1.0_JPRB)/PTST(JLON))**2
      ZNINTS=RNINTS*EXP(ZCEXPN*ZDELT)
      ZCEV=ZSSATI*ZNINTS/(PRHOAIR(JLON)*(ZCONDT+ZFACT1/ZESW))
      ZARG=PRHOAIR(JLON)*ZQNST/ZNINTS
      PEVAN(JLON)=ZCEV*(ZCOEFFE*ZARG**ZEXPE+ZCOEFFF*ZFACT2*ZARG)*TSPHY

      IF (LLEVAPX) THEN
        ZARG=ZEVASX*TSPHY/MAX(ZEPS1,PEVAR(JLON)+PEVAN(JLON))
        ZINT=ZARG*(1.0_JPRB-EXP(-1.0_JPRB/ZARG))
        PEVAR(JLON)=ZINT*PEVAR(JLON)
        PEVAN(JLON)=ZINT*PEVAN(JLON)
      ENDIF

      ZINTW=MIN(1.0_JPRB,MAX(0.0_JPRB,(ZQSATW-PQVST(JLON)))&
       &/MAX(ZEPS1,PEVAR(JLON)+PEVAN(JLON)))
      ZINTI=MIN(1.0_JPRB,MAX(0.0_JPRB,(ZQSATI-PQVST(JLON)))&
       &/MAX(ZEPS1,PEVAR(JLON)+PEVAN(JLON)))
      PEVAR(JLON)=ZINTW*PEVAR(JLON)
      PEVAN(JLON)=ZINTI*PEVAN(JLON)
    ELSE
      ZDELT=PTST(JLON)-RTT
      PEVAR(JLON)=0.0_JPRB
      PEVAN(JLON)=0.0_JPRB
    ENDIF

!     FONTE (SANS REGEL).
!     MELTING (WITHOUT RE-FREEZING).

    PFONT(JLON)=MAX(0.0_JPRB,ZDELT)/PLSCP(JLON)
  ENDDO

ENDIF

!     SECURITES.
!     SECURITIES.

DO JLON=KIDIA,KFDIA
  ZFONTLP=PLPLSN(JLON)/(PPOID(JLON)*PSTAN3(JLON))
  ZFONTLM=-PLPLSL(JLON)/(PPOID(JLON)*PSTAL3(JLON))
  PFONT(JLON)=MAX(MIN(PFONT(JLON),ZFONTLP),ZFONTLM)
  PEVAR(JLON)=PEVAR(JLON)-PFONT(JLON)
  PEVAN(JLON)=PEVAN(JLON)+PFONT(JLON)
  PTEST(JLON)=1.0_JPRB-MAX(0.0_JPRB,SIGN(1.0_JPRB,PEVAR(JLON)+ZFONTLM))&
   &*MAX(0.0_JPRB,SIGN(1.0_JPRB,PEVAN(JLON)-ZFONTLP))
  PEVAR(JLON)=MIN(PEVAR(JLON),-ZFONTLM)
  PEVAN(JLON)=MIN(PEVAN(JLON),ZFONTLP)
  PEVAR(JLON)=PEVAR(JLON)+PFONT(JLON)
  PEVAN(JLON)=PEVAN(JLON)-PFONT(JLON)
ENDDO

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


