Skip to content

Commit 57624fc

Browse files
committed
Use matrix of points for Disk
1 parent 01473be commit 57624fc

File tree

4 files changed

+48
-40
lines changed

4 files changed

+48
-40
lines changed

src/Cone/Cone.jl

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,18 +246,18 @@ rectspace(::DuffyCone) = NormalizedJacobi(0,1,Segment(1,0))*ZernikeDisk()
246246

247247
blocklengths(d::DuffyCone) = blocklengths(rectspace(d))
248248

249-
# M = N(N+1)/2
250-
# N*M == N^2(N+1)/2 == n
251-
# N = 1/3 (-1 + 1/(-1 + 27n + 3sqrt(3)sqrt(n*(-2 + 27 n)))^(1/3) + (-1 + 27n + 3sqrt(3)sqrt(n*(-2 + 27n)))^(1/3))
249+
# M = N*(2N-1)
250+
# N*N*(2N-1) == N^2*(2N-1) == n
251+
# N =1/6*(1 + 1/(1 + 54n + 6sqrt(3)sqrt(n + 27n^2))^(1/3) + (1 + 54n + 6sqrt(3)sqrt(n + 27n^2))^(1/3))
252252
function pointsize(::Cone, n)
253-
N = round(Int,1/3*(-1 + 1/(-1 + 27n + 3sqrt(3)sqrt(n*(-2 + 27n)))^(1/3) + (-1 + 27n + 3sqrt(3)sqrt(n*(-2 + 27n)))^(1/3)),RoundUp)
254-
N, N*(N+1) ÷ 2
253+
N = round(Int, 1/6*(1 + 1/(1 + 54n + 6sqrt(3)sqrt(n + 27n^2))^(1/3) + (1 + 54n + 6sqrt(3)sqrt(n + 27n^2))^(1/3)), RoundUp)
254+
N, N, 2N-1
255255
end
256256

257257

258258
function points(d::Cone,n)
259259
N,M = pointsize(d,n)
260-
pts = Array{float(eltype(d))}(undef,0)
260+
pts = Array{ApproxFunBase.float(eltype(d))}(undef,0)
261261
a,b = rectspace(DuffyCone()).spaces
262262
for y in points(b,M), x in points(a,N)
263263
push!(pts,conemap(Vec(x...,y...)))
@@ -434,7 +434,13 @@ function LegendreConeTransformPlan(S::LegendreCone, v::AbstractVector{T}) where
434434
end
435435

436436

437-
*(P::LegendreConeTransformPlan, v::AbstractVector) = _coefficients(P.triangleplan, P.duffyplan*v, DuffyCone(), LegendreCone())
437+
function *(P::LegendreConeTransformPlan, v::AbstractVector)
438+
N,M = P.duffyplan.plan[1][2],P.duffyplan.plan[2][2]
439+
V=reshape(v,N,M)
440+
cfs = P.duffyplan*copy(V)
441+
duffy2legendrecone!(P.triangleplan,cfs)
442+
fromtensor(LegendreCone(), cfs)
443+
end
438444

439445
plan_transform(K::LegendreCone, v::AbstractVector) = LegendreConeTransformPlan(K, v)
440446

