Skip to content

Commit 19efc73

Browse files
committed
implemented setsize! and _compress! for ArrayBlocks
1 parent 8d8eddc commit 19efc73

File tree

3 files changed

+47
-7
lines changed

3 files changed

+47
-7
lines changed

src/Fields/ArrayBlocks.jl

+17-7
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,18 @@ function evaluate!(cache,::typeof(unwrap_cached_array),a::ArrayBlock)
152152
r
153153
end
154154

155+
Arrays.setsize!(a::ArrayBlock,s::NTuple{N,<:Integer}) where {N} = @notimplemented
156+
157+
function Arrays.setsize!(a::ArrayBlock,b::ArrayBlock)
158+
@assert size(a) == size(b)
159+
for i in eachindex(a.array)
160+
if a.touched[i]
161+
Arrays.setsize!(a.array[i],size(b.array[i]))
162+
end
163+
end
164+
a
165+
end
166+
155167
#LinearAlgebra.promote_leaf_eltypes(a::ArrayBlock) = LinearAlgebra.promote_leaf_eltypes(a.array)
156168

157169
function Base.:(a::AbstractArray{<:ArrayBlock},b::AbstractArray{<:ArrayBlock})
@@ -1332,7 +1344,7 @@ for T in (:AddEntriesMap,:TouchEntriesMap)
13321344

13331345
function return_cache(
13341346
k::$T,A,v::MatrixBlock,I::VectorBlock,J::VectorBlock)
1335-
1347+
13361348
qs = findall(v.touched)
13371349
i, j = Tuple(first(qs))
13381350
cij = return_cache(k,A,v.array[i,j],I.array[i],J.array[j])
@@ -1347,7 +1359,7 @@ for T in (:AddEntriesMap,:TouchEntriesMap)
13471359
end
13481360
cache
13491361
end
1350-
1362+
13511363
function evaluate!(
13521364
cache, k::$T,A,v::MatrixBlock,I::VectorBlock,J::VectorBlock)
13531365
ni,nj = size(v.touched)
@@ -1359,10 +1371,10 @@ for T in (:AddEntriesMap,:TouchEntriesMap)
13591371
end
13601372
end
13611373
end
1362-
1374+
13631375
function return_cache(
13641376
k::$T,A,v::VectorBlock,I::VectorBlock)
1365-
1377+
13661378
qs = findall(v.touched)
13671379
i = first(qs)
13681380
ci = return_cache(k,A,v.array[i],I.array[i])
@@ -1375,7 +1387,7 @@ for T in (:AddEntriesMap,:TouchEntriesMap)
13751387
end
13761388
cache
13771389
end
1378-
1390+
13791391
function evaluate!(
13801392
cache, k::$T,A,v::VectorBlock,I::VectorBlock)
13811393
ni = length(v.touched)
@@ -1388,5 +1400,3 @@ for T in (:AddEntriesMap,:TouchEntriesMap)
13881400

13891401
end
13901402
end
1391-
1392-

src/Fields/Fields.jl

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export ArrayBlock
8686
export VectorBlock
8787
export MatrixBlock
8888
export BlockMap
89+
export unwrap_cached_array
8990

9091
include("FieldsInterfaces.jl")
9192

src/Geometry/CompressedCellArrays.jl

+29
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,18 @@ end
8888
(rm,rv)
8989
end
9090

91+
@inline function _compress!(matvec::Tuple{ArrayBlock,ArrayBlock},cell_to_matvec,cell_range)
92+
mat, vec = matvec
93+
rm = copy(mat)
94+
rv = copy(vec)
95+
for cell in cell_range
96+
cmat, cvec = cell_to_matvec[cell]
97+
rm = rm + cmat
98+
rv = rv + cvec
99+
end
100+
(rm,rv)
101+
end
102+
91103
function array_cache(a::CompressedCellArray)
92104
array = testitem(a.cell_to_array)
93105
_compress_cache(array,a)
@@ -145,3 +157,20 @@ end
145157
end
146158
(rm, rv)
147159
end
160+
161+
@inline function _compress!(c,matvec::Tuple{ArrayBlock,ArrayBlock},ccache,cell_to_matvec,cell_range)
162+
cm, cv = c
163+
mat, vec = matvec
164+
setsize!(cm,mat)
165+
setsize!(cv,vec)
166+
rm = unwrap_cached_array(cm)
167+
rv = unwrap_cached_array(cv)
168+
copyto!(rm,mat)
169+
copyto!(rv,vec)
170+
for cell in cell_range
171+
cmat, cvec = getindex!(ccache,cell_to_matvec,cell)
172+
rm = rm + cmat
173+
rv = rv + cvec
174+
end
175+
(rm, rv)
176+
end

0 commit comments

Comments
 (0)