Télécharger mkiza.eso

Retour à la liste

Numérotation des lignes :

mkiza
  1. C MKIZA SOURCE PV 20/09/26 21:18:53 10724
  2. SUBROUTINE MKIZA(MELDUA,MELPRI,IMATEL,
  3. $ KRINCD,KRINCP,KMINCT,KRSPGT,
  4. $ PMTOT,
  5. $ IZATOT,
  6. $ IMPR,IRET)
  7. IMPLICIT INTEGER(I-N)
  8. IMPLICIT REAL*8 (A-H,O-Z)
  9. C***********************************************************************
  10. C NOM : MKIZA
  11. C DESCRIPTION : Matrice élémentaire + Profil Morse de la matrice
  12. C assemblée => ajout de la contribution de la matrice
  13. C élémentaire aux valeurs de la matrice Morse assemblée.
  14. C
  15. C Le profil Morse est supposé avoir ses colonnes
  16. C ordonnées.
  17. C
  18. C LANGAGE : ESOPE
  19. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  20. C mél : gounand@semt2.smts.cea.fr
  21. C***********************************************************************
  22. C APPELES : REGMAI, IFIDIC, INIRPM
  23. C APPELE PAR : PRASEM
  24. C***********************************************************************
  25. C ENTREES : MELDUA, MELPRI, IMATEL, KRINCD, KRINCP, KMINCT,
  26. C KRSPGT, PMTOT
  27. C ENTREES/SORTIES : IZATOT
  28. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  29. C***********************************************************************
  30. C VERSION : v2, 13/12/99
  31. C HISTORIQUE : v1, 08/10/99, création
  32. C HISTORIQUE : v2, remaniement (on assemble les profils Morse, puis
  33. C la matrice totale)
  34. C HISTORIQUE : 05/01/00 : On ne suppose plus les maillages duaux et
  35. C primaux partitionnés de la même façon que les matrices
  36. C élémentaires.
  37. C HISTORIQUE :
  38. C***********************************************************************
  39. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  40. C en cas de modification de ce sous-programme afin de faciliter
  41. C la maintenance !
  42. C***********************************************************************
  43. *
  44. *
  45. * On peut optimiser les boucles en sortant les NPOS
  46. * On a supposé la chose logique (pas pour tout le monde)
  47. * que le NBSOUS est le même pour MELDUA, MELPRI, IMATEL
  48. *
  49. * Ce serait bien de sortir les REGMAI pour mettre dans prasem
  50. * et supprimmer du source tous les if (NBSOUS.EQ.0)
  51. *
  52. * Le stockage des matrices élémentaires est fait à l'envers
  53. * (NBEL est le premier indice), par contre, les boucles sont
  54. * dans l'ordre logique => perte de performances
  55. *
  56.  
  57. -INC PPARAM
  58. -INC CCOPTIO
  59. -INC SMELEME
  60. POINTEUR MELDUA.MELEME
  61. POINTEUR ML2DUA.MELEME
  62. POINTEUR SMLDUA.MELEME
  63. POINTEUR MELPRI.MELEME
  64. POINTEUR ML2PRI.MELEME
  65. POINTEUR SMLPRI.MELEME
  66. POINTEUR IMATEL.IMATRI
  67. POINTEUR VMATEL.IZAFM
  68. POINTEUR KMINCT.MINC
  69. POINTEUR PMTOT.PMORS
  70. POINTEUR IZATOT.IZA
  71. -INC SMLENTI
  72. POINTEUR KRINCD.MLENTI
  73. POINTEUR KRINCP.MLENTI
  74. POINTEUR KRSPGT.MLENTI
  75. POINTEUR RPMAT.MLENTI
  76. *
  77. INTEGER IMPR,IRET
  78. *
  79. LOGICAL LPARTD,LPARTP
  80. INTEGER IDX,IDXDEB
  81. INTEGER ISOUM,NBSOUM,NBSOUD,NBSOUP
  82. INTEGER ITDDLD,ITDDLP,ITIDUA,ITIPRI,ITPODU,ITPOPR
  83. INTEGER NBCMPD,NBCMPP
  84. INTEGER NELPRI
  85. INTEGER ILMAT,JDMAT,IPMAT,IMATL
  86. INTEGER NDMAT,NPMAT,NBMATL
  87. INTEGER LONLIG
  88. INTEGER IELEM
  89. INTEGER NUELG,OLDISM,ISOUMA,NUELOC
  90. *
  91. * Executable statements
  92. *
  93. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans mkiza'
  94. * On régularise les maillage pour plus se faire chier si LISOUS(/1).EQ.0
  95. * In REGMAI : IF (.NOT.LPARTD) SEGINI ML2DUA
  96. CALL REGMAI(MELDUA,ML2DUA,LPARTD,IMPR,IRET)
  97. IF (IRET.NE.0) GOTO 9999
  98. * In REGMAI : IF (.NOT.LPARTP) SEGINI ML2PRI
  99. CALL REGMAI(MELPRI,ML2PRI,LPARTP,IMPR,IRET)
  100. IF (IRET.NE.0) GOTO 9999
  101. *
  102. * Activons les chapeaux (Matrices et supports)
  103. *
  104. SEGACT ML2DUA
  105. NBSOUD=ML2DUA.LISOUS(/1)
  106. SEGACT ML2PRI
  107. NBSOUP=ML2PRI.LISOUS(/1)
  108. SEGACT IMATEL
  109. NBSOUM=NBSOUP
  110. NBMATL=IMATEL.LIZAFM(/2)
  111. IF (NBSOUD.NE.NBSOUP) THEN
  112. WRITE(IOIMP,*) 'Maillage primal, dual :'
  113. WRITE(IOIMP,*) 'partitionnment différent...'
  114. WRITE(IOIMP,*) 'NBSOUD=',NBSOUD
  115. WRITE(IOIMP,*) 'NBSOUP=',NBSOUP
  116. GOTO 9999
  117. ENDIF
  118. *
  119. * Tableau de repérage dans la matrice
  120. *
  121. * In INIRPM : SEGINI RPMAT
  122. CALL INIRPM(IMATEL,RPMAT,IMPR,IRET)
  123. IF (IRET.NE.0) GOTO 9999
  124. *
  125. * Activons les tableaux de repérage
  126. *
  127. SEGACT KRINCD
  128. NBCMPD=KRINCD.LECT(/1)
  129. SEGACT KRINCP
  130. NBCMPP=KRINCP.LECT(/1)
  131. IF (NBCMPD.NE.NBMATL.OR.NBCMPP.NE.NBMATL) THEN
  132. WRITE(IOIMP,*) 'KRINCD, KRINCP et IMATEL :'
  133. WRITE(IOIMP,*) 'nb. comp. différents...'
  134. GOTO 9999
  135. ENDIF
  136. SEGACT KMINCT
  137. SEGACT KRSPGT
  138. SEGACT PMTOT
  139. SEGACT IZATOT*MOD
  140. *
  141. * Parcourons les matrices élémentaires par sous-domaine et
  142. * remplissons les valeurs de la matrice Morse.
  143. *
  144. DO 1 IMATL=1,NBMATL
  145. ITIDUA=KRINCD.LECT(IMATL)
  146. ITIPRI=KRINCP.LECT(IMATL)
  147. NUELG=0
  148. OLDISM=1
  149. VMATEL=IMATEL.LIZAFM(OLDISM,IMATL)
  150. SEGACT VMATEL
  151. DO 12 ISOUM=1,NBSOUM
  152. SMLDUA=ML2DUA.LISOUS(ISOUM)
  153. SEGACT SMLDUA
  154. SMLPRI=ML2PRI.LISOUS(ISOUM)
  155. SEGACT SMLPRI
  156. NELPRI=SMLPRI.NUM(/2)
  157. DO 122 IELEM=1,NELPRI
  158. NUELG=NUELG+1
  159. CALL RPELEM(NUELG,RPMAT,ISOUMA,NUELOC,IMPR,IRET)
  160. IF (IRET.NE.0) GOTO 9999
  161. ISOUMA=MAX(ISOUMA,1)
  162. IF (ISOUMA.NE.OLDISM) THEN
  163. SEGDES VMATEL
  164. VMATEL=IMATEL.LIZAFM(ISOUMA,IMATL)
  165. SEGACT VMATEL
  166. OLDISM=ISOUMA
  167. ENDIF
  168. ILMAT=NUELOC
  169. NPMAT=VMATEL.AM(/2)
  170. NDMAT=VMATEL.AM(/3)
  171. DO 1222 JDMAT=1,NDMAT
  172. ITPODU=KRSPGT.LECT(SMLDUA.NUM(JDMAT,IELEM))
  173. IF (ITPODU.EQ.0) THEN
  174. WRITE(IOIMP,*) 'Point dual ????'
  175. GOTO 9999
  176. ENDIF
  177. C Test du MPOS... déjà fait dans mkpmor...
  178. ITDDLD=KMINCT.NPOS(ITPODU)
  179. $ + KMINCT.MPOS(ITPODU,ITIDUA)-1
  180. IDXDEB=PMTOT.IA(ITDDLD)
  181. LONLIG=PMTOT.IA(ITDDLD+1)-IDXDEB
  182. IF (LONLIG.EQ.0) THEN
  183. WRITE(IOIMP,*) 'Ligne inex. ddl dua =',ITDDLD
  184. GOTO 9999
  185. ENDIF
  186. C IPMAT parce que IDMAT est le nom d'un segment par défaut...
  187. DO 12222 IPMAT=1,NPMAT
  188. ITPOPR=KRSPGT.LECT(SMLPRI.NUM(IPMAT,IELEM))
  189. IF (ITPOPR.EQ.0) THEN
  190. WRITE(IOIMP,*) 'Point primal ????'
  191. GOTO 9999
  192. ENDIF
  193. ITDDLP=KMINCT.NPOS(ITPOPR)
  194. $ + KMINCT.MPOS(ITPOPR,ITIPRI)-1
  195. CALL IFIDIC(LONLIG,PMTOT.JA(IDXDEB),ITDDLP,
  196. $ IDX,
  197. $ IMPR,IRET)
  198. IF (IRET.NE.0) GOTO 9999
  199. IZATOT.A(IDXDEB+IDX-1)=IZATOT.A(IDXDEB+IDX-1)
  200. $ + VMATEL.AM(ILMAT,IPMAT,JDMAT)
  201. 12222 CONTINUE
  202. 1222 CONTINUE
  203. 122 CONTINUE
  204. SEGDES SMLPRI
  205. SEGDES SMLDUA
  206. 12 CONTINUE
  207. SEGDES VMATEL
  208. 1 CONTINUE
  209. SEGDES IZATOT
  210. SEGDES PMTOT
  211. SEGDES KRSPGT
  212. SEGDES KMINCT
  213. SEGDES KRINCP
  214. SEGDES KRINCD
  215. SEGSUP RPMAT
  216. SEGDES IMATEL
  217. SEGDES ML2PRI
  218. SEGDES ML2DUA
  219. IF (.NOT.LPARTP) SEGSUP ML2PRI
  220. IF (.NOT.LPARTD) SEGSUP ML2DUA
  221. *
  222. * Normal termination
  223. *
  224. IRET=0
  225. RETURN
  226. *
  227. * Format handling
  228. *
  229. *
  230. * Error handling
  231. *
  232. 9999 CONTINUE
  233. IRET=1
  234. WRITE(IOIMP,*) 'An error was detected in subroutine mkiza'
  235. RETURN
  236. *
  237. * End of subroutine MKIZA
  238. *
  239. END
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  

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