Télécharger cv2mab.eso

Retour à la liste

Numérotation des lignes :

cv2mab
  1. C CV2MAB SOURCE GOUNAND 24/11/06 21:15:05 12073
  2. SUBROUTINE CV2MAB(CGEOMQ,MDISCP,NCVARP,MDISCD,NCVARD,
  3. $ IMTLSB,
  4. $ MYFALS,
  5. $ MATLSB,
  6. $ IMPR,IRET)
  7. IMPLICIT REAL*8 (A-H,O-Z)
  8. IMPLICIT INTEGER (I-N)
  9. C***********************************************************************
  10. C NOM : CV2MAB
  11. C DESCRIPTION : Transforme un MCHAEL (mon champ par éléments)
  12. C représentant un ensemble de matrices élémentaires en
  13. C MATRIK...
  14. C
  15. C LANGAGE : ESOPE
  16. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  17. C mél : gounand@semt2.smts.cea.fr
  18. C***********************************************************************
  19. C APPELES : KEEF (recherche de l'élément fini)
  20. C APPELES (E/S) : ECROBJ, PRLIST (écriture entier, objet,
  21. C impression)
  22. C APPELE PAR : PRLSB2
  23. C***********************************************************************
  24. C ENTREES :
  25. C ENTREES/SORTIES : -
  26. C SORTIES :
  27. C TRAVAIL : * MYMEL (type MELEME) : maillage élémentaire.
  28. C * JMTLSB (type MCHEVA) : valeurs du champ IMTLSB
  29. C sur le maillage élémentaire.
  30. C Structure (cf.include SMCHAEL) :
  31. C (nb. ddl dual, nb. ddl primal,
  32. C nb. comp. duales, nb. comp. primales,
  33. C 1, nb. éléments)
  34. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  35. C***********************************************************************
  36. C VERSION : v1, 22/07/09, version initiale
  37. C HISTORIQUE : v1, 22/07/09, création
  38. C HISTORIQUE :
  39. C HISTORIQUE :
  40. C***********************************************************************
  41. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  42. C en cas de modification de ce sous-programme afin de faciliter
  43. C la maintenance !
  44. C***********************************************************************
  45.  
  46. -INC PPARAM
  47. -INC CCOPTIO
  48. -INC SMLMOTS
  49. POINTEUR NCVARP.MLMOTS
  50. POINTEUR NCVARD.MLMOTS
  51. -INC SMELEME
  52. POINTEUR CGEOMQ.MELEME
  53. POINTEUR MELPRI.MELEME
  54. POINTEUR MELDUA.MELEME
  55. POINTEUR MYMEL.MELEME
  56. INTEGER NBNN,NBELEM,NBSOUS,NBREF
  57. -INC SMLENTI
  58. POINTEUR LPOQFP.MLENTI
  59. POINTEUR LPOQFD.MLENTI
  60. POINTEUR KPOQFP.MLENTI
  61. POINTEUR KPOQFD.MLENTI
  62. INTEGER JG
  63. POINTEUR MATLSB.MATRIK
  64. *
  65. * Includes persos
  66. *
  67. -INC TNLIN
  68. *-INC SMCHAEL
  69. POINTEUR IMTLSB.MCHAEL
  70. POINTEUR JMTLSB.MCHEVA
  71. INTEGER NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM
  72. *-INC SFALRF
  73. POINTEUR MYFALS.FALRFS
  74. *-INC SELREF
  75. POINTEUR LRFPRI.ELREF
  76. POINTEUR LRFDUA.ELREF
  77. *
  78. CHARACTER*4 MDISCP,MDISCD
  79. INTEGER IMPR,IRET
  80. *
  81. INTEGER IBNN,IBELEM
  82. INTEGER ITQUAF,NDDLPR,NDDLDU
  83. INTEGER IDDLPR,IDDLDU
  84. INTEGER NSOUS,NPOQUF
  85. INTEGER ISOUS
  86. INTEGER ILIGRP,ILIGRD,IELRIG,ICMPP,ICMPD
  87.  
  88. *
  89. * Executable statements
  90. *
  91. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans cv2mab'
  92. NRIGE=7
  93. NMATRI=0
  94. NKID=9
  95. NKMT=7
  96. SEGINI,MATLSB
  97. *
  98. * Remplissage de MRIGID
  99. *
  100. SEGACT NCVARP
  101. SEGACT NCVARD
  102. SEGACT IMTLSB
  103. NSOUS=IMTLSB.JMACHE(/1)
  104. C SEGPRT,NCVARP
  105. C SEGPRT,NCVARD
  106. C SEGPRT,IMTLSB
  107. SEGACT CGEOMQ
  108. DO ISOUS=1,NSOUS
  109. JMTLSB=IMTLSB.ICHEVA(ISOUS)
  110. IF (JMTLSB.NE.0) THEN
  111. C SEGPRT,NCVARP
  112. C SEGPRT,NCVARD
  113. C SEGPRT,JMTLSB
  114. SEGACT JMTLSB
  115. MYMEL =CGEOMQ.LISOUS(ISOUS)
  116. SEGACT MYMEL
  117. ITQUAF=MYMEL.ITYPEL
  118. CALL KEEF(ITQUAF,MDISCP,MYFALS,
  119. $ LRFPRI,IMPR,IRET)
  120. IF (IRET.NE.0) GOTO 9999
  121. SEGACT LRFPRI
  122. NDDLPR=LRFPRI.NPQUAF(/1)
  123. CALL KEEF(ITQUAF,MDISCD,MYFALS,
  124. $ LRFDUA,IMPR,IRET)
  125. IF (IRET.NE.0) GOTO 9999
  126. SEGACT LRFDUA
  127. NDDLDU=LRFDUA.NPQUAF(/1)
  128. * Si le maillage donné à NLIN n'était pas QUAF au départ, il faut
  129. * vérifier que tous les ddls peuvent s'appuyer sur les points du
  130. * maillage donné
  131. * Le test uniquement sur le 1er element doit etre suffisant
  132. IF (CGEOMQ.LISOUS(ISOUS).NE.0) THEN
  133. DO IDDLPR=1,NDDLPR
  134. NNQUA=LRFPRI.NPQUAF(IDDLPR)
  135. NNGLO=MYMEL.NUM(NNQUA,1)
  136. IF (NNGLO.EQ.0) THEN
  137. WRITE(IOIMP,*) 'A discretization space ',MDISCP,
  138. $ ' is incompatible with the given mesh'
  139. WRITE(IOIMP,*) 'Check its element type please'
  140. GOTO 9999
  141. ENDIF
  142. ENDDO
  143. DO IDDLDU=1,NDDLDU
  144. NNQUA=LRFDUA.NPQUAF(IDDLDU)
  145. NNGLO=MYMEL.NUM(NNQUA,1)
  146. IF (NNGLO.EQ.0) THEN
  147. WRITE(IOIMP,*) 'A discretization space ',MDISCD,
  148. $ ' is incompatible with the given mesh'
  149. WRITE(IOIMP,*) 'Check its element type please'
  150. GOTO 9999
  151. ENDIF
  152. ENDDO
  153. ENDIF
  154. *
  155. DO IVARP=1,NCVARP.MOTS(/2)
  156. * Construction de la liste des points du QUAF sur lesquels il y a des
  157. * ddl pour l'inconnue primale
  158. JG=0
  159. SEGINI LPOQFP
  160. DO IDDLPR=1,NDDLPR
  161. IF (LRFPRI.NUMCMP(IDDLPR).EQ.IVARP) THEN
  162. LPOQFP.LECT(**)=LRFPRI.NPQUAF(IDDLPR)
  163. ENDIF
  164. ENDDO
  165. IF (LPOQFP.LECT(/1).EQ.0) THEN
  166. GOTO 1
  167. ENDIF
  168. C* Suppression des doublons (pas besoin)
  169. C CALL IUNIQ(LPOQFP.LECT,LPOQFP.LECT(/1),
  170. C $ LPOQFP.LECT,NPOQFP,
  171. C $ IMPR,IRET)
  172. C IF (IRET.NE.0) GOTO 9999
  173. C JG=NPOQFP
  174. C SEGADJ,LPOQFP
  175. * Segment de repérage dans cette liste
  176. JG=MYMEL.NUM(/1)
  177. SEGINI,KPOQFP
  178. CALL RSETXI(KPOQFP.LECT,LPOQFP.LECT,LPOQFP.LECT(/1))
  179. * Construction du maillage primal
  180. NBNN=LPOQFP.LECT(/1)
  181. NBELEM = MYMEL.NUM(/2)
  182. NBSOUS = 0
  183. NBREF=0
  184. SEGINI,MELPRI
  185. * Type 32 POLY
  186. MELPRI.ITYPEL=32
  187. DO IBELEM=1,NBELEM
  188. DO IBNN=1,NBNN
  189. MELPRI.NUM(IBNN,IBELEM)=
  190. $ MYMEL.NUM(LPOQFP.LECT(IBNN),IBELEM)
  191. ENDDO
  192. ENDDO
  193. SEGDES MELPRI
  194. *
  195. DO IVARD=1,NCVARD.MOTS(/2)
  196. * Construction de la liste des points du QUAF sur lesquels il y a des
  197. * ddl pour l'inconnue duale
  198. JG=0
  199. SEGINI LPOQFD
  200. DO IDDLDU=1,NDDLDU
  201. IF (LRFDUA.NUMCMP(IDDLDU).EQ.IVARD) THEN
  202. LPOQFD.LECT(**)=LRFDUA.NPQUAF(IDDLDU)
  203. ENDIF
  204. ENDDO
  205. IF (LPOQFD.LECT(/1).EQ.0) THEN
  206. GOTO 3
  207. ENDIF
  208. C* Suppression des doublons
  209. C CALL IUNIQ(LPOQFD.LECT,LPOQFD.LECT(/1),
  210. C $ LPOQFD.LECT,NPOQFD,
  211. C $ IMPR,IRET)
  212. C IF (IRET.NE.0) GOTO 9999
  213. C JG=NPOQFD
  214. C SEGADJ,LPOQFD
  215. * Segment de repérage dans cette liste
  216. JG=MYMEL.NUM(/1)
  217. SEGINI,KPOQFD
  218. CALL RSETXI(KPOQFD.LECT,LPOQFD.LECT,LPOQFD.LECT(/1))
  219. * Construction du maillage dual
  220. NBNN=LPOQFD.LECT(/1)
  221. NBELEM = MYMEL.NUM(/2)
  222. NBSOUS = 0
  223. NBREF=0
  224. SEGINI,MELDUA
  225. * Type 32 POLY
  226. MELDUA.ITYPEL=32
  227. DO IBELEM=1,NBELEM
  228. DO IBNN=1,NBNN
  229. MELDUA.NUM(IBNN,IBELEM)=
  230. $ MYMEL.NUM(LPOQFD.LECT(IBNN),IBELEM)
  231. ENDDO
  232. ENDDO
  233. SEGDES MELDUA
  234. * Construction du IMATRI
  235. NBME=1
  236. NBSOUS=1
  237. SEGINI IMATRI
  238. LISPRI(1)=NCVARP.MOTS(IVARP)
  239. LISDUA(1)=NCVARD.MOTS(IVARD)
  240. * Construction du IZAFM
  241. NBEL=MYMEL.NUM(/2)
  242. NP=LPOQFP.LECT(/1)
  243. MP=LPOQFD.LECT(/1)
  244. SEGINI IZAFM
  245. * remplissage des matrices élémentaires
  246. NBLIG=JMTLSB.WELCHE(/1)
  247. NBCOL=JMTLSB.WELCHE(/2)
  248. N2LIG=JMTLSB.WELCHE(/3)
  249. N2COL=JMTLSB.WELCHE(/4)
  250. NBPOI=JMTLSB.WELCHE(/5)
  251. NBELM=JMTLSB.WELCHE(/6)
  252. IF (NBLIG.NE.NDDLDU.OR.NBCOL.NE.NDDLPR.OR.N2LIG.NE.1
  253. $ .OR.N2COL.NE.1.OR.NBPOI.NE.1.OR.NBELM.NE.NBEL)
  254. $ THEN
  255. WRITE(IOIMP,*) 'Erreur dims JMTLSB'
  256. GOTO 9999
  257. ENDIF
  258. DO IDDLDU=1,NDDLDU
  259. IF (LRFDUA.NUMCMP(IDDLDU).EQ.IVARD) THEN
  260. IMP=KPOQFD.LECT(LRFDUA.NPQUAF(IDDLDU))
  261. DO IDDLPR=1,NDDLPR
  262. IF (LRFPRI.NUMCMP(IDDLPR).EQ.IVARP) THEN
  263. INP=KPOQFP.LECT(LRFPRI.NPQUAF(IDDLPR))
  264. DO IBEL=1,NBEL
  265. AM(IBEL,INP,IMP)=
  266. $ JMTLSB.WELCHE(IDDLDU,IDDLPR,
  267. $ 1,1,1,IBEL)
  268. ENDDO
  269. ENDIF
  270. ENDDO
  271. ENDIF
  272. ENDDO
  273. SEGDES IZAFM
  274. LIZAFM(1,1)=IZAFM
  275. SEGDES IMATRI
  276. *
  277. * Remplissage du chapeau
  278. *
  279. NRIGE=MATLSB.IRIGEL(/1)
  280. NMATRI=MATLSB.IRIGEL(/2)+1
  281. NKID=MATLSB.KIDMAT(/1)
  282. NKMT=MATLSB.KKMMT(/1)
  283. SEGADJ,MATLSB
  284. MATLSB.IRIGEL(1,NMATRI)=MELPRI
  285. MATLSB.IRIGEL(2,NMATRI)=MELDUA
  286. MATLSB.IRIGEL(4,NMATRI)=IMATRI
  287. MATLSB.IRIGEL(7,NMATRI)=2
  288. SEGSUP KPOQFD
  289. 3 CONTINUE
  290. SEGSUP LPOQFD
  291. ENDDO
  292. SEGSUP KPOQFP
  293. 1 CONTINUE
  294. SEGSUP LPOQFP
  295. ENDDO
  296. SEGDES LRFDUA
  297. SEGDES LRFPRI
  298. SEGDES MYMEL
  299. SEGDES JMTLSB
  300. ENDIF
  301. ENDDO
  302. SEGDES IMTLSB
  303. SEGDES NCVARD
  304. SEGDES NCVARP
  305. SEGDES MATLSB
  306. IF (IMPR.GT.3) THEN
  307. WRITE(IOIMP,*) 'On a créé MATLSB=',MATLSB
  308. CALL ECROBJ('MATRIK ',MATLSB)
  309. CALL PRLIST
  310. ENDIF
  311. *
  312. * Normal termination
  313. *
  314. IRET=0
  315. RETURN
  316. *
  317. * Format handling
  318. *
  319. *
  320. * Error handling
  321. *
  322. 9999 CONTINUE
  323. IRET=1
  324. WRITE(IOIMP,*) 'An error was detected in subroutine cv2mab'
  325. RETURN
  326. *
  327. * End of subroutine CV2MAB
  328. *
  329. END
  330.  
  331.  

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