@@ -3,14 +3,14 @@ export idrs, idrs!
3
3
using Random
4
4
5
5
"""
6
- idrs(A, b; s = 8) -> x, [history]
6
+ idrs(A, b; s = 8, kwargs... ) -> x, [history]
7
7
8
8
Same as [`idrs!`](@ref), but allocates a solution vector `x` initialized with zeros.
9
9
"""
10
10
idrs (A, b; kwargs... ) = idrs! (zerox (A,b), A, b; kwargs... )
11
11
12
12
"""
13
- idrs!(x, A, b; s = 8) -> x, [history]
13
+ idrs!(x, A, b; s = 8, kwargs... ) -> x, [history]
14
14
15
15
Solve the problem ``Ax = b`` approximately with IDR(s), where `s` is the dimension of the
16
16
shadow space.
@@ -24,7 +24,11 @@ shadow space.
24
24
## Keywords
25
25
26
26
- `s::Integer = 8`: dimension of the shadow space;
27
- - `tol`: relative tolerance;
27
+ - `abstol::Real = zero(real(eltype(b)))`,
28
+ `reltol::Real = sqrt(eps(real(eltype(b))))`: absolute and relative
29
+ tolerance for the stopping condition
30
+ `|r_k| / |r_0| ≤ max(reltol * resnorm, abstol)`, where `r_k = A * x_k - b`
31
+ is the residual in the `k`th iteration;
28
32
- `maxiter::Int = size(A, 2)`: maximum number of iterations;
29
33
- `log::Bool`: keep track of the residual norm in each iteration;
30
34
- `verbose::Bool`: print convergence information during the iterations.
@@ -41,13 +45,25 @@ shadow space.
41
45
- `history`: convergence history.
42
46
"""
43
47
function idrs! (x, A, b;
44
- s = 8 , tol= sqrt (eps (real (eltype (b)))), maxiter= size (A, 2 ),
45
- log:: Bool = false , kwargs...
46
- )
48
+ s = 8 ,
49
+ abstol:: Real = zero (real (eltype (b))),
50
+ reltol:: Real = sqrt (eps (real (eltype (b)))),
51
+ tol = nothing , # TODO : Deprecations introduced in v0.8
52
+ maxiter= size (A, 2 ),
53
+ log:: Bool = false ,
54
+ kwargs... )
47
55
history = ConvergenceHistory (partial= ! log)
48
- history[:tol ] = tol
49
- reserve! (history,:resnorm , maxiter)
50
- idrs_method! (history, x, A, b, s, tol, maxiter; kwargs... )
56
+ history[:abstol ] = abstol
57
+ history[:reltol ] = reltol
58
+ log && reserve! (history, :resnorm , maxiter)
59
+
60
+ # TODO : Deprecations introduced in v0.8
61
+ if tol != = nothing
62
+ Base. depwarn (" The keyword argument `tol` is deprecated, use `reltol` instead." , :cg! )
63
+ reltol = tol
64
+ end
65
+
66
+ idrs_method! (history, x, A, b, s, abstol, reltol, maxiter; kwargs... )
51
67
log && shrink! (history)
52
68
log ? (x, history) : x
53
69
end
70
86
end
71
87
72
88
function idrs_method! (log:: ConvergenceHistory , X, A, C:: T ,
73
- s:: Number , tol :: Number , maxiter:: Number ; smoothing:: Bool = false , verbose:: Bool = false
89
+ s:: Number , abstol :: Real , reltol :: Real , maxiter:: Number ; smoothing:: Bool = false , verbose:: Bool = false
74
90
) where {T}
75
91
76
92
verbose && @printf (" === idrs ===\n %4s\t %7s\n " ," iter" ," resnorm" )
77
93
R = C - A* X
78
94
normR = norm (R)
79
- iter = 1
95
+ iter = 1
96
+ tol = max (reltol * normR, abstol)
80
97
81
98
if smoothing
82
99
X_s = copy (X)
0 commit comments