@@ -36,10 +36,12 @@ function sizes_from_blocks(A::Diagonal, _)
3636end     
3737
3838
39- #  Block Tridiagonal
39+ #  Block Bi/ Tridiagonal
4040const  BlockTridiagonal{T,VT<: Matrix{T} } =  BlockMatrix{T,<: Tridiagonal{VT} }
41+ const  BlockBidiagonal{T,VT<: Matrix{T} } =  BlockMatrix{T,<: Bidiagonal{VT} }
4142
4243BlockTridiagonal (A,B,C) =  mortar (Tridiagonal (A,B,C))
44+ BlockBidiagonal (A, B, uplo) =  mortar (Bidiagonal (A,B,uplo))
4345
4446function  sizes_from_blocks (A:: Tridiagonal , _) 
4547    #  for k = 1:length(A.du)
@@ -51,9 +53,26 @@ function sizes_from_blocks(A::Tridiagonal, _)
5153    (size .(A. d, 1 ), size .(A. d,2 ))
5254end 
5355
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+ 
5466blockbandwidths (A:: BlockArray ) =  bandwidths (A. blocks)
5567isblockbanded (A:: BlockArray ) =  isbanded (A. blocks)
5668
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+ 
5776@inline  function  getblock (block_arr:: BlockTridiagonal{T,VT} , K:: Int , J:: Int ) where  {T,VT<: AbstractMatrix }
5877    @boundscheck  blockcheckbounds (block_arr, K, J)
5978    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 (:-, :+)
7089        end 
7190        function  $op (λ:: UniformScaling , A:: BlockTridiagonal ) 
7291            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))
74101        end 
75102    end 
76103end 
0 commit comments