      SUBROUTINE FANOUV ( KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, LDERFA,
     S                    LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC )
#include "facom0.h"
C****
C        Sous-programme d'initialisation SANS OUVERTURE d'une unite logique 
C        "Fichier ARPEGE". Il s'agit d'un fichier indexe, 
C        traite par le logiciel LFI.
C
C      FANOUV est derive de FAITOU, mais ne fait pas l'appel a la couche LFI
C             pour l'ouverture reelle.
C
C      utilise pour la seule compression des donnees par des processeurs
C      qui ne font pas d'ecriture effective sur disque
C
C**
C     ARGUMENTS : Ce sont les memes que pour "LFIOUV", avec CDNOMC comme
C                 argument supplementaire.
C
C                 KREP   (Sortie) ==> Code-reponse du sous-programme;
C                 KNUMER (Entree) ==> Numero de l'unite logique;
C                 LDNOMM (Entree) ==> Vrai si l'unite logique doit etre
C                                     associee a un NOM de Fichier EXP-
C                                     LICITE lors de l'"OPEN" FORTRAN;
C                 CDNOMF (Entree) ==> Nom de fichier explicite, si
C                                     *LDNOMM* est VRAI - Meme si ce
C                                     n'est pas le cas, ce *DOIT* ETRE
C                                     UN OBJET DE TYPE "CHARACTER" .
C                 CDSTTU (Entree) ==> "STATUS" pour l'"OPEN" FORTRAN
C                                     ('OLD','NEW','UNKNOWN','SCRATCH')
C                                     par defaut, mettre 'UNKNOWN';
C                 LDERFA (Entree) ==> Option d'erreur fatale;
C                 LDIMST (Entree) ==> Option impression de Statistiques
C                                     au moment de la fermeture;
C                 KNIMES (Entree) ==> Niveau de la Messagerie (0,1 ou 2)
C                                     ( 0==>Rien, 2==>Tout )
C                 KNBARP (Entree) ==> Nombre d'articles logiques prevus,
C                                     ce qui n'est utilise que lors de
C                                     la Creation du fichier,
C                                     et qui n'empeche quand meme pas
C                                     d'avoir plus d'articles logiques;
C                 KNBARI (Sortie) ==> Nombre d'articles logiques de don-
C                                     nees sur le fichier, initialement.
C                                     (zero si creation)
C                 CDNOMC (Entree) ==> Nom du CADRE associe au fichier.
C*
C     N.B. :  Pour un fichier en mode creation, ce cadre doit avoir ete
C          defini au prealable (via le sous-programme FACADE, ou par
C          l'ouverture d'un fichier preexistant).
C             Pour un fichier ARPEGE preexistant, le cadre est lu sur le
C          fichier; s'il etait deja defini auparavant, il y a controle
C          de coherence entre les deux versions du cadre.
C
      USE FAMODU   , ONLY : LIFLAP   ,NCOGRIF  ,NCODGRI
C
#include "precision.h"
C
#include "facomp.h"
#include "facom1.h"
C
      INTEGER KREP, KNUMER, KNIMES, KNBARP, KNBARI
C
      CHARACTER CPNOMD*(*)
      PARAMETER ( CPNOMD='%%%%% FICHIER SANS NOM %%%%%' )
C
      INTEGER IRANG, INUMER, IRANMS, IREPOU, ILNOMC, ILOMIN, IREP, J
      INTEGER INBARP, IRANER, IRANGC
      INTEGER ILONGA, ITRONC, ILACTI, INIMES, INXLON
      INTEGER ITYPTR, IPHASE, IGARDE, IPOSEX, IPUILA
C
      INTEGER IDATEF (JPLDAT)
      INTEGER (KIND=JPDBLE) ILDIMEN(JPCADI),ILRDPOL(JPXPAH+JPXIND)
      INTEGER (KIND=JPDBLE) ILPNVER, ILDATEF(JPLDAT)
