1 : C PRDILU SOURCE MAGN 09/07/30 21:20:17 6458
2 : SUBROUTINE PRDILU(KMORS,KISA,MATRIK,IMPR,IRET)
3 : IMPLICIT INTEGER(I-N)
4 : IMPLICIT REAL*8 (A-H,O-Z)
5 : C***********************************************************************
6 : C NOM : PRDILU
7 : C DESCRIPTION :
8 : C Calcul du préconditionneur D-ILU d'une matrice Morse.
9 : C D-ILU : Diagonal Incomplete LU factorization
10 : C
11 : C On stocke l'inverse des pivots du préconditionneur
12 : C dans un segment de type
13 : C IZA pointé par IDIAG du segment IDMAT
14 : C pointé par KIDMAT(1) du segment MATRIK.
15 : C (Toujours la réutilisation de l'existant...)
16 : C Normalement, aucun indice strictement nul n'est stocké
17 : C (appel de clmors dans melim) donc il suffirait de
18 : C tester l'existence de l'indice diagonal
19 : C On met toutefois un warning si l'indice est très petit.
20 : C
21 : C Ce sous-programme est en fait une interface à :
22 : C mdilus.eso : dans le cas symétrique
23 : C mdilun.eso : dans le cas non-symétrique
24 : C qui sont en Fortran presque pur (pour raison de rapidité)
25 : C et effectuent la construction proprement dite du
26 : C préconditionneur.
27 : C
28 : C ATTENTION : pour une matrice A quelconque, la factorisation
29 : C --------- D-ILU peut ne pas exister (pivot nul) ou avoir
30 : C des pivots négatifs MEME SI la factorisation
31 : C complète de A existe et n'a que des pivots
32 : C positifs.
33 : C
34 : C
35 : C LANGAGE : ESOPE
36 : C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
37 : C mél : gounand@semt2.smts.cea.fr
38 : C REFERENCE (bibtex-like) :
39 : C @BOOK{templates,
40 : C AUTHOR={R.Barrett, M.Berry, T.F.Chan, J.Demmel, J.Donato,
41 : C J.Dongarra, V.Eijkhout, R.Pozo, C.Romine,
42 : C H. Van der Vorst},
43 : C TITLE={Templates for the Solution of Linear Systems :
44 : C Building Blocks for Iterative Methods},
45 : C PUBLISHER={SIAM}, YEAR={1994}, ADDRESS={Philadelphia,PA} }
46 : C -> URL : http://www.netlib.org/templates/Templates.html
47 : C***********************************************************************
48 : C APPELES : -
49 : C***********************************************************************
50 : C ENTREES : MATRIK, IMPR
51 : C ENTREES/SORTIES : -
52 : C SORTIES : INVPIV (IDIAG dans KIDMAT(1) dans MATRIK)
53 : C IRET
54 : C CODE RETOUR (IRET) : 0 si ok
55 : C <0 si problème
56 : C MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK
57 : C on pioche dedans les informations nécessaires
58 : C (différents pointeurs, nb. de ddl...)
59 : C IMPR : niveau d'impression
60 : C INVPIV : pointeur sur segment IZA de l'include SMMATRIK
61 : C vecteur contenant l'inverse de la factorisation
62 : C D-ILU de la matrice morse pointée par MATRIK
63 : C (KIDMAT(4-5))
64 : C***********************************************************************
65 : C VERSION : v1, 01/04/98, version initiale
66 : C HISTORIQUE : v1, 01/04/98, création
67 : C HISTORIQUE : 09/02/98, on ne construit pas le préconditionneur s'il
68 : C existe déjà.
69 : C HISTORIQUE :
70 : C***********************************************************************
71 : C Prière de PRENDRE LE TEMPS de compléter les commentaires
72 : C en cas de modification de ce sous-programme afin de faciliter
73 : C la maintenance !
74 : C***********************************************************************
75 : -INC CCOPTIO
76 : -INC SMMATRIK
77 : POINTEUR KMORS.PMORS
78 : POINTEUR KISA.IZA
79 : POINTEUR INVPIV.IZA
80 : *
81 : * .. Variables locales
82 : C***
83 : IRET=0
84 : IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans prdilu'
85 : C On récupère les segments utiles
86 : SEGACT MATRIK
87 : NTTT =KNTTT
88 : IDMAT=KIDMAT(1)
89 : KSIM =KSYM
90 : SEGACT IDMAT
91 : INVPIV=IDIAG
92 : SEGDES IDMAT
93 : SEGDES MATRIK
94 : C Le préconditionneur est-il déjà construit ?
95 : C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
96 : C En fait, on surcharge tout le temps INVPIV car IDIAG peut ne pas
97 : C etre nul mais contenir autre chose que le préconditionneur
98 : C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
99 : INVPIV=0
100 : C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
101 : IF (INVPIV.EQ.0) THEN
102 : C
103 : C On parcourt les lignes de la matrice
104 : C comme il sied au stockage Morse
105 : C
106 : NBVA=NTTT
107 : SEGINI INVPIV
108 : SEGACT KMORS
109 : SEGACT KISA
110 : NNZ=KISA.A(/1)
111 : IF (KSIM.EQ.0) THEN
111 : CALL MDILUS(NTTT,NNZ,
112 : $ KMORS.IA,KMORS.JA,KISA.A,
113 : $ INVPIV.A,
114 : $ IRET)
115 : IF (IRET.NE.0) GOTO 9999
116 :
117 : ELSEIF (KSIM.EQ.2) THEN
117 : CALL MDILUN(NTTT,NNZ,
118 : $ KMORS.IA,KMORS.JA,KISA.A,
119 : $ INVPIV.A,
120 : $ IRET)
121 : IF (IRET.NE.0) GOTO 9999
122 : ELSE
123 : WRITE(IOIMP,*) 'Valeur incorrecte KSYM=',KSIM
124 : WRITE(IOIMP,*) 'dans le MATRIK',MATRIK
125 : IRET=-2
126 : GOTO 9999
127 : ENDIF
128 :
129 : IF (IMPR.GT.6) THEN
130 : WRITE(IOIMP,*) 'création du pointeur INVPIV='
131 : $ ,INVPIV
132 : IF (IMPR.GT.7) THEN
133 : WRITE(IOIMP,*) 'INVPIV(1..',NBVA,')= '
134 : WRITE(IOIMP,1002)(INVPIV.A(II),II=1,NBVA)
135 : ENDIF
136 : ENDIF
137 :
138 : SEGDES KISA
139 : SEGDES KMORS
140 : SEGDES INVPIV
141 : C
142 : C On stocke l'inverse de la diagonale obtenue
143 : C
144 : SEGACT IDMAT*MOD
145 : IDIAG=INVPIV
146 : SEGDES IDMAT
147 : ELSE
148 : IF (IMPR.GT.6) THEN
149 : WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :'
150 : WRITE(IOIMP,*) 'INVPIV=',INVPIV
151 : IF (IMPR.GT.7) THEN
152 : SEGACT INVPIV
153 : WRITE(IOIMP,*) 'INVPIV.A(1..',NBVA,')= '
154 : WRITE(IOIMP,1002)(INVPIV.A(II),II=1,NBVA)
155 : SEGDES INVPIV
156 : ENDIF
157 : ENDIF
158 : ENDIF
159 : *
160 : * Normal termination
161 : *
162 : RETURN
163 : *
164 : * Format handling
165 : *
166 : 1002 FORMAT(10(1X,1PE11.4))
167 : *
168 : * Error handling
169 : *
170 : 9999 CONTINUE
171 : WRITE(IOIMP,*) 'An error was detected in prdilu.eso'
172 : RETURN
173 : *
174 : * End of PRDILU
175 : *
176 : END
177 :
178 :
179 :
180 :
181 :
182 :
183 :
184 :
185 :
186 :
187 :
188 :
© Cast3M 2003 - All rights reserved.
Disclaimer