1 : C PRILUT SOURCE MAGN 09/07/30 21:20:35 6458
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 CCOPTIO
79 : -INC SMMATRIK
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
133 : CALL MEILUT(NTTDDL,NNZA,KISA.A,KMORS.JA,KMORS.IA,
134 : $ XLFIL,XDTOL,NNZMLU,
135 : $ ILUI.A,ILUM.JA,ILUM.IA,NNZLU,
136 : $ IWORK.LECT,JWORK.LECT,RWORK.PROG,
137 : $ IVARI,IMPR,IRET)
138 : IF (IRET.NE.0) GOTO 9999
139 : IF (IMPR.GT.1) THEN
140 : WRITE(IOIMP,*) 'Préconditionneur : nb.termesstockés=',
141 : $ NNZLU-1
142 : ENDIF
143 : * SEGPRT,ILUM
144 : * SEGPRT,ILUI
145 : SEGSUP RWORK
146 : SEGSUP JWORK
147 : SEGSUP IWORK
148 : NBVA=NNZLU
149 : SEGADJ,ILUI
150 : SEGDES ILUI
151 : NTT=NTTDDL-1
152 : NJA=NNZLU
153 : SEGADJ,ILUM
154 : SEGDES ILUM
155 : SEGDES KISA
156 : SEGDES KMORS
157 : * SEGPRT,ILUM
158 : * SEGPRT,ILUI
159 : * Ordonnancement (peut-être que la montée-descente va plus vite, il
160 : * faudrait tester)
161 : *
162 : * SEGACT ILUM*MOD
163 : * SEGACT ILUI*MOD
164 : * JG=MAX(NTTDDL+1,2*(NNZLU-(NTTDDL+1)))
165 : * SEGINI IWORK
165 : * CALL CSORT2(NTTDDL,ILUI.A(NTTDDL+2),ILUM.JA(NTTDDL+2),
166 : * $ ILUM.JA(1),IWORK.LECT,.TRUE.)
167 : * SEGSUP IWORK
168 : * SEGDES ILUI
169 : * SEGDES ILUM
170 : C
171 : C On stocke la factorisation obtenue du préconditionneur
172 : C
173 : SEGACT MATRIK*MOD
174 : KIDMAT(6)=ILUM
175 : KIDMAT(7)=ILUI
176 : SEGDES MATRIK
177 : C
178 : IF (IMPR.GT.6) THEN
179 : WRITE(IOIMP,*) 'création du préconditionneur Morse',
180 : $ ' de pointeurs',ILUM,'et',ILUI
181 : IF (IMPR.GT.8) THEN
181 : CALL ECMORS(ILUM,ILUI,(IMPR-1))
182 : ENDIF
183 : ENDIF
184 : ELSE
185 : IF (IMPR.GT.6) THEN
186 : WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :',
187 : $ 'ILUM=',ILUM,' et ILUI=',ILUI
188 : IF (IMPR.GT.8) THEN
188 : CALL ECMORS(ILUM,ILUI,(IMPR-1))
189 : ENDIF
190 : ENDIF
191 : ENDIF
192 : *
193 : * Normal termination
194 : *
195 : RETURN
196 : *
197 : * Format handling
198 : *
199 : *
200 : * Error handling
201 : *
202 : 9999 CONTINUE
203 : WRITE(IOIMP,*) 'An error was detected in prilut.eso'
204 : RETURN
205 : *
206 : * End of PRILUT
207 : *
208 : END
209 :
210 :
211 :
212 :
213 :
214 :
215 :
216 :
217 :
© Cast3M 2003 - All rights reserved.
Disclaimer