      SUBROUTINE FAREGI ( CDCLEF, KVAL, KOPT )
#include "facom0.h"
C****
C      Ce sous-programme controle (lecture/ecriture) les options
C      de compression de GRIBEX implicites.
C      (REGlage des options Implicites de codage de gribex)
C**
C    Arguments : CDCLEF (Entree) ==> Mot clef precisant l'action a faire;
C                KVAL   (Sortie  ==> Valeur lue ou ecrite;
C                      ou Entree)
C                KOPT   (Entree) ==> Flag: 0->lecture 1->ecriture;
C*
C     Signification des divers elements du tableau NCODGRI
C
C     NCODGRI(1) = type de codage (0->option HOPER='C'; 1->option HOPER='K')
C     NCODGRI(2) = KSEC4(6), indicateur de la presence de flags
C                               additionnels (0->non; 16->oui)
C     NCODGRI(3) = KSEC4(7)
C     NCODGRI(4) = KSEC4(9), indicateur de la presence de bitmaps
C                             secondaires (0->non; 32->oui)
C     NCODGRI(5) = KSEC4(10), indicateur pour le nb de bits des
C                        groupes de pts de grille (0->const.; 16->different)
C     NCODGRI(6) = KSEC4(11), nb de bits pour les groupes de pts de
C                      grille, quand il est constant.
C                        Si negatif, le logiciel calcule un nb optimal a partir
C                        de -KSEC4(11).
C     NCODGRI(7) = KSEC4(12), indicateur pour les extensions generales de la
C                        compression (0->non; 8->oui)
C     NCODGRI(8) = KSEC4(13), indicateur pour le rearrangement boustrophedo
C                        nique (0->non; 4->oui)
C     NCODGRI(9) = KSEC4(14) (valeurs possibles: -1, 0 et 2)
C     NCODGRI(10) = KSEC4(15) (valeurs possibles: -1, 0 et 1), sert avec
C                         KSEC4(14) a definir la technique de la difference
C                         spatiale.Si l'un des 2 est negatif, l'ordre de
C                         differentiation est estime dynamiquement, sinon
C                         l'ordre vaut KSEC4(14)+KSEC4(15)
C
      USE FAMODU   , ONLY : NCODGRI
C
#include "precision.h"
C
#include "facomp.h"
#include "facom1.h"
#include "facom2.h"
C
      INTEGER KNUMER, KVAL, KOPT
C
      CHARACTER*5 CDCLEF
C
      INTEGER INUMER, INIMES, IREP, INBITSMAX
C
      LOGICAL LLVERG, LLPREA
C
      SAVE LLPREA
C
      DATA LLPREA / .TRUE. /
C
C**
C     0.  -  INITIALISATIONS ET ALLOCATIONS PREALABLES
C-----------------------------------------------------------------------
C
      IREP=0
      IF (LLPREA) THEN
C
C          A la premiere utilisation, appel au sous-programme "FARINE".
C
        CALL FARINE(2)
        LLPREA=.FALSE.
      ENDIF
      INBITSMAX=MAX(NBIPDG,NBICSP)
C
C**
C     1.  -  SPECIFICATION D'UN NOUVEAU CODAGE
C-----------------------------------------------------------------------
C
      IF (KOPT==1) THEN
C
C   Pas de compression (sous-tronc et puissance laplacien
C   ajoutees systematiquement + tard pour les coeff spectraux)
C
        IF (CDCLEF=='BASIC'.OR.CDCLEF=='basic') THEN
          NCODGRI(1)=0
          NCODGRI(2)=0
          NCODGRI(3)=0
          NCODGRI(4)=0
          NCODGRI(5)=0
          NCODGRI(6)=0
C
C   Comme le "BASIC" avec une compression
C   ligne a ligne pour les points de grille
C
        ELSEIF (CDCLEF=='PACK1'.OR.CDCLEF=='pack1') THEN
          NCODGRI(1)=0
          NCODGRI(2)=16
          NCODGRI(3)=0
          NCODGRI(4)=0
          NCODGRI(5)=16
          NCODGRI(6)=0
C
C   Comme le "BASIC" avec une compression
C   pour les points de grille ou le nb de bits est le meme
C   dans chaque groupe de points de grille
C
        ELSEIF (CDCLEF=='PACK2'.OR.CDCLEF=='pack2') THEN
          NCODGRI(1)=0
          NCODGRI(2)=16
          NCODGRI(3)=0
          NCODGRI(4)=32
          NCODGRI(5)=0
C Un nb de bits optimal sera recherche par le logiciel
          NCODGRI(6)=-99
