Télécharger prilup.eso

Retour à la liste

Numérotation des lignes :

prilup
  1. C PRILUP SOURCE PV 20/09/26 21:19:29 10724
  2. SUBROUTINE PRILUP(KMORS,KISA,MATRIK,RXILUP,IFILTR,IMPR,IRET)
  3. IMPLICIT INTEGER(I-N)
  4. IMPLICIT REAL*8 (A-H,O-Z)
  5. C***********************************************************************
  6. C NOM : PRILUP
  7. C DESCRIPTION :
  8. C Calcul du préconditionneur ILU(0) d'une matrice Morse.
  9. C ILU(0) : Incomplete LU factorization of level 0
  10. C appelée aussi Choleski ou Crout incomplet
  11. C
  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 meilu0
  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 --------- ILU(0) 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/TTMF)
  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***********************************************************************
  48. C APPELES : MEILU0
  49. C APPELES (E/S) : ECMORS
  50. C APPELE PAR : KRES2
  51. C***********************************************************************
  52. C ENTREES : MATRIK, IMPR
  53. C ENTREES/SORTIES : -
  54. C SORTIES : ILUM, ILUI (KIDMAT(6-7) dans MATRIK), IRET
  55. C CODE RETOUR (IRET) : 0 si ok
  56. C <0 si problème
  57. C MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK
  58. C on pioche dedans les informations nécessaires
  59. C (différents pointeurs, nb. de ddl...)
  60. C IMPR : niveau d'impression
  61. C ILUM : pointeur sur segment PMORS de l'include SMMATRIK
  62. C profil morse du préconditionneur ILU(0)
  63. C =KIDMAT(6)=KMORS=KIDMAT(4) dans MATRIK
  64. C ILUI : pointeur sur segment IZA de l'include SMMATRIK
  65. C valeur du préconditionneur ILU(0)
  66. C =KIDMAT(7) dans MATRIK
  67. C***********************************************************************
  68. C VERSION : v1, 01/04/98, version initiale
  69. C HISTORIQUE : v1, 01/04/98, création
  70. C HISTORIQUE : 09/02/99, on ne construit pas le préconditionneur s'il
  71. C existe déjà.
  72. C HISTORIQUE : 20/12/99, interfaçage avec le nouveau meilu0
  73. C Le préconditionneur est stocké au format MSR (Modified Sparse Row)
  74. C (voir la doc de Sparskit version 2+ (Youcef Saad))
  75. C HISTORIQUE :
  76. C***********************************************************************
  77. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  78. C en cas de modification de ce sous-programme afin de faciliter
  79. C la maintenance !
  80. C***********************************************************************
  81.  
  82. -INC PPARAM
  83. -INC CCOPTIO
  84. -INC SMLENTI
  85. POINTEUR KMORS.PMORS
  86. POINTEUR KISA.IZA
  87. POINTEUR ILUM.PMORS
  88. POINTEUR ILUI.IZA
  89. POINTEUR IWORK.MLENTI
  90. REAL*8 RXILUP
  91. C***
  92. IRET=0
  93. IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans prilup'
  94. C On récupère les segments utiles
  95. SEGACT MATRIK
  96. ILUM =KIDMAT(6)
  97. ILUI =KIDMAT(7)
  98. SEGDES MATRIK
  99. C Le préconditionneur est-il déjà construit ?
  100. IF ((ILUM.EQ.0).OR.(ILUI.EQ.0)) THEN
  101. C La matrice Morse et son préconditionneur ont le meme
  102. C profil
  103. SEGACT KMORS
  104. N=KMORS.IA(/1)-1
  105. NNZ=KMORS.JA(/1)
  106. SEGACT KISA
  107. NTT=N-1
  108. NJA=NNZ+1
  109. SEGINI ILUM
  110. NBVA=NNZ+1
  111. SEGINI ILUI
  112. JG=N
  113. SEGINI IWORK
  114. C Les boucles sont en Fortran pur
  115. CALL MEILUP(N,NNZ,KISA.A,KMORS.JA,KMORS.IA,
  116. $ ILUI.A,ILUM.JA,ILUM.IA,
  117. $ IWORK.LECT,
  118. $ RXILUP,IFILTR,
  119. $ IMPR,IRET)
  120. IF (IRET.NE.0) GOTO 9999
  121. SEGSUP IWORK
  122. SEGDES ILUI
  123. SEGDES ILUM
  124. SEGDES KISA
  125. SEGDES KMORS
  126. C
  127. C On stocke la factorisation obtenue du préconditionneur
  128. C
  129. SEGACT MATRIK*MOD
  130. KIDMAT(6)=ILUM
  131. KIDMAT(7)=ILUI
  132. SEGDES MATRIK
  133. C
  134. IF (IMPR.GT.6) THEN
  135. WRITE(IOIMP,*) 'création du préconditionneur Morse',
  136. $ ' de pointeurs',ILUM,'et',ILUI
  137. IF (IMPR.GT.8) THEN
  138. CALL ECMORS(ILUM,ILUI,(IMPR-1))
  139. ENDIF
  140. ENDIF
  141. ELSE
  142. IF (IMPR.GT.6) THEN
  143. WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :',
  144. $ 'ILUM=',ILUM,' et ILUI=',ILUI
  145. IF (IMPR.GT.8) THEN
  146. CALL ECMORS(ILUM,ILUI,(IMPR-1))
  147. ENDIF
  148. ENDIF
  149. ENDIF
  150. *
  151. * Normal termination
  152. *
  153. RETURN
  154. *
  155. * Format handling
  156. *
  157. *
  158. * Error handling
  159. *
  160. 9999 CONTINUE
  161. WRITE(IOIMP,*) 'An error was detected in prilup.eso'
  162. RETURN
  163. *
  164. * End of PRILUP
  165. *
  166. END
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  

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