      SUBROUTINE FADECO ( KREP,   KNUMER, CDPREF, KNIVAU, CDSUFF,
     S                    LDCOSP, CDNOMA, KLNOMA, PVALCO, KLONGD,
     S                    PCHAMP )
#include "facom0.h"
C****
C      Sous-programme de controle et de DECODAGE d'un CHAMP HORIZONTAL
C      venant d'etre lu sur un fichier ARPEGE/ALADIN.
C       ( DECOdage de donnees )
C**
C    Arguments : KREP   (Sortie) ==> Code-reponse du sous-programme;
C                KNUMER (Entree) ==> Numero de l'unite logique;
C                CDPREF (Entree) ==> Prefixe eventuel du nom d'article;
C                KNIVAU (Entree) ==> Niveau vertical eventuel;
C                CDSUFF (Entree) ==> Suffixe eventuel du nom d'article;
C                LDCOSP (Entree) ==> Vrai si le champ est represente
C                                    par des coefficients spectraux;
C                CDNOMA (Sortie) ==> Nom de l'article-champ lu;
C                KLNOMA (Sortie) ==> Nombre de caracteres utiles dans
C                                    CDNOMA;
C    ( Tableau ) PVALCO (Entree) ==> Donnees issues de la lecture;
C                KLONGD (Entree) ==> Nombre de valeurs (mots de 64 bits
C                                    en principe) lues;
C    ( Tableau ) PCHAMP (Sortie) ==> Valeurs REELLES du champ lu.
C
C    Remarques:
C
C    - PVALCO est type reel par commodite, et doit avoir une longueur
C      suffisante pour stocker les donnees codees. Le dimensionnement
C      "tous terrains" est (2+ILCHAM), qui permet le cas echeant de
C      stocker un champ a pleine resolution sans codage effectif.
C      (ILCHAM est le nombre de valeurs du champ a decoder)
C
C    - CDNOMA doit avoir au moins JPXNOM caracteres.
#include "precision.h"
C
#include "facomp.h"
#include "facom1.h"
C
      INTEGER KREP, KNUMER, KNIVAU, KLNOMA, KLONGD
C
C
      INTEGER IREP, ILPRFU, ILSUFU, ILNOMU, ILONGA, IRANG, INIMES
      INTEGER ILPREF, ILSUFF, ILCDNO, IRANGC, IVALC1
      INTEGER IB1PAR (JPLB1P)
C
      REAL (KIND=JPDBLR) PCHAMP (*), PVALCO (*)
C
      LOGICAL LLVERF, LLRLFI, LDCOSP, LLNOMU
C
      CHARACTER CDPREF*(*), CDSUFF*(*), CDNOMA*(*)
      CHARACTER CLPREF*(JPXNOM), CLSUFF*(JPXSUF)
C
#include "facom2.h"
C**
C     1.  -  CONTROLES ET INITIALISATIONS.
C-----------------------------------------------------------------------
C
      LLVERF=.FALSE.
      LLRLFI=.FALSE.
      LLNOMU=.FALSE.
      ILPRFU=LEN (CDPREF)
      ILSUFU=LEN (CDSUFF)
      ILCDNO=LEN (CDNOMA)
      KLNOMA=0
      CALL FANUMU (KNUMER,IRANG)
C
      IF (IRANG.EQ.0) THEN
        IREP=-51
        GOTO 1001
      ELSEIF (ILCDNO.LT.JPXNOM) THEN
        IREP=-65
        GOTO 1001
      ELSE
        CDNOMA=' '
      ENDIF
C
C         Verrouillage eventuel du fichier.
C
      IF (LFAMUL) CALL LFIVER (VRFICH(IRANG),'ON')
      LLVERF=LFAMUL
C
      IF (LCREAF(IRANG)) THEN
        IREP=-85
        GOTO 1001
      ENDIF
C**
C     2.  -  FABRICATION DU NOM D'ARTICLE VIA LE SOUS-PROGRAMME "FANFAR"
C            ( controles de CDPREF, KNIVAU, CDSUFF inclus )
C-----------------------------------------------------------------------
C
      CALL FANFAR (IREP,IRANG,CDPREF,KNIVAU,CDSUFF,CDNOMA,IB1PAR(6),
     S             ILPRFU,ILSUFU,ILNOMU)
      IF (IREP.NE.0) GOTO 1001
      LLNOMU=.TRUE.
      KLNOMA=ILNOMU
