@@ -24,6 +24,7 @@ shadow space.
2424## Keywords
2525
2626- `s::Integer = 8`: dimension of the shadow space;
27+ - `Pl::precT`: left preconditioner,
2728- `abstol::Real = zero(real(eltype(b)))`,
2829 `reltol::Real = sqrt(eps(real(eltype(b))))`: absolute and relative
2930 tolerance for the stopping condition
@@ -46,6 +47,7 @@ shadow space.
4647"""
4748function idrs! (x, A, b;
4849 s = 8 ,
50+ Pl = Identity (),
4951 abstol:: Real = zero (real (eltype (b))),
5052 reltol:: Real = sqrt (eps (real (eltype (b)))),
5153 maxiter= size (A, 2 ),
@@ -55,7 +57,7 @@ function idrs!(x, A, b;
5557 history[:abstol ] = abstol
5658 history[:reltol ] = reltol
5759 log && reserve! (history, :resnorm , maxiter)
58- idrs_method! (history, x, A, b, s, abstol, reltol, maxiter; kwargs... )
60+ idrs_method! (history, x, A, b, s, Pl, abstol, reltol, maxiter; kwargs... )
5961 log && shrink! (history)
6062 log ? (x, history) : x
6163end
7880end
7981
8082function idrs_method! (log:: ConvergenceHistory , X, A, C:: T ,
81- s:: Number , abstol:: Real , reltol:: Real , maxiter:: Number ; smoothing:: Bool = false , verbose:: Bool = false
82- ) where {T}
83+ s:: Number , Pl :: precT , abstol:: Real , reltol:: Real , maxiter:: Number ; smoothing:: Bool = false , verbose:: Bool = false
84+ ) where {T, precT }
8385
8486 verbose && @printf (" === idrs ===\n %4s\t %7s\n " ," iter" ," resnorm" )
8587 R = C - A* X
@@ -129,6 +131,9 @@ function idrs_method!(log::ConvergenceHistory, X, A, C::T,
129131 Q .+ = c[i- k+ 1 ] .* U[i]
130132 end
131133
134+ # Preconditioning
135+ ldiv! (Pl, V)
136+
132137 # Compute new U[:,k] and G[:,k], G[:,k] is in space G_j
133138 V .= R .- V
134139
@@ -181,6 +186,10 @@ function idrs_method!(log::ConvergenceHistory, X, A, C::T,
181186 # Now we have sufficient vectors in G_j to compute residual in G_j+1
182187 # Note: r is already perpendicular to P so v = r
183188 copyto! (V, R)
189+
190+ # Preconditioning
191+ ldiv! (Pl, V)
192+
184193 mul! (Q, A, V)
185194 om = omega (Q, R)
186195 R .- = om .* Q
0 commit comments