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