      SUBROUTINE LITAVOIR(FICH,LFICH,HED,NUMNP,NELTOT,NGMAX,NMAX
     &                   ,NDSMAX,XYZ,IBC,NODE,NPR,NFPR,PR,NGROUP,NTYP
     &                   ,NEL,NDS,NUMSD,IMP,IENDIAN,IERR,IPR)
C
C Lecture d'un avoir
C (par routines C -> conversion possible, bid endian, little endian)
C
      DIMENSION XYZ(3,*),PR(6,*)
      INTEGER   IBC(9,*),NODE(0:NDSMAX,*),NPR(*),NFPR(6,*)
     &         ,NGROUP(*),NTYP(*),NEL(*),NDS(*)
      CHARACTER*80  HED,CWORK
      CHARACTER*128 FICH
C
      REAL*4  WORK(100)
      INTEGER IWORK(100)
      EQUIVALENCE (IWORK(1),WORK(1))
      EQUIVALENCE (IWORK(1),CWORK)
C
      CALL PREMIER_LIBRE(LIBRE)
      IF (LIBRE.LT.0) THEN
        PRINT*,'*** Pas d''unité libre'
        STOP
      ENDIF
C
      LPREM = 80
      IERR = 0
      CALL testtypebin(LIBRE,FICH(1:LFICH)//CHAR(0),LPREM,IENDIAN,IMP)
      IF (IENDIAN.LT.0) THEN
        PRINT*,'*** Erreur dans l''accès à '//FICH(1:LFICH)
        IERR = -1
        RETURN
      ELSEIF(IENDIAN.EQ.0) THEN
Cfj        IOPTLI0 = 2
Cfj        IOPTLI1 = 2
C
C 9/2000 lecture + rapide en fortran si pas de traduction
C
        CALL LITAVOIR0(FICH,LFICH,HED,NUMNP,NELTOT,NGMAX,NMAX
     &                ,NDSMAX,XYZ,IBC,NODE,NPR,NFPR,PR,NGROUP,NTYP
     &                ,NEL,NDS,NUMSD,IMP,IERR,IPR)
        RETURN
      ELSE
        IOPTLI0 = 0
        IOPTLI1 = 1
      ENDIF
      CALL ouvrebin(LIBRE,FICH(1:LFICH)//CHAR(0),0,IRC)
      IF (IRC.NE.0) THEN
        PRINT*,'*** Erreur à l''ouverture de '//FICH(1:LFICH)
        IERR = -1
        RETURN
      ENDIF
C
      CALL litrecbin(LIBRE,IWORK,LLL,IOPTLI1)
      HED = CWORK
      CALL litrecbin(LIBRE,IWORK,LLL,IOPTLI0)
      NUMNP = IWORK(1)
      IF (NUMNP.GT.NMAX) THEN
        IERR = 1
        PRINT*,'*** Trop de noeuds',NUMNP,NMAX
        CALL fermebin(LIBRE)
        RETURN
      ENDIF
      IF (IMP.GT.1) THEN
        NTOTAL = 2*NUMNP
        NMOD = MAX(1000,NTOTAL/50)
        CALL INITFLUSH
      ENDIF
      IF (IENDIAN.EQ.0) THEN
        DO I=1,NUMNP
          CALL litrecbinspeed(LIBRE,IWORK,LLL)
          XYZ(1,I) = WORK(1)
          XYZ(2,I) = WORK(2)
          XYZ(3,I) = WORK(3)
          DO K=1,9
            IBC(K,I) = IWORK(K+3)
          ENDDO
          IF (IMP.GT.1) THEN
            IF (MOD(I,NMOD).EQ.0)
     &           CALL MYFLUSH(100.*REAL(I)/REAL(NTOTAL))
          ENDIF
        ENDDO
      ELSE
        DO I=1,NUMNP
          CALL litrecbin(LIBRE,IWORK,LLL,IOPTLI0)
          XYZ(1,I) = WORK(1)
          XYZ(2,I) = WORK(2)
          XYZ(3,I) = WORK(3)
          DO K=1,9
            IBC(K,I) = IWORK(K+3)
          ENDDO
          IF (IMP.GT.1) THEN
            IF (MOD(I,NMOD).EQ.0)
     &           CALL MYFLUSH(100.*REAL(I)/REAL(NTOTAL))
          ENDIF
        ENDDO
      ENDIF
      NUMSD = 0
      NELTOT = 0
      N = 0
 1    CALL litrecbin(LIBRE,IWORK,LLL,IOPTLI0)
      IF (LLL.GT.0) THEN
        NUMSD = NUMSD+1
        IF (NUMSD.GT.NGMAX) THEN
          IERR = 3
          PRINT*,'*** Trop de sous-domaines',NGMAX
          GOTO 999
        ENDIF
        NGROUP(NUMSD) = IWORK(1)
        NTYP(NUMSD) = IWORK(2)
        NEL(NUMSD) = IWORK(3)
        NDS(NUMSD) = IWORK(4)
        IF (NDS(NUMSD).GT.NDSMAX) THEN
          IERR = 4
          PRINT*,'*** Trop de noeuds par élément',NDS(NUMSD)
          GOTO 999
        ENDIF
        NELTOT = NELTOT+NEL(NUMSD)
        IF (NELTOT.GT.NMAX) THEN
          IERR = 2
          PRINT*,'*** Trop d''éléments',NELTOT,NMAX
          GOTO 999
        ENDIF
        IF (IENDIAN.EQ.0) THEN
          DO I=1,NEL(NUMSD)
            CALL litrecbinspeed(LIBRE,IWORK,LLL)
            N = N+1
            IF (IMP.GT.1) THEN
              IF (MOD(N+NUMNP,NMOD).EQ.0)
     &             CALL MYFLUSH(100.*REAL(N+NUMNP)/REAL(NTOTAL))
            ENDIF
            DO K=0,NDS(NUMSD)
              NODE(K,N) = IWORK(K+1)
            ENDDO
            IF (LLL.GT.4*(NDS(NUMSD)+1)) THEN
              NPR(N) = IWORK(NDS(NUMSD)+2)
              IF (NPR(N).GT.0) THEN
                DO K=1,MIN(6,NPR(N))
                  NFPR(K,N) = IWORK(NDS(NUMSD)+1+2*K)
                  PR(K,N) = WORK(NDS(NUMSD)+2+2*K)
                ENDDO
              ENDIF
            ELSEIF(NDS(NUMSD).EQ.3
     &           .OR.NDS(NUMSD).EQ.4.OR.NDS(NUMSD).EQ.8) THEN
              NPR(N) = 0
            ENDIF
          ENDDO
        ELSE
          DO I=1,NEL(NUMSD)
            CALL litrecbin(LIBRE,IWORK,LLL,IOPTLI0)
            N = N+1
            IF (IMP.GT.1) THEN
              IF (MOD(N+NUMNP,NMOD).EQ.0)
     &             CALL MYFLUSH(100.*REAL(N+NUMNP)/REAL(NTOTAL))
            ENDIF
            DO K=0,NDS(NUMSD)
              NODE(K,N) = IWORK(K+1)
            ENDDO
            IF (LLL.GT.4*(NDS(NUMSD)+1)) THEN
              NPR(N) = IWORK(NDS(NUMSD)+2)
              IF (NPR(N).GT.0) THEN
                DO K=1,MIN(6,NPR(N))
                  NFPR(K,N) = IWORK(NDS(NUMSD)+1+2*K)
                  PR(K,N) = WORK(NDS(NUMSD)+2+2*K)
                ENDDO
              ENDIF
            ELSEIF(NDS(NUMSD).EQ.3
     &           .OR.NDS(NUMSD).EQ.4.OR.NDS(NUMSD).EQ.8) THEN
              NPR(N) = 0
            ENDIF
          ENDDO
        ENDIF
        GOTO 1
      ENDIF
 999  CALL fermebin(LIBRE)
      IF (IMP.GT.1) CALL ENDFLUSH
      END
C-----------------------------------------------------------------------
      SUBROUTINE LITAVOIR0(FICH,LFICH,HED,NUMNP,NELTOT,NGMAX,NMAX
     &                    ,NDSMAX,XYZ,IBC,NODE,NPR,NFPR,PR,NGROUP,NTYP
     &                    ,NEL,NDS,NUMSD,IMP,IERR,IPR)
      DIMENSION XYZ(3,*),PR(6,*)
      INTEGER   IBC(9,*),NODE(0:NDSMAX,*),NPR(*),NFPR(6,*)
     &         ,NGROUP(*),NTYP(*),NEL(*),NDS(*)
      CHARACTER*80  HED
      CHARACTER*128 FICH
C
      CALL PREMIER_LIBRE(LIBRE)
      IF (LIBRE.LT.0) THEN
        PRINT*,'*** Pas d''unité libre'
        STOP
      ENDIF
C
      IERR = 0
      OPEN(LIBRE,FILE=FICH(1:LFICH),FORM='UNFORMATTED',STATUS='OLD'
     &      ,IOSTAT=IERR)
      IF (IERR.NE.0) THEN
        PRINT*,'*** Erreur à l''ouverture de '//FICH(1:LFICH)
        IERR = -1
        RETURN
      ENDIF
C
      READ(LIBRE) HED
      READ(LIBRE) NUMNP
      IF (NUMNP.GT.NMAX) THEN
        IERR = 1
        PRINT*,'*** Trop de noeuds',NUMNP,NMAX
        CLOSE(LIBRE)
        RETURN
      ENDIF
      IF (IMP.GT.1) THEN
        NTOTAL = 2*NUMNP
        NMOD = MAX(1000,NTOTAL/50)
        CALL INITFLUSH
      ENDIF
      DO I=1,NUMNP
        READ(LIBRE) (XYZ(K,I),K=1,3),(IBC(K,I),K=1,9)
        IF (IMP.GT.1) THEN
          IF (MOD(I,NMOD).EQ.0)
     &         CALL MYFLUSH(100.*REAL(I)/REAL(NTOTAL))
        ENDIF
      ENDDO
      NUMSD = 0
      NELTOT = 0
      N = 0
 1    READ(LIBRE,END=999,ERR=999) N1,N2,N3,N4
      NUMSD = NUMSD+1
      IF (NUMSD.GT.NGMAX) THEN
        IERR = 3
        PRINT*,'*** Trop de sous-domaines',NGMAX
        GOTO 999
      ENDIF
      NGROUP(NUMSD) = N1
      NTYP(NUMSD) = N2
      NEL(NUMSD) = N3
      NDS(NUMSD) = N4
      IF (NDS(NUMSD).GT.NDSMAX) THEN
        IERR = 4
        PRINT*,'*** Trop de noeuds par élément',NDS(NUMSD)
        GOTO 999
      ENDIF
      NELTOT = NELTOT+NEL(NUMSD)
      IF (NELTOT.GT.NMAX) THEN
        IERR = 2
        PRINT*,'*** Trop d''éléments',NELTOT,NMAX
        GOTO 999
      ENDIF
      IF (NUMSD.EQ.1) THEN
        ND = NDS(NUMSD)
        IF ((ND.EQ.3.OR.ND.EQ.4.OR.ND.EQ.8.OR.ND.EQ.6.OR.ND.EQ.16)
     &       .AND.IPR.EQ.0) THEN
          READ(LIBRE,END=100,ERR=100) (NODE(K,1),K=0,NDS(NUMSD)),NPR(1)
     &                               ,(NFPR(K,1),PR(K,1),K=1,NPR(1))
          IIPR = 0
          GOTO 101
 100      IIPR = 1
cc 101      BACKSPACE(LIBRE)
 101      N = N+1
          NELLOC = NEL(NUMSD)-1
        ELSE
          IIPR = 1
          NELLOC = NEL(NUMSD)
        ENDIF
      ELSE
          NELLOC = NEL(NUMSD)
      ENDIF
      IF (IIPR.EQ.0) THEN
        DO I=1,NELLOC
          N = N+1
          IF (IMP.GT.1) THEN
            IF (MOD(N+NUMNP,NMOD).EQ.0)
     &           CALL MYFLUSH(100.*REAL(N+NUMNP)/REAL(NTOTAL))
          ENDIF
          READ(LIBRE) (NODE(K,N),K=0,NDS(NUMSD)),NPR(N)
     &               ,(NFPR(K,N),PR(K,N),K=1,NPR(N))
        ENDDO
      ELSE
        DO I=1,NELLOC
          N = N+1
          IF (IMP.GT.1) THEN
            IF (MOD(N+NUMNP,NMOD).EQ.0)
     &           CALL MYFLUSH(100.*REAL(N+NUMNP)/REAL(NTOTAL))
          ENDIF
          READ(LIBRE) (NODE(K,N),K=0,NDS(NUMSD))
          NPR(N) = 0
        ENDDO
      ENDIF
      GOTO 1
 999  CLOSE(LIBRE)
      IF (IMP.GT.1) CALL ENDFLUSH
      END
