@@ -116,7 +116,7 @@ kwargs_block_minres = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :his
116116    Vₖ₋₁, Vₖ =  workspace. Vₖ₋₁, workspace. Vₖ
117117    ΔX, X, Q, C =  workspace. ΔX, workspace. X, workspace. Q, workspace. C
118118    D, Φ, stats =  workspace. D, workspace. Φ, workspace. stats
119-     wₖ₋₂, wₖ₋₁  =  workspace. wₖ₋₂, workspace. wₖ₋₁
119+     wₖ₋₂, wₖ₋₁, wₖ  =  workspace. wₖ₋₂, workspace. wₖ₋₁, workspace . wₖ 
120120    Hₖ₋₂, Hₖ₋₁ =  workspace. Hₖ₋₂, workspace. Hₖ₋₁
121121    τₖ₋₂, τₖ₋₁ =  workspace. τₖ₋₂, workspace. τₖ₋₁
122122    buffer =  workspace. buffer
@@ -125,15 +125,15 @@ kwargs_block_minres = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :his
125125    reset! (stats)
126126    R₀ =  warm_start ?  Q :  B
127127
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 . Λₖ 
137137
138138    #  Define the blocks D1 and D2
139139    D1 =  view (D, 1 : p, :)
@@ -242,29 +242,28 @@ kwargs_block_minres = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :his
242242      #  Compute the directions Wₖ, the last columns of Wₖ = Vₖ(Rₖ)⁻¹ ⟷ (Rₖ)ᵀ(Wₖ)ᵀ = (Vₖ)ᵀ
243243      #  w₁Λ₁ = v₁
244244      if  iter ==  1 
245-         wₖ =  wₖ₋₁
246245        wₖ .=  Vₖ
247246        rdiv! (wₖ, UpperTriangular (Λₖ))
248247      end 
249248      #  w₂Λ₂ = v₂ - w₁Γ₁
250249      if  iter ==  2 
251-         wₖ  =  wₖ₋₂ 
252-         wₖ .=  ( - wₖ₋₁  *  Γₖ₋₁) 
253-         wₖ  .+ =  Vₖ 
250+         @kswap! (wₖ₋₁, wₖ) 
251+         wₖ .=  Vₖ 
252+         mul! (wₖ, wₖ₋₁, Γₖ₋₁, α, β) 
254253        rdiv! (wₖ, UpperTriangular (Λₖ))
255254      end 
256255      #  wₖΛₖ = vₖ - wₖ₋₁Γₖ₋₁ - wₖ₋₂Πₖ₋₂
257256      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ₖ₋₁, Γₖ₋₁, α, β)
262262        rdiv! (wₖ, UpperTriangular (Λₖ))
263263      end 
264264
265265      #  Update Xₖ = VₖYₖ = WₖZₖ
266266      #  Xₖ = Xₖ₋₁ + wₖ * Φₖ
267-       R =  B -  A *  X
268267      mul! (X, wₖ, Φₖ, γ, β)
269268
270269      #  Update residual norm estimate.
@@ -277,13 +276,11 @@ kwargs_block_minres = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :his
277276      copyto! (Vₖ₋₁, Vₖ)  #  vₖ₋₁ ← vₖ
278277      copyto! (Vₖ, Q)     #  vₖ ← vₖ₊₁
279278
280-       #  Update directions  for X  and other variables... 
279+       #  Swap the pointers  for Hᵢ  and τᵢ 
281280      if  iter ≥  2 
282-         @kswap! (wₖ₋₂, wₖ₋₁)
283281        @kswap! (Hₖ₋₂, Hₖ₋₁)
284282        @kswap! (τₖ₋₂, τₖ₋₁)
285283      end 
286- 
287284      if  iter ==  1 
288285        copyto! (Hₖ₋₁, Hₖ)
289286        copyto! (τₖ₋₁, τₖ)
0 commit comments