Skip to content

Commit 3054ad4

Browse files
authored
Merge pull request #761 from gridap/issue_760
Bugfix for issue #760
2 parents 175c2f1 + 9464d1d commit 3054ad4

File tree

4 files changed

+68
-7
lines changed

4 files changed

+68
-7
lines changed

src/Arrays/PosNegReindex.jl

+15-7
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,23 @@ function lazy_map(::typeof(evaluate),::Type{T},a::LazyArray{<:Fill{<:PosNegReind
6262
end
6363

6464
function lazy_map(::typeof(evaluate),::Type{T},a::LazyArray{<:Fill{<:PosNegReindex}},x::AbstractArray) where T
65+
i_to_iposneg = a.args[1]
66+
_lazy_map_evaluate_posneg(i_to_iposneg,T,a,x)
67+
end
68+
69+
function _lazy_map_evaluate_posneg(i_to_iposneg,::Type{T},a,x) where T
6570
apos = a.maps.value.values_pos
6671
aneg = a.maps.value.values_neg
67-
i_to_iposneg = a.args[1]
68-
ipos_to_i, ineg_to_i = pos_and_neg_indices(i_to_iposneg)
69-
xpos = lazy_map(Reindex(x),ipos_to_i)
70-
xneg = lazy_map(Reindex(x),ineg_to_i)
71-
cpos = lazy_map(evaluate,apos,xpos)
72-
cneg = lazy_map(evaluate,aneg,xneg)
73-
lazy_map(PosNegReindex(cpos,cneg),T,i_to_iposneg)
72+
if is_exhaustive(i_to_iposneg)
73+
ipos_to_i, ineg_to_i = pos_and_neg_indices(i_to_iposneg)
74+
xpos = lazy_map(Reindex(x),ipos_to_i)
75+
xneg = lazy_map(Reindex(x),ineg_to_i)
76+
cpos = lazy_map(evaluate,apos,xpos)
77+
cneg = lazy_map(evaluate,aneg,xneg)
78+
lazy_map(PosNegReindex(cpos,cneg),T,i_to_iposneg)
79+
else
80+
LazyArray(T,a,x)
81+
end
7482
end
7583

7684
function lazy_map(::typeof(evaluate),::Type{T},b::Fill,a::LazyArray{<:Fill{<:PosNegReindex}}...) where T

src/Arrays/Reindex.jl

+28
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,34 @@ function lazy_map(k::Reindex{<:LazyArray{<:Fill{<:PosNegReindex}}},::Type{T},j_t
6969
end
7070
end
7171

72+
function _lazy_map_evaluate_posneg(
73+
i_to_jposneg::LazyArray{<:Fill{<:Reindex}},::Type{T},i_a,i_x::Fill) where T
74+
i_y = CompressedArray([i_x.value],Fill(Int32(1),length(i_x)))
75+
_lazy_map_evaluate_posneg(i_to_jposneg,T,i_a,i_y)
76+
end
77+
78+
function _lazy_map_evaluate_posneg(i_to_jposneg::LazyArray{<:Fill{<:Reindex}},::Type{T},i_a,i_x::CompressedArray) where T
79+
jpos_a = i_a.maps.value.values_pos
80+
jneg_a = i_a.maps.value.values_neg
81+
j_jposneg = i_to_jposneg.maps.value.values
82+
jpos_j, jneg_j = pos_and_neg_indices(j_jposneg)
83+
k_x = deepcopy(i_x.values)
84+
i_k = i_x.ptrs
85+
push!(k_x,testitem(i_x))
86+
i_j = i_to_jposneg.args[1]
87+
j_k = fill(Int32(length(k_x)),length(j_jposneg))
88+
j_k[i_j] .= i_k
89+
jpos_k = j_k[jpos_j]
90+
jneg_k = j_k[jneg_j]
91+
jpos_x = CompressedArray(k_x,jpos_k)
92+
jneg_x = CompressedArray(k_x,jneg_k)
93+
jpos_b = lazy_map(evaluate,jpos_a,jpos_x)
94+
jneg_b = lazy_map(evaluate,jneg_a,jneg_x)
95+
j_b = lazy_map(PosNegReindex(jpos_b,jneg_b),j_jposneg)
96+
i_b = lazy_map(Reindex(j_b),i_j)
97+
i_b
98+
end
99+
72100
function lazy_map(k::Reindex{<:LazyArray{<:Fill{<:PosNegReindex}}},::Type{T},indices::IdentityVector) where T
73101
@check length(k.values) == length(indices)
74102
k.values

test/GridapTests/issue_760.jl

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Issue760
2+
3+
using Gridap
4+
using Test
5+
6+
cells = (2,2)
7+
domain = (0,1,0,1)
8+
model = CartesianDiscreteModel(domain,cells)
9+
10+
Ω = Interior(model)
11+
Ω1 = Interior(model,[1,2])
12+
Ω2 = Interior(model,[2,4])
13+
14+
f = CellField(1,Ω1)
15+
x = get_cell_points(Ω2)
16+
arr = f(x)
17+
18+
#print_op_tree(arr)
19+
20+
@test arr.maps.value.values_pos.values[1] == [1,1,1,1]
21+
@test arr.maps.value.values_neg.values[1] == [0,0,0,0]
22+
23+
end # module

test/GridapTests/runtests.jl

+2
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,6 @@ using Test
3838

3939
@time @testset "Issue743" begin include("issue_743.jl") end
4040

41+
@time @testset "Issue760" begin include("issue_760.jl") end
42+
4143
end # module

0 commit comments

Comments
 (0)