C SMAOCR    SOURCE    CHAT      06/03/29    21:34:21     5360
C


C     *****************************************************************
C     MODULE  : ST (STRUCTURE DES DONNEES)
C     FICHIER : ST_1STRUCT.F
C     OBJET   : FONCTIONS PRATIQUES POUR LA CREATION DE MAILLAGES
C
C     FONCT.  :
C       SMAOCR  : CREER LA STRUCTURE DE DONNEE MAILLAGE ORIENTEE
C                   (CAS DE PLUSIEURS COMPOSANTES CONNEXES)
C       SFRCRE : CREER LE MAILLAGE FRONTIERE D'UN ENSEMBLE DE
C                   MAILLES
C
C     AUTEUR  : O. STAB
C     DATE    : 03.95
C     MODIFICATIONS :
C      AUTEUR, DATE, OBJET :
C
C
C     *****************************************************************
C
C
      SUBROUTINE SMAOCR(IDE,ITRI,NBE,COORD,NCOORD,IDIMC,
     >                   ITRNOE,NBNMAX,ITRTRI,NBCMAX,NOETRI,NOEMAX,
     >                   ITVL,NBTRAV,NCC,iarr)
C     *****************************************************************
C     OBJET : CREER LA STRUCTURE DE DONNEE MAILLAGE ORIENTEE
C                   (CAS DE PLUSIEURS COMPOSANTES CONNEXES)
C             ITRI -> ITRNOE, ITRTRI, NOETRI
C     EN ENTREE:
C      IDE    :  (1..3) DIMENSION DES ELEMENTS
C      NBE    :  NOMBRE D'ELEMENTS DU MAILLAGE
C      ITRI   :  ITRI(I,J) EST LE NOEUD J DE L'ELEMENT I
C      NBNMAX :  (2..8) NOMBRE DE NOEUDS MAXIMUM DES ELEMENTS
C      NBCMAX :  (2..6) NOMBRE DE COTES MAXIMUM DES ELEMENTS
C      NOEMAX:   TAILLE DU TABLEAU NOETRI
C     EN SORTIE:
C       ITRNOE: ITRNOE(I,J) EST LE NOEUD J DU TRIANGLE I
C                PEUT ETRE LE MEME TABLEAU QUE ITRI
C       ITRTRI: ITRTRI(I,J) EST L'ELEMENT INCIDENT A L'ELEMENT I SUR
C                LE COTE J
C       NOETRI : NOETRI(I) EST UN DES ELEMENTS CONTENANT LE NOEUD I
C                AU MIN = (NBCMAX+1)*NBE
C                AU MAX = MAX((NBCMAX+1)*NBE ,
C                             (NBR MAX D'ELEMENTS EN 1 NOEUD + 1) *
C                             (NUMERO MAXI DU NOEUD DANS ITRI))
C                         => O(N)
C       iarr   : CODE D'ERREUR 0 => OK
C                -2 => LE TABLEAU ITVL EST TROP PETIT
C                -NB => TABLEAU NOETRI TROP PETIT TAILLE SOUHAITE = NB
C     CONDITION D'APPLICATION : ARETE, TRIANGLE, QUADRANGLE, TETRA
C     *****************************************************************
      IMPLICIT INTEGER(I-N)
      INTEGER   IDE,ITRI(*),NBE
      REAL*8      COORD(*)
      INTEGER   NCOORD,IDIMC,ITRNOE(*),NBNMAX,ITRTRI(*),NBCMAX
      INTEGER   NOETRI(*), NOEMAX, ITVL(*), NBTRAV
      INTEGER   NCC,iarr
C
      INTEGER  STRNBN, GORIEN
      EXTERNAL STRNBN, GORIEN
      INTEGER  ITRAM,ITRAP,N,INDC,I,K,NBTRIP(100),IND,IEC
      REAL*8     ZERO
C
      ZERO = 0.0
      CALL SMACRE(IDE,ITRI,NBE,NCOORD,ITRNOE,NBNMAX,ITRTRI,NBCMAX,
     >                   NOETRI,NOEMAX,ITVL,NBTRAV,iarr)
C
      IF( iarr.LT.0 )GO TO 999
      ITRAM = NBTRAV - NBE
      CALL SORIEN(IDE,ITRNOE,NBNMAX,ITRTRI,NBCMAX,NBE,
     >                  ITVL,ITRAM,ITVL(ITRAM),NCC,iarr)
      IF( iarr.LT.0 )GO TO 999
      IF( IDE.LT.IDIMC )GO TO 999
C
C    --- ORIENTATION GEOMETRIQUE IDENTIQUE POUR CHAQUE CC
C        N'A DE SENS QUE SI LA DIMENSION DES ELEMENTS EST
C        IDENTIQUE A LA DIMENSION DE L'ESPACE
C
      IF( NCC.EQ.1 )THEN
C
C     --- UNE SEULE COMPOSANTE CONNEXE -----------------
C
        N = STRNBN(1,ITRNOE,NBNMAX)
        IF( GORIEN(ITRNOE(1),N,COORD,IDIMC,ZERO).EQ.-1)THEN
          DO 30 I=1,NBE
            N = STRNBN(I,ITRNOE,NBNMAX)
            CALL SINVOR(1,N,IDE,ITRNOE((I-1)*NBNMAX+1),
     >                            ITRTRI((I-1)*NBCMAX+1))
   30     CONTINUE
        ENDIF
      ELSE
C
C     --- PLUSIEURS COMPOSANTES CONNEXES ---------------
C
        ITRAP = NBTRAV - NBE
        ITRAM = ITRAP - NBE
        IND = 1
C
C       BUG3 O.STAB 03.08.95 NOMBRE DE PARAMETRES INCORRECT
C
        CALL TMAPAR(IDE,ITRTRI,NBCMAX,IND,NBE,
     >                ITVL,ITVL(ITRAM),ITRAM,
     >                ITVL(ITRAP),NBTRIP,NCC,100,iarr)
        INDC = 1
        DO 50 I=1,NCC
          N = STRNBN(ITVL(ITRAP+INDC),ITRNOE,NBNMAX)
          IF( GORIEN(ITRNOE(INDC),N,COORD,IDIMC,ZERO).EQ.-1)THEN
            DO 40 K=0,(NBTRIP(I)-1)
              IEC = ITVL(ITRAP+INDC+K)
              N = STRNBN(IEC,ITRNOE,NBNMAX)
C
C       BUG4 O.STAB 15.09.95 : NUMERO RELATIF DU COTE (SINVOR)
C
C              CALL SINVOR(ITVL(ITRAP+INDC+K),N,IDE,ITRNOE,
C     >             ITRTRI)
C     REMPLACER PAR :
C
              CALL SINVOR(1,N,IDE,ITRNOE((IEC-1)*NBNMAX+1),
     >             ITRTRI((IEC-1)*NBCMAX+1))
   40       CONTINUE
          ENDIF
   50   CONTINUE
      ENDIF
  999 END



