C PREPA     SOURCE    CHAT      05/01/13    02:25:48     5004
C****************************************************************************
C****************************************************************************
C*************PREPA....PREPAration des donnees*******************************
C****************************************************************************
C****************************************************************************



C Cette procedure transforme les sous espaces crees par la nested disection
C   pour en faire une gestion de donnees.chaque sous espace est considere
C   comme un point, de plus la structure de donnees est triee pour l'utilisation
C   plus rapide du minimum degre avec multifrontale.




      SUBROUTINE PREPA(IPOS,NPVOIS,NVOIS,NBENS,NUMERO,NODES,IADJ,IVOIS)

      IMPLICIT INTEGER(I-N)
        SEGMENT NPVOIS(2*NBENS)
        SEGMENT NVOIS(0)
        INTEGER NBENS,NODES
        SEGMENT NUMERO(NODES)
        SEGMENT IPOS(0)
        SEGMENT IADJ(0),IVOIS(0)


        SEGMENT IENS(0)
        SEGMENT IPELEM(0),NPELEM(NBENS+1)
        SEGMENT IELEM(ND)
        LOGICAL BOOL


        NBENS=1
        SEGINI IPELEM
        SEGINI IENS
        IENS(**)=IPOS(NODES+1)
        NUMERO(1)=1
        IPELEM(**)=1


C   NUMERO(i) donne le nouveau numero du sous espace auquel appartient
C   le noeud i
C   IPELEM(i) donne le nombre de noeuds de l'element i

        DO 10 I=2,NODES
          DO 20 J=1,NBENS
            IF (IPOS(I+NODES).EQ.IENS(J)) THEN
                NUMERO(I)=J
                IPELEM(J)=IPELEM(J)+1
                GOTO 10
            ENDIF
20        CONTINUE
          NBENS=NBENS+1
          NUMERO(I)=NBENS
          IENS(**)=IPOS(I+NODES)
          IPELEM(**)=1
10      CONTINUE

        SEGINI NPELEM,NPVOIS,NVOIS

        NPELEM(1)=1
        DO 50 I=2,NBENS+1
           NPVOIS(I-1)=1
           NPVOIS(I-1+NBENS)=0
           NPELEM(I)=NPELEM(I-1)+IPELEM(I-1)
           IPELEM(I-1)=0
50      CONTINUE

C   NPELEM(i) pointe sur le premier noeud de l'element i dans ELEM

        ND=NPELEM(NBENS+1)
        SEGINI IELEM
        DO 60 I=1,NODES
          DO 70 J=1,NBENS
            IF (IPOS(I+NODES).EQ.IENS(J)) THEN
                IELEM(NPELEM(J)+IPELEM(J))=I
                IPELEM(J)=IPELEM(J)+1
                GOTO 60
            ENDIF
70        CONTINUE
60      CONTINUE


C construction d'une nouvelle base de donnees pour les elements,
C c'est a dire  on recherche les voisins de chaque element.


        DO 100 I=1,NBENS-2
           DO 110 J=NPELEM(I),NPELEM(I+1)-1
              DO 120 K=IADJ(IELEM(J)),IADJ(IELEM(J)+1)-1
                IF(NUMERO(IVOIS(K)).NE.I) THEN
                   DO 130 IK=NPVOIS(I),NPVOIS(I+NBENS)
                    IF(NUMERO(IVOIS(K)).EQ.NVOIS(IK)) GOTO 120
130                CONTINUE
                   NPVOIS(I+NBENS)=NPVOIS(I+NBENS)+1
                   NPVOIS(I+1)=NPVOIS(I+1)+1
                   NVOIS(**)=NUMERO(IVOIS(K))
                ENDIF
120           CONTINUE
110        CONTINUE
        NPVOIS(I+1+NBENS)=NPVOIS(I+NBENS)
        NPVOIS(I+2)=NPVOIS(I+1)
100     CONTINUE

        DO 140 J=NPELEM(NBENS-1),NPELEM(NBENS)-1
              DO 150 K=IADJ(IELEM(J)),IADJ(IELEM(J)+1)-1
                IF(NUMERO(IVOIS(K)).NE.(NBENS-1)) THEN
                   DO 160 IK=NPVOIS((NBENS-1)),NPVOIS(2*NBENS-1)
                    IF(NUMERO(IVOIS(K)).EQ.NVOIS(IK)) GOTO 150
160                CONTINUE
                   NPVOIS(2*NBENS-1)=NPVOIS(2*NBENS-1)+1
                   NPVOIS(NBENS)=NPVOIS(NBENS)+1
                   NVOIS(**)=NUMERO(IVOIS(K))
                ENDIF
150           CONTINUE
140        CONTINUE

        NPVOIS(2*NBENS)=NPVOIS(2*NBENS-1)
        DO 170 J=NPELEM(NBENS),NPELEM(NBENS+1)-1
              DO 180 K=IADJ(IELEM(J)),IADJ(IELEM(J)+1)-1
                IF(NUMERO(IVOIS(K)).NE.NBENS) THEN
                   DO 190 IK=NPVOIS(NBENS),NPVOIS(2*NBENS)
                    IF(NUMERO(IVOIS(K)).EQ.NVOIS(IK)) GOTO 180
190                CONTINUE
                   NPVOIS(2*NBENS)=NPVOIS(2*NBENS)+1
                   NVOIS(**)=NUMERO(IVOIS(K))
                ENDIF
180           CONTINUE
170        CONTINUE

C tri de cette nouvelle base de donnees NVOIS.
C on range les elements voisins par ordre croissant.

        DO 200 I=1,NBENS
                DO 210 J=1,NPVOIS(I+NBENS)-NPVOIS(I)+1
                   BOOL=.FALSE.
                   DO 220 K=NPVOIS(I),NPVOIS(I+NBENS)-J
                        IF(NVOIS(K).GT.NVOIS(K+1)) THEN
                                NGINT=NVOIS(K)
                                NVOIS(K)=NVOIS(K+1)
                                NVOIS(K+1)=NGINT
                                BOOL=.TRUE.
                        ENDIF
220                CONTINUE
                   IF(.NOT.BOOL) GOTO 200
210             CONTINUE
200     CONTINUE

        SEGSUP IPELEM,NPELEM,IELEM,IENS


        RETURN
        END

