@@ -4,7 +4,9 @@ upper_mul_tri_triview(U, X) == Tridiagonal(U*X) where U is Upper triangular Band
44function 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)
810end
911
1012function 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, 2 n + 1 )
136- resize! (ev, 2 n)
168+ resize! (data. UX. dl, 2 n)
169+ resize! (data. UX. d, 2 n + 1 )
170+ resize! (data. UX. du, 2 n)
171+
172+ resize! (data. Y. dl, 2 n)
173+ resize! (data. Y. d, 2 n + 1 )
174+ resize! (data. Y. du, 2 n)
137175 end
138176
139177
0 commit comments