1 : C ELELEM SOURCE CHAT 05/01/12 23:30:45 5004 2 : SUBROUTINE ELELEM(MCLAS,MCLPO1,MCENT,LEPOEL,ELNBEL, 3 : $ LEELEL,IMPR,IRET) 4 : IMPLICIT INTEGER(I-N) 5 : IMPLICIT REAL*8 (A-H,O-Z) 6 : C*********************************************************************** 7 : C NOM : ELELEM 8 : C DESCRIPTION : On construit la liste séquentielle indexée d'éléments 9 : C LEELEL (type MLELEM). 10 : * NOCENT : indice du centre de l'élément considéré dans 11 : * MCENT 12 : * LEELEL.LESPOI(LEELEL.INDEX(NOCENT)) : 13 : * contient le numéro du centre de l'élément considéré 14 : * LEELEL.LESPOI(LEPOEL.INDEX(NOCENT)+1 15 : * -> LEPOEL.INDEX(NOCENT+1)-1) : 16 : * contient les numéro des points centre des éléments 17 : * qui ont un point de MCLPO1 en commun avec l'élément 18 : * considéré (!) 19 : * 20 : * ELNBEL est tel que ELNBEL(NOCENT) = nb d'éléments ayant au 21 : * moins un point de MCLPO1 22 : * en commun avec l'élément 23 : * dont l'indice du centre 24 : * dans MCENT est NOCENT. 25 : * ELNBEL est calculé dans la subroutine elenbl.eso 26 : * Il sert à dimensionner le tableau LESPOI et remplir 27 : * le tableau INDEX du segment LEELEL. 28 : C 29 : C LANGAGE : ESOPE 30 : C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF) 31 : C mél : gounand@semt2.smts.cea.fr 32 : C*********************************************************************** 33 : C APPELES : KRIPAD : MELEME -> (num. globale->locale) 34 : C APPELES (E/S) : - 35 : C APPELES (BLAS) : - 36 : C APPELES (CALCUL) : - 37 : C APPELE PAR : ELPOEL 38 : C*********************************************************************** 39 : C SYNTAXE GIBIANE : - 40 : C ENTREES : MCLAS (type MELEME) : maillage de classe de 41 : C points (sommet, face) par 42 : C élément (MMAIL,ELTFA) 43 : C MCLPO1 (type MELEME) : maillage de points 44 : C correspondant à MCLAS 45 : C MCENT (type MELEME) : un maillage de 46 : C points (dits 'centres') ayant le meme 47 : C nombre d'éléments que MCLAS et 48 : C servant à repérer les éléments de MCLAS. 49 : C ELNBEL (type MLENTI) : voir DESCRIPTION 50 : C 51 : C ENTREES/SORTIES : - 52 : C SORTIES : LEELEL (type MLELEM) : liste séquentielle indexée 53 : C d'éléments (cf. plus haut) 54 : C CODE RETOUR (IRET) : = 0 si tout s'est bien passé 55 : C*********************************************************************** 56 : C VERSION : v1, 02/11/98, version initiale 57 : C HISTORIQUE : v1, 02/11/98, création 58 : C HISTORIQUE : 59 : C HISTORIQUE : 60 : C*********************************************************************** 61 : C Prière de PRENDRE LE TEMPS de compléter les commentaires 62 : C en cas de modification de ce sous-programme afin de faciliter 63 : C la maintenance ! 64 : C*********************************************************************** 65 : -INC CCOPTIO 66 : -INC SMELEME 67 : POINTEUR MCLAS.MELEME 68 : POINTEUR MCLPO1.MELEME 69 : POINTEUR MCENT.MELEME 70 : -INC SMLENTI 71 : POINTEUR ELNBEL.MLENTI 72 : POINTEUR KRIPO1.MLENTI 73 : * 74 : * Segment MLELEM 75 : * 76 : SEGMENT MLELEM 77 : INTEGER INDEX(NBL+1) 78 : INTEGER LESPOI(NBTPOI) 79 : ENDSEGMENT 80 : * 81 : * LISTE SEQUENTIELLE INDEXEE D'ELEMENTS 82 : * 83 : * NBL : NOMBRE D'ELEMENTS 84 : * NBTPOI : NOMBRE TOTAL DE POINTS REFERENCEES 85 : * INDEX(I) : INDICE DU 1ER POINT DU IEME ELEMENT 86 : * DANS LE TABLEAU LESPOI 87 : * LESPOI(INDEX(I) -> INDEX(I+1)-1) : NUMERO DES NOEUDS 88 : * DU IEME ELEMENT 89 : * 90 : POINTEUR LEPOEL.MLELEM 91 : POINTEUR LEELEL.MLELEM 92 : INTEGER IMPR,IRET 93 : INTEGER NBL,NBTPOI 94 : LOGICAL LFOUND 95 : * 96 : * Executable statements 97 : * 98 : IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans elelem.eso' 99 : SEGACT MCLPO1 100 : NBSOUS=MCLPO1.LISOUS(/1) 101 : NOTYP =MCLPO1.ITYPEL 102 : IF (NBSOUS.NE.0.OR.(NBSOUS.EQ.0.AND.NOTYP.NE.1)) THEN 103 : WRITE(IOIMP,*) 'MCLPO1 must contain only POI1 elements' 104 : GOTO 9999 105 : ENDIF 106 : C In KRIPAD : SEGINI KRIPO1 106 : CALL KRIPAD(MCLPO1,KRIPO1) 107 : SEGDES MCLPO1 108 : SEGACT MCENT 109 : NBSOUS=MCENT.LISOUS(/1) 110 : NOTYP =MCENT.ITYPEL 111 : IF (NBSOUS.NE.0.OR.(NBSOUS.EQ.0.AND.NOTYP.NE.1)) THEN 112 : WRITE(IOIMP,*) 'MCENT must contain only POI1 elements' 113 : GOTO 9999 114 : ENDIF 115 : NBCENT=MCENT.NUM(/2) 116 : SEGACT ELNBEL 117 : NELNB=ELNBEL.LECT(/1) 118 : IF (NELNB.NE.NBCENT) THEN 119 : WRITE(IOIMP,*) 'Dimension of MCENT and ELNBEL are not equal' 120 : GOTO 9999 121 : ENDIF 122 : C 123 : C On initialise le segment LEELEL (type MLELEM) 124 : C 125 : NBL=NBCENT 126 : NBTPOI=0 127 : SEGINI LEELEL 128 : IDEPA=1 129 : DO 1 INBL=1,NBL 130 : LEELEL.INDEX(INBL)=IDEPA 131 : IDEPA=IDEPA+1+ELNBEL.LECT(INBL) 132 : 1 CONTINUE 133 : LEELEL.INDEX(NBL+1)=IDEPA 134 : SEGDES ELNBEL 135 : NBTPOI=IDEPA-1 136 : SEGADJ LEELEL 137 : SEGACT LEPOEL 138 : * Parcourons le maillage 139 : SEGACT MCLAS 140 : NBSOUS=MCLAS.LISOUS(/1) 141 : IF (NBSOUS.EQ.0) NBSOUS=1 142 : ICENT=0 143 : DO 3 INBSOU=1,NBSOUS 144 : IF (NBSOUS.GT.1) THEN 145 : IPT1=MCLAS.LISOUS(INBSOU) 146 : SEGACT IPT1 147 : ELSE 148 : IPT1=MCLAS 149 : ENDIF 150 : NBPOEL=IPT1.NUM(/1) 151 : NBELEM=IPT1.NUM(/2) 152 : DO 32 INBEL=1,NBELEM 153 : ICENT=ICENT+1 154 : LEELEL.LESPOI(LEELEL.INDEX(ICENT))=MCENT.NUM(1,ICENT) 155 : ICOUR=LEELEL.INDEX(ICENT)+1 156 : DO 322 INBPO=1,NBPOEL 157 : NOPOI1=KRIPO1.LECT(IPT1.NUM(INBPO,INBEL)) 158 : IF (NOPOI1.NE.0) THEN 159 : DO 3222 IPOEL=LEPOEL.INDEX(NOPOI1)+1, 160 : $ LEPOEL.INDEX(NOPOI1+1)-1 161 : NUMCEN=LEPOEL.LESPOI(IPOEL) 162 : IBCOUR=LEELEL.INDEX(ICENT) 163 : 32222 CONTINUE 164 : LFOUND=(NUMCEN.EQ.LEELEL.LESPOI(IBCOUR)) 165 : IF (.NOT.LFOUND.AND.(IBCOUR.LT.ICOUR)) THEN 166 : IBCOUR=IBCOUR+1 167 : GOTO 32222 168 : ENDIF 169 : IF (.NOT.LFOUND) THEN 170 : LEELEL.LESPOI(ICOUR)=NUMCEN 171 : ICOUR=ICOUR+1 172 : ENDIF 173 : 3222 CONTINUE 174 : ELSE 175 : WRITE(IOIMP,*) 'Erreur grave MCLPO1 n''est pas' 176 : WRITE(IOIMP,*) 'le maillage de points correspondant' 177 : WRITE(IOIMP,*) 'à MCLAS.' 178 : GOTO 9999 179 : ENDIF 180 : 322 CONTINUE 181 : 32 CONTINUE 182 : IF (NBSOUS.GT.1) SEGDES IPT1 183 : 3 CONTINUE 184 : SEGDES MCLAS 185 : SEGDES LEPOEL 186 : IF (IMPR.GT.2) THEN 187 : WRITE(IOIMP,*) 'On a créé LEELEL (type MLELEM)=',LEELEL 188 : IF (IMPR.GT.3) THEN 189 : WRITE(IOIMP,4000) 'LEELEL.INDEX',NBL+1 190 : WRITE(IOIMP,5000) (LEELEL.INDEX(I),I=1,NBL+1) 191 : WRITE(IOIMP,4000) 'LEELEL.LESPOI',NBTPOI 192 : WRITE(IOIMP,5000) (LEELEL.LESPOI(I),I=1,NBTPOI) 193 : ENDIF 194 : ENDIF 195 : SEGDES LEELEL 196 : SEGDES MCENT 197 : SEGSUP KRIPO1 198 : * 199 : * Normal termination 200 : * 201 : IRET=0 202 : RETURN 203 : * 204 : * Format handling 205 : * 206 : 4000 FORMAT (A,'(1..',I8,')') 207 : 5000 FORMAT (8(1X,I8)) 208 : * 209 : * Error handling 210 : * 211 : 9999 CONTINUE 212 : IRET=1 213 : WRITE(IOIMP,*) 'An error was detected in subroutine elelem' 214 : RETURN 215 : * 216 : * End of subroutine ELELEM 217 : * 218 : END 219 : 220 : 221 :
© Cast3M 2003 - All rights reserved.
Disclaimer