Skip to content

Commit 3520770

Browse files
authored
Improvements in Legendre Transforms (#124)
* Work on matrix Legendre transforms * LegendreTransformPlan * tests pass * v0.7.3
1 parent 87c636d commit 3520770

File tree

4 files changed

+51
-4
lines changed

4 files changed

+51
-4
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ClassicalOrthogonalPolynomials"
22
uuid = "b30e2e7b-c4ee-47da-9d5f-2c5c27239acd"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "0.7.2"
4+
version = "0.7.3"
55

66
[deps]
77
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -33,7 +33,7 @@ ContinuumArrays = "0.12.4"
3333
DomainSets = "0.5.6, 0.6"
3434
FFTW = "1.1"
3535
FastGaussQuadrature = "0.4.3, 0.5"
36-
FastTransforms = "0.14.9"
36+
FastTransforms = "0.15"
3737
FillArrays = "0.13"
3838
HypergeometricFunctions = "0.3.4"
3939
InfiniteArrays = "0.12.11"

src/classical/legendre.jl

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,28 @@ end
7979

8080

8181
ldiv(P::Legendre{V}, f::AbstractQuasiFill{T,1}) where {T,V} = _op_ldiv(P, f)
82-
function ldiv(::Legendre{V}, f::AbstractQuasiVector) where V
82+
function transform_ldiv(::Legendre{V}, f::Union{AbstractQuasiVector,AbstractQuasiMatrix}) where V
8383
T = ChebyshevT{V}()
84-
[cheb2leg(paddeddata(T \ f)); zeros(V,∞)]
84+
dat = T \ f
85+
pad(cheb2leg(paddeddata(dat)), axes(dat)...)
8586
end
8687

88+
struct LegendreTransformPlan{T, CHEB2LEG, DCT} <: Plan{T}
89+
cheb2leg::CHEB2LEG
90+
chebtransform::DCT
91+
end
92+
93+
LegendreTransformPlan(c2l, ct) = LegendreTransformPlan{promote_type(eltype(c2l),eltype(ct)),typeof(c2l),typeof(ct)}(c2l, ct)
94+
95+
*(P::LegendreTransformPlan, x::AbstractArray) = P.cheb2leg*(P.chebtransform*x)
96+
97+
function plan_grid_transform(P::Legendre{T}, szs::NTuple{N,Int}, dims=1:N) where {T,N}
98+
arr = Array{T}(undef, szs...)
99+
x = grid(P, size(arr,1))
100+
x, LegendreTransformPlan(FastTransforms.plan_th_cheb2leg!(arr, dims), plan_chebyshevtransform(arr, dims))
101+
end
102+
103+
87104
"""
88105
legendre_massmatrix
89106

test/test_chebyshev.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ import ContinuumArrays: MappedWeightedBasisLayout, Map, WeightedBasisLayout
121121
@test U[0.1,:] cos.(0.1 * (0:1000))
122122
@test U[[0.1,0.2],:] [cos.(0.1 * (0:1000)'); cos.(0.2 * (0:1000)')]
123123

124+
# plan_transform for rect
125+
126+
X = randn(10, 11)
127+
F1 = plan_transform(T, X, 1)
128+
p1 = plan_transform(T, X[:,1])
129+
@test F1*X hcat([p1 * X[:,j] for j = 1:size(X,2)]...)
130+
F2 = plan_transform(T, X, 2)
131+
p2 = plan_transform(T, X[1,:])
132+
@test F2*X vcat([(p2 * X[k,:])' for k = 1:size(X,1)]...)
133+
F = plan_transform(T, X)
134+
@test F*X F2*(F1*X)
135+
124136
# support tensors but for grids
125137
X = randn(150, 2, 2)
126138
F = plan_transform(T, X, 1)

test/test_legendre.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,24 @@ import QuasiArrays: MulQuasiArray
4040
end
4141
end
4242

43+
@testset "expansion" begin
44+
P = Legendre()
45+
x = axes(P,1)
46+
@test (P \ [exp.(x) cos.(x)])[1:10,1:2] [P\exp.(x) P\cos.(x)][1:10,:]
47+
48+
# plan_transform for rect
49+
50+
X = randn(10, 11)
51+
F1 = plan_transform(P, X, 1)
52+
p1 = plan_transform(P, X[:,1])
53+
@test F1*X hcat([p1 * X[:,j] for j = 1:size(X,2)]...)
54+
F2 = plan_transform(P, X, 2)
55+
p2 = plan_transform(P, X[1,:])
56+
@test F2*X vcat([(p2 * X[k,:])' for k = 1:size(X,1)]...)
57+
F = plan_transform(P, X)
58+
@test F*X F2*(F1*X)
59+
end
60+
4361
@testset "operators" begin
4462
P = Legendre()
4563
= Jacobi(0.0,0.0)

0 commit comments

Comments
 (0)