poelem
C POELEM SOURCE CHAT 05/01/13 02:16:22 5004 $ LEPOEL,IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : POELEM C DESCRIPTION : On construit la liste séquentielle indexée C d'éléments 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éros des points centre des * éléments de MCLAS contenant le point considéré (!) * * PONBEL est tel que PONBEL(NOPOI1) = nb d'éléments * contenant le POI1 * (NOPOI1 est le numéro local du point dans MCLPO1) * * PONBEL est calculé dans la subroutine ponbel.eso * Il sert à dimensionner le tableau LESPOI et remplir * le tableau INDEX du segment LEPOEL. 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 : POIELE, 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 PONBEL (type MLENTI) : une liste indiquant C à combien d'éléments de MCLAS appartient C un point de MCLPO1. C C ENTREES/SORTIES : - C SORTIES : LEPOEL (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 PONBEL.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 ICOUR.MLELEM INTEGER IMPR,IRET INTEGER NBL,NBTPOI * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans poelem.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 NBPOI1=MCLPO1.NUM(/2) SEGACT PONBEL NPONB=PONBEL.LECT(/1) IF (NPONB.NE.NBPOI1) THEN WRITE(IOIMP,*) 'Dimension of MCLPO1 and PONBEL are not equal' GOTO 9999 ENDIF C On initialise le segment LEPOEL (type MLELEM) C et le segment ICOUR (type MLELEM) C dans ICOUR, seul le tableau INDEX nous intéresse NBL=NBPOI1 NBTPOI=0 SEGINI LEPOEL IDEPA=1 DO 2 INBL=1,NBL LEPOEL.INDEX(INBL)=IDEPA IDEPA=IDEPA+1+PONBEL.LECT(INBL) 2 CONTINUE LEPOEL.INDEX(NBL+1)=IDEPA SEGDES PONBEL SEGINI,ICOUR=LEPOEL NBTPOI=IDEPA-1 SEGADJ LEPOEL C C On remplit LESPOI(INDEX(I)) avec le numéro du Ieme point C de MCLPO1. C DO 3 INBL=1,NBL LEPOEL.LESPOI(ICOUR.INDEX(INBL))=MCLPO1.NUM(1,INBL) ICOUR.INDEX(INBL)=ICOUR.INDEX(INBL)+1 3 CONTINUE C In KRIPAD : SEGINI KRIPO1 SEGDES MCLPO1 C C On remplit LESPOI(INDEX(I)+1 -> INDEX(I+1)-1) C avec les points centres des éléments contenant le C Ieme point de MCLPO1. C C On procède en bouclant sur les éléments de MCLAS pour C remplir le tableau LESPOI. C SEGACT MCENT SEGACT MCLAS NBSOUS=MCLAS.LISOUS(/1) IF (NBSOUS.EQ.0) NBSOUS=1 ICENT=0 DO 4 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 42 INBEL=1,NBELEM ICENT=ICENT+1 NOCEN=MCENT.NUM(1,ICENT) DO 422 INBPO=1,NBPOEL NOPOI1=KRIPO1.LECT(IPT1.NUM(INBPO,INBEL)) IF (NOPOI1.NE.0) THEN LEPOEL.LESPOI(ICOUR.INDEX(NOPOI1))=NOCEN ICOUR.INDEX(NOPOI1)=ICOUR.INDEX(NOPOI1)+1 ELSE WRITE(IOIMP,*) 'Erreur grave MCLPO1 n''est pas' WRITE(IOIMP,*) 'le maillage de points correspondant' WRITE(IOIMP,*) 'à MCLAS.' GOTO 9999 ENDIF 422 CONTINUE 42 CONTINUE IF (NBSOUS.GT.1) SEGDES IPT1 4 CONTINUE SEGDES MCLAS SEGDES MCENT IF (IMPR.GT.2) THEN WRITE(IOIMP,*) 'On a créé LEPOEL (type MLELEM)=',LEPOEL IF (IMPR.GT.3) THEN WRITE(IOIMP,4000) 'LEPOEL.INDEX',NBL+1 WRITE(IOIMP,5000) (LEPOEL.INDEX(I),I=1,NBL+1) WRITE(IOIMP,4000) 'LEPOEL.LESPOI',NBTPOI WRITE(IOIMP,5000) (LEPOEL.LESPOI(I),I=1,NBTPOI) ENDIF ENDIF SEGDES LEPOEL SEGSUP ICOUR 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 poelem' RETURN * * End of subroutine POELEM * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales