@@ -32,16 +32,17 @@ mutable struct MINRESIterable{matT, solT, vecT <: DenseVector, smallVecT <: Dens
32
32
# Bookkeeping
33
33
mv_products:: Int
34
34
maxiter:: Int
35
- tolerance :: realT
35
+ tol :: realT
36
36
resnorm:: realT
37
37
end
38
38
39
39
function minres_iterable! (x, A, b;
40
- initially_zero:: Bool = false ,
41
- skew_hermitian:: Bool = false ,
42
- tol = sqrt (eps (real (eltype (b)))),
43
- maxiter = size (A, 2 )
44
- )
40
+ initially_zero:: Bool = false ,
41
+ skew_hermitian:: Bool = false ,
42
+ abstol:: Real = zero (real (eltype (b))),
43
+ reltol:: Real = sqrt (eps (real (eltype (b)))),
44
+ tol = nothing , # TODO : Deprecations introduced in v0.8
45
+ maxiter = size (A, 2 ))
45
46
T = eltype (x)
46
47
HessenbergT = skew_hermitian ? T : real (T)
47
48
@@ -53,6 +54,12 @@ function minres_iterable!(x, A, b;
53
54
w_curr = similar (x)
54
55
w_next = similar (x)
55
56
57
+ # TODO : Deprecations introduced in v0.8
58
+ if tol != = nothing
59
+ Base. depwarn (" The keyword argument `tol` is deprecated, use `reltol` instead." , :minres_iterable! )
60
+ reltol = tol
61
+ end
62
+
56
63
mv_products = 0
57
64
58
65
# For nonzero x's, we must do an MV for the initial residual vec
@@ -64,7 +71,7 @@ function minres_iterable!(x, A, b;
64
71
end
65
72
66
73
resnorm = norm (v_curr)
67
- reltol = resnorm * tol
74
+ tolerance = max (reltol * resnorm, abstol)
68
75
69
76
# Last active column of the Hessenberg matrix
70
77
# and last two entries of the right-hand side
@@ -84,18 +91,21 @@ function minres_iterable!(x, A, b;
84
91
w_prev, w_curr, w_next,
85
92
H, rhs,
86
93
c_prev, s_prev, c_curr, s_curr,
87
- mv_products, maxiter, reltol , resnorm
94
+ mv_products, maxiter, tolerance , resnorm
88
95
)
89
96
end
90
97
91
- converged (m:: MINRESIterable ) = m. resnorm ≤ m. tolerance
98
+ converged (m:: MINRESIterable ) = m. resnorm ≤ m. tol
92
99
93
100
start (:: MINRESIterable ) = 1
94
101
95
102
done (m:: MINRESIterable , iteration:: Int ) = iteration > m. maxiter || converged (m)
96
103
97
104
function iterate (m:: MINRESIterable , iteration:: Int = start (m))
98
- if done (m, iteration) return nothing end
105
+ # Check for termination first
106
+ if done (m, iteration)
107
+ return nothing
108
+ end
99
109
100
110
# v_next = A * v_curr - H[2] * v_prev
101
111
mul! (m. v_next, m. A, m. v_curr)
@@ -172,7 +182,13 @@ Solve Ax = b for (skew-)Hermitian matrices A using MINRES.
172
182
matrix-vector product can be saved when computing the initial
173
183
residual vector;
174
184
- `skew_hermitian::Bool = false`: if `true` assumes that `A` is skew-symmetric or skew-Hermitian;
175
- - `tol`: tolerance for stopping condition `|r_k| / |r_0| ≤ tol`. Note that the residual is computed only approximately;
185
+ - `abstol::Real = zero(real(eltype(b)))`,
186
+ `reltol::Real = sqrt(eps(real(eltype(b))))`: absolute and relative
187
+ tolerance for the stopping condition
188
+ `|r_k| / |r_0| ≤ max(reltol * resnorm, abstol)`, where `r_k = A * x_k - b`
189
+ is the residual in the `k`th iteration
190
+ !!! note
191
+ The residual is computed only approximately.
176
192
- `maxiter::Int = size(A, 2)`: maximum number of iterations;
177
193
- `Pl`: left preconditioner;
178
194
- `Pr`: right preconditioner;
@@ -191,20 +207,27 @@ Solve Ax = b for (skew-)Hermitian matrices A using MINRES.
191
207
- `history`: convergence history.
192
208
"""
193
209
function minres! (x, A, b;
194
- skew_hermitian:: Bool = false ,
195
- verbose:: Bool = false ,
196
- log:: Bool = false ,
197
- tol = sqrt (eps (real (eltype (b)))),
198
- maxiter:: Int = size (A, 2 ),
199
- initially_zero:: Bool = false
200
- )
210
+ skew_hermitian:: Bool = false ,
211
+ verbose:: Bool = false ,
212
+ log:: Bool = false ,
213
+ abstol:: Real = zero (real (eltype (b))),
214
+ reltol:: Real = sqrt (eps (real (eltype (b)))),
215
+ tol = nothing , # TODO : Deprecations introduced in v0.8
216
+ maxiter:: Int = size (A, 2 ),
217
+ initially_zero:: Bool = false )
201
218
history = ConvergenceHistory (partial = ! log)
202
219
history[:tol ] = tol
203
220
log && reserve! (history, :resnorm , maxiter)
204
221
222
+ # TODO : Deprecations introduced in v0.8
223
+ if tol != = nothing
224
+ Base. depwarn (" The keyword argument `tol` is deprecated, use `reltol` instead." , :minres! )
225
+ reltol = tol
226
+ end
227
+
205
228
iterable = minres_iterable! (x, A, b;
206
229
skew_hermitian = skew_hermitian,
207
- tol = tol ,
230
+ abstol = abstol, reltol = reltol ,
208
231
maxiter = maxiter,
209
232
initially_zero = initially_zero
210
233
)
0 commit comments