SUBROUTINE CASTAS(KPROMA,KNBPT,KTASK,PSLN,PSP_SB,PSP_RR,PSD_VF,PESIG,PCAGUE,PGELAT,PGELAM)
!****-------------------------------------------------------------------
!****   CASTAS : ROUTINE GERANT L'EXECUTION DE L'ANALYSE DE SST
!****-------------------------------------------------------------------
!***  ROUTINES APPELANTES: - CAPOTX -
!***  -------------------
!***  ARGUMENTS:  IN       KPROMA : surdimensionnement horizontal
!***  ---------   IN       KNBPT  : nombre reel de points traites
!***              IN       KTASK  : numero de la tache (multitasking)
!***              IN       PSLN   :
!***              IN/OUT   PSP_RR
!***              OUT      PSP_SB
!***              IN       PESIG, PCAGUE, PGELAT, PGELAM, PSD_VF:

!     COMMONS: - QADOCK - CONTIENT LA TABLE DE CONTINGENCE
!     -------             PREDICTEURS/PREDICTANTS ET DES CONTRAINTES
!                         POUR LA SELECTION DES OBSERVATIONS.
!              - QAPAVU - DIMENSIONS ET INDICE RELATIFS A *QAVARA*.
!              - QADIAG - CHAMPS DIAGNOSTICS DE L'ANALYSE.
!              - YOMDIM - DIMENSION DES TABLEAUX DE TRAVAIL.
!              - PARDIMO- PARAMETERS POUR LES TABLEAUX D'OBSERVATIONS.

!     EXTERNES: - CANEVA - ROUTINE EFFECTUANT L'ANALYSE.
!     --------
!****--------------------------------------------------------------------

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

USE PARDIMO  , ONLY : JPNOTP
USE YOMDIM   , ONLY : NFLEVG
USE QAPAVU   , ONLY : JPPXST
USE QAPREX   , ONLY : NPREA    ,NBPREA   ,NAST
USE QADOCK   , ONLY : QDSTVA   ,MINMA    ,QCORMIN  ,QDELPI
USE QADIAG   , ONLY : RCATSL   ,RCARES   ,RCASIG
USE SURFACE_FIELDS_MIX, ONLY : YSP_RRD, YSP_RR, YSP_SBD, YSP_SB, YSD_VFD, YSD_VF

IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KNBPT 
INTEGER(KIND=JPIM),INTENT(IN)    :: KTASK 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSLN(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PSP_RR(KPROMA,YSP_RRD%NDIM)
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSP_SB(KPROMA,YSP_SBD%NLEVS,YSP_SBD%NDIM)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSD_VF(KPROMA,YSD_VFD%NDIM)
REAL(KIND=JPRB)   ,INTENT(IN)    :: PESIG(2*NFLEVG+5,KNBPT) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCAGUE(2,KNBPT) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGELAT(KNBPT) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGELAM(KNBPT) 
!     INM    : NOMBRE DE PREDICTEURS PAR PREDICTANT.
!     INBPR  : NOMBRE DE PREDICTEURS PAR POINT D'ANALYSE.

REAL(KIND=JPRB) ::    ZDSTVA(JPNOTP)
INTEGER(KIND=JPIM) :: INM(1), INBPR(KNBPT), INXI(1), INLXI

!     ZSIGPS : EN GENERAL, ECART-TYPES D'ERREUR DE L'EBAUCHE.
!     ZRESIA : RESIDUS ANALYSES.
!     ZSIGA  : ECART-TYPES D'ERREUR D'ANALYSE.

REAL(KIND=JPRB) :: ZSIGPS(KNBPT), ZRESIA(KNBPT), ZSIGA(KNBPT)

INTEGER(KIND=JPIM) :: IANTY, IQUOI, Ixx(JPNOTP), JROF

REAL(KIND=JPRB) :: ZCORMIN, ZDELPI, Zxxx(JPNOTP)
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "caneva.intfb.h"

!**---------------------------------------------------------------------
!**  - 1 - Initialisations.
!**        ---------------

IF (LHOOK) CALL DR_HOOK('CASTAS',0,ZHOOK_HANDLE)
RCATSL(:,1,KTASK) = 0.0_JPRB
RCARES(:,1,KTASK) = 0.0_JPRB
RCASIG(:,1,KTASK) = 1.0_JPRB

ZSIGPS(:) = PESIG(2*NFLEVG+1,:)

IQUOI = -1
IANTY = 0

INLXI = 1
INXI(1) = JPPXST

ZDELPI = QDELPI(NAST)
ZCORMIN = QCORMIN(NAST)

ZDSTVA = 0.0_JPRB

ZDSTVA(1) = QDSTVA(1)
ZDSTVA(4) = QDSTVA(4)

INM(1) = MINMA(NAST)

!**---------------------------------------------------------------------
!**  - 2 - Lancement de l'analyse par interpolation optimale.
!**        -------------------------------------------------

CALL CANEVA(IQUOI, IANTY, KTASK,&
 & Zxxx, ZDSTVA(1), ZDELPI, Ixx, Ixx,&
 & ZCORMIN, PCAGUE, PGELAT, PGELAM,&
 & PSLN, KNBPT, 1,&
 & INXI(1), INLXI ,NPREA(1,NAST), NBPREA(NAST), INM(1),&
 & ZSIGPS(1), ZRESIA(1), ZSIGA(1), INBPR(1))  

!**---------------------------------------------------------------------
!**  - 3 - Calcul du champ de SST analyse.
!**        ------------------------------

DO JROF = 1 , KNBPT
  IF ( PSD_VF(JROF,YSD_VF%YLSM%MP) <= 0.5_JPRB ) THEN
    RCATSL(JROF,1,KTASK) = REAL(INBPR(JROF),JPRB)
    RCARES(JROF,1,KTASK) = ZRESIA(JROF)
    RCASIG(JROF,1,KTASK) = ZSIGA(JROF)/ZSIGPS(JROF)
    PSP_RR(JROF,YSP_RR%YT%MP0)  = PSP_RR(JROF,YSP_RR%YT%MP0)+ZRESIA(JROF)
    PSP_SB(JROF,1,YSP_SB%YT%MP0)= PSP_RR(JROF,YSP_RR%YT%MP0)
  ENDIF
ENDDO

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