SUBROUTINE CACHBU( PLAT , PLON , PDIST , KNUMB , KLNBB )
!****--------------------------------------------------------------------------
!****   CACHBU : Calcul des numeros des boites contenues dans un
!****   ------   cercle de rayon PDIST, centre en PLAT et PLON.
!****
!****   Auteur :      VC 08/92
!****--------------------------------------------------------------------------
!*** Arguments d'entree :
!*** ------------------
!***   PLAT   : latitude du point en radians
!***   PLON   : longitude du point en radians
!***   PDIST  : rayon du cercle centre en PLAT et PLON
!***
!*** Arguments de sortie :
!*** -------------------
!***   KNUMB  : numeros des boites selectionnees
!***   KLNBB  : nombre effectif de boites selectionnees
!***
!*** Sous-programme amont : CASGRA
!*** --------------------
!*** Sous-programmes aval :
!*** --------------------
!*** COMMON utilises : YOMCST - QACTES - QAPABO - QALOLA - QADITS
!*** ---------------
!*** Algorithme :
!*** ----------
!***---------------------------------------------------------------------------

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

USE YOMCST   , ONLY : RPI      ,RA
USE QAPABO   , ONLY : NBONLA   ,NBONLO   ,NBONBT   ,NBONBU
USE QALOLA   , ONLY : RLAB     ,RLOB

IMPLICIT NONE

REAL(KIND=JPRB)   ,INTENT(IN)    :: PLAT 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLON 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDIST 
INTEGER(KIND=JPIM),INTENT(OUT)   :: KNUMB(NBONBT) 
INTEGER(KIND=JPIM),INTENT(INOUT) :: KLNBB 
INTEGER(KIND=JPIM) :: ILA, ILO, ILAD, ILAF, ILOD, ILOF
REAL(KIND=JPRB) ::    ZDLAT, ZDLON, ZDISLA, ZLABO, ZDISLO, ZLOBO, ZDLALO
INTEGER(KIND=JPIM) :: JBO, JLA, JLO

INTEGER(KIND=JPIM) :: IKLO
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "qadits.h"

!**----------------------------------------------------------------------------
!**  - 1 - Determination des boites distantes de moins de PDIST de (PLAT,PLON)
!**        -------------------------------------------------------------------

IF (LHOOK) CALL DR_HOOK('CACHBU',0,ZHOOK_HANDLE)
ZDLAT  = REAL(NBONLA,JPRB) / RPI
ZDLON  = REAL(NBONLO,JPRB) / RPI * 0.5_JPRB
ZDISLA = PDIST / RA
ILA    = NBONLA/2 - NINT((PLAT         ) * ZDLAT - 0.5_JPRB)
ILO    = 1 + NINT(PLON * ZDLON - 0.5_JPRB)
ILAD   = NBONLA/2 - NINT((PLAT + ZDISLA) * ZDLAT - 0.5_JPRB)
ILAF   = NBONLA/2 - NINT((PLAT - ZDISLA) * ZDLAT - 0.5_JPRB)

! si on va au dessus d'un pole ...

IF (ILAD  <=  1) THEN
  KLNBB = 1 + (1-ILAD) * NBONLO
  DO JBO = 1 , KLNBB
    KNUMB(JBO) = JBO
  ENDDO
  ILAD = 2 + (1-ILAD)
ELSEIF (ILAF  >=  NBONLA) THEN
  KLNBB = 1 + (ILAF-NBONLA) * NBONLO
  DO JBO = 1 , KLNBB
    KNUMB(JBO) = NBONBU - JBO
  ENDDO
  ILAF = NBONLA - 1 - (ILAF-NBONLA)
ELSE
  KLNBB = 0
ENDIF

! maintenant on travaille par latitudes non polaires [2,NBONLA-1]

DO JLA = ILAD , ILAF

! prise du coin le plus pres de (PLAT,PLON) en latitude

  IF (JLA  <  ILA) THEN
    ZLABO = RLAB(JLA+1)
  ELSEIF (JLA  >  ILA) THEN
    ZLABO = RLAB(JLA)
  ELSE
    ZLABO = PLAT
  ENDIF

! calcul des limites en longitudes

  ZDISLO = ZDISLA / COS(ZLABO)
  ILOD   = 1 + NINT((PLON - ZDISLO) * ZDLON - 0.5_JPRB)
  ILOF   = 1 + NINT((PLON + ZDISLO) * ZDLON - 0.5_JPRB)

! on boucle sur les longitudes

  DO JLO = ILOD , ILOF

! rectification au franchissement de Greenwich

    IF (JLO  <  1) THEN
      IKLO = JLO + NBONLO
    ELSEIF (JLO  >  NBONLO) THEN
      IKLO = JLO - NBONLO
    ELSE
      IKLO = JLO
    ENDIF

! prise du coin le plus pres de (PLAT,PLON) en longitude

    IF (JLO  <  ILO) THEN
      ZLOBO = RLOB(IKLO+1)
    ELSEIF (JLO  >  ILO) THEN
      ZLOBO = RLOB(IKLO)
    ELSE
      ZLOBO = PLON
    ENDIF

! calcul de la distance entre (PLAT,PLON) et le coin le plus proche

    ZDLALO = CADIT2( PLAT , PLON , ZLABO , ZLOBO )
    IF ( ZDLALO  <=  PDIST**2 ) THEN
      KLNBB        = KLNBB + 1
      KNUMB(KLNBB) = 1 + (JLA-2) * NBONLO + IKLO
    ENDIF
  ENDDO
ENDDO

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