Skip to content

Commit 5a7aae6

Browse files
committed
Add IDR(s) from IterativeSolvers
1 parent 464156c commit 5a7aae6

File tree

5 files changed

+35
-3
lines changed

5 files changed

+35
-3
lines changed

docs/src/solvers/solvers.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ IterativeSolversJL_CG
157157
IterativeSolversJL_GMRES
158158
IterativeSolversJL_BICGSTAB
159159
IterativeSolversJL_MINRES
160+
IterativeSolversJL_IDRS
160161
IterativeSolversJL
161162
```
162163

ext/LinearSolveIterativeSolversExt.jl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ function LinearSolve.IterativeSolversJL_GMRES(args...; kwargs...)
2727
generate_iterator = IterativeSolvers.gmres_iterable!,
2828
kwargs...)
2929
end
30+
function LinearSolve.IterativeSolversJL_IDRS(args...; kwargs...)
31+
IterativeSolversJL(args...;
32+
generate_iterator = IterativeSolvers.idrs_iterable!,
33+
kwargs...)
34+
end
35+
3036
function LinearSolve.IterativeSolversJL_BICGSTAB(args...; kwargs...)
3137
IterativeSolversJL(args...;
3238
generate_iterator = IterativeSolvers.bicgstabl_iterator!,
@@ -47,6 +53,7 @@ function LinearSolve.init_cacheval(alg::IterativeSolversJL, A, b, u, Pl, Pr, max
4753
reltol,
4854
verbose::Bool, assumptions::OperatorAssumptions)
4955
restart = (alg.gmres_restart == 0) ? min(20, size(A, 1)) : alg.gmres_restart
56+
s = :idrs_s in keys(alg.kwargs) ? alg.kwargs.idrs_s : 4 # shadow space
5057

5158
kwargs = (abstol = abstol, reltol = reltol, maxiter = maxiters,
5259
alg.kwargs...)
@@ -59,6 +66,14 @@ function LinearSolve.init_cacheval(alg::IterativeSolversJL, A, b, u, Pl, Pr, max
5966
elseif alg.generate_iterator === IterativeSolvers.gmres_iterable!
6067
alg.generate_iterator(u, A, b; Pl = Pl, Pr = Pr, restart = restart,
6168
kwargs...)
69+
elseif alg.generate_iterator === IterativeSolvers.idrs_iterable!
70+
!!LinearSolve._isidentity_struct(Pr) &&
71+
@warn "$(alg.generate_iterator) doesn't support right preconditioning"
72+
history = IterativeSolvers.ConvergenceHistory(partial=true)
73+
history[:abstol] = abstol
74+
history[:reltol] = reltol
75+
IterativeSolvers.idrs_iterable!(history, u, A, b, s, Pl, abstol, reltol, maxiters;
76+
alg.kwargs...)
6277
elseif alg.generate_iterator === IterativeSolvers.bicgstabl_iterator!
6378
!!LinearSolve._isidentity_struct(Pr) &&
6479
@warn "$(alg.generate_iterator) doesn't support right preconditioning"
@@ -95,7 +110,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::IterativeSolversJL; kwargs...
95110
end
96111
cache.verbose && println()
97112

98-
resid = cache.cacheval.residual
113+
resid = cache.cacheval isa IterativeSolvers.IDRSIterable ? cache.cacheval.R : cache.cacheval.residual
99114
if resid isa IterativeSolvers.Residual
100115
resid = resid.current
101116
end

src/LinearSolve.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ export LinearSolveFunction, DirectLdiv!
177177
export KrylovJL, KrylovJL_CG, KrylovJL_MINRES, KrylovJL_GMRES,
178178
KrylovJL_BICGSTAB, KrylovJL_LSMR, KrylovJL_CRAIGMR,
179179
IterativeSolversJL, IterativeSolversJL_CG, IterativeSolversJL_GMRES,
180-
IterativeSolversJL_BICGSTAB, IterativeSolversJL_MINRES,
180+
IterativeSolversJL_BICGSTAB, IterativeSolversJL_MINRES, IterativeSolversJL_IDRS,
181181
KrylovKitJL, KrylovKitJL_CG, KrylovKitJL_GMRES
182182

183183
export HYPREAlgorithm

src/extension_algs.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,21 @@ A wrapper over the IterativeSolvers.jl GMRES.
309309
"""
310310
function IterativeSolversJL_GMRES end
311311

312+
"""
313+
```julia
314+
IterativeSolversJL_IDRS(args...; Pl = nothing, kwargs...)
315+
```
316+
317+
A wrapper over the IterativeSolvers.jl IDR(S).
318+
319+
320+
!!! note
321+
322+
Using this solver requires adding the package IterativeSolvers.jl, i.e. `using IterativeSolvers`
323+
324+
"""
325+
function IterativeSolversJL_IDRS end
326+
312327
"""
313328
```julia
314329
IterativeSolversJL_BICGSTAB(args...; Pl = nothing, Pr = nothing, kwargs...)

test/basictests.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,8 @@ end
250250
kwargs = (; gmres_restart = 5)
251251
for alg in (("Default", IterativeSolversJL(kwargs...)),
252252
("CG", IterativeSolversJL_CG(kwargs...)),
253-
("GMRES", IterativeSolversJL_GMRES(kwargs...))
253+
("GMRES", IterativeSolversJL_GMRES(kwargs...)),
254+
("IDRS", IterativeSolversJL_IDRS(kwargs...))
254255
# ("BICGSTAB",IterativeSolversJL_BICGSTAB(kwargs...)),
255256
# ("MINRES",IterativeSolversJL_MINRES(kwargs...)),
256257
)

0 commit comments

Comments
 (0)