@@ -144,8 +144,9 @@ function solve!(x, ml::MultiLevel, b::AbstractVector{T},
144
144
maxiter:: Int = 100 ,
145
145
tol:: Float64 = 1e-5 ,
146
146
verbose:: Bool = false ,
147
- log:: Bool = false ) where {T}
148
-
147
+ log:: Bool = false ,
148
+ calculate_residual = true ) where {T}
149
+
149
150
A = length (ml) == 1 ? ml. final_A : ml. levels[1 ]. A
150
151
V = promote_type (eltype (A), eltype (b))
151
152
tol = eltype (b)(tol)
@@ -156,15 +157,20 @@ function solve!(x, ml::MultiLevel, b::AbstractVector{T},
156
157
end
157
158
log && push! (residuals, normb)
158
159
160
+ res = ml. workspace. res_vecs[1 ]
159
161
itr = lvl = 1
160
- while itr <= maxiter && normres > tol
162
+ while itr <= maxiter && ( ! calculate_residual || normres > tol)
161
163
if length (ml) == 1
162
164
ml. coarse_solver (x, b)
163
165
else
164
166
__solve! (x, ml, cycle, b, lvl)
165
167
end
166
- normres = norm (b - A * x)
167
- log && push! (residuals, normres)
168
+ if calculate_residual
169
+ mul! (res, A, x)
170
+ res .= b .- res
171
+ normres = norm (res)
172
+ log && push! (residuals, normres)
173
+ end
168
174
itr += 1
169
175
end
170
176
@@ -176,7 +182,10 @@ function __solve!(x, ml, v::V, b, lvl)
176
182
A = ml. levels[lvl]. A
177
183
ml. presmoother (A, x, b)
178
184
179
- res = b - A * x
185
+ res = ml. workspace. res_vecs[lvl]
186
+ mul! (res, A, x)
187
+ res .= b .- res
188
+
180
189
coarse_b = ml. levels[lvl]. R * res
181
190
coarse_x = zeros (eltype (coarse_b), size (coarse_b))
182
191
0 commit comments