C
C   Comme le "BASIC" avec une compression
C   "OMM general" pour les points de grille
C
        ELSEIF (CDCLEF=='PACK3'.OR.CDCLEF=='pack3') THEN
          NCODGRI(1)=0
          NCODGRI(2)=16
          NCODGRI(3)=0
          NCODGRI(4)=32
          NCODGRI(5)=16
          NCODGRI(6)=0
C
C   Compression "aggressive": le logiciel va
C   tenter la compression ligne a ligne et comparer la
C   longueur de message obtenue avec celle en l'absence de
C   compression et au final retenir la meilleure solution.
C
        ELSEIF (CDCLEF=='APAC1'.OR.CDCLEF=='apac1') THEN
          NCODGRI(1)=1
          NCODGRI(2)=16
          NCODGRI(3)=0
          NCODGRI(4)=0
          NCODGRI(5)=16
          NCODGRI(6)=0
C
C   Compression "aggressive": le logiciel va
C   suivre la demarche "APAC1" en testant en plus le nb de bits
C   constant par groupe de pts de grille et retenir la meilleure
C   compression
C
        ELSEIF (CDCLEF=='APAC2'.OR.CDCLEF=='apac2') THEN
          NCODGRI(1)=1
          NCODGRI(2)=16
          NCODGRI(3)=0
          NCODGRI(4)=0
          NCODGRI(5)=0
C Un nb de bits optimal sera recherche par le logiciel
          NCODGRI(6)=-99
C
C   Compression "aggressive": le logiciel va
C   suivre la demarche "APAC1" en testant en plus la compression
C   "general OMM" et retenir la meilleure compression.
C
        ELSEIF (CDCLEF=='APAC3'.OR.CDCLEF=='apac3') THEN
          NCODGRI(1)=1
          NCODGRI(2)=16
          NCODGRI(3)=0
          NCODGRI(4)=32
          NCODGRI(5)=16
          NCODGRI(6)=0
C
C   Compression "aggressive": le logiciel va
C   suivre la demarche "APAC3" en testant en plus le nb de bits
C   constant par groupe de pts de grille et retenir la meilleure
C   compression.
C
        ELSEIF (CDCLEF=='APAC4'.OR.CDCLEF=='apac4') THEN
          NCODGRI(1)=1
          NCODGRI(2)=16
          NCODGRI(3)=0
          NCODGRI(4)=32
          NCODGRI(5)=0
C Un nb de bits optimal sera recherche par le logiciel
          NCODGRI(6)=-99
C
C   Specification du nb de bits a utiliser dans le cadre
C   de la compression avec nb de bits constant
C   par groupe de pts de grille
C   
        ELSEIF (CDCLEF=='WIDPA'.OR.CDCLEF=='widpa') THEN
          IF (KVAL.LT.1-INBITSMAX.OR.KVAL.GT.INBITSMAX-1) THEN
            IREP=-97
            GOTO 1001
          ENDIF
          NCODGRI(6)=KVAL