C
      LOGICAL LDNOMM, LDERFA, LDIMST, LLNOUF, LLNOUC, LLRLFI
      LOGICAL LLMODC, LLREDF, LLMODA
C
      CHARACTER CDNOMF*(*), CDSTTU*(*), CDNOMC*(*)
C
#include "facom2.h"
C**
C     1.  -  CONTROLES DIVERS
C-----------------------------------------------------------------------
C
C     Controle sommaire sur les arguments...
C
      IRANG=0
      IRANER=0
      IRANMS=0
      IREPOU=JPNIIL
      LLRLFI=.FALSE.
      ILNOMC=LEN (CDNOMC)
      ILOMIN=MIN ( LEN (CDNOMF), LEN (CDSTTU), ILNOMC)
C
C        L'appel ci-dessous est legerement anticipe, de maniere a
C     initialiser les variables globales du logiciel s'il s'agit
C     du premier appel a un sous-programme de ce logiciel.
C
      CALL FANUMU (KNUMER,IRANG)
C
      IF (ILOMIN.LE.0) THEN
        IREP=-65
        GOTO 1001
      ELSEIF (IRANG.NE.0) THEN
C
C            Controle de non-ouverture prealable (au sens du logiciel)
C
        IREP=-55
        IRANMS=IRANG
        GOTO 1001
      ENDIF
C
C             Verrouillage global, si necessaire.
C
C        A-t-on deja atteint le nombre limite de fichiers ARPEGE
C     ouverts simultanement ? Si non, on cherche un emplacement libre
C     dans la table NULOGI (logiquement, il devrait en exister un)
C
      IF (NFIOUV.GE.JPNXFA) THEN
        IREP=-56
        GOTO 1001
      ELSE
C
        DO 101 J=1,JPNXFA
C
        IF (NULOGI(J).EQ.JPNIIL) THEN
          IRANG=J
          GOTO 102
        ENDIF
C
  101   CONTINUE
C
        IREP=-66
        GOTO 1001
C
  102   CONTINUE
C
      ENDIF
C
C**
C     2.  -  CONTROLES SPECIFIQUES AU LOGICIEL DE FICHIERS ARPEGE.
C-----------------------------------------------------------------------
C
      LLNOUF=KNBARI.EQ.0
      CALL FANUCA (CDNOMC,IRANGC,.FALSE.)
      LLNOUC=IRANGC.EQ.0
C
      IF (LLNOUF) THEN
C
        IF (LLNOUC) THEN
          IREP=-57
          GOTO 1001
        ELSE
C
C         Fichier en mode creation et cadre predefini... OK a ce niveau.
C
C       On ecrit les articles definissant le cadre sur le fichier,
C     ainsi qu'un article ayant pour nom l'identificateur "par defaut",
C     (en fait, le nom du cadre) de maniere a ce que cet article soit
C     sequentiellement celui qui suit le dernier article du cadre.
C
          ILNOMC=NLCCAD(IRANGC)
C
        ENDIF
C
      ENDIF
C*
C        Controle de la Date fichier, et stockage dans MADATE.
C
!  IDATEF arbitraire pour contenter FACOND
      IDATEF(1) = 1993
      IDATEF(2) = 9
      IDATEF(3) = 2
      IDATEF(4) = 0
      IDATEF(5) = 0
      IDATEF(6) = 1
      IDATEF(7) = 0
      IDATEF(8) = 0
      IDATEF(9) = 1
      IDATEF(10) = 0
      IDATEF(11) = 0

      DO J=1,JPLDAT
        MADATE(J,IRANG)=IDATEF(J)
      ENDDO

C**
C     3.  -  ON MET A JOUR LES TABLES RELATIVES AUX FICHIERS.
C-----------------------------------------------------------------------
C
  300 CONTINUE
!
      IREPOU=0
