Télécharger elelem.eso

Retour à la liste

Numérotation des lignes :

  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.  
  66. -INC PPARAM
  67. -INC CCOPTIO
  68. -INC SMELEME
  69. POINTEUR MCLAS.MELEME
  70. POINTEUR MCLPO1.MELEME
  71. POINTEUR MCENT.MELEME
  72. -INC SMLENTI
  73. POINTEUR ELNBEL.MLENTI
  74. POINTEUR KRIPO1.MLENTI
  75. *
  76. * Segment MLELEM
  77. *
  78. SEGMENT MLELEM
  79. INTEGER INDEX(NBL+1)
  80. INTEGER LESPOI(NBTPOI)
  81. ENDSEGMENT
  82. *
  83. * LISTE SEQUENTIELLE INDEXEE D'ELEMENTS
  84. *
  85. * NBL : NOMBRE D'ELEMENTS
  86. * NBTPOI : NOMBRE TOTAL DE POINTS REFERENCEES
  87. * INDEX(I) : INDICE DU 1ER POINT DU IEME ELEMENT
  88. * DANS LE TABLEAU LESPOI
  89. * LESPOI(INDEX(I) -> INDEX(I+1)-1) : NUMERO DES NOEUDS
  90. * DU IEME ELEMENT
  91. *
  92. POINTEUR LEPOEL.MLELEM
  93. POINTEUR LEELEL.MLELEM
  94. INTEGER IMPR,IRET
  95. INTEGER NBL,NBTPOI
  96. LOGICAL LFOUND
  97. *
  98. * Executable statements
  99. *
  100. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans elelem.eso'
  101. SEGACT MCLPO1
  102. NBSOUS=MCLPO1.LISOUS(/1)
  103. NOTYP =MCLPO1.ITYPEL
  104. IF (NBSOUS.NE.0.OR.(NBSOUS.EQ.0.AND.NOTYP.NE.1)) THEN
  105. WRITE(IOIMP,*) 'MCLPO1 must contain only POI1 elements'
  106. GOTO 9999
  107. ENDIF
  108. C In KRIPAD : SEGINI KRIPO1
  109. CALL KRIPAD(MCLPO1,KRIPO1)
  110. SEGDES MCLPO1
  111. SEGACT MCENT
  112. NBSOUS=MCENT.LISOUS(/1)
  113. NOTYP =MCENT.ITYPEL
  114. IF (NBSOUS.NE.0.OR.(NBSOUS.EQ.0.AND.NOTYP.NE.1)) THEN
  115. WRITE(IOIMP,*) 'MCENT must contain only POI1 elements'
  116. GOTO 9999
  117. ENDIF
  118. NBCENT=MCENT.NUM(/2)
  119. SEGACT ELNBEL
  120. NELNB=ELNBEL.LECT(/1)
  121. IF (NELNB.NE.NBCENT) THEN
  122. WRITE(IOIMP,*) 'Dimension of MCENT and ELNBEL are not equal'
  123. GOTO 9999
  124. ENDIF
  125. C
  126. C On initialise le segment LEELEL (type MLELEM)
  127. C
  128. NBL=NBCENT
  129. NBTPOI=0
  130. SEGINI LEELEL
  131. IDEPA=1
  132. DO 1 INBL=1,NBL
  133. LEELEL.INDEX(INBL)=IDEPA
  134. IDEPA=IDEPA+1+ELNBEL.LECT(INBL)
  135. 1 CONTINUE
  136. LEELEL.INDEX(NBL+1)=IDEPA
  137. SEGDES ELNBEL
  138. NBTPOI=IDEPA-1
  139. SEGADJ LEELEL
  140. SEGACT LEPOEL
  141. * Parcourons le maillage
  142. SEGACT MCLAS
  143. NBSOUS=MCLAS.LISOUS(/1)
  144. IF (NBSOUS.EQ.0) NBSOUS=1
  145. ICENT=0
  146. DO 3 INBSOU=1,NBSOUS
  147. IF (NBSOUS.GT.1) THEN
  148. IPT1=MCLAS.LISOUS(INBSOU)
  149. SEGACT IPT1
  150. ELSE
  151. IPT1=MCLAS
  152. ENDIF
  153. NBPOEL=IPT1.NUM(/1)
  154. NBELEM=IPT1.NUM(/2)
  155. DO 32 INBEL=1,NBELEM
  156. ICENT=ICENT+1
  157. LEELEL.LESPOI(LEELEL.INDEX(ICENT))=MCENT.NUM(1,ICENT)
  158. ICOUR=LEELEL.INDEX(ICENT)+1
  159. DO 322 INBPO=1,NBPOEL
  160. NOPOI1=KRIPO1.LECT(IPT1.NUM(INBPO,INBEL))
  161. IF (NOPOI1.NE.0) THEN
  162. DO 3222 IPOEL=LEPOEL.INDEX(NOPOI1)+1,
  163. $ LEPOEL.INDEX(NOPOI1+1)-1
  164. NUMCEN=LEPOEL.LESPOI(IPOEL)
  165. IBCOUR=LEELEL.INDEX(ICENT)
  166. 32222 CONTINUE
  167. LFOUND=(NUMCEN.EQ.LEELEL.LESPOI(IBCOUR))
  168. IF (.NOT.LFOUND.AND.(IBCOUR.LT.ICOUR)) THEN
  169. IBCOUR=IBCOUR+1
  170. GOTO 32222
  171. ENDIF
  172. IF (.NOT.LFOUND) THEN
  173. LEELEL.LESPOI(ICOUR)=NUMCEN
  174. ICOUR=ICOUR+1
  175. ENDIF
  176. 3222 CONTINUE
  177. ELSE
  178. WRITE(IOIMP,*) 'Erreur grave MCLPO1 n''est pas'
  179. WRITE(IOIMP,*) 'le maillage de points correspondant'
  180. WRITE(IOIMP,*) 'à MCLAS.'
  181. GOTO 9999
  182. ENDIF
  183. 322 CONTINUE
  184. 32 CONTINUE
  185. IF (NBSOUS.GT.1) SEGDES IPT1
  186. 3 CONTINUE
  187. SEGDES MCLAS
  188. SEGDES LEPOEL
  189. IF (IMPR.GT.2) THEN
  190. WRITE(IOIMP,*) 'On a créé LEELEL (type MLELEM)=',LEELEL
  191. IF (IMPR.GT.3) THEN
  192. WRITE(IOIMP,4000) 'LEELEL.INDEX',NBL+1
  193. WRITE(IOIMP,5000) (LEELEL.INDEX(I),I=1,NBL+1)
  194. WRITE(IOIMP,4000) 'LEELEL.LESPOI',NBTPOI
  195. WRITE(IOIMP,5000) (LEELEL.LESPOI(I),I=1,NBTPOI)
  196. ENDIF
  197. ENDIF
  198. SEGDES LEELEL
  199. SEGDES MCENT
  200. SEGSUP KRIPO1
  201. *
  202. * Normal termination
  203. *
  204. IRET=0
  205. RETURN
  206. *
  207. * Format handling
  208. *
  209. 4000 FORMAT (A,'(1..',I8,')')
  210. 5000 FORMAT (8(1X,I8))
  211. *
  212. * Error handling
  213. *
  214. 9999 CONTINUE
  215. IRET=1
  216. WRITE(IOIMP,*) 'An error was detected in subroutine elelem'
  217. RETURN
  218. *
  219. * End of subroutine ELELEM
  220. *
  221. END
  222.  
  223.  
  224.  
  225.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales