Télécharger prmcp5.eso

Retour à la liste

Numérotation des lignes :

prmcp5
  1. C PRMCP5 SOURCE GOUNAND 24/11/06 21:15:16 12073
  2. SUBROUTINE PRMCP5(MMLPRI,MMLDUA,MMATEL,ICMPRI,ICMDUA,LNBME,
  3. $ MPOPRI,KICPRI,KMCPRI,
  4. $ KICDUA,KMCDUA,
  5. $ MPODUA,
  6. $ IMPR,IRET)
  7. IMPLICIT INTEGER(I-N)
  8. IMPLICIT REAL*8 (A-H,O-Z)
  9. C***********************************************************************
  10. C NOM : PRMCP5
  11. C DESCRIPTION : Produit matrices élémentaires * mpoval primal
  12. C -> mpoval dual.
  13. C
  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 : REGMAI, INIRPM, RPELEM
  20. C APPELE PAR : PRMCP2
  21. C***********************************************************************
  22. C ENTREES : MLPRI, MMLDUA, MMATEL, ICMPRI, ICMDUA, LNBME,
  23. C MPOPRI, KICPRI, KMCPRI, KICDUA, KMCDUA
  24. C ENTREES/SORTIES : -
  25. C SORTIES : MPODUA
  26. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  27. C***********************************************************************
  28. C VERSION : v1, 18/04/2000, version initiale
  29. C HISTORIQUE : v1, 18/04/2000, création
  30. C HISTORIQUE :
  31. C HISTORIQUE :
  32. C***********************************************************************
  33. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  34. C en cas de modification de ce sous-programme afin de faciliter
  35. C la maintenance !
  36. C***********************************************************************
  37. -INC PPARAM
  38. -INC CCOPTIO
  39. -INC SMELEME
  40. POINTEUR MMLPRI.MELEME
  41. POINTEUR MMLDUA.MELEME
  42. POINTEUR ML2PRI.MELEME
  43. POINTEUR ML2DUA.MELEME
  44. POINTEUR SMLPRI.MELEME
  45. POINTEUR SMLDUA.MELEME
  46. POINTEUR MMATEL.IMATRI
  47. POINTEUR VMATEL.IZAFM
  48. -INC SMLENTI
  49. POINTEUR RPMAT.MLENTI
  50. POINTEUR ICMPRI.MLENTI
  51. POINTEUR ICMDUA.MLENTI
  52. POINTEUR LNBME.MLENTI
  53. POINTEUR KICPRI.MLENTI
  54. POINTEUR KICDUA.MLENTI
  55. POINTEUR KMCPRI.MLENTI
  56. POINTEUR KMCDUA.MLENTI
  57. -INC SMCHPOI
  58. POINTEUR MPOPRI.MPOVAL
  59. POINTEUR MPODUA.MPOVAL
  60. *
  61. INTEGER IMPR,IRET
  62. *
  63. INTEGER ICCPRI,ICCDUA,ILMAT,NUELG,NUELOC,ITPOPR,ITPODU
  64. INTEGER IELEM ,IMATL ,IPMAT,JDMAT, ISOUM,ISOUMA,OLDISM
  65. INTEGER NELPRI,NMATL ,NPMAT,NDMAT,NBSOUM,NBSOUP,NBSOUD
  66. *
  67. * Executable statements
  68. *
  69. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans prmcp5.eso'
  70. * On régularise les maillage pour plus se faire chier si LISOUS(/1).EQ.0
  71. * In REGMAI : SEGINI ML2DUA
  72. CALL REGMAI(MMLDUA,ML2DUA)
  73. * In REGMAI : SEGINI ML2PRI
  74. CALL REGMAI(MMLPRI,ML2PRI)
  75. *
  76. * Activons les chapeaux (Matrices et supports)
  77. *
  78. SEGACT ML2DUA
  79. NBSOUD=ML2DUA.LISOUS(/1)
  80. SEGACT ML2PRI
  81. NBSOUP=ML2PRI.LISOUS(/1)
  82. SEGACT MMATEL
  83. NBSOUM=NBSOUP
  84. IF (NBSOUD.NE.NBSOUP) THEN
  85. WRITE(IOIMP,*) 'Maillage primal, dual :'
  86. WRITE(IOIMP,*) 'partitionnment différent...'
  87. WRITE(IOIMP,*) 'NBSOUD=',NBSOUD
  88. WRITE(IOIMP,*) 'NBSOUP=',NBSOUP
  89. GOTO 9999
  90. ENDIF
  91. *
  92. * Tableau de repérage dans la matrice
  93. *
  94. * In INIRPM : SEGINI RPMAT
  95. CALL INIRPM(MMATEL,RPMAT,IMPR,IRET)
  96. IF (IRET.NE.0) GOTO 9999
  97. *
  98. * Activons les tableaux de repérage
  99. *
  100. * Matrices
  101. * Inconnues
  102. SEGACT ICMPRI
  103. SEGACT ICMDUA
  104. * Matrices élémentaires à parcourir
  105. SEGACT LNBME
  106. * Chpoints
  107. SEGACT MPOPRI
  108. SEGACT MPODUA*MOD
  109. * Inconnues
  110. SEGACT KICPRI
  111. SEGACT KICDUA
  112. * Maillages
  113. SEGACT KMCPRI
  114. SEGACT KMCDUA
  115. *
  116. * Parcourons les matrices élémentaires par sous-domaine et
  117. * remplissons les valeurs de MPODUA.
  118. *
  119. NMATL=LNBME.LECT(/1)
  120. DO 1 IMATL=1,NMATL
  121. * Numéros d'inconnues dans les chpo. primaux et duaux
  122. * pour la LNBME.LECT(IMATL)ième matrice
  123. ICCPRI=KICPRI.LECT(ICMPRI.LECT(LNBME.LECT(IMATL)))
  124. ICCDUA=KICDUA.LECT(ICMDUA.LECT(LNBME.LECT(IMATL)))
  125. NUELG=0
  126. OLDISM=1
  127. VMATEL=MMATEL.LIZAFM(OLDISM,LNBME.LECT(IMATL))
  128. SEGACT VMATEL
  129. DO 12 ISOUM=1,NBSOUM
  130. SMLDUA=ML2DUA.LISOUS(ISOUM)
  131. SEGACT SMLDUA
  132. SMLPRI=ML2PRI.LISOUS(ISOUM)
  133. SEGACT SMLPRI
  134. NELPRI=SMLPRI.NUM(/2)
  135. DO 122 IELEM=1,NELPRI
  136. NUELG=NUELG+1
  137. CALL RPELEM(NUELG,RPMAT,ISOUMA,NUELOC,IMPR,IRET)
  138. IF (IRET.NE.0) GOTO 9999
  139. ISOUMA=MAX(ISOUMA,1)
  140. IF (ISOUMA.NE.OLDISM) THEN
  141. SEGDES VMATEL
  142. VMATEL=MMATEL.LIZAFM(ISOUMA,LNBME.LECT(IMATL))
  143. SEGACT VMATEL
  144. OLDISM=ISOUMA
  145. ENDIF
  146. ILMAT=NUELOC
  147. NPMAT=VMATEL.AM(/2)
  148. NDMAT=VMATEL.AM(/3)
  149. DO 1222 JDMAT=1,NDMAT
  150. ITPODU=KMCDUA.LECT(SMLDUA.NUM(JDMAT,IELEM))
  151. IF (ITPODU.EQ.0) THEN
  152. WRITE(IOIMP,*) 'Point dual ????'
  153. GOTO 9999
  154. ENDIF
  155. DO 12222 IPMAT=1,NPMAT
  156. ITPOPR=KMCPRI.LECT(SMLPRI.NUM(IPMAT,IELEM))
  157. * IF (ITPOPR.EQ.0) THEN
  158. * WRITE(IOIMP,*) 'Un point du chpo. primal ',
  159. * $ 'n''est pas dans le spg primal de la ',
  160. * $ 'matrice..'
  161. * GOTO 9999
  162. * ENDIF
  163. IF (ITPOPR.NE.0) THEN
  164. MPODUA.VPOCHA(ITPODU,ICCDUA)=
  165. $ MPODUA.VPOCHA(ITPODU,ICCDUA)+
  166. $ (VMATEL.AM(ILMAT,IPMAT,JDMAT)
  167. $ *MPOPRI.VPOCHA(ITPOPR,ICCPRI))
  168. ENDIF
  169. 12222 CONTINUE
  170. 1222 CONTINUE
  171. 122 CONTINUE
  172. SEGDES SMLPRI
  173. SEGDES SMLDUA
  174. 12 CONTINUE
  175. SEGDES VMATEL
  176. 1 CONTINUE
  177. *
  178. * Désactivons les tableaux de repérage
  179. *
  180. SEGDES KMCDUA
  181. SEGDES KMCPRI
  182. SEGDES KICDUA
  183. SEGDES KICPRI
  184. SEGDES LNBME
  185. SEGDES ICMDUA
  186. SEGDES ICMPRI
  187. SEGDES RPMAT
  188. SEGDES MMATEL
  189. SEGDES ML2PRI
  190. SEGDES ML2DUA
  191. SEGSUP ML2PRI
  192. SEGSUP ML2DUA
  193. *
  194. * Normal termination
  195. *
  196. IRET=0
  197. RETURN
  198. *
  199. * Format handling
  200. *
  201. *
  202. * Error handling
  203. *
  204. 9999 CONTINUE
  205. IRET=1
  206. WRITE(IOIMP,*) 'An error was detected in subroutine prmcp5'
  207. RETURN
  208. *
  209. * End of subroutine PRMCP5
  210. *
  211. END
  212.  
  213.  

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