Télécharger prilut.eso

Retour à la liste

Numérotation des lignes :

prilut
  1. C PRILUT SOURCE PV 20/09/26 21:19:30 10724
  2. SUBROUTINE PRILUT(KMORS,KISA,MATRIK,XLFIL,XDTOL,IVARI,
  3. $ IMPR,IRET)
  4. IMPLICIT INTEGER(I-N)
  5. IMPLICIT REAL*8 (A-H,O-Z)
  6. C***********************************************************************
  7. C NOM : PRILUT
  8. C DESCRIPTION :
  9. C Calcul du préconditionneur ILUT d'une matrice Morse (IVARI=0)
  10. C ou d'une variante qui remplit mieux la mémoire et fonctionne mieux
  11. C quelquefois (IVARI=1)
  12. C Le préconditionneur est une matrice stockée
  13. C au format MSR (Modified Sparse Row, stockage de l'inverse de la
  14. C diagonale) de meme profil que la matrice Morse (format CSR) qu'il
  15. C préconditionne.
  16. C Le profil et les valeurs du préconditionneur sont
  17. C stockés dans KIDMAT(6 et 7) (réutilisation de l'existant).
  18. C
  19. C Ce sous-programme est en fait une interface à :
  20. C meilut
  21. C qui est en Fortran presque pur (pour raison de rapidité)
  22. C et effectue la construction proprement dite du
  23. C préconditionneur.
  24. C
  25. C ATTENTION : pour une matrice A quelconque, la factorisation
  26. C --------- ILUT peut ne pas exister (pivot nul) ou avoir
  27. C des pivots négatifs MEME SI la factorisation
  28. C complète de A existe et n'a que des pivots
  29. C positifs.
  30. C
  31. C
  32. C LANGAGE : ESOPE
  33. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  34. C mél : gounand@semt2.smts.cea.fr
  35. C REFERENCE (bibtex-like) :
  36. C @BOOK{templates,
  37. C AUTHOR={R.Barrett, M.Berry, T.F.Chan, J.Demmel, J.Donato,
  38. C J.Dongarra, V.Eijkhout, R.Pozo, C.Romine,
  39. C H. Van der Vorst},
  40. C TITLE={Templates for the Solution of Linear Systems :
  41. C Building Blocks for Iterative Methods},
  42. C PUBLISHER={SIAM}, YEAR={1994}, ADDRESS={Philadelphia,PA} }
  43. C -> URL : http://www.netlib.org/templates/Templates.html
  44. C Sparskit : a basic tool kit for sparse matrix computations
  45. C Version 2 (Youcef Saad)
  46. C -> URL : http://www.cs.umn.edu/Research/arpa/SPARSKIT/sparskit.html
  47. C REMARQUES :
  48. C On pourrait effectuer l'ordonnancement des colonnes du préconditionneur
  49. C (peut-être que la montée-descente va plus vite après, il faudrait
  50. C tester)
  51. C***********************************************************************
  52. C APPELES : MEILUT
  53. C APPELE PAR : KRES2
  54. C***********************************************************************
  55. C ENTREES : MATRIK, XLFIL, XDTOL, IMPR
  56. C SORTIES : ILUM, ILUI (KIDMAT(6-7) dans MATRIK), IRET
  57. C CODE RETOUR (IRET) : 0 si ok
  58. C <0 si problème
  59. C MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK
  60. C on pioche dedans les informations nécessaires
  61. C (différents pointeurs, nb. de ddl...)
  62. C IMPR : niveau d'impression
  63. C ILUM : pointeur sur segment PMORS de l'include SMMATRIK
  64. C profil morse du préconditionneur ILU(0)
  65. C =KIDMAT(6)=KMORS=KIDMAT(4) dans MATRIK
  66. C ILUI : pointeur sur segment IZA de l'include SMMATRIK
  67. C valeur du préconditionneur ILU(0)
  68. C =KIDMAT(7) dans MATRIK
  69. C***********************************************************************
  70. C VERSION : v1, 23/02/2000, version initiale
  71. C HISTORIQUE : v1, 23/02/2000, création
  72. C HISTORIQUE :
  73. C***********************************************************************
  74. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  75. C en cas de modification de ce sous-programme afin de faciliter
  76. C la maintenance !
  77. C***********************************************************************
  78. -INC PPARAM
  79. -INC CCOPTIO
  80. INTEGER NTT,NJA,NBVA
  81. POINTEUR KMORS.PMORS
  82. POINTEUR KISA.IZA
  83. POINTEUR ILUM.PMORS
  84. POINTEUR ILUI.IZA
  85. -INC SMLENTI
  86. INTEGER JG
  87. POINTEUR IWORK.MLENTI
  88. POINTEUR JWORK.MLENTI
  89. -INC SMLREEL
  90. POINTEUR RWORK.MLREEL
  91. *
  92. REAL*8 XLFIL,XDTOL
  93. INTEGER IVARI,IMPR,IRET
  94. *
  95. INTEGER ILFIL,NNZA,NNZLU,NNZMLU,NTTDDL
  96. REAL*8 XNTLIG
  97. *
  98. IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans prilut.eso'
  99. C On récupère les segments utiles
  100. SEGACT MATRIK
  101. ILUM =KIDMAT(6)
  102. ILUI =KIDMAT(7)
  103. SEGDES MATRIK
  104. C Le préconditionneur est-il déjà construit ?
  105. IF ((ILUM.EQ.0).OR.(ILUI.EQ.0)) THEN
  106. C La matrice Morse et son préconditionneur ont le meme
  107. C profil
  108. SEGACT KMORS
  109. NTTDDL=KMORS.IA(/1)-1
  110. NNZA=KMORS.JA(/1)
  111. SEGACT KISA
  112. * Pour faire comme dans priltp
  113. * XNTLIG=DBLE(NNZA)/DBLE(NTTDDL)
  114. * ILFIL=INT(XNTLIG*XLFIL/2.D0)
  115. * NNZMLU=NTTDDL*(2*ILFIL+1)
  116. *
  117. NNZMLU = INT(DBLE(NNZA)*XLFIL) + 1
  118. *
  119. NTT=NTTDDL-1
  120. NJA=NNZMLU+1
  121. SEGINI ILUM
  122. NBVA=NNZMLU+1
  123. SEGINI ILUI
  124. JG=NTTDDL
  125. SEGINI IWORK
  126. JG=NTTDDL
  127. SEGINI JWORK
  128. JG=NTTDDL
  129. SEGINI RWORK
  130. * WRITE(IOIMP,*) 'NTTDDL=',NTTDDL,'NNZA=',NNZA,
  131. * $ 'NNZMLU=',NNZMLU
  132. * WRITE(IOIMP,*) 'ILFIL=',ILFIL,'XLFIL=',XLFIL,'XDTOL=',XDTOL
  133. C Les boucles sont en Fortran pur
  134. CALL MEILUT(NTTDDL,NNZA,KISA.A,KMORS.JA,KMORS.IA,
  135. $ XLFIL,XDTOL,NNZMLU,
  136. $ ILUI.A,ILUM.JA,ILUM.IA,NNZLU,
  137. $ IWORK.LECT,JWORK.LECT,RWORK.PROG,
  138. $ IVARI,IMPR,IRET)
  139. IF (IRET.NE.0) GOTO 9999
  140. IF (IMPR.GT.1) THEN
  141. WRITE(IOIMP,*) 'Préconditionneur : nb.termesstockés=',
  142. $ NNZLU-1
  143. ENDIF
  144. * SEGPRT,ILUM
  145. * SEGPRT,ILUI
  146. SEGSUP RWORK
  147. SEGSUP JWORK
  148. SEGSUP IWORK
  149. NBVA=NNZLU
  150. SEGADJ,ILUI
  151. SEGDES ILUI
  152. NTT=NTTDDL-1
  153. NJA=NNZLU
  154. SEGADJ,ILUM
  155. SEGDES ILUM
  156. SEGDES KISA
  157. SEGDES KMORS
  158. * SEGPRT,ILUM
  159. * SEGPRT,ILUI
  160. * Ordonnancement (peut-être que la montée-descente va plus vite, il
  161. * faudrait tester)
  162. *
  163. * SEGACT ILUM*MOD
  164. * SEGACT ILUI*MOD
  165. * JG=MAX(NTTDDL+1,2*(NNZLU-(NTTDDL+1)))
  166. * SEGINI IWORK
  167. * CALL CSORT2(NTTDDL,ILUI.A(NTTDDL+2),ILUM.JA(NTTDDL+2),
  168. * $ ILUM.JA(1),IWORK.LECT,.TRUE.)
  169. * SEGSUP IWORK
  170. * SEGDES ILUI
  171. * SEGDES ILUM
  172. C
  173. C On stocke la factorisation obtenue du préconditionneur
  174. C
  175. SEGACT MATRIK*MOD
  176. KIDMAT(6)=ILUM
  177. KIDMAT(7)=ILUI
  178. SEGDES MATRIK
  179. C
  180. IF (IMPR.GT.6) THEN
  181. WRITE(IOIMP,*) 'création du préconditionneur Morse',
  182. $ ' de pointeurs',ILUM,'et',ILUI
  183. IF (IMPR.GT.8) THEN
  184. CALL ECMORS(ILUM,ILUI,(IMPR-1))
  185. ENDIF
  186. ENDIF
  187. ELSE
  188. IF (IMPR.GT.6) THEN
  189. WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :',
  190. $ 'ILUM=',ILUM,' et ILUI=',ILUI
  191. IF (IMPR.GT.8) THEN
  192. CALL ECMORS(ILUM,ILUI,(IMPR-1))
  193. ENDIF
  194. ENDIF
  195. ENDIF
  196. *
  197. * Normal termination
  198. *
  199. RETURN
  200. *
  201. * Format handling
  202. *
  203. *
  204. * Error handling
  205. *
  206. 9999 CONTINUE
  207. WRITE(IOIMP,*) 'An error was detected in prilut.eso'
  208. RETURN
  209. *
  210. * End of PRILUT
  211. *
  212. END
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  

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