SUBROUTINE CAMERA (KASELS, KOSELS, PDSELS, KNSELS, PCOVAR, PCOREL,&
 & PCORMIN, KNM,   KNIN,   KNLX,   KNBPV,  KNOUT)  
!****------------------------------------------------------------------------
!**** DK CAMERA
!**** ---------
!**** AUTEURS:  MCP 14/08/90; VC 03/92
!**** -------
!**** Selection des meilleurs predicteurs dans un ensemble pour lequel on
!**** dispose deja du quadrant, de la distance, des "covariances normees"
!**** et des correlations.
!****------------------------------------------------------------------------
!*** ENTREE:
!*** ------
!***  KASELS: tableau des adresses des predicteurs
!***  KOSELS: tableau des adresses des obs. contenant les predicteurs
!***  PDSELS: tableau des distances du point d'analyse aux predicteurs
!***  KNSELS: tableau du nombre de predicteurs par type
!***  PCOVAR: matrice des "covariances normees" predicteurs/predictants
!***  PCOREL: matrice des val. abs. des correlations correspondantes
!***  PCORMIN:correlation minimale pour retenir un predicteur
!***  KNM   : tableau du nombre max. de predicteurs par predictants
!***  KNIN  : 1ere dim. de PCOVAR et PCOREL, >= somme des KNSELS
!***  KNLX  : 2eme dim. de PCOVAR et PCOREL, nombre de predictants
!***  KNBPV : 3eme dim. de PCOVAR et PCOREL, nombre de niveaux a analyser
!***
!*** SORTIE:
!*** ------
!***  KASELS, KOSELS, PDSELS, KNSELS, PCOVAR, PCOREL reordonnes
!***  KNOUT : somme des KNSELS en sortie, nombre de predicteurs retenus
!***          dimension utile de PCOVAR et PCOREL
!***
!*** COMMON UTILISES: QAPABL  dimensions des tableaux du coeur de l'analyse
!*** ---------------  QAPAVU  dimensions des tables NVX et NVY
!***
!*** SOUS-PROGRAMMES:
!*** ---------------
!***
!*** DESCRIPTION:
!*** -----------
!*** On selectionne les predicteurs en mettant a jour les differents tableaux
!*** definis en entree de CAMERA.
!*** Les criteres de selection sont les suivants :
!***    - le predicteur presente une correlation minimale (PCORMIN) avec au
!***      moins un predictant (inutile de garder un predicteur n'apportant pas
!***      d'information)
!***    - choisir ceux qui sont les plus correles avec les predictants cela se
!***      fait dans l'ordre des predictants de la table NVX
!***      on ne conserve au plus que KNM predicteurs par predictants pour
!***      pouvoir en selectionner pour tous les predictants sans depasser
!***      la limite qui est la somme des KNM * KNBPV, un predicteur une fois
!***      retenu laisse les autres predictants choisir des predicteurs moins
!***      bien correles que lui-meme
!****------------------------------------------------------------------------

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

USE QAPABL   , ONLY : JPKZMA
USE QAPAVU   , ONLY : JPNVY

IMPLICIT NONE

!     EXTERNAL INTEGER FUNCTIONS
INTEGER(KIND=JPIM),INTENT(IN)    :: KNIN 
INTEGER(KIND=JPIM),INTENT(IN)    :: KNLX 
INTEGER(KIND=JPIM),INTENT(IN)    :: KNBPV 
INTEGER(KIND=JPIM),INTENT(INOUT) :: KASELS(JPNVY,JPKZMA) 
INTEGER(KIND=JPIM),INTENT(INOUT) :: KOSELS(JPNVY,JPKZMA) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PDSELS(JPNVY,JPKZMA) 
INTEGER(KIND=JPIM),INTENT(INOUT) :: KNSELS(JPNVY) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCOVAR(KNIN,KNLX*KNBPV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PCOREL(KNIN,KNLX*KNBPV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCORMIN 
INTEGER(KIND=JPIM),INTENT(IN)    :: KNM(KNLX) 
INTEGER(KIND=JPIM),INTENT(OUT)   :: KNOUT 
INTEGER(KIND=JPIM), EXTERNAL :: ISMAX

LOGICAL ::       LLGARD(KNIN)

INTEGER(KIND=JPIM) :: IJPRE, ISEL, IXV, IY, IYG, JJPRE, JJTYP, JSEL, JV, JX, JXV, JY
REAL(KIND=JPRB) :: ZHOOK_HANDLE

!**--------------------------------------------------------------------------
!**  - 1 - Elimination des predicteurs trop peu correles avec les predictants.
!**        ------------------------------------------------------------------

! calcul du nombre de predicteurs possibles
IF (LHOOK) CALL DR_HOOK('CAMERA',0,ZHOOK_HANDLE)
KNOUT   = 0
DO JJTYP = 1 , JPNVY
  KNOUT = KNOUT + KNSELS(JJTYP)
ENDDO

!**--------------------------------------------------------------------------
!**  - 2 - SELECTION DES MEILLEURS PREDICTEURS, PREDICTANT PAR PREDICTANT.
!**        --------------------------------------------------------------

! Le tableau PCOREL sera mis a une valeur negative quand
!  le predicteur est selectionne pour eviter une seconde selection

DO JJPRE = 1 , KNOUT
  LLGARD(JJPRE) = .FALSE.
ENDDO

! choix par predictants d'au plus KNM(JX) predicteurs

DO JV = 1 , KNBPV
  DO JX = 1 , KNLX
    IXV = JX+KNLX*(JV-1)
    DO JY = 1 , KNM(JX)
      IJPRE = ISMAX(KNOUT, PCOREL(1,IXV), 1)
      IF (PCOREL(IJPRE,IXV)  <  PCORMIN) THEN
        EXIT
      ELSE
        LLGARD(IJPRE) = .TRUE.
! NO SHORTLOOP (3*24 > 64 et checking)
        DO JXV = IXV , KNLX*KNBPV
          PCOREL(IJPRE,JXV) = - PCOREL(IJPRE,JXV)
        ENDDO
      ENDIF
    ENDDO
  ENDDO
ENDDO

!**--------------------------------------------------------------------------
!**  - 3 - Remise en ordre des tableaux selon le choix.
!**        -------------------------------------------

IY  = 0
IYG = 0
DO JJTYP = 1 , JPNVY
  ISEL = 0
  DO JSEL = 1 , KNSELS(JJTYP)
    IY = IY + 1
    IF (LLGARD(IY)) THEN
      ISEL = ISEL + 1
      IYG = IYG + 1
      KASELS(JJTYP,ISEL) = KASELS(JJTYP,JSEL)
      KOSELS(JJTYP,ISEL) = KOSELS(JJTYP,JSEL)
      PDSELS(JJTYP,ISEL) = PDSELS(JJTYP,JSEL)
! NO SHORTLOOP
      DO JXV = 1 , KNLX*KNBPV
        PCOVAR(IYG,JXV) = PCOVAR(IY,JXV)
        PCOREL(IYG,JXV) = ABS(PCOREL(IY,JXV))
      ENDDO
    ENDIF
  ENDDO
  KNSELS(JJTYP) = ISEL
ENDDO
KNOUT = IYG

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