Skip to content

Commit b8c29cf

Browse files
committed
split out pieces
1 parent 50d30ad commit b8c29cf

File tree

1 file changed

+44
-6
lines changed

1 file changed

+44
-6
lines changed

src/banded/tridiagonalconjugation.jl

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ upper_mul_tri_triview(U, X) == Tridiagonal(U*X) where U is Upper triangular Band
44
function upper_mul_tri_triview(U::BandedMatrix, X::Tridiagonal)
55
T = promote_type(eltype(U), eltype(X))
66
n = size(U,1)
7-
upper_mul_tri_triview!(Tridiagonal(Vector{T}(undef, n-1), Vector{T}(undef, n), Vector{T}(undef, n-1)), U, X)
7+
UX = Tridiagonal(Vector{T}(undef, n-1), Vector{T}(undef, n), Vector{T}(undef, n-1))
8+
9+
upper_mul_tri_triview!(UX, U, X)
810
end
911

1012
function upper_mul_tri_triview!(UX::Tridiagonal, U::BandedMatrix, X::Tridiagonal)
@@ -22,29 +24,60 @@ function upper_mul_tri_triview!(UX::Tridiagonal, U::BandedMatrix, X::Tridiagonal
2224
# Tridiagonal bands can be resized
2325
@assert length(Xdl)+1 == length(Xd) == length(Xdu)+1 == length(UXdl)+1 == length(UXd) == length(UXdu)+1 == n
2426

27+
UX, bⱼ, aⱼ, cⱼ, cⱼ₋₁ = initiate_upper_mul_tri_triview!(UX, U, X)
28+
UX, bⱼ, aⱼ, cⱼ, cⱼ₋₁ = main_upper_mul_tri_triview!(UX, U, X, 2:n-2, bⱼ, aⱼ, cⱼ, cⱼ₋₁)
29+
finalize_upper_mul_tri_triview!(UX, U, X, n-1, bⱼ, aⱼ, cⱼ, cⱼ₋₁)
30+
end
31+
32+
33+
function initiate_upper_mul_tri_triview!(UX, U, X)
34+
Xdl, Xd, Xdu = X.dl, X.d, X.du
35+
UXdl, UXd, UXdu = UX.dl, UX.d, UX.du
36+
Udat = U.data
37+
38+
l,u = bandwidths(U)
39+
2540
j = 1
2641
aⱼ, cⱼ = Xd[1], Xdl[1]
2742
Uⱼⱼ, Uⱼⱼ₊₁, Uⱼⱼ₊₂ = Udat[u+1,1], Udat[u,2], Udat[u-1,3] # U[j,j], U[j,j+1], U[j,j+2]
2843
UXd[1] = Uⱼⱼ*aⱼ + Uⱼⱼ₊₁*cⱼ # UX[j,j] = U[j,j]*X[j,j] + U[j,j+1]*X[j+1,j]
2944
bⱼ, aⱼ, cⱼ, cⱼ₋₁ = Xdu[1], Xd[2], Xdl[2], cⱼ # X[j,j+1], X[j+1,j+1], X[j+2,j+1], X[j+1,j]
3045
UXdu[1] = Uⱼⱼ*bⱼ + Uⱼⱼ₊₁*aⱼ + Uⱼⱼ₊₂*cⱼ # UX[j,j+1] = U[j,j]*X[j,j+1] + U[j,j+1]*X[j+1,j+1] + U[j,j+1]*X[j+1,j]
3146

32-
@inbounds for j = 2:n-2
47+
UX, bⱼ, aⱼ, cⱼ, cⱼ₋₁
48+
end
49+
50+
51+
function main_upper_mul_tri_triview!(UX, U, X, jr, bⱼ, aⱼ, cⱼ, cⱼ₋₁)
52+
Xdl, Xd, Xdu = X.dl, X.d, X.du
53+
UXdl, UXd, UXdu = UX.dl, UX.d, UX.du
54+
Udat = U.data
55+
l,u = bandwidths(U)
56+
57+
@inbounds for j = jr
3358
Uⱼⱼ, Uⱼⱼ₊₁, Uⱼⱼ₊₂ = Udat[u+1,j], Udat[u,j+1], Udat[u-1,j+2] # U[j,j], U[j,j+1], U[j,j+2]
3459
UXdl[j-1] = Uⱼⱼ*cⱼ₋₁ # UX[j,j-1] = U[j,j]*X[j,j-1]
3560
UXd[j] = Uⱼⱼ*aⱼ + Uⱼⱼ₊₁*cⱼ # UX[j,j] = U[j,j]*X[j,j] + U[j,j+1]*X[j+1,j]
3661
bⱼ, aⱼ, cⱼ, cⱼ₋₁ = Xdu[j], Xd[j+1], Xdl[j+1], cⱼ # X[j,j+1], X[j+1,j+1], X[j+2,j+1], X[j+1,j]
3762
UXdu[j] = Uⱼⱼ*bⱼ + Uⱼⱼ₊₁*aⱼ + Uⱼⱼ₊₂*cⱼ # UX[j,j+1] = U[j,j]*X[j,j+1] + U[j,j+1]*X[j+1,j+1] + U[j,j+2]*X[j+2,j+1]
3863
end
3964

40-
j = n-1
65+
UX, bⱼ, aⱼ, cⱼ, cⱼ₋₁
66+
end
67+
68+
function finalize_upper_mul_tri_triview!(UX, U, X, j, bⱼ, aⱼ, cⱼ, cⱼ₋₁)
69+
Xdl, Xd, Xdu = X.dl, X.d, X.du
70+
UXdl, UXd, UXdu = UX.dl, UX.d, UX.du
71+
Udat = U.data
72+
l,u = bandwidths(U)
73+
4174
Uⱼⱼ, Uⱼⱼ₊₁ = Udat[u+1,j], Udat[u,j+1] # U[j,j], U[j,j+1]
4275
UXdl[j-1] = Uⱼⱼ*cⱼ₋₁ # UX[j,j-1] = U[j,j]*X[j,j-1]
4376
UXd[j] = Uⱼⱼ*aⱼ + Uⱼⱼ₊₁*cⱼ # UX[j,j] = U[j,j]*X[j,j] + U[j,j+1]*X[j+1,j]
4477
bⱼ, aⱼ, cⱼ₋₁ = Xdu[j], Xd[j+1], cⱼ # X[j,j+1], X[j+1,j+1], X[j+2,j+1], X[j+1,j]
4578
UXdu[j] = Uⱼⱼ*bⱼ + Uⱼⱼ₊₁*aⱼ # UX[j,j+1] = U[j,j]*X[j,j+1] + U[j,j+1]*X[j+1,j+1] + U[j,j+2]*X[j+2,j+1]
4679

47-
j = n
80+
j += 1
4881
Uⱼⱼ = Udat[u+1,j] # U[j,j]
4982
UXdl[j-1] = Uⱼⱼ*cⱼ₋₁ # UX[j,j-1] = U[j,j]*X[j,j-1]
5083
UXd[j] = Uⱼⱼ*aⱼ # UX[j,j] = U[j,j]*X[j,j] + U[j,j+1]*X[j+1,j]
@@ -132,8 +165,13 @@ function resizedata!(data::TridiagonalConjugationData, n)
132165
n = max(v, n)
133166
dv, ev = data.dv, data.ev
134167
if n > length(ev) # Avoid O(n²) growing. Note min(length(dv), length(ev)) == length(ev)
135-
resize!(dv, 2n + 1)
136-
resize!(ev, 2n)
168+
resize!(data.UX.dl, 2n)
169+
resize!(data.UX.d, 2n + 1)
170+
resize!(data.UX.du, 2n)
171+
172+
resize!(data.Y.dl, 2n)
173+
resize!(data.Y.d, 2n + 1)
174+
resize!(data.Y.du, 2n)
137175
end
138176

139177

0 commit comments

Comments
 (0)