SUBROUTINE CARACO
!--------------------------------------------------------------------
!   CARACO : mise a jour donnees sur observations
!   ------
!   auteur : Ph. Caille   04/90
!   modifs : Ph. Caille   05/93  passage du FOC au CMAFOC
!            Ph. Caille   03/96  passage du CMAFOC au CMAFOC
!            FT           07/98  reperage ancien/nouvel ordre
!            R. Ajjaji    06/98  changement de la dimension NMXWAG 
!            F. Taillefer 08/00  passage CMAFOC --> ODB
!--------------------------------------------------------------------

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

USE PARDIMO  , ONLY : JPNOTP
USE YOMCT0   , ONLY : LELAM    ,LRPLANE  ,NPROC
USE YOMDIMO  , ONLY : NOBTOT
USE YOMOBA   , ONLY : MNBOTP   ,MNBOTPG
USE YOMDB
USE YOMGEM   , ONLY : RSTRET   ,RC2P1    ,RC2M1
USE MPL_MODULE
USE QALORI   , ONLY : QCAOBS   ,RCALPH

IMPLICIT NONE

INTEGER(KIND=JPIM) :: IABOX, IOTP, JO

REAL(KIND=JPRB) :: ZGM, ZMUDEN, ZRMU, ZUS2C
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "cabotu.intfb.h"

#include "openmp_obs.h"

!--------------------------------------------------------------------
!  - 1 -  Initialisations
!         ---------------

IF (LHOOK) CALL DR_HOOK('CARACO',0,ZHOOK_HANDLE)
ZUS2C = 0.0_JPRB
IF ( .NOT. LRPLANE ) ZUS2C = 1.0_JPRB / (2.0_JPRB*RSTRET)
IF ( LELAM ) ZGM = 3.5_JPRB

!--------------------------------------------------------------------
!  - 2 -  Boucle sur les observations
!         ---------------------------

DO JO = 1 , NOBTOT

!  - 2.1 -  calcul des numeros de boite pour chaque observation

  IABOX = 0
  CALL CABOTU (ROBHDR(JO,MDBLAT),ROBHDR(JO,MDBLON),IABOX)
  ROBHDR(JO,MDBBOX) = IABOX

!  - 2.2 -  alimentation tableau MNBOTP (nb obs par type - version locale)

  IOTP = ROBHDR(JO,MDBOTP)
  MNBOTP(IOTP) = MNBOTP(IOTP) + 1

!  - 2.3 -  remplissage QCAOBS

  IF ( .NOT. LELAM ) THEN
    ZRMU   = SIN(ROBHDR(JO,MDBTLA))
    ZMUDEN = RC2P1 + ZRMU * RC2M1
    ZGM    = ZMUDEN * ZUS2C
  ENDIF
  QCAOBS(2,JO) = EXP( RCALPH * (1.0_JPRB/ZGM - ZGM) )
  QCAOBS(1,JO) = QCAOBS(2,JO)**2

ENDDO

!  - 2.4 - mise a jour MNBOTPG (version globale de MNBOTP)

MNBOTPG(:)=MNBOTP(:)
IF (NPROC > 1) THEN
  CALL MPL_ALLREDUCE(MNBOTPG(1:JPNOTP),'SUM',LDREPROD=.FALSE., &
   & CDSTRING='CARACO : ')
ENDIF

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