Skip to content

Commit 53b072b

Browse files
authored
Support SVector in PiecewiseSegment (#265)
* Support SVector in PiecewiseSegment * Fix SplineSpace
1 parent 5919425 commit 53b072b

File tree

3 files changed

+19
-15
lines changed

3 files changed

+19
-15
lines changed

src/Domains/PiecewiseSegment.jl

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
export PiecewiseSegment
22

3-
struct PiecewiseSegment{T} <: Domain{T}
4-
points::Vector{T}
5-
PiecewiseSegment{T}(d::Vector{T}) where {T} = new{T}(d)
3+
struct PiecewiseSegment{T,V<:AbstractVector{T}} <: Domain{T}
4+
points::V
65
end
7-
PiecewiseSegment(d::AbstractVector) = PiecewiseSegment{eltype(d)}(collect(d))
8-
PiecewiseSegment(d...) = PiecewiseSegment(collect(mapreduce(eltype,promote_type,d),d))
6+
PiecewiseSegment{T}(d::V) where {T,V<:AbstractVector{T}} = PiecewiseSegment{T,V}(d)
7+
PiecewiseSegment(d...) = PiecewiseSegment(SVector{length(d), mapreduce(eltype,promote_type,d)}(d))
98

109
function PiecewiseSegment(pcsin::AbstractVector{IT}) where IT<:IntervalOrSegment
1110
pcs=collect(pcsin)
@@ -28,13 +27,16 @@ end
2827

2928
==(a::PiecewiseSegment,b::PiecewiseSegment) = a.points==b.points
3029

31-
indomain(x, d::PiecewiseSegment) = any(in.(x, components(d)))
30+
indomain(x, d::PiecewiseSegment) = any(Base.Fix1(in, x), components(d))
3231

3332

3433
canonicaldomain(d::PiecewiseSegment)=d
3534
ncomponents(d::PiecewiseSegment)=length(d.points)-1
36-
component(d::PiecewiseSegment,j::Integer) = Segment(d.points[j],d.points[j+1])
37-
components(d::PiecewiseSegment{T}) where {T} = Segment{T}[component(d,k) for k=1:ncomponents(d)]
35+
component(d::PiecewiseSegment{T}, j::Integer) where {T} = Segment{T}(d.points[j], d.points[j+1])
36+
components(d::PiecewiseSegment) = [component(d,k) for k=1:ncomponents(d)]
37+
function components(d::PiecewiseSegment{<:Any, <:SVector})
38+
SVector(ntuple(k->component(d,k), ncomponents(d)))
39+
end
3840

3941
for OP in (:arclength,:complexlength)
4042
@eval $OP(d::PiecewiseSegment) = mapreduce($OP,+,components(d))

src/Domains/multivariate.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ include("ProductDomain.jl")
66
const RectDomain = Union{DomainSets.FixedIntervalProduct{2}, DomainSets.Rectangle, VcatDomain{2,<:Any,(1,1),<:Tuple}}
77

88
boundary(d::RectDomain) =
9-
PiecewiseSegment([SVector(leftendpoint(factor(d,1)),leftendpoint(factor(d,2))),
9+
PiecewiseSegment(SVector{5}(SVector(leftendpoint(factor(d,1)),leftendpoint(factor(d,2))),
1010
SVector(rightendpoint(factor(d,1)),leftendpoint(factor(d,2))),
1111
SVector(rightendpoint(factor(d,1)),rightendpoint(factor(d,2))),
1212
SVector(leftendpoint(factor(d,1)),rightendpoint(factor(d,2))),
13-
SVector(leftendpoint(factor(d,1)),leftendpoint(factor(d,2)))])
13+
SVector(leftendpoint(factor(d,1)),leftendpoint(factor(d,2)))))
1414

1515

1616
## Union

src/Spaces/HeavisideSpace.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
# SplineSpace represents a Spline, right now piecewise constant HeavisideSpace is only implemented case
2-
struct SplineSpace{order,T,R} <: Space{PiecewiseSegment{T},R}
3-
domain::PiecewiseSegment{T}
2+
struct SplineSpace{order,T,R,P<:PiecewiseSegment} <: Space{P,R}
3+
domain::P
44
end
55

6+
SplineSpace{m,T,R}(d::PiecewiseSegment{T}) where {m,T,R} = SplineSpace{m,T,R,typeof(d)}(d)
7+
68
SplineSpace{m,T}(d::PiecewiseSegment{T}) where {m,T} = SplineSpace{m,T,real(eltype(T))}(d)
79
SplineSpace{m,T}(d::AbstractVector) where {m,T} = SplineSpace{m}(PiecewiseSegment(sort(d)))
810

911
SplineSpace{m}(d::PiecewiseSegment{T}) where {m,T} = SplineSpace{m,T,real(eltype(T))}(d)
1012
SplineSpace{m}(d::AbstractVector) where {m} = SplineSpace{m}(PiecewiseSegment(sort(d)))
1113

12-
const HeavisideSpace{T,R} = SplineSpace{0,T,R}
14+
const HeavisideSpace{T,R,P<:PiecewiseSegment} = SplineSpace{0,T,R,P}
1315
dimension(h::SplineSpace{λ}) where {λ} = length(h.domain.points)+λ-1
1416

1517
convert(::Type{HeavisideSpace},d::PiecewiseSegment) = HeavisideSpace{eltype(d)}(d)
@@ -105,10 +107,10 @@ end
105107

106108

107109

108-
differentiate(f::Fun{SplineSpace{1,T,R}}) where {T,R} =
110+
differentiate(f::Fun{<:SplineSpace{1}}) =
109111
Fun(HeavisideSpace(space(f).domain),
110112
diff(pad(f.coefficients,dimension(space(f))))./diff(space(f).domain.points))
111113

112-
integrate(f::Fun{HeavisideSpace{T,R}}) where {T,R} =
114+
integrate(f::Fun{<:HeavisideSpace{T,R}}) where {T,R} =
113115
Fun(SplineSpace{1,T,R}(space(f).domain),
114116
[0;cumsum(f.coefficients).*diff(space(f).domain.points)])

0 commit comments

Comments
 (0)