Skip to content

Commit 6baa523

Browse files
Merge pull request #404 from mschauer/idrs
Add IDR(s) from IterativeSolvers
2 parents a409857 + 02155b7 commit 6baa523

File tree

6 files changed

+36
-4
lines changed

6 files changed

+36
-4
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ EnzymeCore = "0.5, 0.6"
6767
FastLapackInterface = "1, 2"
6868
GPUArraysCore = "0.1"
6969
HYPRE = "1.4.0"
70-
IterativeSolvers = "0.9.2"
70+
IterativeSolvers = "0.9.3"
7171
KLU = "0.3.0, 0.4"
7272
KernelAbstractions = "0.9"
7373
Krylov = "0.9"

docs/src/solvers/solvers.md

+1
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ IterativeSolversJL_CG
221221
IterativeSolversJL_GMRES
222222
IterativeSolversJL_BICGSTAB
223223
IterativeSolversJL_MINRES
224+
IterativeSolversJL_IDRS
224225
IterativeSolversJL
225226
```
226227

ext/LinearSolveIterativeSolversExt.jl

+16-1
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

+1-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ export LinearSolveFunction, DirectLdiv!
217217
export KrylovJL, KrylovJL_CG, KrylovJL_MINRES, KrylovJL_GMRES,
218218
KrylovJL_BICGSTAB, KrylovJL_LSMR, KrylovJL_CRAIGMR,
219219
IterativeSolversJL, IterativeSolversJL_CG, IterativeSolversJL_GMRES,
220-
IterativeSolversJL_BICGSTAB, IterativeSolversJL_MINRES,
220+
IterativeSolversJL_BICGSTAB, IterativeSolversJL_MINRES, IterativeSolversJL_IDRS,
221221
KrylovKitJL, KrylovKitJL_CG, KrylovKitJL_GMRES
222222

223223
export SimpleGMRES

src/extension_algs.jl

+15
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

+2-1
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,8 @@ end
267267
kwargs = (; gmres_restart = 5)
268268
for alg in (("Default", IterativeSolversJL(kwargs...)),
269269
("CG", IterativeSolversJL_CG(kwargs...)),
270-
("GMRES", IterativeSolversJL_GMRES(kwargs...))
270+
("GMRES", IterativeSolversJL_GMRES(kwargs...)),
271+
("IDRS", IterativeSolversJL_IDRS(kwargs...))
271272
# ("BICGSTAB",IterativeSolversJL_BICGSTAB(kwargs...)),
272273
# ("MINRES",IterativeSolversJL_MINRES(kwargs...)),
273274
)

0 commit comments

Comments
 (0)