31
31
32
32
# # Krylov.jl
33
33
34
- struct KrylovJL{F,Tl,Tr,T, I,A,K} <: AbstractKrylovSubspaceMethod
34
+ struct KrylovJL{F,Tl,Tr,I,A,K} <: AbstractKrylovSubspaceMethod
35
35
KrylovAlg:: F
36
36
Pl:: Tl
37
37
Pr:: Tr
38
- abstol:: T
39
- reltol:: T
40
- maxiter:: I
41
- ifverbose:: Bool
42
38
gmres_restart:: I
43
39
window:: I
44
40
args:: A
45
41
kwargs:: K
46
42
end
47
43
48
44
function KrylovJL (args... ; KrylovAlg = Krylov. gmres!, Pl= I, Pr= I,
49
- abstol= 0.0 , reltol= 0.0 , maxiter= 0 , ifverbose= false ,
50
- gmres_restart= 20 , window= 0 , # for building solver
45
+ gmres_restart= 0 , window= 0 ,
51
46
kwargs... )
52
47
53
- return KrylovJL (KrylovAlg, Pl, Pr, abstol, reltol, maxiter, ifverbose,
54
- gmres_restart, window,
48
+ return KrylovJL (KrylovAlg, Pl, Pr, gmres_restart, window,
55
49
args, kwargs)
56
50
end
57
51
@@ -106,13 +100,15 @@ function init_cacheval(alg::KrylovJL, A, b, u)
106
100
107
101
KS = get_KrylovJL_solver (alg. KrylovAlg)
108
102
103
+ memory = (alg. gmres_restart == 0 ) ? min (20 , size (A,1 )) : alg. gmres_restart
104
+
109
105
solver = if (
110
106
alg. KrylovAlg === Krylov. dqgmres! ||
111
107
alg. KrylovAlg === Krylov. diom! ||
112
108
alg. KrylovAlg === Krylov. gmres! ||
113
109
alg. KrylovAlg === Krylov. fom!
114
110
)
115
- KS (A, b, alg . gmres_restart )
111
+ KS (A, b, memory )
116
112
elseif (
117
113
alg. KrylovAlg === Krylov. minres! ||
118
114
alg. KrylovAlg === Krylov. symmlq! ||
@@ -136,13 +132,13 @@ function SciMLBase.solve(cache::LinearCache, alg::KrylovJL; kwargs...)
136
132
cache = set_cacheval (cache, solver)
137
133
end
138
134
139
- abstol = (alg . abstol == 0 ) ? √ eps ( eltype ( cache. b)) : alg . abstol
140
- reltol = (alg . reltol == 0 ) ? √ eps ( eltype ( cache. b)) : alg . reltol
141
- maxiter = (alg . maxiter == 0 ) ? length ( cache. b) : alg . maxiter
142
- verbose = alg . ifverbose ? 1 : 0
135
+ atol = cache. abstol
136
+ rtol = cache. reltol
137
+ itmax = cache. maxiters
138
+ verbose = cache . verbose ? 1 : 0
143
139
144
140
args = (cache. cacheval, cache. A, cache. b)
145
- kwargs = (atol= abstol , rtol= reltol , itmax= maxiter , verbose= verbose,
141
+ kwargs = (atol= atol , rtol= rtol , itmax= itmax , verbose= verbose,
146
142
alg. kwargs... )
147
143
148
144
if cache. cacheval isa Krylov. CgSolver
@@ -170,14 +166,10 @@ end
170
166
171
167
# # IterativeSolvers.jl
172
168
173
- struct IterativeSolversJL{F,Tl,Tr,T, I,A,K} <: AbstractKrylovSubspaceMethod
169
+ struct IterativeSolversJL{F,Tl,Tr,I,A,K} <: AbstractKrylovSubspaceMethod
174
170
generate_iterator:: F
175
171
Pl:: Tl
176
172
Pr:: Tr
177
- abstol:: T
178
- reltol:: T
179
- maxiter:: I
180
- ifverbose:: Bool
181
173
gmres_restart:: I
182
174
args:: A
183
175
kwargs:: K
@@ -187,11 +179,9 @@ function IterativeSolversJL(args...;
187
179
generate_iterator = IterativeSolvers. gmres_iterable!,
188
180
Pl= IterativeSolvers. Identity (),
189
181
Pr= IterativeSolvers. Identity (),
190
- abstol= 0.0 , reltol= 0.0 , maxiter= 0 , ifverbose= true ,
191
182
gmres_restart= 0 , kwargs... )
192
- return IterativeSolversJL (generate_iterator, Pl, Pr,
193
- abstol, reltol, maxiter, ifverbose,
194
- gmres_restart, args, kwargs)
183
+ return IterativeSolversJL (generate_iterator, Pl, Pr, gmres_restart,
184
+ args, kwargs)
195
185
end
196
186
197
187
IterativeSolversJL_CG (args... ; kwargs... ) =
@@ -211,24 +201,29 @@ IterativeSolversJL_MINRES(args...;kwargs...) =
211
201
generate_iterator= IterativeSolvers. minres_iterable!,
212
202
kwargs... )
213
203
214
- function init_cacheval (alg:: IterativeSolversJL , A, b, u)
204
+ function init_cacheval (alg:: IterativeSolversJL , cache:: LinearCache )
205
+ @unpack A, b, u = cache
206
+
215
207
Pl = (alg. Pl == LinearAlgebra. I) ? IterativeSolvers. Identity () : alg. Pl
216
208
Pr = (alg. Pr == LinearAlgebra. I) ? IterativeSolvers. Identity () : alg. Pr
217
209
218
- abstol = (alg. abstol == 0 ) ? √ eps (eltype (b)) : alg. abstol
219
- reltol = (alg. reltol == 0 ) ? √ eps (eltype (b)) : alg. reltol
220
- maxiter = (alg. maxiter == 0 ) ? length (b) : alg. maxiter
210
+ abstol = cache. abstol
211
+ reltol = cache. reltol
212
+ maxiter = cache. maxiters
213
+ verbose = cache. verbose
221
214
222
- # args = (u, A, b)
223
- kwargs = (abstol= abstol, reltol= reltol, maxiter= maxiter, alg. kwargs... )
215
+ restart = (alg. gmres_restart == 0 ) ? min (20 , size (A,1 )) : alg. gmres_restart
216
+
217
+ kwargs = (abstol= abstol, reltol= reltol, maxiter= maxiter,
218
+ alg. kwargs... )
224
219
225
220
iterable = if alg. generate_iterator === IterativeSolvers. cg_iterator!
226
221
Pr != IterativeSolvers. Identity () &&
227
222
@warn " $(alg. generate_iterator) doesn't support right preconditioning"
228
223
alg. generate_iterator (u, A, b, Pl;
229
224
kwargs... )
230
225
elseif alg. generate_iterator === IterativeSolvers. gmres_iterable!
231
- alg. generate_iterator (u, A, b; Pl= Pl, Pr= Pr,
226
+ alg. generate_iterator (u, A, b; Pl= Pl, Pr= Pr, restart = restart,
232
227
kwargs... )
233
228
elseif alg. generate_iterator === IterativeSolvers. bicgstabl_iterator!
234
229
Pr != IterativeSolvers. Identity () &&
@@ -247,16 +242,16 @@ end
247
242
248
243
function SciMLBase. solve (cache:: LinearCache , alg:: IterativeSolversJL ; kwargs... )
249
244
if cache. isfresh
250
- solver = init_cacheval (alg, cache. A, cache . b, cache . u )
245
+ solver = init_cacheval (alg, cache)
251
246
cache = set_cacheval (cache, solver)
252
247
end
253
248
254
- alg . ifverbose && println (" Using IterativeSolvers.$(alg. generate_iterator) " )
249
+ cache . verbose && println (" Using IterativeSolvers.$(alg. generate_iterator) " )
255
250
for iter in enumerate (cache. cacheval)
256
- alg . ifverbose && println (" Iter: $(iter[1 ]) , residual: $(iter[2 ]) " )
257
- # inject callbacks KSP into solve cb!(cache.cacheval)
251
+ cache . verbose && println (" Iter: $(iter[1 ]) , residual: $(iter[2 ]) " )
252
+ # TODO inject callbacks KSP into solve cb!(cache.cacheval)
258
253
end
259
- alg . ifverbose && println ()
254
+ cache . verbose && println ()
260
255
261
256
return cache. u
262
257
end
0 commit comments