C
C   Demande supplementaire de l'extension generale de la compression
C   (si KVAL=1, sinon c'est le retrait de cette option)
C
        ELSEIF (CDCLEF=='GEXTE'.OR.CDCLEF=='gexte') THEN
          IF (KVAL.EQ.1) THEN
            CALL GRSX2O(1)
            NCODGRI(7)=8
          ELSE
            NCODGRI(7)=0
          ENDIF
C
C   Demande supplementaire du rearrangement boustrophedonique dans la
C   compression (si KVAL=1, sinon c'est le retrait de cette option)
C
        ELSEIF (CDCLEF=='BOUST'.OR.CDCLEF=='boust') THEN
          IF (KVAL.EQ.1) THEN
            CALL GRSX2O(1)
            NCODGRI(8)=4
          ELSE
            NCODGRI(8)=0
          ENDIF
C
C   Demande supplementaire de la difference spatiale dans la compression.
C   KVAL donne l'ordre de differentiation:
C   -1-> calcul dynamique par GRIBEX; 1 a 3->ordre; 0->desactiv; autre->err
C
        ELSEIF (CDCLEF=='DIFFE'.OR.CDCLEF=='diffe') THEN
          IF (KVAL.EQ.-1) THEN
            CALL GRSX2O(1)
            CALL GRSN2O(1)
            NCODGRI( 9)=0
            NCODGRI(10)=-1
          ELSEIF (KVAL.EQ.1) THEN
            CALL GRSX2O(1)
            CALL GRSN2O(1)
            NCODGRI( 9)=0
            NCODGRI(10)=1
          ELSEIF (KVAL.EQ.2) THEN
            CALL GRSX2O(1)
            CALL GRSN2O(1)
            NCODGRI( 9)=2
            NCODGRI(10)=0
          ELSEIF (KVAL.EQ.3) THEN
            CALL GRSX2O(1)
            CALL GRSN2O(1)
            NCODGRI( 9)=2
            NCODGRI(10)=1
          ELSEIF (KVAL.EQ.0) THEN
            CALL GRSN2O(0)
            NCODGRI( 9)=0
            NCODGRI(10)=0
          ELSE
            IREP=-125
            GOTO 1001
          ENDIF
        ENDIF
C**
C     2.  -  DEMANDE D'INFORMATION
C-----------------------------------------------------------------------
C
      ELSEIF (KOPT==0) THEN
C
C   Obtention des mots-clef disponibles
C
        IF (CDCLEF=='CLEFS'.OR.CDCLEF=='clefs') THEN
          KVAL=0
          PRINT *
          PRINT *,'Mots clef disponibles pour FAREGI:'
          PRINT *
          PRINT *,'BASIC: pas de compression'
          PRINT *,'PACK1: BASIC avec une compression'
          PRINT *,'       ligne a ligne pour les pts de grille'
          PRINT *,'PACK2: BASIC avec une compression'
          PRINT *,'       ou le nb de bits est cst pour les groupes'
          PRINT *,'PACK3: BASIC avec une compression'
          PRINT *,'       OMM general pour les points de grille'
          PRINT *,'APAC1: compression agressive'
          PRINT *,'       BASIC et PACK1 sont testes'
          PRINT *,'APAC2: compression agressive'
          PRINT *,'       BASIC, PACK1 et PACK2 sont testes'
          PRINT *,'APAC3: compression agressive'
          PRINT *,'       BASIC, PACK1 et PACK3 sont testes'
          PRINT *,'APAC4: compression agressive'
          PRINT *,'       BASIC, PACK1, PACK2 et PACK3 testes'
          PRINT *,'WIDPA: lecture/ecriture du nb de bits'
          PRINT *,'       a utiliser pour les groupes de points'
          PRINT *,'       de grille dans le cas PACK2'
          PRINT *,'GEXTE: les extensions generales de la compression'
          PRINT *,'       sont activees (KVAL=1) ou desactiv. (KVAL=0)'
          PRINT *,'BOUST: le rearrangement boustrophedonique est'
          PRINT *,'       active (KVAL=1) ou desactive (KVAL=0)'
          PRINT *,'DIFFE: la differenciation spatiale est'
          PRINT *,'       activee (KVAL=ordre de differ. (1 a 3)'
          PRINT *,'       ou -1 (calcul dyn)) ou desactivee (0)'
          PRINT *
C
C   Lecture du nb de bits a utiliser dans le cadre
C   de la compression avec nb de bits constant
C   par groupe de pts de grille
C   
        ELSEIF (CDCLEF=='WIDPA'.OR.CDCLEF=='widpa') THEN
          KVAL=NCODGRI(6)
C
C   Lecture de la presence ou non de la compression
C   "general extended"
C
        ELSEIF (CDCLEF=='GEXTE'.OR.CDCLEF=='gexte') THEN
          KVAL = NCODGRI(7) / 8
C
C   Lecture de la presence ou non du rearrangement
C   boustrophedonique.
C
        ELSEIF (CDCLEF=='BOUST'.OR.CDCLEF=='boust') THEN
          KVAL = NCODGRI(8) / 4
C
C   Lecture de la presence ou non de la differentiation spatiale
C
        ELSEIF (CDCLEF=='DIFFE'.OR.CDCLEF=='diffe') THEN
          KVAL=NCODGRI( 9)+NCODGRI(10)
        ELSE
          IREP=-125
          GOTO 1001
        ENDIF
C**
C     3.  -  OPTION INCONNUE
C-----------------------------------------------------------------------
C
      ELSE
        IREP=-125
        GOTO 1001
      ENDIF
C**
C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
C            VIA LE SOUS-PROGRAMME "FAIPAR" .
C-----------------------------------------------------------------------
C
 1001 CONTINUE
      LLFATA=LLMOER (IREP,0)
C
      IF (LLFATA) THEN
        INIMES=2
      ELSE
        INIMES=NIMSGA
      ENDIF
C
      IF (INIMES.EQ.0) RETURN
C
      CLNSPR='FAREGI'
      INUMER=JPNIIL
C
      WRITE (UNIT=CLMESS,FMT='(''IREP='',I2,
     S        '', CDCLEF='''''',A,'''''', KVAL='',I12,
     S        '', KOPT='',I4)')
     S        IREP,CDCLEF,KVAL,KOPT
      INUMER=JPNIIL
      CALL FAIPAR (INUMER,INIMES,IREP,LLFATA,CLMESS,CLNSPR,
     S             CLNSPR,.FALSE.)
C
      RETURN
      END
