@@ -36,10 +36,12 @@ function sizes_from_blocks(A::Diagonal, _)
36
36
end
37
37
38
38
39
- # Block Tridiagonal
39
+ # Block Bi/ Tridiagonal
40
40
const BlockTridiagonal{T,VT<: Matrix{T} } = BlockMatrix{T,<: Tridiagonal{VT} }
41
+ const BlockBidiagonal{T,VT<: Matrix{T} } = BlockMatrix{T,<: Bidiagonal{VT} }
41
42
42
43
BlockTridiagonal (A,B,C) = mortar (Tridiagonal (A,B,C))
44
+ BlockBidiagonal (A, B, uplo) = mortar (Bidiagonal (A,B,uplo))
43
45
44
46
function sizes_from_blocks (A:: Tridiagonal , _)
45
47
# for k = 1:length(A.du)
@@ -51,9 +53,26 @@ function sizes_from_blocks(A::Tridiagonal, _)
51
53
(size .(A. d, 1 ), size .(A. d,2 ))
52
54
end
53
55
56
+ function sizes_from_blocks (A:: Bidiagonal , _)
57
+ # for k = 1:length(A.du)
58
+ # size(A.du[k],1) == sz[1][k] || throw(ArgumentError("block sizes of upper diagonal inconsisent with diagonal"))
59
+ # size(A.du[k],2) == sz[2][k+1] || throw(ArgumentError("block sizes of upper diagonal inconsisent with diagonal"))
60
+ # size(A.dl[k],1) == sz[1][k+1] || throw(ArgumentError("block sizes of lower diagonal inconsisent with diagonal"))
61
+ # size(A.dl[k],2) == sz[2][k] || throw(ArgumentError("block sizes of lower diagonal inconsisent with diagonal"))
62
+ # end
63
+ (size .(A. dv, 1 ), size .(A. dv,2 ))
64
+ end
65
+
54
66
blockbandwidths (A:: BlockArray ) = bandwidths (A. blocks)
55
67
isblockbanded (A:: BlockArray ) = isbanded (A. blocks)
56
68
69
+ @inline function getblock (block_arr:: BlockBidiagonal{T,VT} , K:: Int , J:: Int ) where {T,VT<: AbstractMatrix }
70
+ @boundscheck blockcheckbounds (block_arr, K, J)
71
+ l,u = blockbandwidths (block_arr)
72
+ - l ≤ (J- K) ≤ u || return convert (VT, Zeros {T} (length .(getindex .(axes (block_arr),(Block (K),Block (J))))... ))
73
+ block_arr. blocks[K,J]
74
+ end
75
+
57
76
@inline function getblock (block_arr:: BlockTridiagonal{T,VT} , K:: Int , J:: Int ) where {T,VT<: AbstractMatrix }
58
77
@boundscheck blockcheckbounds (block_arr, K, J)
59
78
abs (J- K) ≥ 2 && return convert (VT, Zeros {T} (length .(getindex .(axes (block_arr),(Block (K),Block (J))))... ))
@@ -70,7 +89,15 @@ for op in (:-, :+)
70
89
end
71
90
function $op (λ:: UniformScaling , A:: BlockTridiagonal )
72
91
checksquareblocks (A)
73
- mortar (Tridiagonal (A. blocks. dl, broadcast ($ op, Ref (λ), A. blocks. d), A. blocks. du))
92
+ mortar (Tridiagonal (broadcast ($ op,A. blocks. dl), broadcast ($ op, Ref (λ), A. blocks. d), broadcast ($ op,A. blocks. du)))
93
+ end
94
+ function $op (A:: BlockBidiagonal , λ:: UniformScaling )
95
+ checksquareblocks (A)
96
+ mortar (Bidiagonal (broadcast ($ op, A. blocks. dv, Ref (λ)), A. blocks. ev, A. blocks. uplo))
97
+ end
98
+ function $op (λ:: UniformScaling , A:: BlockBidiagonal )
99
+ checksquareblocks (A)
100
+ mortar (Bidiagonal (broadcast ($ op, Ref (λ), A. blocks. dv), broadcast ($ op,A. blocks. ev), A. blocks. uplo))
74
101
end
75
102
end
76
103
end
0 commit comments