1 : C PRILU0 SOURCE MAGN 09/07/30 21:20:33 6458
2 : SUBROUTINE PRILU0(KMORS,KISA,MATRIK,IMPR,IRET)
3 : IMPLICIT INTEGER(I-N)
4 : IMPLICIT REAL*8 (A-H,O-Z)
5 : C***********************************************************************
6 : C NOM : PRILU0
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 : -INC CCOPTIO
82 : -INC SMMATRIK
83 : -INC SMLENTI
84 : POINTEUR KMORS.PMORS
85 : POINTEUR KISA.IZA
86 : POINTEUR ILUM.PMORS
87 : POINTEUR ILUI.IZA
88 : POINTEUR IWORK.MLENTI
89 : C***
90 : IRET=0
91 : IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans prilu0'
92 : C On récupère les segments utiles
93 : SEGACT MATRIK
94 : ILUM =KIDMAT(6)
95 : ILUI =KIDMAT(7)
96 : SEGDES MATRIK
97 : C Le préconditionneur est-il déjà construit ?
98 : IF ((ILUM.EQ.0).OR.(ILUI.EQ.0)) THEN
99 : C La matrice Morse et son préconditionneur ont le meme
100 : C profil
101 : SEGACT KMORS
102 : N=KMORS.IA(/1)-1
103 : NNZ=KMORS.JA(/1)
104 : SEGACT KISA
105 : NTT=N-1
106 : NJA=NNZ+1
107 : SEGINI ILUM
108 : NBVA=NNZ+1
109 : SEGINI ILUI
110 : JG=N
111 : SEGINI IWORK
112 : C Les boucles sont en Fortran pur
112 : CALL MEILU0(N,NNZ,KISA.A,KMORS.JA,KMORS.IA,
113 : $ ILUI.A,ILUM.JA,ILUM.IA,
114 : $ IWORK.LECT,
115 : $ IMPR,IRET)
116 : IF (IRET.NE.0) GOTO 9999
117 : SEGSUP IWORK
118 : SEGDES ILUI
119 : SEGDES ILUM
120 : SEGDES KISA
121 : SEGDES KMORS
122 : C
123 : C On stocke la factorisation obtenue du préconditionneur
124 : C
125 : SEGACT MATRIK*MOD
126 : KIDMAT(6)=ILUM
127 : KIDMAT(7)=ILUI
128 : SEGDES MATRIK
129 : C
130 : IF (IMPR.GT.6) THEN
131 : WRITE(IOIMP,*) 'création du préconditionneur Morse',
132 : $ ' de pointeurs',ILUM,'et',ILUI
133 : IF (IMPR.GT.8) THEN
133 : CALL ECMORS(ILUM,ILUI,(IMPR-1))
134 : ENDIF
135 : ENDIF
136 : ELSE
137 : IF (IMPR.GT.6) THEN
138 : WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :',
139 : $ 'ILUM=',ILUM,' et ILUI=',ILUI
140 : IF (IMPR.GT.8) THEN
140 : CALL ECMORS(ILUM,ILUI,(IMPR-1))
141 : ENDIF
142 : ENDIF
143 : ENDIF
144 : *
145 : * Normal termination
146 : *
147 : RETURN
148 : *
149 : * Format handling
150 : *
151 : *
152 : * Error handling
153 : *
154 : 9999 CONTINUE
155 : WRITE(IOIMP,*) 'An error was detected in prilu0.eso'
156 : RETURN
157 : *
158 : * End of PRILU0
159 : *
160 : END
161 :
162 :
163 :
164 :
165 :
166 :
167 :
168 :
© Cast3M 2003 - All rights reserved.
Disclaimer