SUBROUTINE CACDGU(KTASK,CDVAR,KNUM,PCHAMP,KPROMA,KLEN,KZD,KZF,PGELAM,PGELAT)
!****-------------------------------------------------------------------
!****   CACDGU : Calcul des elements pour les moyennes, ecart-types
!****   ------     et extrema.
!****
!****   Auteur :      V.Casse   03/93
!****-------------------------------------------------------------------
!***
!*** But : Calcul des elements pour les moyennes, ecart-types et extrema
!*** ---
!*** Arguments d'entree   :
!*** ------------------
!*** Arguments de sortie  :
!*** -------------------
!*** Sous-programme amont :  CAPOTX - CACSTS
!*** --------------------
!*** Sous-programmes aval :
!*** --------------------
!*** COMMON utilises      :  QAPDGU
!*** ---------------
!*** Algorithme : on calcule les elements par taches pour
!*** ----------   la moyenne et le calcul de l'ecart-type ainsi que la
!***              determination des extrema
!****-------------------------------------------------------------------

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

USE YOMLUN   , ONLY : NULOUT
USE QAPDGU   , ONLY : JPNUMAX  ,NBPOINT  ,RMOY1    ,RMOY2    ,&
 & RMIN     ,RMAX     ,RPLACE   ,NBNIV    ,CNAME  

IMPLICIT NONE
INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KLEN 
INTEGER(KIND=JPIM),INTENT(IN)    :: KTASK 
CHARACTER         ,INTENT(IN)    :: CDVAR*16 
INTEGER(KIND=JPIM),INTENT(IN)    :: KNUM 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCHAMP(KPROMA,*) 
INTEGER(KIND=JPIM),INTENT(IN)    :: KZD 
INTEGER(KIND=JPIM),INTENT(IN)    :: KZF 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGELAM(KLEN) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGELAT(KLEN) 
INTEGER(KIND=JPIM) :: JX, JZ
INTEGER(KIND=JPIM) :: IZ
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "abor1.intfb.h"

!**---------------------------------------------------------------------
!**  1.  Verification coherence.
!**      ----------------------

IF (LHOOK) CALL DR_HOOK('CACDGU',0,ZHOOK_HANDLE)
IF ( KNUM < 0.OR. KNUM > JPNUMAX ) THEN
  WRITE(NULOUT,*) 'PB sur KNUM dans CACDGU',CDVAR,KNUM,KTASK,CNAME
  CALL ABOR1 ('erreur sur KNUM')
ENDIF

IF ( CDVAR /= CNAME(KNUM) ) THEN
  WRITE(NULOUT,*) 'KNUM, KTASK, CDVAR  /=  CNAME(KNUM) : ',&
   & KNUM, KTASK, CDVAR, CNAME  
  CALL ABOR1 ('appel incoherent a CACDGU')
ENDIF

IF ( KZF-KZD+1 /= NBNIV(KNUM) ) THEN
  WRITE(NULOUT,*) 'KZF-KZD+1  /=  NBNIV(KNUM) : ',KZD, KZF, KNUM, NBNIV
  CALL ABOR1 ('appel incoherent a CACDGU')
ENDIF

!**---------------------------------------------------------------------
!**  2.  Calcul des elements statistiques.
!**      --------------------------------

NBPOINT(KNUM,KTASK) = NBPOINT(KNUM,KTASK) + KLEN

DO JZ = KZD , KZF
  IZ = JZ-KZD+1
  DO JX = 1 , KLEN
    RMOY1(IZ,KNUM,KTASK) = RMOY1(IZ,KNUM,KTASK) + PCHAMP(JX,JZ)
    RMOY2(IZ,KNUM,KTASK) =RMOY2(IZ,KNUM,KTASK) + PCHAMP(JX,JZ)**2
    IF ( PCHAMP(JX,JZ) < RMIN(IZ,KNUM,KTASK) ) THEN
      RMIN(IZ,KNUM,KTASK) = PCHAMP(JX,JZ)
      RPLACE(IZ,1,KNUM,KTASK) = PGELAT(JX)
      RPLACE(IZ,2,KNUM,KTASK) = PGELAM(JX)
    ENDIF
    IF ( PCHAMP(JX,JZ) > RMAX(IZ,KNUM,KTASK) ) THEN
      RMAX(IZ,KNUM,KTASK) = PCHAMP(JX,JZ)
      RPLACE(IZ,3,KNUM,KTASK) = PGELAT(JX)
      RPLACE(IZ,4,KNUM,KTASK) = PGELAM(JX)
    ENDIF
  ENDDO
ENDDO

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