C MINDEG SOURCE CHAT 05/01/13 01:45:16 5004 C************************************************************************** C************************************************************************** C************************************************************************** C***************************** ****************************** C************************* *************************** c******************* MINIDEG ********************* c************************** *************************** C**************************** ****************************** C************************************************************************** C************************************************************************** C************************************************************************** SUBROUTINE MINDEG(NPVOIS,NVOIS,NBENS,IORDRE) C***************************************************************************** C Cette procedure permet: C - tout d'abord, de renumeroter les noeuds a partir C du minimum degre. C - ensuite,a partir de cette nouvelle renumerotation,d'obtenir C une matrice par blocs par le biais de la methode multifrontale. C domaine d'etude. C*********************** IMPLICIT INTEGER(I-N) SEGMENT NPVOIS(0),NVOIS(0) INTEGER NBENS SEGMENT MPVOIS(NBENS*2),MVOIS(0) C MVOIS contient pour chaque noeud: C tous les voisins de noeud contenus dans NVOIS. C des nouveaux voisins qui apparaissent lors de l'elimination C d'un voisin (appartenant a MVOIS) de noeud. C le nombre de voisins total du noeud X= MPVOIS(X,2)-MPVOIS(X,1) SEGMENT NOERES(NBENS+1) C NOERES=tableau des noeuds non elimines. C NOERES(1)=dimension de NOERES SEGMENT IORDRE(NBENS*2) INTEGER COMPT,RACINE,NOEUD SEGMENT IFILS(NBENS),IFRERE(NBENS) C RACINE,IFILS,IFRERE servent a la confection du graphe de C renumerotation. C initialisation : C************************ SEGINI NOERES,MPVOIS,MVOIS,IORDRE DO 10 I=1,NBENS NOERES(I+1)=I MPVOIS(I)=NPVOIS(I) IORDRE(I)=0 IORDRE(I+NBENS)=0 MPVOIS(I+NBENS)=NPVOIS(I+NBENS) DO 20 J=NPVOIS(I),NPVOIS(I+NBENS) MVOIS(**)=NVOIS(J) 20 CONTINUE 10 CONTINUE NOERES(1)=NBENS C tous les noeuds sont des noeuds restants. COMPT=0 C le compteur est initialise a 0. C Boucle principale : C************************** 100 IF (NOERES(1).NE.0) THEN C si le nombre de noeuds restants n'est pas nul, CALL CHDEG(NPVOIS,NVOIS,NOERES,NOEUD,NBENS) C on cherche alors le NOEUD de degre minimum. CALL FUSION(NPVOIS,NVOIS,NOEUD,NBENS) C on elimine ce NOEUD de la gestion de donnees de C ses voisins . C on rajoute a la gestion de donnees des voisins de NOEUD C tous les voisins de NOEUD qui ne leur sont pas deja C voisins et differents d'eux-memes. C dans MGD, on ne fait que rajouter;on n'elimine pas. C CALL MFUSIO(MPVOIS,MVOIS,NOEUD,NPVOIS,NVOIS,NBENS) CALL DELIMI(NOEUD,NOERES) C on elimine NOEUD de NOERES. COMPT=COMPT+1 C COMPT correspond au nombre de noeuds elimines. IORDRE(NOEUD+NBENS)=COMPT IORDRE(COMPT)=NOEUD C IORDRE(NOEUD+NBENS)=ordre d'elimination de noeud. C = nouvelle numerotation. C IORDRE(NOEUD)=ancienne numerotation. GOTO 100 ENDIF SEGINI IFILS,IFRERE CALL IFILSF(MPVOIS,MVOIS,IORDRE,COMPT,IFILS, & IFRERE,RACINE,NBENS) C cree les liens de parente entre noeuds. SEGSUP MPVOIS,MVOIS C suppression des segments inutiles. CALL NUMO(IFILS,IFRERE,RACINE,IORDRE,NBENS) C renumerote les noeuds a partir des liens de parente. SEGSUP NOERES,IFILS,IFRERE C suppression des segments. RETURN END