Skip to content

Commit 2ec7841

Browse files
authored
Numbers as derivative orders (#63)
1 parent 737accc commit 2ec7841

File tree

4 files changed

+38
-17
lines changed

4 files changed

+38
-17
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ApproxFunFourier"
22
uuid = "59844689-9c9d-51bf-9583-5b794ec66d30"
3-
version = "0.3.5"
3+
version = "0.3.6"
44

55
[deps]
66
AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c"
@@ -17,7 +17,7 @@ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
1717

1818
[compat]
1919
AbstractFFTs = "0.5, 1"
20-
ApproxFunBase = "0.7.34"
20+
ApproxFunBase = "0.7.43"
2121
ApproxFunBaseTest = "0.1"
2222
Aqua = "0.5"
2323
BandedMatrices = "0.16, 0.17"

src/ApproxFunFourier.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ export Fourier, Taylor, Hardy, CosSpace, SinSpace, Laurent, PeriodicDomain
5858
include("utils.jl")
5959
include("Domains/Domains.jl")
6060

61+
convert_vector_or_svector(v::AbstractVector) = convert(Vector, v)
62+
convert_vector_or_svector(t::Tuple) = SVector(t)
63+
6164
for T in (:CosSpace,:SinSpace)
6265
@eval begin
6366
struct $T{D<:PeriodicDomain,R} <: Space{D,R}

src/FourierOperators.jl

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ rangespace(D::ConcreteDerivative{S}) where {S<:SinSpace} = iseven(D.order) ? D.s
100100

101101
function getindex(D::ConcreteDerivative{CS,OT,T},k::Integer,j::Integer) where {CS<:CosSpace,OT,T}
102102
d=domain(D)
103-
m=D.order
103+
m=Int(D.order)
104104
C=convert(T,2/complexlength(d)*π)
105105

106106
if k==j && mod(m,4)==0
@@ -118,7 +118,7 @@ end
118118

119119
function getindex(D::ConcreteDerivative{CS,OT,T},k::Integer,j::Integer) where {CS<:SinSpace,OT,T}
120120
d=domain(D)
121-
m=D.order
121+
m=Int(D.order)
122122
C=convert(T,2/complexlength(d)*π)
123123

124124
if k==j && mod(m,4)==0
@@ -136,13 +136,18 @@ end
136136

137137

138138
# Use Laurent derivative
139-
Derivative(S::Fourier{DD,RR},k::Integer) where {DD<:Circle,RR} =
139+
function Derivative(S::Fourier{<:Circle}, k::Number)
140+
@assert Integer(k) == k "order must be an integer"
140141
DerivativeWrapper(Derivative(Laurent(S),k)*Conversion(S,Laurent(S)),k)
142+
end
141143

142-
Integral(::CosSpace,m::Integer) =
143-
error("Integral not defined for CosSpace. Use Integral(CosSpace()|(2:∞)) if first coefficient vanishes.")
144+
Integral(::CosSpace, m::Number) =
145+
error("Integral not defined for CosSpace. Use Integral(CosSpace()|(2:Infinities.∞)) if first coefficient vanishes.")
144146

145-
Integral(sp::SinSpace{<:PeriodicSegment}, m::Integer) = ConcreteIntegral(sp,m)
147+
function Integral(sp::SinSpace{<:PeriodicSegment}, m::Number)
148+
@assert Integer(m) == m "order must be an integer"
149+
ConcreteIntegral(sp,m)
150+
end
146151

147152
bandwidths(D::ConcreteIntegral{<:SinSpace}) = iseven(D.order) ? (0,0) : (1,0)
148153
rangespace(D::ConcreteIntegral{<:CosSpace}) = iseven(D.order) ? D.space : SinSpace(domain(D))
@@ -151,7 +156,7 @@ rangespace(D::ConcreteIntegral{<:SinSpace}) = iseven(D.order) ? D.space : CosSpa
151156
function getindex(D::ConcreteIntegral{CS,OT,T},k::Integer,j::Integer) where {CS<:SinSpace,OT,T}
152157
d=domain(D)
153158
@assert isa(d,PeriodicSegment)
154-
m=D.order
159+
m=Int(D.order)
155160
C=convert(T,2/complexlength(d)*π)
156161

157162

@@ -168,7 +173,8 @@ function getindex(D::ConcreteIntegral{CS,OT,T},k::Integer,j::Integer) where {CS<
168173
end
169174
end
170175

171-
function Integral(S::SubSpace{<:CosSpace,<:AbstractInfUnitRange{Int},<:PeriodicSegment},k::Integer)
176+
function Integral(S::SubSpace{<:CosSpace,<:AbstractInfUnitRange{Int},<:PeriodicSegment},k::Number)
177+
@assert Integer(k) == k "order must be an integer"
172178
@assert first(S.indexes)==2
173179
ConcreteIntegral(S,k)
174180
end
@@ -181,7 +187,7 @@ rangespace(D::ConcreteIntegral{<:SubSpace{<:CosSpace,<:AbstractInfUnitRange{Int}
181187
function getindex(D::ConcreteIntegral{<:SubSpace{<:CosSpace,<:AbstractInfUnitRange{Int},<:PeriodicSegment}},
182188
k::Integer,j::Integer)
183189
d=domain(D)
184-
m=D.order
190+
m=Int(D.order)
185191
T=eltype(D)
186192
C=convert(T,2/complexlength(d)*π)
187193

@@ -192,7 +198,7 @@ function getindex(D::ConcreteIntegral{<:SubSpace{<:CosSpace,<:AbstractInfUnitRan
192198
elseif mod(m,4)==2
193199
-(C*k)^(-m)
194200
elseif mod(m,4)==1
195-
(C*k)^(-m)
201+
(C*k)^(-m)
196202
else # mod(m,4)==3
197203
-(C*k)^(-m)
198204
end

src/LaurentOperators.jl

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,25 @@ coefficienttimes(f::Fun{Laurent{DD,RR}},g::Fun{Laurent{DD,RR}}) where {DD,RR} =
6767
## Derivative
6868

6969
# override map definition
70-
Derivative(S::Hardy{s,DD},k::Integer) where {s,DD<:Circle} = ConcreteDerivative(S,k)
71-
Derivative(S::Hardy{s,DD},k::Integer) where {s,DD<:PeriodicSegment} = ConcreteDerivative(S,k)
72-
Derivative(S::Laurent{DD,RR},k::Integer) where {DD<:Circle,RR} =
73-
DerivativeWrapper(InterlaceOperator(Diagonal([map(s->Derivative(s,k),S.spaces)...]),SumSpace),k)
70+
function Derivative(S::Hardy{<:Any,<:Circle}, k::Number)
71+
@assert Integer(k) == k "order must be an integer"
72+
ConcreteDerivative(S,k)
73+
end
74+
function Derivative(S::Hardy{<:Any,<:PeriodicSegment}, k::Number)
75+
@assert Integer(k) == k "order must be an integer"
76+
ConcreteDerivative(S,k)
77+
end
78+
function Derivative(S::Laurent{<:Circle}, k::Number)
79+
@assert Integer(k) == k "order must be an integer"
80+
t = map(s->Derivative(s,k), S.spaces)
81+
v = convert_vector_or_svector(t)
82+
D = Diagonal(v)
83+
O = InterlaceOperator(D, SumSpace)
84+
DerivativeWrapper(O,k)
85+
end
7486

7587
bandwidths(D::ConcreteDerivative{Hardy{s,DD,RR}}) where {s,DD<:PeriodicSegment,RR}=(0,0)
76-
bandwidths(D::ConcreteDerivative{Hardy{s,DD,RR}}) where {s,DD<:Circle,RR}=s ? (0,D.order) : (D.order,0)
88+
bandwidths(D::ConcreteDerivative{Hardy{s,DD,RR}}) where {s,DD<:Circle,RR}=s ? (-D.order,D.order) : (D.order,-D.order)
7789

7890
rangespace(D::ConcreteDerivative{S}) where {S<:Hardy}=D.space
7991

0 commit comments

Comments
 (0)