elenbl
C ELENBL SOURCE CHAT 05/01/12 23:31:01 5004 $ ELNBEL,IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : ELENBL C DESCRIPTION : Construit une liste d'entiers : ELNBEL (type MLENTI) * NOCENT : indice du centre de l'élément considéré dans MCENT * ELNBEL(NOCENT) : nombre d'éléments partageant (au moins) * un point de MCLPO1 avec l'élément considéré. C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C APPELES : KRIPAD : MELEME -> (num. globale->locale) C APPELES (E/S) : - C APPELES (BLAS) : - C APPELES (CALCUL) : - C APPELE PAR : ELPOEL C*********************************************************************** C SYNTAXE GIBIANE : - C ENTREES : MCLAS (type MELEME) : maillage de classe de C points (sommet, face) par C élément (MMAIL,ELTFA) C MCLPO1 (type MELEME) : maillage de points C correspondant à MCLAS C MCENT (type MELEME) : maillage des centres de C MCLAS C LEPOEL (type MLELEM) : * NOPOI1 : indice du point considéré dans MCLPO1 * LEPOEL.LESPOI(LEPOEL.INDEX(NOPOI1)) : * contient le numéro du point considéré * LEPOEL.LESPOI(LEPOEL.INDEX(NOPOI1)+1 * -> LEPOEL.INDEX(NOPOI1+1)-1) : * contient les numéro des points centre * des éléments contenant le point considéré C C ENTREES/SORTIES : - C SORTIES : ELNBEL (type MLENTI) C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 02/11/98, version initiale C HISTORIQUE : v1, 02/11/98, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** C Prière de PRENDRE LE TEMPS de compléter les commentaires C en cas de modification de ce sous-programme afin de faciliter C la maintenance ! C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC SMELEME POINTEUR MCLAS.MELEME POINTEUR MCLPO1.MELEME POINTEUR MCENT.MELEME -INC SMLENTI POINTEUR ELNBEL.MLENTI POINTEUR KRIPO1.MLENTI POINTEUR TMPCEN.MLENTI * * Segment MLELEM * SEGMENT MLELEM INTEGER INDEX(NBL+1) INTEGER LESPOI(NBTPOI) ENDSEGMENT * * LISTE SEQUENTIELLE INDEXEE D'ELEMENTS * * NBL : NOMBRE D'ELEMENTS * NBTPOI : NOMBRE TOTAL DE POINTS REFERENCEES * INDEX(I) : INDICE DU 1ER POINT DU IEME ELEMENT * DANS LE TABLEAU LESPOI * LESPOI(INDEX(I) -> INDEX(I+1)-1) : NUMERO DES NOEUDS * DU IEME ELEMENT * POINTEUR LEPOEL.MLELEM INTEGER IMPR,IRET LOGICAL LFOUND * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans elenbl.eso' SEGACT MCLPO1 NBSOUS=MCLPO1.LISOUS(/1) NOTYP =MCLPO1.ITYPEL IF (NBSOUS.NE.0.OR.(NBSOUS.EQ.0.AND.NOTYP.NE.1)) THEN WRITE(IOIMP,*) 'MCLPO1 must contain only POI1 elements' GOTO 9999 ENDIF C In KRIPAD : SEGINI KRIPO1 NBPOI1=MCLPO1.NUM(/2) SEGDES MCLPO1 SEGACT MCENT NBSOUS=MCENT.LISOUS(/1) NOTYP =MCENT.ITYPEL IF (NBSOUS.NE.0.OR.(NBSOUS.EQ.0.AND.NOTYP.NE.1)) THEN WRITE(IOIMP,*) 'MCENT must contain only POI1 elements' GOTO 9999 ENDIF NBCENT=MCENT.NUM(/2) JG=NBCENT SEGINI ELNBEL * On a besoin du max. du nombre de centres adjacents à un point * de MCLPO1 pour avoir une estimation * du nombre max de centres adjacents à l'élément en cours SEGACT LEPOEL NBLEPO=LEPOEL.INDEX(/1)-1 IF (NBLEPO.NE.NBPOI1) THEN WRITE(IOIMP,*) $ 'Dimension of MCLPO1 and LEPOEL are not compatible' GOTO 9999 ENDIF MAPOCE=0 DO 1 INBL=1,NBLEPO MAPOCE=MAX(MAPOCE,(LEPOEL.INDEX(INBL+1)-LEPOEL.INDEX(INBL))) 1 CONTINUE * Dans LEPOEL, on a a la fois le point et les centre adjacents MAPOCE=MAPOCE-1 * Parcourons le maillage géométrique SEGACT MCLAS NBSOUS=MCLAS.LISOUS(/1) IF (NBSOUS.EQ.0) NBSOUS=1 ICENT=0 DO 2 INBSOU=1,NBSOUS IF (NBSOUS.GT.1) THEN IPT1=MCLAS.LISOUS(INBSOU) SEGACT IPT1 ELSE IPT1=MCLAS ENDIF NBPOEL=IPT1.NUM(/1) NBELEM=IPT1.NUM(/2) JG=NBPOEL*MAPOCE * TMPCEN sert à stocker les centres adajacents à l'élément * en cours. Il faut faire attention à ne pas stocker deux * fois le meme numéro de centre. SEGINI TMPCEN DO 22 INBEL=1,NBELEM ICENT=ICENT+1 ITMPC=1 * On stocke le centre de l'élément considéré en premier TMPCEN.LECT(ITMPC)=MCENT.NUM(1,ICENT) DO 222 INBPO=1,NBPOEL NOPOI1=KRIPO1.LECT(IPT1.NUM(INBPO,INBEL)) IF (NOPOI1.NE.0) THEN DO 2222 IPOCE=LEPOEL.INDEX(NOPOI1)+1, $ LEPOEL.INDEX(NOPOI1+1)-1 NUMCEN=LEPOEL.LESPOI(IPOCE) IBTMPC=1 * On cherche si le centre de numéro NUMCEN n'est pas deja * dans la liste TMPCEN 22222 CONTINUE LFOUND=(NUMCEN.EQ.TMPCEN.LECT(IBTMPC)) IF (.NOT.LFOUND.AND.(IBTMPC.LT.ITMPC)) THEN IBTMPC=IBTMPC+1 GOTO 22222 ENDIF * Il n'est pas dans la liste, on le rajoute IF (.NOT.LFOUND) THEN ITMPC=ITMPC+1 TMPCEN.LECT(ITMPC)=NUMCEN ENDIF 2222 CONTINUE ELSE WRITE(IOIMP,*) 'Erreur grave MCLPO1 n''est pas' WRITE(IOIMP,*) 'le maillage de points correspondant' WRITE(IOIMP,*) 'à MCLAS.' ENDIF 222 CONTINUE * ITMPC-1 car TMPCEN contient aussi le centre de l'élément * courant ELNBEL.LECT(ICENT)=ITMPC-1 22 CONTINUE IF (NBSOUS.GT.1) SEGDES IPT1 SEGSUP TMPCEN 2 CONTINUE SEGDES MCLAS SEGDES LEPOEL SEGDES MCENT SEGSUP KRIPO1 IF (IMPR.GT.2) THEN WRITE(IOIMP,*) 'On a créé ELNBEL (type MLENTI)=',ELNBEL IF (IMPR.GT.3) THEN WRITE(IOIMP,4000) 'ELNBEL',NBCENT WRITE(IOIMP,5000) (ELNBEL.LECT(I),I=1,NBCENT) ENDIF ENDIF SEGDES ELNBEL * * Normal termination * IRET=0 RETURN * * Format handling * 4000 FORMAT (A,'(1..',I8,')') 5000 FORMAT (8(1X,I8)) * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine elenbl' RETURN * * End of subroutine ELENBL * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales