Télécharger prmcp2.eso

Retour à la liste

Numérotation des lignes :

prmcp2
  1. C PRMCP2 SOURCE CB215821 20/11/25 13:37:06 10792
  2. SUBROUTINE PRMCP2(MMLPRI,MMLDUA,MMATEL,MSOPRI,
  3. $ MSODUA,
  4. $ IMPR,IRET)
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. C***********************************************************************
  8. C NOM : PRMCP2
  9. C DESCRIPTION : Produit matrices élémentaires * msoupo primal
  10. C -> msoupo dual.
  11. C
  12. C
  13. C LANGAGE : ESOPE
  14. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  15. C mél : gounand@semt2.smts.cea.fr
  16. C***********************************************************************
  17. C APPELES : PRMCP3, PRMCP4, PRMCP5, KRIPEE, KRIPME,
  18. C RPENEN, EXENEN, IUNIQ, MLUNIQ
  19. C APPELE PAR : PRDMCP
  20. C***********************************************************************
  21. C ENTREES : MMLPRI, MMLDUA, MMATEL, MSOPRI
  22. C ENTREES/SORTIES : -
  23. C SORTIES : MSODUA
  24. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  25. C***********************************************************************
  26. C VERSION : v1, 18/04/2000, version initiale
  27. C HISTORIQUE : v1, 18/04/2000, création
  28. C HISTORIQUE :
  29. C HISTORIQUE :
  30. C***********************************************************************
  31. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  32. C en cas de modification de ce sous-programme afin de faciliter
  33. C la maintenance !
  34. C***********************************************************************
  35.  
  36. -INC PPARAM
  37. -INC CCOPTIO
  38. -INC SMCOORD
  39. -INC SMELEME
  40. POINTEUR MMLPRI.MELEME
  41. POINTEUR MMLDUA.MELEME
  42. POINTEUR MLCPRI.MELEME
  43. POINTEUR MLCDUA.MELEME
  44. POINTEUR MMATEL.IMATRI
  45. -INC SMCHPOI
  46. POINTEUR MSOPRI.MSOUPO
  47. POINTEUR MSODUA.MSOUPO
  48. INTEGER N,NC
  49. POINTEUR MPOPRI.MPOVAL
  50. POINTEUR MPODUA.MPOVAL
  51. -INC SMLMOTS
  52. POINTEUR ICOGLO.MLMOTS
  53. -INC SMLENTI
  54. INTEGER JG
  55. POINTEUR ICMPRI.MLENTI
  56. POINTEUR ICMDUA.MLENTI
  57. POINTEUR ICCPRI.MLENTI
  58. POINTEUR ICCDUA.MLENTI
  59. POINTEUR ICOPRI.MLENTI
  60. POINTEUR KRIPRI.MLENTI
  61. POINTEUR KICPRI.MLENTI
  62. POINTEUR KICDUA.MLENTI
  63. POINTEUR KMCPRI.MLENTI
  64. POINTEUR KMCDUA.MLENTI
  65. POINTEUR LNBME.MLENTI
  66. *
  67. * Includes persos
  68. *
  69. INTEGER NBMEL
  70. SEGMENT MELS
  71. POINTEUR LISMEL(NBMEL).MELEME
  72. ENDSEGMENT
  73. POINTEUR GPMELS.MELS
  74. *
  75. INTEGER ICDUA
  76. INTEGER NCDUA
  77. INTEGER NBDUAL,NBDUA2,NIPRI,NIUNIQ,NTOTPO,NPODUA
  78. INTEGER IMPR,IRET
  79. *
  80. * Executable statements
  81. *
  82. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans prmcp2.eso'
  83. *
  84. * On s'occupe d'abord des inconnues
  85. *
  86. * Repérage global des inconnues : ICOGLO (LISTMOTS)
  87. * Numéros des inconnues primales et duales de la matrice exprimées
  88. * dans ce repérage : ICMPRI, ICMDUA
  89. * Numéros des inconnues du chpoint primal : ICCPRI
  90. * i.e.
  91. * ICOGLO: MLMOTS qui contient les inconnues primales,
  92. * duales et les composantes du CHPOINT
  93. * que un seul fois
  94. * ICMPRI.LECT(i) = position de l'inconnue MMATEL.LISPRI(i)
  95. * dans ICOGLO
  96. * ICMDUA.LECT(i) = position de l'inconnue MMATEL.LISDUA(i)
  97. * dans ICOGLO
  98. * ICCPRI.LECT(i) = position de l'inconnue MSOPRI.COMP(i)
  99. * dans ICCPRI
  100. *
  101. * In PRMCP3 : SEGINI ICOGLO
  102. * In PRMCP3 : SEGINI ICMPRI
  103. * In PRMCP3 : SEGINI ICMDUA
  104. * In PRMCP3 : SEGINI ICCPRI
  105. CALL PRMCP3(MMATEL,MSOPRI,
  106. $ ICOGLO,ICMPRI,ICMDUA,ICCPRI,
  107. $ IMPR,IRET)
  108.  
  109. IF (IRET.NE.0) GOTO 9999
  110. SEGACT ICOGLO
  111. NIUNIQ=ICOGLO.MOTS(/2)
  112. SEGDES ICOGLO
  113. *
  114. * Construction de ICOPRI (LISTENTI), liste des inconnues
  115. * appartenant à la fois à ICMPRI et ICCPRI
  116. * i.e.
  117. * ICOPRI.LECT(/1) = nombre d'inconnues communes
  118. * ICOGLO.MOTS(ICOPRI.LECT(i)) = les inconnues communes
  119. *
  120. * In PRCMP4 : SEGINI ICOPRI
  121. CALL PRMCP4(ICMPRI,ICCPRI,NIUNIQ,
  122. $ ICOPRI,
  123. $ IMPR,IRET)
  124. IF (IRET.NE.0) GOTO 9999
  125. * Bien sur, si ICOPRI est vide, il n'y a pas d'inconnues
  126. * communes; donc on sort prématurément
  127. SEGACT ICOPRI
  128. NIPRI=ICOPRI.LECT(/1)
  129. SEGDES ICOPRI
  130. IF (NIPRI.EQ.0) THEN
  131. * SEGINI ICOPRI
  132. * SEGINI ICCPRI
  133. * SEGINI ICMDUA
  134. * SEGINI ICMPRI
  135. * SEGINI ICOGLO
  136. SEGSUP ICOPRI
  137. SEGSUP ICCPRI
  138. SEGSUP ICMDUA
  139. SEGSUP ICMPRI
  140. SEGSUP ICOGLO
  141. GOTO 9998
  142. ENDIF
  143. * Sinon, on construit KRIPRI où on a repéré les inconnues de ICOPRI
  144. * dans le segment des inconnues globales
  145. * i.e.
  146. * KRIPRI.LECT(j) = 0 si ICOGLO.MOTS(j) n'est pas une inconnue
  147. * commune; sinon
  148. * KRIPRI.LECT(ICOPRI.LECT(i)) = i
  149. *
  150. * In KRIPEE : SEGINI KRIPRI
  151. CALL KRIPEE(ICOPRI,NIUNIQ,
  152. $ KRIPRI,
  153. $ IMPR,IRET)
  154. IF (IRET.NE.0) GOTO 9999
  155. SEGSUP ICOPRI
  156. * On repère les inconnues de ICMPRI qui sont dans ICOPRI
  157. * i.e.
  158. * LNBME.LECT(/1) = nombre d'inconnues de MMATEL.LISPRI
  159. * qui sont dedans ICOGLO
  160. * LNBME.LECT(i) = inconnues de MMATEL.LISPRI en ICOGLO
  161. *
  162. * In RPENEN : SEGINI LNBME
  163. CALL RPENEN(ICMPRI,KRIPRI,
  164. $ LNBME,
  165. $ IMPR,IRET)
  166. IF (IRET.NE.0) GOTO 9999
  167.  
  168. SEGSUP KRIPRI
  169. *
  170. * Ceci permet de construire les inconnues du chpo. dual
  171. *
  172. * ICCDUA.LECT(/1) = LNBME.LECT(/1)
  173. * ICCDUA.LECT(i) = les inconnues duales qui correspondent
  174. * aux inconnues primales en ICOGLO
  175. * Donc on extrait de ICCDUA (i.e. de MMATEL.LISDUA)
  176. * les seules composantes qui interviennent dans la
  177. * multiplication.
  178. *
  179. * In EXENEN : SEGINI ICCDUA
  180. *
  181. CALL EXENEN(ICMDUA,LNBME,
  182. $ ICCDUA,
  183. $ IMPR,IRET)
  184. IF (IRET.NE.0) GOTO 9999
  185. * On y supprimme le doublons en ICCDUA
  186. SEGACT ICCDUA*MOD
  187. NBDUA2=ICCDUA.LECT(/1)
  188. CALL IUNIQ(ICCDUA.LECT,NBDUA2,
  189. $ ICCDUA.LECT,NBDUAL,IMPR,IRET)
  190. IF (IRET.NE.0) GOTO 9999
  191. JG=NBDUAL
  192. SEGADJ ICCDUA
  193. SEGDES ICCDUA
  194. * On construit KICPRI où on a repéré les inconnues de ICCPRI
  195. * dans le segment des inconnues globales
  196. * In KRIPEE : SEGINI KICPRI
  197. CALL KRIPEE(ICCPRI,NIUNIQ,
  198. $ KICPRI,
  199. $ IMPR,IRET)
  200. IF (IRET.NE.0) GOTO 9999
  201. SEGSUP ICCPRI
  202. * On construit KICDUA où on a repéré les inconnues de ICCDUA
  203. * dans le segment des inconnues globales
  204. * In KRIPEE : SEGINI KICDUA
  205. CALL KRIPEE(ICCDUA,NIUNIQ,
  206. $ KICDUA,
  207. $ IMPR,IRET)
  208. IF (IRET.NE.0) GOTO 9999
  209. *
  210. * On s'occupe des maillages
  211. *
  212. NTOTPO=nbpts
  213. * Le support géométrique de MSODUA sera le maillage des points
  214. * de MMLDUA
  215. NBMEL=1
  216. SEGINI GPMELS
  217. GPMELS.LISMEL(1)=MMLDUA
  218. CALL MLUNIQ(GPMELS,MLCDUA,IMPR,IRET)
  219. IF (IRET.NE.0) GOTO 9999
  220. SEGSUP GPMELS
  221. SEGACT MSOPRI
  222. MLCPRI=MSOPRI.IGEOC
  223. MPOPRI=MSOPRI.IPOVAL
  224. * On construit KMCPRI où on a repéré les points de MLCPRI
  225. * dans le segment des points globaux
  226. * In KRIPME : SEGINI KMCPRI
  227. CALL KRIPME(MLCPRI,NTOTPO,
  228. $ KMCPRI,
  229. $ IMPR,IRET)
  230. IF (IRET.NE.0) GOTO 9999
  231. * On construit KMCDUA où on a repéré les points de MLCDUA
  232. * dans le segment des points globaux
  233. * In KRIPME : SEGINI KMCDUA
  234. CALL KRIPME(MLCDUA,NTOTPO,
  235. $ KMCDUA,
  236. $ IMPR,IRET)
  237. IF (IRET.NE.0) GOTO 9999
  238. * On initialise le chpoint dual
  239. * Inconnues
  240. SEGACT ICOGLO
  241. SEGACT ICCDUA
  242. NCDUA=ICCDUA.LECT(/1)
  243. NC=NCDUA
  244. SEGINI MSODUA
  245. DO 3 ICDUA=1,NCDUA
  246. MSODUA.NOCOMP(ICDUA)=ICOGLO.MOTS(ICCDUA.LECT(ICDUA))(1:4)
  247. 3 CONTINUE
  248. * SEGDES ICCDUA
  249. SEGSUP ICCDUA
  250. * SEGDES ICOGLO
  251. SEGSUP ICOGLO
  252. * Maillage
  253. SEGACT MLCDUA
  254. NPODUA=MLCDUA.NUM(/2)
  255. SEGDES MLCDUA
  256. MSODUA.IGEOC=MLCDUA
  257. NC=NCDUA
  258. N=NPODUA
  259. SEGINI MPODUA
  260. MSODUA.IPOVAL=MPODUA
  261. *
  262. * On effectue le produit (remplissage de MPODUA)
  263. *
  264. CALL PRMCP5(MMLPRI,MMLDUA,MMATEL,ICMPRI,ICMDUA,LNBME,
  265. $ MPOPRI,KICPRI,KMCPRI,
  266. $ KICDUA,KMCDUA,
  267. $ MPODUA,
  268. $ IMPR,IRET)
  269. IF (IRET.NE.0) GOTO 9999
  270. SEGSUP KMCDUA
  271. SEGSUP KMCPRI
  272. SEGSUP KICDUA
  273. SEGSUP KICPRI
  274. SEGSUP LNBME
  275. SEGSUP ICMPRI
  276. SEGSUP ICMDUA
  277. *
  278. * Normal termination
  279. *
  280. IRET=0
  281. RETURN
  282. *
  283. * Format handling
  284. *
  285. *
  286. * Error handling
  287. *
  288. * Pas une erreur proprement dite, mais il n'y avait pas de composantes communes
  289. 9998 CONTINUE
  290. MSODUA=0
  291. IRET=0
  292. RETURN
  293. 9999 CONTINUE
  294. IRET=1
  295. WRITE(IOIMP,*) 'An error was detected in subroutine prmcp2'
  296. RETURN
  297. *
  298. * End of subroutine PRMCP2
  299. *
  300. END
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  

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