C**
C     3.  -  CONTROLE ET DECODAGE DE L'ARTICLE DEJA LU SUR LE FICHIER.
C-----------------------------------------------------------------------
C
C
C  Controle de l'homogeneite du type de rangement des coeff. spectraux
C  parmi les champs lus/ecrits: ces champs compactes avec
C  NIGRIB=-1 ou 3 doivent etre ranges comme dans le modele ("verticalement"
C  soit selon des colonnes JM=cst consecutives) et contrairement si compactes
C  avec NIGRIB= 0,1 ou 2.
C 
      IRANGC=NUCADR(IRANG)
      IVALC1=NINT(PVALCO(1))
      IF (LDCOSP) THEN
        IF (IVALC1.EQ.-1.OR.IVALC1.EQ.3) THEN
          NRASVE(IRANG)=NRASVE(IRANG)+1
          IF (NRASVE(IRANG).EQ.1.AND.NRASHO(IRANG).GT.0) THEN
            WRITE(0,*)'------------------------------------------------'
            WRITE(0,*)' FADECO :  WARNING !!!!!           '
            WRITE(0,*)' Un champ de coeff. spectraux avec'
            WRITE(0,*)' rangement type modele va etre lu alors que'
            WRITE(0,*)' d''autres champs spect. ont un rangt different.'
            WRITE(0,*)' ***  Prenez en compte cette heterogeneite!  ***'
            WRITE(0,*)'------------------------------------------------'
          ENDIF
        ELSEIF (IVALC1.GE.0.AND.IVALC1.LE.2) THEN
          NRASHO(IRANG)=NRASHO(IRANG)+1
          IF (NRASHO(IRANG).EQ.1.AND.NRASVE(IRANG).GT.0) THEN
            WRITE(0,*)'------------------------------------------------'
            WRITE(0,*)' FADECO :  WARNING !!!!!           '
            WRITE(0,*)' Un champ de coeff. spectraux avec'
            WRITE(0,*)' rangement autre que celui du modele va etre lu'
            WRITE(0,*)' alors que d''autres champs ont le rangt modele'
            WRITE(0,*)' ***  Prenez en compte cette heterogeneite!  ***'
            WRITE(0,*)'------------------------------------------------'
          ENDIF
        ENDIF
      ENDIF
C
      IF (IVALC1.EQ.3) THEN
C Cas d'un champ gribe avec GRIBEX
        CALL FADECX ( IREP,   IRANG,  CDNOMA(1:ILNOMU), PVALCO, KLONGD,
     S              PCHAMP, LDCOSP )
      ELSE
        CALL FADECI ( IREP,   IRANG,  CDNOMA(1:ILNOMU), PVALCO, KLONGD,
     S              PCHAMP, LDCOSP )
      ENDIF
C**
C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
C            VIA LE SOUS-PROGRAMME "FAIPAR" .
C-----------------------------------------------------------------------
C
 1001 CONTINUE
      KREP=IREP
      LLFATA=LLMOER (IREP,IRANG)
C
C        Deverrouillage eventuel du fichier.
C
      IF (LLVERF) CALL LFIVER (VRFICH(IRANG),'OFF')
C
      IF (LLFATA) THEN
        INIMES=2
      ELSE
        INIMES=IXNVMS(IRANG)
      ENDIF
C
      IF (.NOT.LLFATA.AND.INIMES.NE.2) RETURN
C
      CLNSPR='FADECO'
C
      IF (ILPRFU.GE.1) THEN
        ILPREF=MIN (ILPRFU,LEN (CLPREF))
        CLPREF(1:ILPREF)=CDPREF(1:ILPREF)
      ELSE
        ILPREF=8
        CLPREF(1:ILPREF)=CHAINC(:ILPREF)
      ENDIF
C
      IF (ILSUFU.GE.1) THEN
        ILSUFF=MIN (ILSUFU,LEN (CLSUFF))
        CLSUFF(1:ILSUFF)=CDSUFF(1:ILSUFF)
      ELSE
        ILSUFF=8
        CLSUFF(1:ILSUFF)=CHAINC(:ILSUFF)
      ENDIF
C
      IF (.NOT.LLNOMU) THEN
        ILNOMU=MIN (ILPREF,NCPCAD)
        CDNOMA(1:ILNOMU)=CLPREF(1:ILPREF)
      ENDIF
C
      WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KNUMER='',I3,
     S       '', CDPREF='''''',A,'''''', KNIVAU='',I6,
     S       '', CDSUFF='''''',A,'''''', LDCOSP= '',L1)')
     S   KREP,KNUMER,CLPREF(1:ILPREF),KNIVAU,CLSUFF(1:ILSUFF),LDCOSP
      CALL FAIPAR (KNUMER,INIMES,IREP,LLFATA,CLMESS,CLNSPR,
     S             CDNOMA(1:ILNOMU),LLRLFI)
C
      RETURN
      END
