Télécharger mkiza.eso

Retour à la liste

Numérotation des lignes :

mkiza
  1. C MKIZA SOURCE GOUNAND 24/11/06 21:15:12 12073
  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. INTEGER IDX,IDXDEB
  80. INTEGER ISOUM,NBSOUM,NBSOUD,NBSOUP
  81. INTEGER ITDDLD,ITDDLP,ITIDUA,ITIPRI,ITPODU,ITPOPR
  82. INTEGER NBCMPD,NBCMPP
  83. INTEGER NELPRI
  84. INTEGER ILMAT,JDMAT,IPMAT,IMATL
  85. INTEGER NDMAT,NPMAT,NBMATL
  86. INTEGER LONLIG
  87. INTEGER IELEM
  88. INTEGER NUELG,OLDISM,ISOUMA,NUELOC
  89. *
  90. * Executable statements
  91. *
  92. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans mkiza'
  93. * On régularise les maillage pour plus se faire chier si LISOUS(/1).EQ.0
  94. * In REGMAI : SEGINI ML2DUA
  95. CALL REGMAI(MELDUA,ML2DUA)
  96. * In REGMAI : SEGINI ML2PRI
  97. CALL REGMAI(MELPRI,ML2PRI)
  98. *
  99. * Activons les chapeaux (Matrices et supports)
  100. *
  101. SEGACT ML2DUA
  102. NBSOUD=ML2DUA.LISOUS(/1)
  103. SEGACT ML2PRI
  104. NBSOUP=ML2PRI.LISOUS(/1)
  105. SEGACT IMATEL
  106. NBSOUM=NBSOUP
  107. NBMATL=IMATEL.LIZAFM(/2)
  108. IF (NBSOUD.NE.NBSOUP) THEN
  109. WRITE(IOIMP,*) 'Maillage primal, dual :'
  110. WRITE(IOIMP,*) 'partitionnment différent...'
  111. WRITE(IOIMP,*) 'NBSOUD=',NBSOUD
  112. WRITE(IOIMP,*) 'NBSOUP=',NBSOUP
  113. GOTO 9999
  114. ENDIF
  115. *
  116. * Tableau de repérage dans la matrice
  117. *
  118. * In INIRPM : SEGINI RPMAT
  119. CALL INIRPM(IMATEL,RPMAT,IMPR,IRET)
  120. IF (IRET.NE.0) GOTO 9999
  121. *
  122. * Activons les tableaux de repérage
  123. *
  124. SEGACT KRINCD
  125. NBCMPD=KRINCD.LECT(/1)
  126. SEGACT KRINCP
  127. NBCMPP=KRINCP.LECT(/1)
  128. IF (NBCMPD.NE.NBMATL.OR.NBCMPP.NE.NBMATL) THEN
  129. WRITE(IOIMP,*) 'KRINCD, KRINCP et IMATEL :'
  130. WRITE(IOIMP,*) 'nb. comp. différents...'
  131. GOTO 9999
  132. ENDIF
  133. SEGACT KMINCT
  134. SEGACT KRSPGT
  135. SEGACT PMTOT
  136. SEGACT IZATOT*MOD
  137. *
  138. * Parcourons les matrices élémentaires par sous-domaine et
  139. * remplissons les valeurs de la matrice Morse.
  140. *
  141. DO 1 IMATL=1,NBMATL
  142. ITIDUA=KRINCD.LECT(IMATL)
  143. ITIPRI=KRINCP.LECT(IMATL)
  144. NUELG=0
  145. OLDISM=1
  146. VMATEL=IMATEL.LIZAFM(OLDISM,IMATL)
  147. SEGACT VMATEL
  148. DO 12 ISOUM=1,NBSOUM
  149. SMLDUA=ML2DUA.LISOUS(ISOUM)
  150. SEGACT SMLDUA
  151. SMLPRI=ML2PRI.LISOUS(ISOUM)
  152. SEGACT SMLPRI
  153. NELPRI=SMLPRI.NUM(/2)
  154. DO 122 IELEM=1,NELPRI
  155. NUELG=NUELG+1
  156. CALL RPELEM(NUELG,RPMAT,ISOUMA,NUELOC,IMPR,IRET)
  157. IF (IRET.NE.0) GOTO 9999
  158. ISOUMA=MAX(ISOUMA,1)
  159. IF (ISOUMA.NE.OLDISM) THEN
  160. SEGDES VMATEL
  161. VMATEL=IMATEL.LIZAFM(ISOUMA,IMATL)
  162. SEGACT VMATEL
  163. OLDISM=ISOUMA
  164. ENDIF
  165. ILMAT=NUELOC
  166. NPMAT=VMATEL.AM(/2)
  167. NDMAT=VMATEL.AM(/3)
  168. DO 1222 JDMAT=1,NDMAT
  169. ITPODU=KRSPGT.LECT(SMLDUA.NUM(JDMAT,IELEM))
  170. IF (ITPODU.EQ.0) THEN
  171. WRITE(IOIMP,*) 'Point dual ????'
  172. GOTO 9999
  173. ENDIF
  174. C Test du MPOS... déjà fait dans mkpmor...
  175. ITDDLD=KMINCT.NPOS(ITPODU)
  176. $ + KMINCT.MPOS(ITPODU,ITIDUA)-1
  177. IDXDEB=PMTOT.IA(ITDDLD)
  178. LONLIG=PMTOT.IA(ITDDLD+1)-IDXDEB
  179. IF (LONLIG.EQ.0) THEN
  180. WRITE(IOIMP,*) 'Ligne inex. ddl dua =',ITDDLD
  181. GOTO 9999
  182. ENDIF
  183. C IPMAT parce que IDMAT est le nom d'un segment par défaut...
  184. DO 12222 IPMAT=1,NPMAT
  185. ITPOPR=KRSPGT.LECT(SMLPRI.NUM(IPMAT,IELEM))
  186. IF (ITPOPR.EQ.0) THEN
  187. WRITE(IOIMP,*) 'Point primal ????'
  188. GOTO 9999
  189. ENDIF
  190. ITDDLP=KMINCT.NPOS(ITPOPR)
  191. $ + KMINCT.MPOS(ITPOPR,ITIPRI)-1
  192. CALL IFIDIC(LONLIG,PMTOT.JA(IDXDEB),ITDDLP,
  193. $ IDX,
  194. $ IMPR,IRET)
  195. IF (IRET.NE.0) GOTO 9999
  196. IZATOT.A(IDXDEB+IDX-1)=IZATOT.A(IDXDEB+IDX-1)
  197. $ + VMATEL.AM(ILMAT,IPMAT,JDMAT)
  198. 12222 CONTINUE
  199. 1222 CONTINUE
  200. 122 CONTINUE
  201. SEGDES SMLPRI
  202. SEGDES SMLDUA
  203. 12 CONTINUE
  204. SEGDES VMATEL
  205. 1 CONTINUE
  206. SEGDES IZATOT
  207. SEGDES PMTOT
  208. SEGDES KRSPGT
  209. SEGDES KMINCT
  210. SEGDES KRINCP
  211. SEGDES KRINCD
  212. SEGSUP RPMAT
  213. SEGDES IMATEL
  214. SEGDES ML2PRI
  215. SEGDES ML2DUA
  216. SEGSUP ML2PRI
  217. SEGSUP ML2DUA
  218. *
  219. * Normal termination
  220. *
  221. IRET=0
  222. RETURN
  223. *
  224. * Format handling
  225. *
  226. *
  227. * Error handling
  228. *
  229. 9999 CONTINUE
  230. IRET=1
  231. WRITE(IOIMP,*) 'An error was detected in subroutine mkiza'
  232. RETURN
  233. *
  234. * End of subroutine MKIZA
  235. *
  236. END
  237.  
  238.  

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