@@ -27,6 +27,12 @@ function LinearSolve.IterativeSolversJL_GMRES(args...; kwargs...)
27
27
generate_iterator = IterativeSolvers. gmres_iterable!,
28
28
kwargs... )
29
29
end
30
+ function LinearSolve. IterativeSolversJL_IDRS (args... ; kwargs... )
31
+ IterativeSolversJL (args... ;
32
+ generate_iterator = IterativeSolvers. idrs_iterable!,
33
+ kwargs... )
34
+ end
35
+
30
36
function LinearSolve. IterativeSolversJL_BICGSTAB (args... ; kwargs... )
31
37
IterativeSolversJL (args... ;
32
38
generate_iterator = IterativeSolvers. bicgstabl_iterator!,
@@ -47,6 +53,7 @@ function LinearSolve.init_cacheval(alg::IterativeSolversJL, A, b, u, Pl, Pr, max
47
53
reltol,
48
54
verbose:: Bool , assumptions:: OperatorAssumptions )
49
55
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
50
57
51
58
kwargs = (abstol = abstol, reltol = reltol, maxiter = maxiters,
52
59
alg. kwargs... )
@@ -59,6 +66,14 @@ function LinearSolve.init_cacheval(alg::IterativeSolversJL, A, b, u, Pl, Pr, max
59
66
elseif alg. generate_iterator === IterativeSolvers. gmres_iterable!
60
67
alg. generate_iterator (u, A, b; Pl = Pl, Pr = Pr, restart = restart,
61
68
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... )
62
77
elseif alg. generate_iterator === IterativeSolvers. bicgstabl_iterator!
63
78
! !LinearSolve. _isidentity_struct (Pr) &&
64
79
@warn " $(alg. generate_iterator) doesn't support right preconditioning"
@@ -95,7 +110,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::IterativeSolversJL; kwargs...
95
110
end
96
111
cache. verbose && println ()
97
112
98
- resid = cache. cacheval. residual
113
+ resid = cache. cacheval isa IterativeSolvers . IDRSIterable ? cache . cacheval . R : cache . cacheval . residual
99
114
if resid isa IterativeSolvers. Residual
100
115
resid = resid. current
101
116
end
0 commit comments