1
1
2
- """
3
- TODO
4
- - account for standard kwargs: abstol, reltol, maxiter, restart, window
5
- - KrylovJL: memory, window <-- Solver, itmax, atol, rtol <-- Solve
6
- - IterativeSolversJL: restart
7
- """
8
-
9
-
10
2
# # Preconditioners
11
3
12
4
struct ScaleVector{T}
36
28
37
29
# # Krylov.jl
38
30
39
- struct KrylovJL{F,Tl,Tr,A,K, T, I } <: SciMLLinearSolveAlgorithm
31
+ struct KrylovJL{F,Tl,Tr,T,I,A,K } <: SciMLLinearSolveAlgorithm
40
32
KrylovAlg:: F
41
33
Pl:: Tl
42
34
Pr:: Tr
@@ -59,9 +51,14 @@ function KrylovJL(args...; KrylovAlg = Krylov.gmres!, Pl=I, Pr=I,
59
51
args, kwargs)
60
52
end
61
53
62
- KrylovJL_CG (args... ;kwargs... ) = KrylovJL (Krylov. cg!, args... ; kwargs... )
63
- KrylovJL_GMRES (args... ;kwargs... ) = KrylovJL (Krylov. gmres!, args... ; kwargs... )
64
- KrylovJL_BICGSTAB (args... ;kwargs... ) = KrylovJL (Krylov. bicgstab!, args... ; kwargs... )
54
+ KrylovJL_CG (args... ;kwargs... ) =
55
+ KrylovJL (Krylov. cg!, args... ; kwargs... )
56
+ KrylovJL_GMRES (args... ;kwargs... ) =
57
+ KrylovJL (Krylov. gmres!, args... ; kwargs... )
58
+ KrylovJL_BICGSTAB (args... ;kwargs... ) =
59
+ KrylovJL (Krylov. bicgstab!, args... ; kwargs... )
60
+ KrylovJL_MINRES (args... ;kwargs... ) =
61
+ KrylovJL (Krylov. minres!, args... ; kwargs... )
65
62
66
63
const KrylovJL_solvers = Dict (
67
64
(Krylov. lsmr! => Krylov. LsmrSolver ),
@@ -101,8 +98,8 @@ function init_cacheval(alg::KrylovJL, A, b, u)
101
98
102
99
KS = KrylovJL_solvers[alg. KrylovAlg]
103
100
104
- solver =
105
- if ( KS === Krylov. DqgmresSolver ||
101
+ solver = if (
102
+ KS === Krylov. DqgmresSolver ||
106
103
KS === Krylov. DiomSolver ||
107
104
KS === Krylov. GmresSolver ||
108
105
KS === Krylov. FormSovler
@@ -135,7 +132,7 @@ function SciMLBase.solve(cache::LinearCache, alg::KrylovJL; kwargs...)
135
132
maxiter = (alg. reltol == 0 ) ? length (cache. b) : alg. maxiter
136
133
137
134
Krylov. solve! (cache. cacheval, cache. A, cache. b;
138
- M= cache . Pl, N= cache . Pr,
135
+ M= alg . Pl, N= alg . Pr,
139
136
atol = abstol, rtol = reltol, itmax = maxiter,
140
137
alg. kwargs... )
141
138
@@ -144,24 +141,27 @@ end
144
141
145
142
# # IterativeSolvers.jl
146
143
147
- struct IterativeSolversJL{F,Tl,Tr,A,K} <: SciMLLinearSolveAlgorithm
144
+ struct IterativeSolversJL{F,Tl,Tr,T,I, A,K} <: SciMLLinearSolveAlgorithm
148
145
generate_iterator:: F
149
146
Pl:: Tl
150
147
Pr:: Tr
148
+ abstol:: T
149
+ reltol:: T
150
+ maxiter:: I
151
+ restart:: I
151
152
args:: A
152
153
kwargs:: K
153
- # abstol::T
154
- # reltol::T
155
- # maxiter::I
156
- # restart::I
157
154
end
158
155
159
156
function IterativeSolversJL (args... ;
157
+ generate_iterator = IterativeSolvers. gmres_iterable!,
160
158
Pl= IterativeSolvers. Identity (),
161
159
Pr= IterativeSolvers. Identity (),
162
- generate_iterator = IterativeSolvers . gmres_iterable! ,
160
+ abstol = 0.0 , reltol = 0.0 , maxiter = 0 , restart = 0 ,
163
161
kwargs... )
164
- return IterativeSolversJL (generate_iterator, Pl, Pr, args, kwargs)
162
+ return IterativeSolversJL (generate_iterator, Pl, Pr,
163
+ abstol, reltol, maxiter, restart,
164
+ args, kwargs)
165
165
end
166
166
167
167
IterativeSolversJL_CG (args... ; kwargs... ) =
@@ -170,43 +170,51 @@ IterativeSolversJL_GMRES(args...;kwargs...) =
170
170
IterativeSolversJL (IterativeSolvers. gmres_iterable!, args... ; kwargs... )
171
171
IterativeSolversJL_BICGSTAB (args... ;kwargs... ) =
172
172
IterativeSolversJL (IterativeSolvers. bicgstabl_iterator!, args... ;kwargs... )
173
+ IterativeSolversJL_MINRES (args... ;kwargs... ) =
174
+ IterativeSolversJL (IterativeSolvers. minres_iterable!, args... ;kwargs... )
173
175
174
- function init_cacheval (alg:: IterativeSolversJL , A, b, u, Pl, Pr )
175
- Pl = (Pl == LinearAlgebra. I) ? IterativeSolvers. Identity () : Pl
176
- Pr = (Pr == LinearAlgebra. I) ? IterativeSolvers. Identity () : Pr
176
+ function init_cacheval (alg:: IterativeSolversJL , A, b, u)
177
+ Pl = (alg . Pl == LinearAlgebra. I) ? IterativeSolvers. Identity () : alg . Pl
178
+ Pr = (alg . Pr == LinearAlgebra. I) ? IterativeSolvers. Identity () : alg . Pr
177
179
178
- # standard kwargs: abstol, reltol
179
- #
180
- # cg: kw: maxiter
181
- # gmres: kw: restart=20, maxiter=length(b)
182
- # bicgstabl: kw: max_mv_products
180
+ abstol = (alg. abstol == 0 ) ? √ eps (eltype (b)) : alg. abstol
181
+ reltol = (alg. reltol == 0 ) ? √ eps (eltype (b)) : alg. reltol
182
+ maxiter = (alg. reltol == 0 ) ? length (b) : alg. maxiter
183
183
184
- cacheval = if alg. generate_iterator === IterativeSolvers. cg_iterator!
184
+ iterable = if alg. generate_iterator === IterativeSolvers. cg_iterator!
185
185
Pr != IterativeSolvers. Identity () &&
186
- @warn " $(alg. generate_iterator) doesn't support right preconditioning"
187
- alg. generate_iterator (u, A, b, Pl; alg. kwargs... )
186
+ @warn " $(alg. generate_iterator) doesn't support right preconditioning"
187
+ alg. generate_iterator (u, A, b, Pl;
188
+ abstol= abstol, reltol= reltol, maxiter= maxiter,
189
+ alg. kwargs... )
188
190
elseif alg. generate_iterator === IterativeSolvers. gmres_iterable!
189
- alg. generate_iterator (u, A, b; Pl= Pl, Pr= Pr, alg. kwargs... )
191
+ alg. generate_iterator (u, A, b; Pl= Pl, Pr= Pr,
192
+ abstol= abstol, reltol= reltol, maxiter= maxiter,
193
+ alg. kwargs... )
190
194
elseif alg. generate_iterator === IterativeSolvers. bicgstabl_iterator!
191
195
Pr != IterativeSolvers. Identity () &&
192
- @warn " $(alg. generate_iterator) doesn't support right preconditioning"
193
- alg. generate_iterator (u, A, b, alg. args... ; Pl= Pl, alg. kwargs... )
194
- else
195
- alg. generate_iterator (u, A, b, alg. args... ; alg. kwargs... )
196
+ @warn " $(alg. generate_iterator) doesn't support right preconditioning"
197
+ alg. generate_iterator (u, A, b, alg. args... ; Pl= Pl,
198
+ abstol= abstol, reltol= reltol,
199
+ max_mv_products= maxiter* 2 ,
200
+ alg. kwargs... )
201
+ else # minres, qmr
202
+ alg. generate_iterator (u, A, b, alg. args... ;
203
+ abstol= abstol, reltol= reltol, maxiter= maxiter,
204
+ alg. kwargs... )
196
205
end
197
- return cacheval
206
+ return iterable
198
207
end
199
208
200
209
function SciMLBase. solve (cache:: LinearCache , alg:: IterativeSolversJL ; kwargs... )
201
210
if cache. isfresh
202
- solver = init_cacheval (alg, cache. A, cache. b, cache. u,
203
- cache. Pl, cache. Pr)
211
+ solver = init_cacheval (alg, cache. A, cache. b, cache. u)
204
212
cache = set_cacheval (cache, solver)
205
213
end
206
214
207
215
for resi in cache. cacheval
208
216
# allow for verbose, log
209
- # inject specific code into KSP solve
217
+ # inject specific code into KSP solve func!(cache.cacheval)
210
218
end
211
219
212
220
return cache. u
0 commit comments