Télécharger mkpmor.eso

Retour à la liste

Numérotation des lignes :

mkpmor
  1. C MKPMOR SOURCE PV 20/09/26 21:18:57 10724
  2. SUBROUTINE MKPMOR(LPDPP,KJSPGD,KRINCP,KRINCD,
  3. $ KRSPGT,KMINCT,
  4. $ PMCOU,
  5. $ IMPR,IRET)
  6. IMPLICIT INTEGER(I-N)
  7. IMPLICIT REAL*8 (A-H,O-Z)
  8. C***********************************************************************
  9. C NOM : MKPMOR
  10. C PROJET : Assemblage matrice élémentaire -> matrice Morse
  11. C DESCRIPTION : Matrice élémentaire + liste indexée d'entiers(popoin) =>
  12. C Profil Morse de la matrice assemblée (les colonnes ne
  13. C sont pas ordonnées).
  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 : CORINC
  20. C APPELE PAR : MAKPRM
  21. C***********************************************************************
  22. C ENTREES : LPDPP, KJSPGD, KRINCP, KRINCD, KRSPGT, KMINCT
  23. C SORTIES : PMCOU
  24. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  25. C***********************************************************************
  26. C VERSION : v1, 06/10/99, version initiale
  27. C HISTORIQUE : v1, 06/10/99, 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. *
  37. * On peut optimiser les boucles en sortant les NPOS
  38. *
  39. *
  40. -INC PPARAM
  41. -INC CCOPTIO
  42. -INC SMELEME
  43. POINTEUR KJSPGD.MELEME
  44. POINTEUR KMINCT.MINC
  45. INTEGER NTT,NJA
  46. POINTEUR PMCOU.PMORS
  47. -INC SMLENTI
  48. INTEGER JG
  49. POINTEUR KRINCD.MLENTI
  50. POINTEUR KRIDUN.MLENTI
  51. POINTEUR KRINCP.MLENTI
  52. POINTEUR KRSPGT.MLENTI
  53. POINTEUR DD2DP.MLENTI
  54. *
  55. * Includes perso
  56. *
  57. *-INC SLSTIND
  58. *
  59. * Segment LSTIND (liste séquentielle indexée)
  60. *
  61. SEGMENT LSTIND
  62. INTEGER IDX(NBM+1)
  63. INTEGER IVAL(NBTVAL)
  64. ENDSEGMENT
  65. *
  66. * LISTE SEQUENTIELLE INDEXEE D'ENTIERS
  67. *
  68. * NBM : NOMBRE DE MULTIPLETS
  69. * NBTVAL : NOMBRE TOTAL DE VALEURS
  70. * IDX(I) : INDICE DE LA PREMIERE VALEUR DU IEME
  71. * MULTIPLET DANS LE TABLEAU IVAL
  72. * IVAL(IDX(I) -> IDX(I+1)-1) : VALEURS DU IEME MULTIPLET
  73. POINTEUR LIPUN.LSTIND
  74. POINTEUR LPDPP.LSTIND
  75. *
  76. INTEGER IMPR,IRET
  77. *
  78. LOGICAL LEXIST
  79. INTEGER IDEPA
  80. INTEGER IDUNIQ,IPUNIQ,IPDUA,IPPRI,ITTDDL
  81. INTEGER NDUNIQ,NPDUA, NTTDDL
  82. INTEGER NOPPR,NOPDU
  83. INTEGER NUTPPR,NUTPDU,NUTDPR,NUTDDU
  84. INTEGER NTOTCO,NTOTPO
  85. *
  86. * Executable statements
  87. *
  88. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans mkpmor'
  89. C Pour chaque composante primale distincte, il faudrait déterminer
  90. C avec quels composantes duales distinctes il est relié :
  91. C Par exemple, si on a :
  92. C KRINCD = 1 1 1 2
  93. C KRINCP = 2 2 3 4
  94. C On a : KRIDUN = 1 2
  95. C On veut : LIPUN = (2 3) (4) (c'est une liste indexée)
  96. C
  97. CALL CORINC(KRINCD,KRINCP,
  98. $ KRIDUN,LIPUN,
  99. $ IMPR,IRET)
  100. C - Construire la liste d'entiers suivante (DD2DP) :
  101. C * Nombre d'entiers = nb total de ddl (primaux) ;
  102. C * pour chaque ddl primal : nb. total de ddl duaux qui lui
  103. C sont reliés.
  104. SEGACT KRIDUN
  105. NDUNIQ=KRIDUN.LECT(/1)
  106. SEGACT LIPUN
  107. SEGACT KJSPGD
  108. SEGACT KRSPGT
  109. SEGACT KMINCT
  110. NTOTPO=KMINCT.NPOS(/1)-1
  111. NTTDDL=KMINCT.NPOS(NTOTPO+1)-1
  112. JG=NTTDDL
  113. SEGINI DD2DP
  114. SEGACT LPDPP
  115. NPDUA=KJSPGD.NUM(/2)
  116. DO 1 IPDUA=1,NPDUA
  117. NOPDU=KJSPGD.NUM(1,IPDUA)
  118. NUTPDU=KRSPGT.LECT(NOPDU)
  119. IF (NUTPDU.EQ.0) THEN
  120. WRITE(IOIMP,*) 'C''est dual grave...'
  121. GOTO 9999
  122. ENDIF
  123. DO 12 IDUNIQ=1,NDUNIQ
  124. LEXIST=(KMINCT.MPOS(NUTPDU,KRIDUN.LECT(IDUNIQ)).NE.0)
  125. IF (.NOT.LEXIST) THEN
  126. WRITE(IOIMP,*) 'C''est comp. duale grave...'
  127. GOTO 9999
  128. ENDIF
  129. NUTDDU=KMINCT.NPOS(NUTPDU)
  130. $ +KMINCT.MPOS(NUTPDU,KRIDUN.LECT(IDUNIQ))-1
  131. DD2DP.LECT(NUTDDU)=(LIPUN.IDX(IDUNIQ+1)-LIPUN.IDX(IDUNIQ))
  132. $ *(LPDPP.IDX(IPDUA+1)-LPDPP.IDX(IPDUA))
  133. 12 CONTINUE
  134. 1 CONTINUE
  135. C
  136. C - Dimensionner le profil Morse
  137. C
  138. NTOTCO=0
  139. DO 3 ITTDDL=1,NTTDDL
  140. NTOTCO=NTOTCO+DD2DP.LECT(ITTDDL)
  141. 3 CONTINUE
  142. NTT=NTTDDL
  143. NJA=NTOTCO
  144. SEGINI PMCOU
  145. C
  146. C - Remplissage du profil de la matrice Morse :
  147. C * Le tableau IA :
  148. PMCOU.IA(1)=1
  149. DO 5 ITTDDL=1,NTTDDL
  150. PMCOU.IA(ITTDDL+1)=PMCOU.IA(ITTDDL)
  151. $ +DD2DP.LECT(ITTDDL)
  152. 5 CONTINUE
  153. SEGSUP DD2DP
  154. C * Le tableau JA :
  155. DO 7 IPDUA=1,NPDUA
  156. NOPDU=KJSPGD.NUM(1,IPDUA)
  157. NUTPDU=KRSPGT.LECT(NOPDU)
  158. DO 72 IDUNIQ=1,NDUNIQ
  159. NUTDDU=KMINCT.NPOS(NUTPDU)
  160. $ +KMINCT.MPOS(NUTPDU,KRIDUN.LECT(IDUNIQ))-1
  161. IDEPA=PMCOU.IA(NUTDDU)
  162. DO 722 IPPRI=LPDPP.IDX(IPDUA),LPDPP.IDX(IPDUA+1)-1
  163. NOPPR=LPDPP.IVAL(IPPRI)
  164. NUTPPR=KRSPGT.LECT(NOPPR)
  165. DO 7222 IPUNIQ=LIPUN.IDX(IDUNIQ),LIPUN.IDX(IDUNIQ+1)-1
  166. NUTDPR=KMINCT.NPOS(NUTPPR)
  167. $ +KMINCT.MPOS(NUTPPR,LIPUN.IVAL(IPUNIQ))-1
  168. PMCOU.JA(IDEPA)=NUTDPR
  169. IDEPA=IDEPA+1
  170. 7222 CONTINUE
  171. 722 CONTINUE
  172. 72 CONTINUE
  173. 7 CONTINUE
  174. SEGDES PMCOU
  175. SEGDES LPDPP
  176. SEGDES KMINCT
  177. SEGDES KRSPGT
  178. SEGDES KJSPGD
  179. SEGSUP LIPUN
  180. SEGSUP KRIDUN
  181. *
  182. * Normal termination
  183. *
  184. IRET=0
  185. RETURN
  186. *
  187. * Format handling
  188. *
  189. *
  190. * Error handling
  191. *
  192. 9999 CONTINUE
  193. IRET=1
  194. WRITE(IOIMP,*) 'An error was detected in subroutine mkpmor'
  195. RETURN
  196. *
  197. * End of subroutine MKPMOR
  198. *
  199. END
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  

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