@@ -116,7 +116,7 @@ kwargs_block_minres = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :his
116
116
Vₖ₋₁, Vₖ = workspace. Vₖ₋₁, workspace. Vₖ
117
117
ΔX, X, Q, C = workspace. ΔX, workspace. X, workspace. Q, workspace. C
118
118
D, Φ, stats = workspace. D, workspace. Φ, workspace. stats
119
- wₖ₋₂, wₖ₋₁ = workspace. wₖ₋₂, workspace. wₖ₋₁
119
+ wₖ₋₂, wₖ₋₁, wₖ = workspace. wₖ₋₂, workspace. wₖ₋₁, workspace . wₖ
120
120
Hₖ₋₂, Hₖ₋₁ = workspace. Hₖ₋₂, workspace. Hₖ₋₁
121
121
τₖ₋₂, τₖ₋₁ = workspace. τₖ₋₂, workspace. τₖ₋₁
122
122
buffer = workspace. buffer
@@ -125,15 +125,15 @@ kwargs_block_minres = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :his
125
125
reset! (stats)
126
126
R₀ = warm_start ? Q : B
127
127
128
- # Temporary buffers -- should be stored in the workspace
129
- Ψₖ = similar (B, p, p)
130
- Ωₖ = similar (B, p, p)
131
- Ψₖ₊₁ = similar (B, p, p)
132
- Πₖ₋₂ = similar (B, p, p)
133
- Γbarₖ₋₁ = similar (B, p, p)
134
- Γₖ₋₁ = similar (B, p, p)
135
- Λbarₖ = similar (B, p, p)
136
- Λₖ = similar (B, p, p)
128
+ # Matrices in the workspace (some of them could be removed in the future)
129
+ Ψₖ = workspace . Ψₖ
130
+ Ωₖ = workspace . Ωₖ
131
+ Ψₖ₊₁ = workspace . Ψₖ₊₁
132
+ Πₖ₋₂ = workspace . Πₖ₋₂
133
+ Γbarₖ₋₁ = workspace . Γbarₖ₋₁
134
+ Γₖ₋₁ = workspace . Γₖ₋₁
135
+ Λbarₖ = workspace . Λbarₖ
136
+ Λₖ = workspace . Λₖ
137
137
138
138
# Define the blocks D1 and D2
139
139
D1 = view (D, 1 : p, :)
@@ -242,29 +242,28 @@ kwargs_block_minres = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :his
242
242
# Compute the directions Wₖ, the last columns of Wₖ = Vₖ(Rₖ)⁻¹ ⟷ (Rₖ)ᵀ(Wₖ)ᵀ = (Vₖ)ᵀ
243
243
# w₁Λ₁ = v₁
244
244
if iter == 1
245
- wₖ = wₖ₋₁
246
245
wₖ .= Vₖ
247
246
rdiv! (wₖ, UpperTriangular (Λₖ))
248
247
end
249
248
# w₂Λ₂ = v₂ - w₁Γ₁
250
249
if iter == 2
251
- wₖ = wₖ₋₂
252
- wₖ .= ( - wₖ₋₁ * Γₖ₋₁)
253
- wₖ .+ = Vₖ
250
+ @kswap! (wₖ₋₁, wₖ)
251
+ wₖ .= Vₖ
252
+ mul! (wₖ, wₖ₋₁, Γₖ₋₁, α, β)
254
253
rdiv! (wₖ, UpperTriangular (Λₖ))
255
254
end
256
255
# wₖΛₖ = vₖ - wₖ₋₁Γₖ₋₁ - wₖ₋₂Πₖ₋₂
257
256
if iter ≥ 3
258
- wₖ = wₖ₋₂
259
- wₖ .= (- wₖ₋₂ * Πₖ₋₂)
260
- wₖ .= (wₖ - wₖ₋₁ * Γₖ₋₁)
261
- wₖ .+ = Vₖ
257
+ @kswap! (wₖ₋₂, wₖ₋₁)
258
+ @kswap! (wₖ₋₁, wₖ)
259
+ wₖ .= Vₖ
260
+ mul! (wₖ, wₖ₋₂, Πₖ₋₂, α, β)
261
+ mul! (wₖ, wₖ₋₁, Γₖ₋₁, α, β)
262
262
rdiv! (wₖ, UpperTriangular (Λₖ))
263
263
end
264
264
265
265
# Update Xₖ = VₖYₖ = WₖZₖ
266
266
# Xₖ = Xₖ₋₁ + wₖ * Φₖ
267
- R = B - A * X
268
267
mul! (X, wₖ, Φₖ, γ, β)
269
268
270
269
# Update residual norm estimate.
@@ -277,13 +276,11 @@ kwargs_block_minres = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :his
277
276
copyto! (Vₖ₋₁, Vₖ) # vₖ₋₁ ← vₖ
278
277
copyto! (Vₖ, Q) # vₖ ← vₖ₊₁
279
278
280
- # Update directions for X and other variables...
279
+ # Swap the pointers for Hᵢ and τᵢ
281
280
if iter ≥ 2
282
- @kswap! (wₖ₋₂, wₖ₋₁)
283
281
@kswap! (Hₖ₋₂, Hₖ₋₁)
284
282
@kswap! (τₖ₋₂, τₖ₋₁)
285
283
end
286
-
287
284
if iter == 1
288
285
copyto! (Hₖ₋₁, Hₖ)
289
286
copyto! (τₖ₋₁, τₖ)
0 commit comments