src/Disk/Disk.jl

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,10 @@ end
2121
# N = (1 + sqrt(1 + 8n)/4)
2222
function points(d::ZernikeDisk, n)
2323
a,b = rectspace(ZernikeDisk()).spaces
24-
pts=Array{float(eltype(domain(d)))}(undef,0)
25-
N,M = pointsize(d, n)
26-
27-
for y in points(b,M),
28-
x in points(a,N)
29-
push!(pts,polar(Vec(x...,y...)))
30-
end
31-
pts
24+
M,N = pointsize(d, n)
25+
p_b = points(b,N)
26+
p_a = points(a,M)
27+
polar.(Vec.(p_a, p_b'))
3228
end
3329

3430
function evaluate(cfs::AbstractVector, Z::ZernikeDisk, xy)
@@ -183,24 +179,22 @@ struct ZernikeDiskTransformPlan{DUF,CHEB}
183179
disk2cxf::CHEB
184180
end
185181

186-
function ZernikeDiskTransformPlan(S::ZernikeDisk, v::AbstractVector{T}) where T
187-
n = length(v)
188-
N = (1 + isqrt(1+8n)) ÷ 4
189-
M = 2N-1
182+
function ZernikeDiskTransformPlan(S::ZernikeDisk, V::AbstractMatrix{T}) where T
183+
N,M = size(V)
184+
@assert M == 2N-1
190185
D = plan_transform!(rectspace(ChebyshevDisk()), Array{T}(undef,N,M))
191186
N = (M-1)÷4+1
192187
4(N-1)+1 == M || (N += 1) # round up
193188
ZernikeDiskTransformPlan(D, CDisk2CxfPlan(N))
194189
end
195190

196-
function *(P::ZernikeDiskTransformPlan, v::AbstractVector)
197-
N,M = P.cxfplan.plan[1][2],P.cxfplan.plan[2][2]
198-
V = P.cxfplan*reshape(copy(v),N,M)
191+
function *(P::ZernikeDiskTransformPlan, V::AbstractMatrix)
192+
V = P.cxfplan*copy(V)
199193
C = checkerboard(V)
200194
fromtensor(ZernikeDisk(), P.disk2cxf\C)
201195
end
202196

203-
plan_transform(K::ZernikeDisk, v::AbstractVector) = ZernikeDiskTransformPlan(K, v)
197+
plan_transform(K::ZernikeDisk, v::AbstractMatrix) = ZernikeDiskTransformPlan(K, v)
204198

205199
struct ZernikeDiskITransformPlan{DUF,CHEB}
206200
icxfplan::DUF

test/test_cone.jl

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ using ApproxFun, MultivariateOrthogonalPolynomials, StaticArrays, FillArrays, Bl
22
import ApproxFunBase: checkpoints, plan_transform!, fromtensor
33
import MultivariateOrthogonalPolynomials: rectspace, totensor, duffy2legendreconic!, legendre2duffyconic!, c_plan_rottriangle, plan_transform,
44
c_execute_tri_hi2lo, c_execute_tri_lo2hi, duffy2legendrecone_column_J!, duffy2legendrecone!, legendre2duffycone!,
5-
duffy2legendreconic!, ConicTensorizer
5+
duffy2legendreconic!, ConicTensorizer, pointsize
66

77

88
@testset "Conic" begin
@@ -126,6 +126,11 @@ end
126126
@test checkpoints(rs) isa Vector{SVector{3,Float64}}
127127
end
128128

129+
@testset "ConeTensorizer" begin
130+
ts = MultivariateOrthogonalPolynomials.ConeTensorizer()
131+
@test totensor(ts,1:10) == [1 2 3 5 6 7; 4 8 9 0 0 0; 10 0 0 0 0 0]
132+
end
133+
129134
@testset "DuffyCone" begin
130135
p = points(DuffyCone(), 10)
131136
@test p isa Vector{SVector{3,Float64}}
@@ -205,27 +210,33 @@ end
205210
@testset "LegendreConePlan" begin
206211
for N = 1:10
207212
n = N*sum(1:N)
208-
@test round(Int,1/3*(-1 + 1/(-1 + 27n + 3sqrt(3)sqrt(n*(-2 + 27n)))^(1/3) + (-1 + 27n + 3sqrt(3)sqrt(n*(-2 + 27n)))^(1/3)),RoundUp) N
213+
@test round(Int, 1/6*(1 + 1/(1 + 54n + 6sqrt(3)sqrt(n + 27n^2))^(1/3) + (1 + 54n + 6sqrt(3)sqrt(n + 27n^2))^(1/3)), RoundUp)
209214
end
210215
p = points(LegendreCone(),10)
211-
@test length(p) == 18 == 3*sum(1:3)
216+
@test length(p) == 12 == 2*2*3
212217
v = fill(1.0,length(p))
213218
n = length(v)
214-
N = round(Int,1/3*(-1 + 1/(-1 + 27n + 3sqrt(3)sqrt(n*(-2 + 27n)))^(1/3) + (-1 + 27n + 3sqrt(3)sqrt(n*(-2 + 27n)))^(1/3)),RoundUp)
215-
M = N*(N+1) ÷ 2
219+
M,N,O = pointsize(Cone(),n)
220+
221+
216222
D = plan_transform!(rectspace(DuffyCone()), reshape(v,N,M))
217223
N,M = D.plan[1][2],D.plan[2][2]
218224
V=reshape(v,N,M)
219-
@test D*copy(V) [[1/sqrt(2) zeros(1,5)]; zeros(2,6)]
225+
@test D*V [[1/sqrt(2) zeros(1,5)]; zeros(2,6)]
220226
T = Float64
221227
P = c_plan_rottriangle(N, zero(T), zero(T), zero(T))
222228
duffy2legendrecone!(P,V)
223-
@test V [[1 zeros(1,2)]; zeros(1,3)]
224-
@test fromtensor(DuffyConic(), V) [1; Zeros(5)]
229+
@test V [[1/sqrt(2) zeros(1,5)]; zeros(2,6)]
230+
@test fromtensor(LegendreCone(), V) [1/sqrt(2); Zeros(55)]
225231

226232
v = fill(1.0,length(p))
227-
@test plan_transform(LegendreConic(),v)*v [1; Zeros(3)]
233+
P = plan_transform(LegendreCone(),v)
234+
@test P*v [1/sqrt(2); Zeros(55)]
228235
@test v == fill(1.0,length(p))
236+
237+
p = points(LegendreCone(),20)
238+
v = fill(1.0,length(p))
239+
P = plan_transform(LegendreCone(),v)
229240

230241

231242
for (m,k,ℓ) in ((0,0,0), )

test/test_disk.jl

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,23 +141,20 @@ end
141141
@testset "transform derivation" begin
142142
p = points(ZernikeDisk(),10)
143143
@test length(p) == 6
144-
v = fill(1.0,length(p))
145-
n = length(v)
146-
N = (1 + isqrt(1+8n)) ÷ 4
147-
M = 2N-1
148-
D = plan_transform!(rectspace(ChebyshevDisk()), reshape(v,N,M))
144+
@test size(p) == (2,3)
145+
V = fill(1.0,size(p))
146+
D = plan_transform!(rectspace(ChebyshevDisk()), V)
149147
N,M = D.plan[1][2],D.plan[2][2]
150-
V=reshape(v,N,M)
151148
@test D*V [[1 zeros(1,2)]; zeros(1,3)]
152149
C = checkerboard(V)
153150
disk2cxf = CDisk2CxfPlan(size(C,1))
154151
C = disk2cxf\C
155152
@test C [[1/sqrt(2) zeros(1,4)]; zeros(1,5)]
156153
@test fromtensor(ZernikeDisk(), C) [1/sqrt(2); Zeros(5)]
157154

158-
v = fill(1.0,length(p))
155+
v = fill(1.0,size(p))
159156
@test plan_transform(ZernikeDisk(),v)*v [1/sqrt(2); Zeros(5)]
160-
@test v == fill(1.0,length(p))
157+
@test v == fill(1.0,size(p))
161158
end
162159

163160
@testset "ChebyshevDisk-ZernikeDisk" begin

0 commit comments

Comments
 (0)