@@ -27,6 +27,12 @@ function LinearSolve.IterativeSolversJL_GMRES(args...; kwargs...)
2727 generate_iterator = IterativeSolvers. gmres_iterable!,
2828 kwargs... )
2929end
30+ function LinearSolve. IterativeSolversJL_IDRS (args... ; kwargs... )
31+ IterativeSolversJL (args... ;
32+ generate_iterator = IterativeSolvers. idrs_iterable!,
33+ kwargs... )
34+ end
35+
3036function 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
0 commit comments