|
25 | 25 |
|
26 | 26 | using BlockArrays: AbstractBlockedUnitRange |
27 | 27 | using BlockSparseArrays: Block, ZeroBlocks, eachblockaxis, mortar_axis |
28 | | -using DerivableInterfaces: zero! |
29 | | -using FillArrays: Eye |
30 | | -using KroneckerArrays: |
31 | | - KroneckerArrays, |
32 | | - EyeEye, |
33 | | - EyeKronecker, |
34 | | - KroneckerEye, |
35 | | - KroneckerMatrix, |
36 | | - ⊗, |
37 | | - arg1, |
38 | | - arg2, |
39 | | - _similar |
| 28 | +using KroneckerArrays: KroneckerArrays, KroneckerArray, ⊗, arg1, arg2, _similar |
| 29 | +using BlockSparseArrays.TypeParameterAccessors: unwrap_array_type |
40 | 30 |
|
41 | 31 | function KroneckerArrays.arg1(r::AbstractBlockedUnitRange) |
42 | 32 | return mortar_axis(arg1.(eachblockaxis(r))) |
|
58 | 48 |
|
59 | 49 | ## TODO: Is this needed? |
60 | 50 | function Base.getindex( |
61 | | - a::ZeroBlocks{2,KroneckerMatrix{T,A,B}}, I::Vararg{Int,2} |
62 | | -) where {T,A<:AbstractMatrix{T},B<:AbstractMatrix{T}} |
| 51 | + a::ZeroBlocks{N,KroneckerArray{T,N,A,B}}, I::Vararg{Int,N} |
| 52 | +) where {T,N,A<:AbstractArray{T,N},B<:AbstractArray{T,N}} |
63 | 53 | ax_a1 = map(arg1, a.parentaxes) |
64 | | - a1 = ZeroBlocks{2,A}(ax_a1)[I...] |
65 | 54 | ax_a2 = map(arg2, a.parentaxes) |
66 | | - a2 = ZeroBlocks{2,B}(ax_a2)[I...] |
67 | | - return a1 ⊗ a2 |
68 | | -end |
69 | | -function Base.getindex( |
70 | | - a::ZeroBlocks{2,EyeKronecker{T,A,B}}, I::Vararg{Int,2} |
71 | | -) where {T,A<:Eye{T},B<:AbstractMatrix{T}} |
72 | | - block_ax_a1 = arg1.(block_axes(a.parentaxes, Block(I))) |
73 | | - a1 = _similar(A, block_ax_a1) |
74 | | - |
75 | | - ax_a2 = arg2.(a.parentaxes) |
76 | | - a2 = ZeroBlocks{2,B}(ax_a2)[I...] |
77 | | - |
78 | | - return a1 ⊗ a2 |
79 | | -end |
80 | | -function Base.getindex( |
81 | | - a::ZeroBlocks{2,KroneckerEye{T,A,B}}, I::Vararg{Int,2} |
82 | | -) where {T,A<:AbstractMatrix{T},B<:Eye{T}} |
83 | | - ax_a1 = arg1.(a.parentaxes) |
84 | | - a1 = ZeroBlocks{2,A}(ax_a1)[I...] |
85 | | - |
86 | | - block_ax_a2 = arg2.(block_axes(a.parentaxes, Block(I))) |
87 | | - a2 = _similar(B, block_ax_a2) |
88 | | - |
| 55 | + # TODO: Instead of mutability, maybe have a trait like |
| 56 | + # `isstructural` or `isdata`. |
| 57 | + ismut1 = ismutabletype(unwrap_array_type(A)) |
| 58 | + ismut2 = ismutabletype(unwrap_array_type(B)) |
| 59 | + (ismut1 || ismut2) || error("Can't get zero block.") |
| 60 | + a1 = if ismut1 |
| 61 | + ZeroBlocks{N,A}(ax_a1)[I...] |
| 62 | + else |
| 63 | + block_ax_a1 = arg1.(block_axes(a.parentaxes, Block(I))) |
| 64 | + _similar(A, block_ax_a1) |
| 65 | + end |
| 66 | + a2 = if ismut2 |
| 67 | + ZeroBlocks{N,B}(ax_a2)[I...] |
| 68 | + else |
| 69 | + block_ax_a2 = arg2.(block_axes(a.parentaxes, Block(I))) |
| 70 | + a2 = _similar(B, block_ax_a2) |
| 71 | + end |
89 | 72 | return a1 ⊗ a2 |
90 | 73 | end |
91 | | -function Base.getindex( |
92 | | - a::ZeroBlocks{2,EyeEye{T,A,B}}, I::Vararg{Int,2} |
93 | | -) where {T,A<:Eye{T},B<:Eye{T}} |
94 | | - return error("Not implemented.") |
95 | | -end |
96 | 74 |
|
97 | 75 | using BlockSparseArrays: BlockSparseArrays |
98 | 76 | using KroneckerArrays: KroneckerArrays, KroneckerVector |
|
0 commit comments