elelem
C ELELEM SOURCE CHAT 05/01/12 23:30:45 5004 $ LEELEL,IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : ELELEM C DESCRIPTION : On construit la liste séquentielle indexée d'éléments C LEELEL (type MLELEM). * NOCENT : indice du centre de l'élément considéré dans * MCENT * LEELEL.LESPOI(LEELEL.INDEX(NOCENT)) : * contient le numéro du centre de l'élément considéré * LEELEL.LESPOI(LEPOEL.INDEX(NOCENT)+1 * -> LEPOEL.INDEX(NOCENT+1)-1) : * contient les numéro des points centre des éléments * qui ont un point de MCLPO1 en commun avec l'élément * considéré (!) * * ELNBEL est tel que ELNBEL(NOCENT) = nb d'éléments ayant au * moins un point de MCLPO1 * en commun avec l'élément * dont l'indice du centre * dans MCENT est NOCENT. * ELNBEL est calculé dans la subroutine elenbl.eso * Il sert à dimensionner le tableau LESPOI et remplir * le tableau INDEX du segment LEELEL. 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) : un maillage de C points (dits 'centres') ayant le meme C nombre d'éléments que MCLAS et C servant à repérer les éléments de MCLAS. C ELNBEL (type MLENTI) : voir DESCRIPTION C C ENTREES/SORTIES : - C SORTIES : LEELEL (type MLELEM) : liste séquentielle indexée C d'éléments (cf. plus haut) 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 * * 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 POINTEUR LEELEL.MLELEM INTEGER IMPR,IRET INTEGER NBL,NBTPOI LOGICAL LFOUND * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans elelem.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 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) SEGACT ELNBEL NELNB=ELNBEL.LECT(/1) IF (NELNB.NE.NBCENT) THEN WRITE(IOIMP,*) 'Dimension of MCENT and ELNBEL are not equal' GOTO 9999 ENDIF C C On initialise le segment LEELEL (type MLELEM) C NBL=NBCENT NBTPOI=0 SEGINI LEELEL IDEPA=1 DO 1 INBL=1,NBL LEELEL.INDEX(INBL)=IDEPA IDEPA=IDEPA+1+ELNBEL.LECT(INBL) 1 CONTINUE LEELEL.INDEX(NBL+1)=IDEPA SEGDES ELNBEL NBTPOI=IDEPA-1 SEGADJ LEELEL SEGACT LEPOEL * Parcourons le maillage SEGACT MCLAS NBSOUS=MCLAS.LISOUS(/1) IF (NBSOUS.EQ.0) NBSOUS=1 ICENT=0 DO 3 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) DO 32 INBEL=1,NBELEM ICENT=ICENT+1 LEELEL.LESPOI(LEELEL.INDEX(ICENT))=MCENT.NUM(1,ICENT) ICOUR=LEELEL.INDEX(ICENT)+1 DO 322 INBPO=1,NBPOEL NOPOI1=KRIPO1.LECT(IPT1.NUM(INBPO,INBEL)) IF (NOPOI1.NE.0) THEN DO 3222 IPOEL=LEPOEL.INDEX(NOPOI1)+1, $ LEPOEL.INDEX(NOPOI1+1)-1 NUMCEN=LEPOEL.LESPOI(IPOEL) IBCOUR=LEELEL.INDEX(ICENT) 32222 CONTINUE LFOUND=(NUMCEN.EQ.LEELEL.LESPOI(IBCOUR)) IF (.NOT.LFOUND.AND.(IBCOUR.LT.ICOUR)) THEN IBCOUR=IBCOUR+1 GOTO 32222 ENDIF IF (.NOT.LFOUND) THEN LEELEL.LESPOI(ICOUR)=NUMCEN ICOUR=ICOUR+1 ENDIF 3222 CONTINUE ELSE WRITE(IOIMP,*) 'Erreur grave MCLPO1 n''est pas' WRITE(IOIMP,*) 'le maillage de points correspondant' WRITE(IOIMP,*) 'à MCLAS.' GOTO 9999 ENDIF 322 CONTINUE 32 CONTINUE IF (NBSOUS.GT.1) SEGDES IPT1 3 CONTINUE SEGDES MCLAS SEGDES LEPOEL IF (IMPR.GT.2) THEN WRITE(IOIMP,*) 'On a créé LEELEL (type MLELEM)=',LEELEL IF (IMPR.GT.3) THEN WRITE(IOIMP,4000) 'LEELEL.INDEX',NBL+1 WRITE(IOIMP,5000) (LEELEL.INDEX(I),I=1,NBL+1) WRITE(IOIMP,4000) 'LEELEL.LESPOI',NBTPOI WRITE(IOIMP,5000) (LEELEL.LESPOI(I),I=1,NBTPOI) ENDIF ENDIF SEGDES LEELEL SEGDES MCENT SEGSUP KRIPO1 * * 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 elelem' RETURN * * End of subroutine ELELEM * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales