      SUBROUTINE FARPAR ( KREP, CDPREF, CDSUFF, KCODPA, KNUM )
#include "facom0.h"
C****
C      Sous-programme de reglage de la correspondance "nom d'article FA"
C              <-> "descripteurs GRIB du parametre+niveau"
C**
C    Arguments : KREP   (Sortie) ==> Code-reponse du sous-programme;
C    ( Tableau ) CDPREF (Entree) ==> Prefixe pour les KNUM noms d'article;
C    ( Tableau ) CDSUFF (Entree) ==> Suffixe pour les KNUM noms d'article;
C    ( Tableau ) KCODPA (Entree) ==> 6 descripteurs GRIB pour chacun
C                                    des KNUM parametres:
C      KCODPA(J,1) = KSEC1(1)  version de la table parametres
C      KCODPA(J,2) = KSEC1(6)  indicateur du parametre
C      KCODPA(J,3) = KSEC1(7)  indicateur du type de niveau
C      KCODPA(J,4) = KSEC1(8)  niveau
C      KCODPA(J,5) = KSEC1(9)  2ieme nv si couche, sinon 0
C      KCODPA(J,6) = KSEC1(18) indicateur du type de champ
C                              (0 sf si min/max:2 ou si cumul:4)
C
C                KNUM   (Entree  ==> Nombre de parametres a regler
C                          et        (dimension de CDPREF, CDSUFF et KCODPA)
C                        Sortie) ==> Nb de nouveaux parametres pouvant encore
C                                    etre definis lors d'un appel ulterieur.
C
      USE FAMODU   , ONLY : CISUFF   ,CIPREF   ,NCODPA
     S                     ,NBPARC   ,JPXPAR
C                                 ALLOCATABLE
#include "precision.h"
C
#include "facomp.h"
#include "facom1.h"
C
      INTEGER KREP, KNUM
      INTEGER KCODPA(KNUM,6)
C
      CHARACTER (LEN=*) CDPREF(KNUM), CDSUFF(KNUM)
C
      INTEGER J, JJ, INUMER, INIMES, JMEM
C
      INTRINSIC LEN_TRIM
C
C**
C     0.  -  CONTROLES ET INITIALISATIONS PREALABLES
C-----------------------------------------------------------------------
C
      IF (KNUM.LT.1) THEN
        KREP=-129
        IF (LFAMOP) THEN
          PRINT *,'FARPAR: Nb de parametres ',KNUM,' incorrect'
        ENDIF
        GOTO 1001
      ENDIF
      DO J = 1,KNUM
        IF ( LEN_TRIM(CDPREF(J)).LE.0 .OR.
     S       LEN_TRIM(CDPREF(J)).GT.JPXPRF ) THEN
          KREP=-129
          IF (LFAMOP) THEN
            PRINT *,'FARPAR: Longueur du prefixe ',CDPREF(J),
     S              ' incorrecte : ',LEN_TRIM(CDPREF(J))
          ENDIF
          GOTO 1001
        ENDIF
        IF ( LEN_TRIM(CDSUFF(J)).LE.0 .OR.
     S       LEN_TRIM(CDSUFF(J)).GT.JPXNOM-LEN_TRIM(CDPREF(J)) ) THEN
          KREP=-129
          IF (LFAMOP) THEN
            PRINT *,'FARPAR: Longueur du suffixe ',CDSUFF(J),
     S              ' incorrecte : ',LEN_TRIM(CDSUFF(J))
          ENDIF
          GOTO 1001
        ENDIF
        DO JJ = 1,3
          IF (KCODPA(J,JJ).LT.1 .OR. KCODPA(J,JJ).GT.255) THEN
            KREP=-129
            IF (LFAMOP) THEN
              PRINT *,'FARPAR: descripteur GRIB num ',JJ,
     S                ' pour le parametre num ',J,' ( ',
     S                CDPREF(J)//CDSUFF(J),' ) incorrect : ',
     S                KCODPA(J,JJ)
            ENDIF
            GOTO 1001
          ENDIF
        ENDDO
        IF (KCODPA(J,6).LT.0 .OR. KCODPA(J,6).GT.124) THEN
          KREP=-129
          IF (LFAMOP) THEN
            PRINT *,'FARPAR: descripteur GRIB, KSEC1(18),',
     S              ' pour le parametre num ',J,' ( ',
     S              CDPREF(J)//CDSUFF(J),' ) incorrect : ',
     S              KCODPA(J,6)
          ENDIF
          GOTO 1001
        ENDIF
        IF (KCODPA(J,4).LT.0) THEN
          KREP=-129
          IF (LFAMOP) THEN
            PRINT *,'FARPAR: descripteur GRIB, KSEC1(8),',
     S              ' pour le parametre num ',J,' ( ',
     S              CDPREF(J)//CDSUFF(J),' ) incorrect : ',
     S              KCODPA(J,4)
          ENDIF
          GOTO 1001
        ENDIF
      ENDDO
C
C**
C     2.  -  Prise en compte des nouvelles correspondances
C---------------------------------------------------------
C
C
      DO J = 1,KNUM
C Recherche prealable de l'eventuelle existence de la definition
C de ce parametre (il faudra alors l'ecraser).
        JMEM = 0
        DO JJ = 1,NBPARC
          IF (CDPREF(J )(1:LEN_TRIM(CDPREF(J ))).EQ.
     S        CIPREF(JJ)(1:LEN_TRIM(CIPREF(JJ))) .AND.
     S        CDSUFF(J )(1:LEN_TRIM(CDSUFF(J ))).EQ.
     S        CISUFF(JJ)(1:LEN_TRIM(CISUFF(JJ)))) THEN
            JMEM = JJ
            EXIT
          ENDIF
        ENDDO
        IF (JMEM==0) THEN
          IF (NBPARC+1.GT.JPXPAR) THEN
            KREP=-129
            IF (LFAMOP) THEN
              PRINT *,'FARPAR: le nb lim de parametres definissables ',
     S                JPXPAR
              PRINT *,'        est depasse avec la definition de ',
     S                KNUM,' nouveaux parametres'
            ENDIF
            GOTO 1001
          ENDIF
          JMEM = NBPARC + 1
          NBPARC = NBPARC + 1
        ENDIF
        CIPREF(JMEM)     = 
     S         CDPREF(J)(1:LEN_TRIM(CDPREF(J)))
        CISUFF(JMEM)     = 
     S         CDSUFF(J)(1:LEN_TRIM(CDSUFF(J)))
        NCODPA(JMEM,1:6) = KCODPA(J,1:6)
        IF (LFAMOP) THEN
          PRINT *,'FARPAR: Prise en compte de ',CDPREF(J)//CDSUFF(J)
          PRINT *,'        associe a KSEC1(1,6:9 et 18) = ',
     S            NCODPA(JMEM,1:6)
        ENDIF
      ENDDO
      KNUM = JPXPAR - NBPARC
C
C**
C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
C            VIA LE SOUS-PROGRAMME "FAIPAR" .
C-----------------------------------------------------------------------
C
 1001 CONTINUE
C
      IF (LFAMOP) THEN
        INIMES=2
        CLNSPR='FARPAR'
        INUMER=JPNIIL
C
        WRITE (UNIT=CLMESS,FMT='(''KREP='',I4)') KREP
        CALL FAIPAR (INUMER,INIMES,KREP,.FALSE.,CLMESS,CLNSPR,
     S               CLNSPR,.FALSE.)
      ENDIF
C
      RETURN
      END
