SUBROUTINE CACLSI(KNBPT,KPROMA,PUT,PVT,PTT,PQT,PLT,PIT,PRT,PST,PSPT,PGM,&
 & PSP_SG,PSP_RR,PSD_VF,PSD_VV,PSP_CI)

!****-------------------------------------------------------------------
!****   CACLSI : ROUTINE EFFECTUANT L'INITIALISATION DE TABLEAUX
!****   ------   POINTS DE GRILLE NECESSAIRES A *CANARI*.
!****
!****  Auteurs :   CB 12/90  BU 08/92  PM xx/xx  VC 02/93,11/94  DG 05/94
!        R. El Khatib : 01-08-07 Pruning options
!        M. Bellus : 2003-04-24 Change of arguments in ACHMT calling
!                               + removing LSOLV and some cleaning
!        M. Tudor : 2003-10-21 change args in ACHMT, reintroduce LSOLV
!        Y. Bouteloup : 2005-01-19 add PLT and PIT in input to initialise ZQL and ZQI
!        Modified 04-02-06: Y. Seity : new arguments to GPRCP
!        Y. Bouteloup : 2005-12-25 add PRT and PST in input to initialise ZQR and ZQS
!        M.Hamrud      01-Jul-2006 Revised surface fields
!        A. Alias : 2007-10-11 New Output in ACHMT (ZRTI=1/R*T) 
!        C.Payan  : 2008-11 Neutral Wind (ACHMT)
!****-------------------------------------------------------------------
!*** Arguments d'entree :
!*** ------------------
!               KNBPT  : dimensionnement horizontal utile
!               KPROMA : surdimensionnement horizontal
!               PUT,PVT,PTT,PQT,PLT,PIT,PRT,PST,PSPT : 
!                  parties des champs u,v,t,qv,ql,qi,qr,qs,ps
!               PGM : partie du champ GM (facteur d'echelle)

!*** Sous-programme amont :  CAPOTX
!*** --------------------
!*** Sous-programmes aval :
!*** --------------------
!               - GPPREH- CALCUL DES NIVEAUX PRESSIONS.
!               - GPXYB - CALCUL DE QUANTITES AUXILIAIRES LIEES AUX PRESSIONS
!               - GPPREF- CALCUL DES NIVEAUX PRESSION
!               - GPRCP - CALCUL DE R, CP ET KAPPA.
!               - GPGEO - CALCUL DES ALTITUDES GEOPOTENTIEL
!               - ACSOLW- CALCULS PRELIMINAIRES POUR ISBA (WFC)
!               - ACHMT - CALCUL DES PARAMETRES AUX HAUTEURS METEO

!*** COMMONS utilises :
!*** ----------------
!              - YOMDIM - DIMENSIONS DES TABLEAUX DE TRAVAIL.
!              - YOMDPHY- DIMENSIONS DES TABLEAUX DE LA PHYSIQUE.
!              - YOMCST - CONSTANTES DE BASE.
!              - YOMPHY - CLES DE LA PHYSIQUE.
!              - YOMPHY2- DEFINITION DES HAUTEURS METEO.
!              - YOMGEM - DEFINITION DE LA GEOMETRIE DU MODELE.
!              - YOMSC2 - DEFINITION DES BUFFERS.

!*** Algorithme :
!*** ----------
!              - APPELLE *ACSOLW* POUR DES CALCULS PRELIMINAIRES AVEC ISBA
!              - APPELLE *ACHMT* POUR LE CACUL DES PARAMETRES
!                AUX ALTITUDES METEOS RANGES DANS *QAGPSF*.
!****-------------------------------------------------------------------

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

USE YOMDIM   , ONLY : NFLEVG
USE YOMCST   , ONLY : RG
USE YOMPHY   , ONLY : LSOLV    ,LFGEL
USE YOMPHY2  , ONLY : HTCLS    ,HVCLS
USE YOMDPHY  , ONLY : LDIRCLSMOD
USE YOMGEM   , ONLY : VBH      ,VAH      ,VC       ,VDELB
USE SURFACE_FIELDS_MIX, ONLY : YSP_SGD, YSP_SG,YSP_RRD, YSP_RR,YSD_VVD, YSD_VV,&
 & YSD_VFD, YSD_VF, YSP_CID, YSP_CI
!**---------------------------------------------------------------------

IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KNBPT 
INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMA 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PUT(KPROMA,NFLEVG) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PVT(KPROMA,NFLEVG) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTT(KPROMA,NFLEVG) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQT(KPROMA,NFLEVG) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLT(KPROMA,NFLEVG)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PIT(KPROMA,NFLEVG)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PRT(KPROMA,NFLEVG)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PST(KPROMA,NFLEVG)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSPT(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGM(KNBPT) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSP_SG(KPROMA,YSP_SGD%NDIM)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSP_RR(KPROMA,YSP_RRD%NDIM)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSD_VF(KPROMA,YSD_VFD%NDIM)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSD_VV(KPROMA,YSD_VVD%NDIM)
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSP_CI(KPROMA,YSP_CID%NDIM)

!**---------------------------------------------------------------------

!     ZPRESF  : PRESSIONS AUX NIVEAUX ENTIERS.
!     ZPRESH  : PRESSIONS AUX DEMI-NIVEAUX.
!     ZDELP   : DIFFERENCES DE PRESSIONS (NIVEAUX ENTIERS).
!     ZRDELP  : INVERSES DES QUANTITES PRECEDENTES.
!     ZLNPR   : LOGARITHMES DE RAPPORT DE PRESSIONS.
!     ZALPH   : COEFFICIENTS POUR L'HYDROSTATIQUE.
!     ZQ      : HUMIDITE SPECIFIQUE.
!     ZQI     : EAU GLACE.
!     ZQL     : EAU LIQUIDE.
!     ZQR     : PLUIE.
!     ZQSN     : NEIGE.
!     ZQG     : GRAUPEL.
!     ZT      : TEMPERATURE.
!     ZU      : COMPOSANTE EN X DU VENT.
!     ZV      : COMPOSANTE EN Y DU VENT.
!     ZSNS    : HAUTEUR DE NEIGE.
!     ZTS     : TEMPERATURE DE SURFACE.
!     ZWS     : CONTENU EN EAU DU SOL.
!     ZR      : R(EAU).
!     ZCP     : CP(EAU).
!     ZKAP    : R(EAU)/CP(EAU).
!     ZPHIF   : GEOPOTENTIELS AUX NIVEAUX ENTIERS.
!     ZPHIH   : GEOPOTENTIELS AUX DEMI-NIVEAUX.
!     ZQCLS   : HUMIDITE SPECIFIQUE A 2M.
!     ZTCLS   : TEMPERATURE A 2M.
!     ZRHCLS  : HUMIDITE RELATIVE A 2M.
!     ZUCLS   : COMPOSANTE DU VENT EN X A 10M.
!     ZVCLS   : COMPOSANTE DU VENT EN Y A 10M.
!     ZUCLN   : COMPOSANTE DU VENT NEUTRE EN X A 10M.
!     ZVCLN   : COMPOSANTE DU VENT NEUTRE EN Y A 10M.

REAL(KIND=JPRB) :: ZPRESF(KPROMA,NFLEVG),ZPRESH(KPROMA,0:NFLEVG)
REAL(KIND=JPRB) :: ZDELP(KPROMA,NFLEVG), ZRDELP(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZLNPR(KPROMA,NFLEVG), ZALPH(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZRTGR(KPROMA,NFLEVG), ZR(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZRPRES(KPROMA,NFLEVG),ZPRPP(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZCP(KPROMA,NFLEVG),   ZKAP(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZQ(KPROMA,NFLEVG),    ZT(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZU(KPROMA,NFLEVG),    ZV(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZQI(KPROMA,NFLEVG),   ZQL(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZQR(KPROMA,NFLEVG),   ZQSN(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZQG(KPROMA,NFLEVG)
REAL(KIND=JPRB) :: ZPHIF(KPROMA,NFLEVG), ZPHIH(KPROMA,0:NFLEVG)
REAL(KIND=JPRB) :: ZFPLSH(KPROMA,0:NFLEVG), ZFPLCH(KPROMA,0:NFLEVG)
REAL(KIND=JPRB) :: ZSNS  (KPROMA), ZTS   (KPROMA), ZWS   (KPROMA)
REAL(KIND=JPRB) :: ZRHCLS(KPROMA), ZTCLS (KPROMA), ZPCLS (KPROMA)
REAL(KIND=JPRB) :: ZUCLS (KPROMA), ZVCLS (KPROMA)
REAL(KIND=JPRB) :: ZUCLN (KPROMA), ZVCLN (KPROMA)
REAL(KIND=JPRB) :: ZDPHIT(KPROMA), ZDPHIV(KPROMA), ZWFC  (KPROMA)
REAL(KIND=JPRB) :: ZNBVNO(KPROMA,0:NFLEVG)
REAL(KIND=JPRB) :: ZCD   (KPROMA), ZCDN  (KPROMA), ZCDROV(KPROMA)
REAL(KIND=JPRB) :: ZCH   (KPROMA), ZCHROV(KPROMA), ZCPS  (KPROMA)
REAL(KIND=JPRB) :: ZDQSTS(KPROMA), ZGWDCS(KPROMA), ZGZ0  (KPROMA)
REAL(KIND=JPRB) :: ZGZ0H (KPROMA)
REAL(KIND=JPRB) :: ZNEIJ (KPROMA), ZHQ   (KPROMA)
REAL(KIND=JPRB) :: ZHU   (KPROMA), ZQS   (KPROMA), ZQCLS (KPROMA)
REAL(KIND=JPRB) :: ZQSATS(KPROMA), ZRS   (KPROMA), ZSTAB (KPROMA)
REAL(KIND=JPRB) :: ZRTI  (KPROMA)
REAL(KIND=JPRB) :: ZXDROV(KPROMA), ZXHROV(KPROMA)
REAL(KIND=JPRB) :: ZURAF (KPROMA), ZVRAF (KPROMA)
REAL(KIND=JPRB) :: ZHV   (KPROMA), ZZ0H  (KPROMA), ZZ0F  (KPROMA)
REAL(KIND=JPRB) :: ZFLSM (KPROMA), ZARG  (KPROMA), ZWSI  (KPROMA)
REAL(KIND=JPRB) :: ZD2   (KPROMA), ZIVEG (KPROMA), ZSAB  (KPROMA)
REAL(KIND=JPRB) :: ZGZ0R (KPROMA), ZNEIJG(KPROMA), ZNEIJV(KPROMA)
REAL(KIND=JPRB) :: ZWPMX (KPROMA), ZWSAT (KPROMA), ZWSMX (KPROMA)
REAL(KIND=JPRB) :: ZWWILT(KPROMA), ZVEG  (KPROMA), ZVEG0 (KPROMA)

INTEGER(KIND=JPIM) :: JLEV, JROF

LOGICAL :: LLDCLS, LLDHMT

REAL(KIND=JPRB) :: ZRHMAX, ZRHMIN
REAL(KIND=JPRB) :: ZHOOK_HANDLE

!**---------------------------------------------------------------------

#include "achmt.intfb.h"
#include "acsolw.intfb.h"
#include "gpgeo.intfb.h"
#include "gppref.intfb.h"
#include "gppreh.intfb.h"
#include "gprcp.intfb.h"
#include "gpxyb.intfb.h"

!**---------------------------------------------------------------------

IF (LHOOK) CALL DR_HOOK('CACLSI',0,ZHOOK_HANDLE)

!**---------------------------------------------------------------------
!**  - 1 - Preparation du calcul des parametres aux hauteurs meteo.
!**        -------------------------------------------------------

ZPRESH(:,NFLEVG)=PSPT(:)

! Pressions a tous les niveaux intermediaires
CALL GPPREH(KPROMA,1,KNBPT,NFLEVG,VAH,VBH,ZPRESH)

! Calcul des quantites auxiliaires liees aux pressions
CALL GPXYB(KPROMA,1,KNBPT,NFLEVG,VDELB,VC,ZPRESH,ZDELP,ZRDELP,&
 & ZLNPR,ZALPH,ZRTGR,ZRPRES,ZPRPP)  
CALL GPPREF(KPROMA,1,KNBPT,NFLEVG,ZALPH,ZPRESH,ZPRESF)

! Remplissage des tableaux locaux
DO JLEV = 1 , NFLEVG
  DO JROF = 1 , KNBPT
    ZT(JROF,JLEV)  = PTT(JROF,JLEV)
    ZQ(JROF,JLEV)  = PQT(JROF,JLEV)
    ZQL(JROF,JLEV) = PLT(JROF,JLEV)
    ZQI(JROF,JLEV) = PIT(JROF,JLEV)
    ZQR(JROF,JLEV) = PRT(JROF,JLEV)
    ZQSN(JROF,JLEV)= PST(JROF,JLEV)
    ZU(JROF,JLEV)  = PUT(JROF,JLEV) * PGM(JROF)
    ZV(JROF,JLEV)  = PVT(JROF,JLEV) * PGM(JROF)
  ENDDO
ENDDO

DO JROF = 1 , KNBPT
  ZDPHIT(JROF) = RG*HTCLS
  ZDPHIV(JROF) = RG*HVCLS
  ZPHIH(JROF,NFLEVG) = 0.0_JPRB
  ZSNS (JROF) = PSP_SG(JROF,YSP_SG%YF%MP0)
  ZTS  (JROF) = PSP_RR(JROF,YSP_RR%YT%MP0)
  ZWS  (JROF) = PSP_RR(JROF,YSP_RR%YW%MP0)
  ZVEG (JROF) = PSD_VF(JROF,YSD_VF%YVEG%MP)
  ZZ0F (JROF) = PSD_VF(JROF,YSD_VF%YZ0F%MP)
  ZFLSM(JROF) = PSD_VF(JROF,YSD_VF%YLSM%MP)
ENDDO

! Calcul de R, CP et KAPPA.
CALL GPRCP(KPROMA,1,KNBPT,NFLEVG, &
 & PQ=ZQ,PQI=ZQI,PQL=ZQL,PQR=ZQR,PQS=ZQSN,PQG=ZQG, &
 & PCP=ZCP,PR=ZR,PKAP=ZKAP)

! Calcul du geopotentiel par rapport a la surface a tous les niveaux
CALL GPGEO(KPROMA,1,KNBPT,NFLEVG,ZPHIH,ZPHIF,ZT,ZR,ZLNPR,ZALPH)

LLDCLS = .FALSE.
LLDHMT = .TRUE.

! Calculs preliminaires pour le schema sol-vegetation (WFC,HV)
IF ( LSOLV ) THEN
  DO JROF = 1 , KNBPT
    ZHV   (JROF) = PSD_VV(JROF,YSD_VV%YHV%MP)
    ZARG  (JROF) = PSD_VV(JROF,YSD_VV%YARG%MP)
!          ZD2   (JROF) = 1.
!          ZIVEG (JROF) = 0.
!          ZSAB  (JROF) = PSD_VV(JROF,YSD_VV%YSAB%MP)
    IF ((YSD_VVD%NUMFLDS >= 8).AND.LSOLV) ZZ0H(JROF) = PSD_VV(JROF,YSD_VV%YZ0H%MP)
    IF (LFGEL) ZWSI(JROF) = PSP_RR(JROF,YSP_RR%YRR(4)%MP0)
  ENDDO
  CALL ACSOLW(1,KNBPT,KPROMA,ZARG,ZD2,ZFLSM,ZIVEG,ZSAB,LLDHMT,&
   & ZWFC,ZWPMX,ZWSAT,ZWSMX,ZWWILT,'ACSOLW ')  
ENDIF

!**---------------------------------------------------------------------
!**  - 2 - Appel pour le calcul des parametres aux hauteurs meteo.
!**        ------------------------------------------------------

CALL ACHMT(1,KNBPT,KPROMA,0,NFLEVG,YSD_VVD%NUMFLDS,&
 & ZPHIH,ZPHIF,ZPRESH,ZPRESF,ZCP,ZQ,ZR,ZT,ZU,ZV,ZFPLSH,ZFPLCH,&
 & ZDPHIT,ZDPHIV,ZZ0F,ZZ0H,ZGZ0R,ZHV,ZFLSM,ZNEIJG,ZNEIJV,ZSNS,&
 & ZTS,ZVEG,ZWFC,ZWS,ZWSI,LLDCLS,LLDHMT,ZNBVNO,&
 & ZCD,ZCDN,ZCDROV,ZCH,ZCHROV,ZCPS,ZDQSTS,ZGWDCS,&
 & ZGZ0,ZGZ0H,ZHQ,ZHU,ZNEIJ,ZQCLS,ZQS,ZQSATS,ZRHCLS,ZRS,ZRTI,ZSTAB,&
 & ZTCLS,ZUCLS,ZVCLS,ZUCLN,ZVCLN,ZPCLS,ZVEG0,ZXDROV,ZXHROV,&
 & ZURAF,ZVRAF,&
 & 'ACHMT  ')  

! Initialisation et stockage des champs diagnostics necessaires a l'analyse
IF (.NOT. LDIRCLSMOD) THEN
  ZRHMAX = 1.0_JPRB
  ZRHMIN = 0.0_JPRB
  DO JROF = 1 , KNBPT
    PSP_CI(JROF,YSP_CI%YCI(5)%MP0) = MAX(ZRHMIN,MIN(ZRHMAX,ZRHCLS(JROF)))
    PSP_CI(JROF,YSP_CI%YCI(4)%MP0) = ZTCLS(JROF)
    PSP_CI(JROF,YSP_CI%YCI(6)%MP0) = ZUCLS(JROF) / PGM(JROF)
    PSP_CI(JROF,YSP_CI%YCI(7)%MP0) = ZVCLS(JROF) / PGM(JROF)
  ENDDO
ELSE
  DO JROF = 1 , KNBPT
    PSP_CI(JROF,YSP_CI%YCI(6)%MP0) = ZUCLS(JROF) / PGM(JROF)
    PSP_CI(JROF,YSP_CI%YCI(7)%MP0) = ZVCLS(JROF) / PGM(JROF)
  ENDDO
ENDIF

!**---------------------------------------------------------------------
IF (LHOOK) CALL DR_HOOK('CACLSI',1,ZHOOK_HANDLE)
END SUBROUTINE CACLSI
