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