C IFILSF    SOURCE    CHAT      05/01/13    00:32:54     5004
C**************************************************************************
C**************************************************************************
C****************************                   ***************************
c************************          IFILSFRE          ***********************
c****************************                   ***************************
C**************************************************************************
C**************************************************************************
C       IFILS FREres.

C       cree une "arborescence" a partir de la racine, de gd,
C       de l'ordre d'elimination des noeuds.

        SUBROUTINE  IFILSF(MPVOIS,MVOIS,IORDRE,COMPT,
     *                       IFILS,IFRERE,RACINE,NBENS)


      IMPLICIT INTEGER(I-N)


        SEGMENT MPVOIS(0),MVOIS(0)
        SEGMENT IORDRE(0)
        INTEGER COMPT,RACINE
        SEGMENT IFILS(0),IFRERE(0)

        LOGICAL B,B2,BOOL
        INTEGER NOEUD,R,PERE,Y,FILLE
        SEGMENT  IENS(NBENS)


        SEGINI IENS

C       construction de l'arbre
        DO 10 I=1,NBENS
          IFRERE(I)=0
          IFILS(I)=0
10      CONTINUE
C       chaque noeud n'a ni fils, ni frere.



        RACINE=IORDRE(COMPT)
C       la racine est toujours le dernier noeud elimine
C       car il n'a pas de pere.


        DO 200 I=1,COMPT-1

           NOEUD=IORDRE(I)
C          noeud est dans l'ancienne numerotation.


           L=0
           DO 220 J=MPVOIS(NOEUD),MPVOIS(NOEUD+NBENS)

                B2=(IORDRE(MVOIS(J)+NBENS).GT.IORDRE(NOEUD+NBENS))
C               B2 est vrai si le voisin de NOEUD possede un nouveau
C               numero superieur au nouveau numero de NOEUD.

                IF (B2) THEN
                    L=L+1
                    IENS(L)=MVOIS(J)
C                   si b2 vrai, alors le voisin considere est un pere
C                   possible.
                    ENDIF
220             CONTINUE

                PERE=IENS(1)
C               PERE est initialise a IENS(1)

                DO 230 J=2,L
                      B=(IORDRE(IENS(J)+NBENS).LT.IORDRE(PERE+NBENS))
                      IF(B) PERE=IENS(J)
C                     s'il existe un element de ens ayant un nouveau numero
C                     inferieur a celui de pere alors il devient le veritable
C                     pere(l'autre n'est qu'un grand pere).
C               pere est dans l'ancienne numerotation.
230             CONTINUE

                FILLE=IFILS(PERE)

                IF (FILLE.EQ.0) THEN
C               s'il n'existe pas d'autre fils de pere,alors
C               noeud n'a pas de frere.
                    IFILS(PERE)=NOEUD
                    IFRERE(NOEUD)=0
                ELSE
C               si pere a un autre fils que noeud,
240                IF(IFRERE(FILLE).EQ.0) THEN
                        IFRERE(FILLE)=NOEUD
C                       et si cet autre fils n'a pas de frere,noeud devient
C                        ce frere.
                   ELSE
C                  sinon on prend le frere de cet autre fils du pere,
C                  on recherche si lui-meme a un frere jusqu'a aboutir
C                  a ne plus avoir de frere,et on met noeud a cette
C                  position.
                        FILLE=IFRERE(FILLE)
                        GOTO 240
                   ENDIF
                ENDIF

200     CONTINUE

        SEGSUP IENS


        RETURN
        END

