Skip to content

Commit 7b43d91

Browse files
Add complex transforms
soften typing of parameterized transforms (@dlfivefifty), since they get converted at the `ccall`
1 parent d93a15c commit 7b43d91

File tree

2 files changed

+103
-76
lines changed

2 files changed

+103
-76
lines changed

src/libfasttransforms.jl

Lines changed: 54 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ for f in (:leg2cheb, :cheb2leg, :ultra2ultra, :jac2jac,
219219
plan_f = Symbol("plan_", f)
220220
@eval begin
221221
$plan_f(x::AbstractArray{T}, y...; z...) where T = $plan_f(T, size(x, 1), y...; z...)
222+
$plan_f(x::AbstractArray{Complex{T}}, y...; z...) where T <: Real = $plan_f(T, size(x, 1), y...; z...)
222223
$f(x::AbstractArray, y...; z...) = $plan_f(x, y...; z...)*x
223224
end
224225
end
@@ -242,47 +243,47 @@ function plan_cheb2leg(::Type{Float32}, n::Integer; normcheb::Bool=false, normle
242243
return FTPlan{Float32, 1, CHEB2LEG}(plan, n)
243244
end
244245

245-
function plan_ultra2ultra(::Type{Float32}, n::Integer, λ::Float32, μ::Float32; norm1::Bool=false, norm2::Bool=false)
246+
function plan_ultra2ultra(::Type{Float32}, n::Integer, λ, μ; norm1::Bool=false, norm2::Bool=false)
246247
plan = ccall((:ft_plan_ultraspherical_to_ultrasphericalf, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32, Float32), norm1, norm2, n, λ, μ)
247248
return FTPlan{Float32, 1, ULTRA2ULTRA}(plan, n)
248249
end
249250

250-
function plan_jac2jac(::Type{Float32}, n::Integer, α::Float32, β::Float32, γ::Float32, δ::Float32; norm1::Bool=false, norm2::Bool=false)
251+
function plan_jac2jac(::Type{Float32}, n::Integer, α, β, γ, δ; norm1::Bool=false, norm2::Bool=false)
251252
plan = ccall((:ft_plan_jacobi_to_jacobif, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32, Float32, Float32, Float32), norm1, norm2, n, α, β, γ, δ)
252253
return FTPlan{Float32, 1, JAC2JAC}(plan, n)
253254
end
254255

255-
function plan_lag2lag(::Type{Float32}, n::Integer, α::Float32, β::Float32; norm1::Bool=false, norm2::Bool=false)
256+
function plan_lag2lag(::Type{Float32}, n::Integer, α, β; norm1::Bool=false, norm2::Bool=false)
256257
plan = ccall((:ft_plan_laguerre_to_laguerref, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32, Float32), norm1, norm2, n, α, β)
257258
return FTPlan{Float32, 1, LAG2LAG}(plan, n)
258259
end
259260

260-
function plan_jac2ultra(::Type{Float32}, n::Integer, α::Float32, β::Float32, λ::Float32; normjac::Bool=false, normultra::Bool=false)
261+
function plan_jac2ultra(::Type{Float32}, n::Integer, α, β, λ; normjac::Bool=false, normultra::Bool=false)
261262
plan = ccall((:ft_plan_jacobi_to_ultrasphericalf, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32, Float32, Float32), normjac, normultra, n, α, β, λ)
262263
return FTPlan{Float32, 1, JAC2ULTRA}(plan, n)
263264
end
264265

265-
function plan_ultra2jac(::Type{Float32}, n::Integer, λ::Float32, α::Float32, β::Float32; normultra::Bool=false, normjac::Bool=false)
266+
function plan_ultra2jac(::Type{Float32}, n::Integer, λ, α, β; normultra::Bool=false, normjac::Bool=false)
266267
plan = ccall((:ft_plan_ultraspherical_to_jacobif, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32, Float32, Float32), normultra, normjac, n, λ, α, β)
267268
return FTPlan{Float32, 1, ULTRA2JAC}(plan, n)
268269
end
269270

270-
function plan_jac2cheb(::Type{Float32}, n::Integer, α::Float32, β::Float32; normjac::Bool=false, normcheb::Bool=false)
271+
function plan_jac2cheb(::Type{Float32}, n::Integer, α, β; normjac::Bool=false, normcheb::Bool=false)
271272
plan = ccall((:ft_plan_jacobi_to_chebyshevf, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32, Float32), normjac, normcheb, n, α, β)
272273
return FTPlan{Float32, 1, JAC2CHEB}(plan, n)
273274
end
274275

275-
function plan_cheb2jac(::Type{Float32}, n::Integer, α::Float32, β::Float32; normcheb::Bool=false, normjac::Bool=false)
276+
function plan_cheb2jac(::Type{Float32}, n::Integer, α, β; normcheb::Bool=false, normjac::Bool=false)
276277
plan = ccall((:ft_plan_chebyshev_to_jacobif, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32, Float32), normcheb, normjac, n, α, β)
277278
return FTPlan{Float32, 1, CHEB2JAC}(plan, n)
278279
end
279280

280-
function plan_ultra2cheb(::Type{Float32}, n::Integer, λ::Float32; normultra::Bool=false, normcheb::Bool=false)
281+
function plan_ultra2cheb(::Type{Float32}, n::Integer, λ; normultra::Bool=false, normcheb::Bool=false)
281282
plan = ccall((:ft_plan_ultraspherical_to_chebyshevf, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32), normultra, normcheb, n, λ)
282283
return FTPlan{Float32, 1, ULTRA2CHEB}(plan, n)
283284
end
284285

285-
function plan_cheb2ultra(::Type{Float32}, n::Integer, λ::Float32; normcheb::Bool=false, normultra::Bool=false)
286+
function plan_cheb2ultra(::Type{Float32}, n::Integer, λ; normcheb::Bool=false, normultra::Bool=false)
286287
plan = ccall((:ft_plan_chebyshev_to_ultrasphericalf, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float32), normcheb, normultra, n, λ)
287288
return FTPlan{Float32, 1, CHEB2ULTRA}(plan, n)
288289
end
@@ -298,47 +299,47 @@ function plan_cheb2leg(::Type{Float64}, n::Integer; normcheb::Bool=false, normle
298299
return FTPlan{Float64, 1, CHEB2LEG}(plan, n)
299300
end
300301

301-
function plan_ultra2ultra(::Type{Float64}, n::Integer, λ::Float64, μ::Float64; norm1::Bool=false, norm2::Bool=false)
302+
function plan_ultra2ultra(::Type{Float64}, n::Integer, λ, μ; norm1::Bool=false, norm2::Bool=false)
302303
plan = ccall((:ft_plan_ultraspherical_to_ultraspherical, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64, Float64), norm1, norm2, n, λ, μ)
303304
return FTPlan{Float64, 1, ULTRA2ULTRA}(plan, n)
304305
end
305306

306-
function plan_jac2jac(::Type{Float64}, n::Integer, α::Float64, β::Float64, γ::Float64, δ::Float64; norm1::Bool=false, norm2::Bool=false)
307+
function plan_jac2jac(::Type{Float64}, n::Integer, α, β, γ, δ; norm1::Bool=false, norm2::Bool=false)
307308
plan = ccall((:ft_plan_jacobi_to_jacobi, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64, Float64, Float64, Float64), norm1, norm2, n, α, β, γ, δ)
308309
return FTPlan{Float64, 1, JAC2JAC}(plan, n)
309310
end
310311

311-
function plan_lag2lag(::Type{Float64}, n::Integer, α::Float64, β::Float64; norm1::Bool=false, norm2::Bool=false)
312+
function plan_lag2lag(::Type{Float64}, n::Integer, α, β; norm1::Bool=false, norm2::Bool=false)
312313
plan = ccall((:ft_plan_laguerre_to_laguerre, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64, Float64), norm1, norm2, n, α, β)
313314
return FTPlan{Float64, 1, LAG2LAG}(plan, n)
314315
end
315316

316-
function plan_jac2ultra(::Type{Float64}, n::Integer, α::Float64, β::Float64, λ::Float64; normjac::Bool=false, normultra::Bool=false)
317+
function plan_jac2ultra(::Type{Float64}, n::Integer, α, β, λ; normjac::Bool=false, normultra::Bool=false)
317318
plan = ccall((:ft_plan_jacobi_to_ultraspherical, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64, Float64, Float64), normjac, normultra, n, α, β, λ)
318319
return FTPlan{Float64, 1, JAC2ULTRA}(plan, n)
319320
end
320321

321-
function plan_ultra2jac(::Type{Float64}, n::Integer, λ::Float64, α::Float64, β::Float64; normultra::Bool=false, normjac::Bool=false)
322+
function plan_ultra2jac(::Type{Float64}, n::Integer, λ, α, β; normultra::Bool=false, normjac::Bool=false)
322323
plan = ccall((:ft_plan_ultraspherical_to_jacobi, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64, Float64, Float64), normultra, normjac, n, λ, α, β)
323324
return FTPlan{Float64, 1, ULTRA2JAC}(plan, n)
324325
end
325326

326-
function plan_jac2cheb(::Type{Float64}, n::Integer, α::Float64, β::Float64; normjac::Bool=false, normcheb::Bool=false)
327+
function plan_jac2cheb(::Type{Float64}, n::Integer, α, β; normjac::Bool=false, normcheb::Bool=false)
327328
plan = ccall((:ft_plan_jacobi_to_chebyshev, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64, Float64), normjac, normcheb, n, α, β)
328329
return FTPlan{Float64, 1, JAC2CHEB}(plan, n)
329330
end
330331

331-
function plan_cheb2jac(::Type{Float64}, n::Integer, α::Float64, β::Float64; normcheb::Bool=false, normjac::Bool=false)
332+
function plan_cheb2jac(::Type{Float64}, n::Integer, α, β; normcheb::Bool=false, normjac::Bool=false)
332333
plan = ccall((:ft_plan_chebyshev_to_jacobi, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64, Float64), normcheb, normjac, n, α, β)
333334
return FTPlan{Float64, 1, CHEB2JAC}(plan, n)
334335
end
335336

336-
function plan_ultra2cheb(::Type{Float64}, n::Integer, λ::Float64; normultra::Bool=false, normcheb::Bool=false)
337+
function plan_ultra2cheb(::Type{Float64}, n::Integer, λ; normultra::Bool=false, normcheb::Bool=false)
337338
plan = ccall((:ft_plan_ultraspherical_to_chebyshev, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64), normultra, normcheb, n, λ)
338339
return FTPlan{Float64, 1, ULTRA2CHEB}(plan, n)
339340
end
340341

341-
function plan_cheb2ultra(::Type{Float64}, n::Integer, λ::Float64; normcheb::Bool=false, normultra::Bool=false)
342+
function plan_cheb2ultra(::Type{Float64}, n::Integer, λ; normcheb::Bool=false, normultra::Bool=false)
342343
plan = ccall((:ft_plan_chebyshev_to_ultraspherical, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Float64), normcheb, normultra, n, λ)
343344
return FTPlan{Float64, 1, CHEB2ULTRA}(plan, n)
344345
end
@@ -354,47 +355,47 @@ function plan_cheb2leg(::Type{BigFloat}, n::Integer; normcheb::Bool=false, norml
354355
return FTPlan{BigFloat, 1, CHEB2LEG}(plan, n)
355356
end
356357

357-
function plan_ultra2ultra(::Type{BigFloat}, n::Integer, λ::BigFloat, μ::BigFloat; norm1::Bool=false, norm2::Bool=false)
358+
function plan_ultra2ultra(::Type{BigFloat}, n::Integer, λ, μ; norm1::Bool=false, norm2::Bool=false)
358359
plan = ccall((:ft_mpfr_plan_ultraspherical_to_ultraspherical, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Ref{BigFloat}, Clong, Int32), norm1, norm2, n, λ, μ, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
359360
return FTPlan{BigFloat, 1, ULTRA2ULTRA}(plan, n)
360361
end
361362

362-
function plan_jac2jac(::Type{BigFloat}, n::Integer, α::BigFloat, β::BigFloat, γ::BigFloat, δ::BigFloat; norm1::Bool=false, norm2::Bool=false)
363+
function plan_jac2jac(::Type{BigFloat}, n::Integer, α, β, γ, δ; norm1::Bool=false, norm2::Bool=false)
363364
plan = ccall((:ft_mpfr_plan_jacobi_to_jacobi, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Ref{BigFloat}, Ref{BigFloat}, Ref{BigFloat}, Clong, Int32), norm1, norm2, n, α, β, γ, δ, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
364365
return FTPlan{BigFloat, 1, JAC2JAC}(plan, n)
365366
end
366367

367-
function plan_lag2lag(::Type{BigFloat}, n::Integer, α::BigFloat, β::BigFloat; norm1::Bool=false, norm2::Bool=false)
368+
function plan_lag2lag(::Type{BigFloat}, n::Integer, α, β; norm1::Bool=false, norm2::Bool=false)
368369
plan = ccall((:ft_mpfr_plan_laguerre_to_laguerre, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Ref{BigFloat}, Clong, Int32), norm1, norm2, n, α, β, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
369370
return FTPlan{BigFloat, 1, LAG2LAG}(plan, n)
370371
end
371372

372-
function plan_jac2ultra(::Type{BigFloat}, n::Integer, α::BigFloat, β::BigFloat, λ::BigFloat; normjac::Bool=false, normultra::Bool=false)
373+
function plan_jac2ultra(::Type{BigFloat}, n::Integer, α, β, λ; normjac::Bool=false, normultra::Bool=false)
373374
plan = ccall((:ft_mpfr_plan_jacobi_to_ultraspherical, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Ref{BigFloat}, Ref{BigFloat}, Clong, Int32), normjac, normultra, n, α, β, λ, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
374375
return FTPlan{BigFloat, 1, JAC2ULTRA}(plan, n)
375376
end
376377

377-
function plan_ultra2jac(::Type{BigFloat}, n::Integer, λ::BigFloat, α::BigFloat, β::BigFloat; normultra::Bool=false, normjac::Bool=false)
378+
function plan_ultra2jac(::Type{BigFloat}, n::Integer, λ, α, β; normultra::Bool=false, normjac::Bool=false)
378379
plan = ccall((:ft_mpfr_plan_ultraspherical_to_jacobi, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Ref{BigFloat}, Ref{BigFloat}, Clong, Int32), normultra, normjac, n, λ, α, β, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
379380
return FTPlan{BigFloat, 1, ULTRA2JAC}(plan, n)
380381
end
381382

382-
function plan_jac2cheb(::Type{BigFloat}, n::Integer, α::BigFloat, β::BigFloat; normjac::Bool=false, normcheb::Bool=false)
383+
function plan_jac2cheb(::Type{BigFloat}, n::Integer, α, β; normjac::Bool=false, normcheb::Bool=false)
383384
plan = ccall((:ft_mpfr_plan_jacobi_to_chebyshev, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Ref{BigFloat}, Clong, Int32), normjac, normcheb, n, α, β, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
384385
return FTPlan{BigFloat, 1, JAC2CHEB}(plan, n)
385386
end
386387

387-
function plan_cheb2jac(::Type{BigFloat}, n::Integer, α::BigFloat, β::BigFloat; normcheb::Bool=false, normjac::Bool=false)
388+
function plan_cheb2jac(::Type{BigFloat}, n::Integer, α, β; normcheb::Bool=false, normjac::Bool=false)
388389
plan = ccall((:ft_mpfr_plan_chebyshev_to_jacobi, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Ref{BigFloat}, Clong, Int32), normcheb, normjac, n, α, β, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
389390
return FTPlan{BigFloat, 1, CHEB2JAC}(plan, n)
390391
end
391392

392-
function plan_ultra2cheb(::Type{BigFloat}, n::Integer, λ::BigFloat; normultra::Bool=false, normcheb::Bool=false)
393+
function plan_ultra2cheb(::Type{BigFloat}, n::Integer, λ; normultra::Bool=false, normcheb::Bool=false)
393394
plan = ccall((:ft_mpfr_plan_ultraspherical_to_chebyshev, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Clong, Int32), normultra, normcheb, n, λ, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
394395
return FTPlan{BigFloat, 1, ULTRA2CHEB}(plan, n)
395396
end
396397

397-
function plan_cheb2ultra(::Type{BigFloat}, n::Integer, λ::BigFloat; normcheb::Bool=false, normultra::Bool=false)
398+
function plan_cheb2ultra(::Type{BigFloat}, n::Integer, λ; normcheb::Bool=false, normultra::Bool=false)
398399
plan = ccall((:ft_mpfr_plan_chebyshev_to_ultraspherical, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Ref{BigFloat}, Clong, Int32), normcheb, normultra, n, λ, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
399400
return FTPlan{BigFloat, 1, CHEB2ULTRA}(plan, n)
400401
end
@@ -415,12 +416,12 @@ function plan_disk2cxf(::Type{Float64}, n::Integer)
415416
return FTPlan{Float64, 2, DISK}(plan, n)
416417
end
417418

418-
function plan_tri2cheb(::Type{Float64}, n::Integer, α::Float64, β::Float64, γ::Float64)
419+
function plan_tri2cheb(::Type{Float64}, n::Integer, α, β, γ)
419420
plan = ccall((:ft_plan_tri2cheb, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Float64, Float64, Float64), n, α, β, γ)
420421
return FTPlan{Float64, 2, TRIANGLE}(plan, n)
421422
end
422423

423-
function plan_tet2cheb(::Type{Float64}, n::Integer, α::Float64, β::Float64, γ::Float64, δ::Float64)
424+
function plan_tet2cheb(::Type{Float64}, n::Integer, α, β, γ, δ)
424425
plan = ccall((:ft_plan_tet2cheb, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Float64, Float64, Float64, Float64), n, α, β, γ, δ)
425426
return FTPlan{Float64, 3, TETRAHEDRON}(plan, n)
426427
end
@@ -621,3 +622,27 @@ function ldiv!(p::FTPlan{Float64, 3, TETRAHEDRON}, x::Array{Float64, 3})
621622
ccall((:ft_execute_cheb2tet, libfasttransforms), Cvoid, (Ptr{ft_plan_struct}, Ptr{Float64}, Cint, Cint, Cint), p, x, size(x, 1), size(x, 2), size(x, 3))
622623
return x
623624
end
625+
626+
*(p::FTPlan{T}, x::Array{Complex{T}}) where T = lmul!(p, deepcopy(x))
627+
*(p::AdjointFTPlan{T}, x::Array{Complex{T}}) where T = lmul!(p, deepcopy(x))
628+
*(p::TransposeFTPlan{T}, x::Array{Complex{T}}) where T = lmul!(p, deepcopy(x))
629+
\(p::FTPlan{T}, x::Array{Complex{T}}) where T = ldiv!(p, deepcopy(x))
630+
\(p::AdjointFTPlan{T}, x::Array{Complex{T}}) where T = ldiv!(p, deepcopy(x))
631+
\(p::TransposeFTPlan{T}, x::Array{Complex{T}}) where T = ldiv!(p, deepcopy(x))
632+
633+
for fJ in (:lmul!, :ldiv!)
634+
@eval begin
635+
function $fJ(p::FTPlan{T}, x::AbstractArray{Complex{T}}) where T
636+
x .= complex.($fJ(p, real(x)), $fJ(p, imag(x)))
637+
return x
638+
end
639+
function $fJ(p::AdjointFTPlan{T, FTPlan{T, N, K}}, x::AbstractArray{Complex{T}}) where {T, N, K}
640+
x .= complex.($fJ(p, real(x)), $fJ(p, imag(x)))
641+
return x
642+
end
643+
function $fJ(p::TransposeFTPlan{T, FTPlan{T, N, K}}, x::AbstractArray{Complex{T}}) where {T, N, K}
644+
x .= complex.($fJ(p, real(x)), $fJ(p, imag(x)))
645+
return x
646+
end
647+
end
648+
end

test/libfasttransformstests.jl

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ FastTransforms.set_num_threads(ceil(Int, Base.Sys.CPU_THREADS/2))
55
@testset "libfasttransforms" begin
66
n = 64
77
α, β, γ, δ, λ, μ = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6
8-
for T in (Float32, Float64, BigFloat)
8+
for T in (Float32, Float64, BigFloat, Complex{Float32}, Complex{Float64}), Complex{BigFloat})
99
x = T(1)./(1:n)
1010
Id = Matrix{T}(I, n, n)
1111
for (p1, p2) in ((plan_leg2cheb(Id), plan_cheb2leg(Id)),
12-
(plan_ultra2ultra(Id, T(λ), T(μ)), plan_ultra2ultra(Id, T(μ), T(λ))),
13-
(plan_jac2jac(Id, T(α), T(β), T(γ), T(δ)), plan_jac2jac(Id, T(γ), T(δ), T(α), T(β))),
14-
(plan_lag2lag(Id, T(α), T(β)), plan_lag2lag(Id, T(β), T(α))),
15-
(plan_jac2ultra(Id, T(α), T(β), T(λ)), plan_ultra2jac(Id, T(λ), T(α), T(β))),
16-
(plan_jac2cheb(Id, T(α), T(β)), plan_cheb2jac(Id, T(α), T(β))),
17-
(plan_ultra2cheb(Id, T(λ)), plan_cheb2ultra(Id, T(λ))))
12+
(plan_ultra2ultra(Id, λ, μ), plan_ultra2ultra(Id, μ, λ)),
13+
(plan_jac2jac(Id, α, β, γ, δ), plan_jac2jac(Id, γ, δ, α, β)),
14+
(plan_lag2lag(Id, α, β), plan_lag2lag(Id, β, α)),
15+
(plan_jac2ultra(Id, α, β, λ), plan_ultra2jac(Id, λ, α, β)),
16+
(plan_jac2cheb(Id, α, β), plan_cheb2jac(Id, α, β)),
17+
(plan_ultra2cheb(Id, λ), plan_cheb2ultra(Id, λ)))
1818
y = p1*x
1919
z = p2*y
2020
@test z x
@@ -53,48 +53,50 @@ FastTransforms.set_num_threads(ceil(Int, Base.Sys.CPU_THREADS/2))
5353
end
5454
end
5555

56-
A = sphones(Float64, n, 2n-1)
57-
p = plan_sph2fourier(A)
58-
ps = plan_sph_synthesis(A)
59-
pa = plan_sph_analysis(A)
60-
B = copy(A)
61-
C = ps*(p*A)
62-
A = p\(pa*C)
63-
@test A B
56+
for T in (Float64, Complex{Float64})
57+
A = sphones(T, n, 2n-1)
58+
p = plan_sph2fourier(A)
59+
ps = plan_sph_synthesis(A)
60+
pa = plan_sph_analysis(A)
61+
B = copy(A)
62+
C = ps*(p*A)
63+
A = p\(pa*C)
64+
@test A B
6465

65-
A = sphvones(Float64, n, 2n-1)
66-
p = plan_sphv2fourier(A)
67-
ps = plan_sphv_synthesis(A)
68-
pa = plan_sphv_analysis(A)
69-
B = copy(A)
70-
C = ps*(p*A)
71-
A = p\(pa*C)
72-
@test A B
66+
A = sphvones(T, n, 2n-1)
67+
p = plan_sphv2fourier(A)
68+
ps = plan_sphv_synthesis(A)
69+
pa = plan_sphv_analysis(A)
70+
B = copy(A)
71+
C = ps*(p*A)
72+
A = p\(pa*C)
73+
@test A B
7374

74-
A = diskones(Float64, n, 4n-3)
75-
p = plan_disk2cxf(A)
76-
ps = plan_disk_synthesis(A)
77-
pa = plan_disk_analysis(A)
78-
B = copy(A)
79-
C = ps*(p*A)
80-
A = p\(pa*C)
81-
@test A B
75+
A = diskones(T, n, 4n-3)
76+
p = plan_disk2cxf(A)
77+
ps = plan_disk_synthesis(A)
78+
pa = plan_disk_analysis(A)
79+
B = copy(A)
80+
C = ps*(p*A)
81+
A = p\(pa*C)
82+
@test A B
8283

83-
A = triones(Float64, n, n)
84-
p = plan_tri2cheb(A, α, β, γ)
85-
ps = plan_tri_synthesis(A)
86-
pa = plan_tri_analysis(A)
87-
B = copy(A)
88-
C = ps*(p*A)
89-
A = p\(pa*C)
90-
@test A B
84+
A = triones(T, n, n)
85+
p = plan_tri2cheb(A, α, β, γ)
86+
ps = plan_tri_synthesis(A)
87+
pa = plan_tri_analysis(A)
88+
B = copy(A)
89+
C = ps*(p*A)
90+
A = p\(pa*C)
91+
@test A B
9192

92-
A = tetones(Float64, n, n, n)
93-
p = plan_tet2cheb(A, α, β, γ, δ)
94-
ps = plan_tet_synthesis(A)
95-
pa = plan_tet_analysis(A)
96-
B = copy(A)
97-
C = ps*(p*A)
98-
A = p\(pa*C)
99-
@test A B
93+
A = tetones(T, n, n, n)
94+
p = plan_tet2cheb(A, α, β, γ, δ)
95+
ps = plan_tet_synthesis(A)
96+
pa = plan_tet_analysis(A)
97+
B = copy(A)
98+
C = ps*(p*A)
99+
A = p\(pa*C)
100+
@test A B
101+
end
100102
end

0 commit comments

Comments
 (0)