SUBROUTINE CAN1
!--------------------------------------------------------------------
! CAN1 : Controle au niveau 1 de l'analyse par interpolation optimale
!--------------------------------------------------------------------
!  But : Controle au niveau 1 de l'analyse par interpolation opt.
!  ---
!  Sequence d'appel     : CALL CAN1
!  ----------------
!  Sous-programme amont : CNT0
!  --------------------
!  Sous-programmes aval :
!  --------------------
!    - SU1YOM : initialisation COMMON et variables de niveau 1
!    - SU2YOM : initialisation COMMON et variables de niveau 2
!    - SU3YOM : initialisation COMMON et variables de niveau 3
!    - SUOBS  : chargement des observations en memoire
!    - SUINIF : initialisation des champs du modele
!    - CANALI : lecture des NAMELIST necessaires a CANARI
!    - CANARI : analyse par interpolation optimale
!    - CAPRSURF : impression des champs de surface
!    - SPNORM : impression des normes des champs spectraux
!    - ABOR1  : arret si erreur d'execution

!  COMMON utilises : YOMCT0 - YOMCT3 - YOMLUN - YOMMP - YOMTAG -
!  ---------------   YOMDAG

!  Algorithme :  - controle de la configuration
!  ----------    - initialisation des COMMON et autres variables
!                - chargement des observations
!                - chargement de l'ebauche
!                - initialisations specifiques a CANARI
!                - execution de l'analyse
!--------------------------------------------------------------------

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

USE YOMCT0   , ONLY : NCONF    ,LELAM    ,NPROC
USE YOMCT3   , ONLY : NSTEP
USE YOMLUN   , ONLY : NULOUT
USE YOMMP    , ONLY : NSTRIN   ,MYPROC   ,NPRCIDS
USE YOMTAG   , ONLY : MTAGGLOBSI
USE YOMDAG
USE YOMCMA   , ONLY : LECFIO
USE MPL_MODULE
USE QACTEX   , ONLY : RCLIMCA  ,RCLISST
USE QACLIM

IMPLICIT NONE

INTEGER(KIND=JPIM) :: IBUFR(4), IBUFS(4)

INTEGER(KIND=JPIM) :: IKFILE, ITAG, JP
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "abor1.intfb.h"
#include "canali.intfb.h"
#include "canami.intfb.h"
#include "canari.intfb.h"
#include "caprsurf.intfb.h"
#include "elsac.intfb.h"
#include "spnorm.intfb.h"
#include "su1yom.intfb.h"
#include "su2yom.intfb.h"
#include "su3yom.intfb.h"
#include "suinif.intfb.h"
#include "suobs.intfb.h"

!-----------------------------------------------------------------------
!  - 1 -  CONTROLE DE LA CONFIGURATION
!         ----------------------------

IF (LHOOK) CALL DR_HOOK('CAN1',0,ZHOOK_HANDLE)
IF ( NCONF /= 701 ) THEN
  CALL ABOR1 (' Configuration interdite  (s/p CAN1) ')
ELSE
  WRITE (NULOUT,701) NCONF
ENDIF

!-----------------------------------------------------------------------
!  - 2 -  INITIALISATIONS DE COMMON ET AUTRES VARIABLES
!         ---------------------------------------------

!  - 2.1 -  initialisation des COMMON et var. de niveaux 1, 2 et 3

CALL SU1YOM
CALL SU2YOM
CALL SU3YOM

NSTEP = 0

!-----------------------------------------------------------------------
!  - 3 -  CHARGEMENT DES OBSERVATIONS
!         ---------------------------

CALL SUOBS

!-----------------------------------------------------------------------
!  - 4 -  LECTURE ET IMPRESSIONS DES NAMELIST NECESSAIRES A CANARI
!         --------------------------------------------------------

CALL CANAMI
CALL CANALI

!-----------------------------------------------------------------------
!  - 5 -  CHARGEMENT DE L'EBAUCHE
!         -----------------------

IF ( LELAM ) THEN
  CALL ELSAC
ELSE
  IKFILE = 0
  CALL SUINIF(IKFILE)
ENDIF
CALL SPNORM(0)

! plantage si rappel clim demande et fichier absent !
IF ((RCLIMCA /= 0.0_JPRB .OR. RCLISST /= 0.0_JPRB).AND..NOT.LCLIM) THEN
  WRITE(NULOUT,'(/,'' INCOHERENCE POUR LA SURFACE: RAPPEL CLIM DEMANDE'',&
   & '' ET FICHIER ABSENT !'')')  
  CALL ABOR1('CANARI : PB CLIM')
ENDIF

! Mise a jour common YOMDAG selon nb de processeurs de lecture
IF (NSTRIN < NPROC) THEN
  IF (MYPROC == 1) THEN
    IBUFR(1)=NDATGU
    IBUFR(2)=NRESGU
    IBUFR(3)=NECHGU
    IBUFR(4)=NTYPGU
    DO JP = NSTRIN+1,NPROC
      ITAG=MTAGGLOBSI+JP
      CALL MPL_SEND(IBUFR(1:4),KDEST=NPRCIDS(JP),KTAG=ITAG,CDSTRING='CAN1:')
    ENDDO
  ENDIF
  IF (MYPROC > NSTRIN) THEN
    ITAG=MTAGGLOBSI+MYPROC
    CALL MPL_RECV(IBUFS(1:4),KSOURCE=NPRCIDS(1),KTAG=ITAG,CDSTRING='CAN1:')
    NDATGU=IBUFS(1)
    NRESGU=IBUFS(2)
    NECHGU=IBUFS(3)
    NTYPGU=IBUFS(4)
  ENDIF
ENDIF

!-----------------------------------------------------------------------
!  - 6 -  LANCEMENT DE L'ANALYSE
!         ----------------------

IF (LECFIO) CALL CANARI

CALL CAPRSURF
CALL SPNORM(0)

WRITE (NULOUT,702) NCONF

!-----------------------------------------------------------------------
!  - 7 -  FORMATS
!         -------

701 FORMAT(/,'    *********************************************',/,&
 & '    *                                           *',/,&
 & '    * BIENVENUE DANS L''ANALYSE OBJECTIVE CANARI *',/,&
 & '    *                                           *',/,&
 & '    *********************************************',/,&
 & ' DEBUT D''ANALYSE  configuration demandee ',I6)  

702 FORMAT(/,' ANALYSE TERMINEE  configuration demandee ',I6,//,&
 & '    *********************************************',/,&
 & '    *                                           *',/,&
 & '    * A BIENTOT DANS L''ANALYSE OBJECTIVE CANARI *',/,&
 & '    *                                           *',/,&
 & '    *********************************************')  
!-----------------------------------------------------------------------
IF (LHOOK) CALL DR_HOOK('CAN1',1,ZHOOK_HANDLE)
END SUBROUTINE CAN1
