Skip to content

Commit 7537ef9

Browse files
committed
standardize keywords for gmres_restart, maxiters, verbose, etc
1 parent 83ec485 commit 7537ef9

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

src/wrappers.jl

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11

2+
#TODO: composed preconditioners, preconditioner setter for cache,
3+
# detailed tests for wrappers
4+
25
## Preconditioners
36

47
struct ScaleVector{T}
@@ -127,14 +130,26 @@ function SciMLBase.solve(cache::LinearCache, alg::KrylovJL; kwargs...)
127130
cache = set_cacheval(cache, solver)
128131
end
129132

130-
abstol = (alg.abstol == 0) ? eps(eltype(cache.b)) : alg.abstol
131-
reltol = (alg.reltol == 0) ? eps(eltype(cache.b)) : alg.reltol
132-
maxiter = (alg.reltol == 0) ? length(cache.b) : alg.maxiter
133+
abstol = (alg.abstol == 0) ? eps(eltype(cache.b)) : alg.abstol
134+
reltol = (alg.reltol == 0) ? eps(eltype(cache.b)) : alg.reltol
135+
maxiter = (alg.maxiter == 0) ? length(cache.b) : alg.maxiter
136+
137+
138+
args = (cache.cacheval, cache.A, cache.b)
139+
kwargs = (atol=abstol, rtol=reltol, itmax=maxiter, alg.kwargs...)
133140

134-
Krylov.solve!(cache.cacheval, cache.A, cache.b;
135-
M=alg.Pl, N=alg.Pr,
136-
atol = abstol, rtol = reltol, itmax = maxiter,
137-
alg.kwargs...)
141+
if cache.cacheval == Krylov.CgSolver
142+
alg.Pr != LinearAlgebra.I &&
143+
@warn "$(alg.KrylovAlg) doesn't support right preconditioning."
144+
Krylov.solve!(args...; M=alg.Pl,
145+
kwargs...)
146+
elseif cache.cacheval == Krylov.GmresSolver
147+
Krylov.solve!(args...; M=alg.Pl, N=alg.Pr,
148+
kwargs...)
149+
else
150+
Krylov.solve!(args...; M=alg.Pl, N=alg.Pr,
151+
kwargs...)
152+
end
138153

139154
return cache.u
140155
end
@@ -177,20 +192,21 @@ function init_cacheval(alg::IterativeSolversJL, A, b, u)
177192
Pl = (alg.Pl == LinearAlgebra.I) ? IterativeSolvers.Identity() : alg.Pl
178193
Pr = (alg.Pr == LinearAlgebra.I) ? IterativeSolvers.Identity() : alg.Pr
179194

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
195+
abstol = (alg.abstol == 0) ? eps(eltype(b)) : alg.abstol
196+
reltol = (alg.reltol == 0) ? eps(eltype(b)) : alg.reltol
197+
maxiter = (alg.maxiter == 0) ? length(b) : alg.maxiter
198+
199+
# args = (u, A, b)
200+
kwargs = (abstol=abstol, reltol=reltol, maxiter=maxiter, alg.kwargs...)
183201

184202
iterable = if alg.generate_iterator === IterativeSolvers.cg_iterator!
185203
Pr != IterativeSolvers.Identity() &&
186204
@warn "$(alg.generate_iterator) doesn't support right preconditioning"
187205
alg.generate_iterator(u, A, b, Pl;
188-
abstol=abstol, reltol=reltol, maxiter=maxiter,
189-
alg.kwargs...)
206+
kwargs...)
190207
elseif alg.generate_iterator === IterativeSolvers.gmres_iterable!
191208
alg.generate_iterator(u, A, b; Pl=Pl, Pr=Pr,
192-
abstol=abstol, reltol=reltol, maxiter=maxiter,
193-
alg.kwargs...)
209+
kwargs...)
194210
elseif alg.generate_iterator === IterativeSolvers.bicgstabl_iterator!
195211
Pr != IterativeSolvers.Identity() &&
196212
@warn "$(alg.generate_iterator) doesn't support right preconditioning"

0 commit comments

Comments
 (0)