!
C
      NFIOUV=NFIOUV+1
      NULIND(NFIOUV)=IRANG
      NULOGI(IRANG)=KNUMER
      NUCADR(IRANG)=IRANGC
C
      LNOMME(IRANG)=LDNOMM
      NIVOMS(IRANG)=KNIMES
      LERRFA(IRANG)=LDERFA
      LCREAF(IRANG)=.FALSE.
      NBFPDG(IRANG)=NBIPDG
      NBFCSP(IRANG)=NBICSP
      NPUFLA(IRANG)=NPUILA
      NMFDPL(IRANG)=NMIDPL
      NFGRIB(IRANG)=NIGRIB
      CIDENT(IRANG)=CDNOMC
      ITRONC=MTRONC(IRANGC)
      ITYPTR=NTYPTR(IRANGC)
C
      IF (ITYPTR.LT.0) THEN
        NSTROF(IRANG)=MIN (NSTROI,ITRONC-1,-ITYPTR-1)
      ELSE
        NSTROF(IRANG)=MIN (NSTROI,ITRONC-1)
      ENDIF
C
C Appel a FAINOC pour interpreter les eventuels defauts
C de -1 pris par NBFPDG, NBFCSP, NSTROF et NPUFLA en
C IRANG-ieme position.
C
      CALL FAINOC ( IRANG )
C
      IRANER=IRANG
      IRANMS=IRANG
      IPUILA=NPUFLA(IRANG)
C
      NCOGRIF(:,IRANG)=NCODGRI(:)
      NRASHO(IRANG) = 0
      NRASVE(IRANG) = 0
C
C   L'initialisation de FLAP1Dx sera faite dans FACSIM
C
      LIFLAP(IRANG)=.TRUE.
C
C        On incremente le nombre de fichiers attaches au cadre specifie.
C
      NULCAD(IRANGC)=NULCAD(IRANGC)+1
      IREP=IREPOU
      GOTO 1001
C**
C     9.  - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
C-----------------------------------------------------------------------
C
  901 CONTINUE
      CLACTI='INQUIRE'
C
C      AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
C
      IREP=IABS (IREP)
C**
C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
C            VIA LE SOUS-PROGRAMME "LFIEMS" .
C-----------------------------------------------------------------------
C
 1001 CONTINUE
      KREP=IREP
      LLFATA=LLMOER (IREP,IRANER)
C
      IF (LLFATA) THEN
        INIMES=2
      ELSE
        INIMES=IXNVMS (IRANMS)
      ENDIF
C
      IF (.NOT.LLFATA.AND.INIMES.EQ.0) RETURN
C
      CLNSPR='FANOUV'
C
      IF (INIMES.EQ.2) THEN
C
        IF (ILNOMC.GT.0) THEN
          ILACTI=MIN (LEN (CLACTI),ILNOMC)
          CLACTI(1:ILACTI)=CDNOMC(1:ILNOMC)
        ELSE
          ILACTI=8
          CLACTI=CHAINC(:ILACTI)
        ENDIF
C
        WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KNUMER='',I3,
     S     '', LDNOMM= '',L1,'', CDSTTU='''''',A7,'''''', LDERFA= '',L1,
     S     '',  LDIMST= '',L1,
     S         '', KNIMES='',I2,'', KNBARP='',I6,'' KNBARI='',I6)')
     S   KREP,KNUMER,LDNOMM,CDSTTU,LDERFA,LDIMST,KNIMES,KNBARP,KNBARI
        CALL FAIPAR (KNUMER,INIMES,IREP,.FALSE.,CLMESS,CLNSPR,
     S               CLACTI(1:ILACTI),LLRLFI)
        CLMESS='CDNOMC='''//CLACTI(1:ILACTI)//''''
        CALL FAIPAR (KNUMER,INIMES,IREP,LLFATA,CLMESS,CLNSPR,
     S               CLACTI(1:ILACTI),LLRLFI)
      ENDIF
C
      RETURN
      END
