Skip to content

Commit 7d5a39e

Browse files
add triangular typing for * and \ of 1D FTPlans, elliptic submodule
1 parent cc10528 commit 7d5a39e

File tree

5 files changed

+146
-7
lines changed

5 files changed

+146
-7
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "FastTransforms"
22
uuid = "057dd010-8810-581a-b7be-e3fc3b93f78c"
3-
version = "0.14.0"
3+
version = "0.14.1"
44

55
[deps]
66
AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c"

docs/src/index.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,9 @@ FastTransforms.chebyshevjacobimoments2
135135
```@docs
136136
FastTransforms.chebyshevlogmoments2
137137
```
138+
139+
### Elliptic
140+
141+
```@docs
142+
FastTransforms.Elliptic
143+
```

src/FastTransforms.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export plan_leg2cheb, plan_cheb2leg, plan_ultra2ultra, plan_jac2jac,
5353
include("clenshaw.jl")
5454

5555
include("libfasttransforms.jl")
56+
include("elliptic.jl")
5657

5758
export nufft, nufft1, nufft2, nufft3, inufft1, inufft2
5859

src/elliptic.jl

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
"""
2+
`FastTransforms` submodule for the computation of some elliptic integrals and functions.
3+
4+
Complete elliptic integrals of the first and second kinds:
5+
```math
6+
K(k) = \\int_0^{\\frac{\\pi}{2}} \\frac{{\\rm d}\\theta}{\\sqrt{1-k^2\\sin^2\\theta}},\\quad{\\rm and},
7+
```
8+
```math
9+
E(k) = \\int_0^{\\frac{\\pi}{2}} \\sqrt{1-k^2\\sin^2\\theta} {\\rm\\,d}\\theta.
10+
```
11+
12+
Jacobian elliptic functions:
13+
```math
14+
x = \\int_0^{\\operatorname{sn}(x,k)} \\frac{{\\rm d}t}{\\sqrt{(1-t^2)(1-k^2t^2)}},
15+
```
16+
```math
17+
x = \\int_{\\operatorname{cn}(x,k)}^1 \\frac{{\\rm d}t}{\\sqrt{(1-t^2)[1-k^2(1-t^2)]}},
18+
```
19+
```math
20+
x = \\int_{\\operatorname{dn}(x,k)}^1 \\frac{{\\rm d}t}{\\sqrt{(1-t^2)(t^2-1+k^2)}},
21+
```
22+
and the remaining nine are defined by:
23+
```math
24+
\\operatorname{pq}(x,k) = \\frac{\\operatorname{pr}(x,k)}{\\operatorname{qr}(x,k)} = \\frac{1}{\\operatorname{qp}(x,k)}.
25+
```
26+
"""
27+
module Elliptic
28+
29+
import FastTransforms: libfasttransforms
30+
31+
export K, E,
32+
sn, cn, dn, ns, nc, nd,
33+
sc, cs, sd, ds, cd, dc
34+
35+
for (fC, elty) in ((:ft_complete_elliptic_integralf, :Float32), (:ft_complete_elliptic_integral, :Float64))
36+
@eval begin
37+
function K(k::$elty)
38+
return ccall(($(string(fC)), libfasttransforms), $elty, (Cint, $elty), '1', k)
39+
end
40+
function E(k::$elty)
41+
return ccall(($(string(fC)), libfasttransforms), $elty, (Cint, $elty), '2', k)
42+
end
43+
end
44+
end
45+
46+
const SN = UInt(1)
47+
const CN = UInt(2)
48+
const DN = UInt(4)
49+
50+
for (fC, elty) in ((:ft_jacobian_elliptic_functionsf, :Float32), (:ft_jacobian_elliptic_functions, :Float64))
51+
@eval begin
52+
function sn(x::$elty, k::$elty)
53+
retsn = Ref{$elty}()
54+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, retsn, C_NULL, C_NULL, SN)
55+
retsn[]
56+
end
57+
function cn(x::$elty, k::$elty)
58+
retcn = Ref{$elty}()
59+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, C_NULL, retcn, C_NULL, CN)
60+
retcn[]
61+
end
62+
function dn(x::$elty, k::$elty)
63+
retdn = Ref{$elty}()
64+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, C_NULL, C_NULL, retdn, DN)
65+
retdn[]
66+
end
67+
function ns(x::$elty, k::$elty)
68+
retsn = Ref{$elty}()
69+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, retsn, C_NULL, C_NULL, SN)
70+
inv(retsn[])
71+
end
72+
function nc(x::$elty, k::$elty)
73+
retcn = Ref{$elty}()
74+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, C_NULL, retcn, C_NULL, CN)
75+
inv(retcn[])
76+
end
77+
function nd(x::$elty, k::$elty)
78+
retdn = Ref{$elty}()
79+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, C_NULL, C_NULL, retdn, DN)
80+
inv(retdn[])
81+
end
82+
function sc(x::$elty, k::$elty)
83+
retsn = Ref{$elty}()
84+
retcn = Ref{$elty}()
85+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, retsn, retcn, C_NULL, SN & CN)
86+
retsn[]/retcn[]
87+
end
88+
function cs(x::$elty, k::$elty)
89+
retsn = Ref{$elty}()
90+
retcn = Ref{$elty}()
91+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, retsn, retcn, C_NULL, SN & CN)
92+
retcn[]/retsn[]
93+
end
94+
function sd(x::$elty, k::$elty)
95+
retsn = Ref{$elty}()
96+
retdn = Ref{$elty}()
97+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, retsn, C_NULL, retdn, SN & DN)
98+
retsn[]/retdn[]
99+
end
100+
function ds(x::$elty, k::$elty)
101+
retsn = Ref{$elty}()
102+
retdn = Ref{$elty}()
103+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, retsn, C_NULL, retdn, SN & DN)
104+
retdn[]/retsn[]
105+
end
106+
function cd(x::$elty, k::$elty)
107+
retcn = Ref{$elty}()
108+
retdn = Ref{$elty}()
109+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, C_NULL, retcn, retdn, CN & DN)
110+
retcn[]/retdn[]
111+
end
112+
function dc(x::$elty, k::$elty)
113+
retcn = Ref{$elty}()
114+
retdn = Ref{$elty}()
115+
ccall(($(string(fC)), libfasttransforms), Cvoid, ($elty, $elty, Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, UInt), x, k, C_NULL, retcn, retdn, CN & DN)
116+
retdn[]/retcn[]
117+
end
118+
end
119+
end
120+
121+
end # module

src/libfasttransforms.jl

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,7 @@ function plan_modifiedherm2herm(::Type{Float64}, n::Integer, u::Vector{Float64},
567567
return FTPlan{Float64, 1, MODIFIEDHERM2HERM}(plan, n)
568568
end
569569

570+
570571
function plan_leg2cheb(::Type{BigFloat}, n::Integer; normleg::Bool=false, normcheb::Bool=false)
571572
plan = ccall((:ft_mpfr_plan_legendre_to_chebyshev, libfasttransforms), Ptr{ft_plan_struct}, (Cint, Cint, Cint, Clong, Int32), normleg, normcheb, n, precision(BigFloat), Base.MPFR.ROUNDING_MODE[])
572573
return FTPlan{BigFloat, 1, LEG2CHEB}(plan, n)
@@ -778,12 +779,22 @@ end
778779
\(p::AdjointFTPlan{T}, x::AbstractArray{T}) where T = ldiv!(p, Array(x))
779780
\(p::TransposeFTPlan{T}, x::AbstractArray{T}) where T = ldiv!(p, Array(x))
780781

781-
*(p::FTPlan{T, 1}, x::UniformScaling{S}) where {T, S} = lmul!(p, Matrix{promote_type(T, S)}(x, p.n, p.n))
782-
*(p::AdjointFTPlan{T, FTPlan{T, 1, K}}, x::UniformScaling{S}) where {T, S, K} = lmul!(p, Matrix{promote_type(T, S)}(x, p.parent.n, p.parent.n))
783-
*(p::TransposeFTPlan{T, FTPlan{T, 1, K}}, x::UniformScaling{S}) where {T, S, K} = lmul!(p, Matrix{promote_type(T, S)}(x, p.parent.n, p.parent.n))
784-
\(p::FTPlan{T, 1}, x::UniformScaling{S}) where {T, S} = ldiv!(p, Matrix{promote_type(T, S)}(x, p.n, p.n))
785-
\(p::AdjointFTPlan{T, FTPlan{T, 1, K}}, x::UniformScaling{S}) where {T, S, K} = ldiv!(p, Matrix{promote_type(T, S)}(x, p.parent.n, p.parent.n))
786-
\(p::TransposeFTPlan{T, FTPlan{T, 1, K}}, x::UniformScaling{S}) where {T, S, K} = ldiv!(p, Matrix{promote_type(T, S)}(x, p.parent.n, p.parent.n))
782+
*(p::FTPlan{T, 1}, x::UniformScaling{S}) where {T, S} = UpperTriangular(lmul!(p, Matrix{promote_type(T, S)}(x, p.n, p.n)))
783+
*(p::AdjointFTPlan{T, FTPlan{T, 1, K}}, x::UniformScaling{S}) where {T, S, K} = LowerTriangular(lmul!(p, Matrix{promote_type(T, S)}(x, p.parent.n, p.parent.n)))
784+
*(p::TransposeFTPlan{T, FTPlan{T, 1, K}}, x::UniformScaling{S}) where {T, S, K} = LowerTriangular(lmul!(p, Matrix{promote_type(T, S)}(x, p.parent.n, p.parent.n)))
785+
\(p::FTPlan{T, 1}, x::UniformScaling{S}) where {T, S} = UpperTriangular(ldiv!(p, Matrix{promote_type(T, S)}(x, p.n, p.n)))
786+
\(p::AdjointFTPlan{T, FTPlan{T, 1, K}}, x::UniformScaling{S}) where {T, S, K} = LowerTriangular(ldiv!(p, Matrix{promote_type(T, S)}(x, p.parent.n, p.parent.n)))
787+
\(p::TransposeFTPlan{T, FTPlan{T, 1, K}}, x::UniformScaling{S}) where {T, S, K} = LowerTriangular(ldiv!(p, Matrix{promote_type(T, S)}(x, p.parent.n, p.parent.n)))
788+
789+
const AbstractUpperTriangular{T, S <: AbstractMatrix} = Union{UpperTriangular{T, S}, UnitUpperTriangular{T, S}}
790+
const AbstractLowerTriangular{T, S <: AbstractMatrix} = Union{LowerTriangular{T, S}, UnitLowerTriangular{T, S}}
791+
792+
*(p::FTPlan{T, 1}, x::AbstractUpperTriangular) where T = UpperTriangular(lmul!(p, Array(x)))
793+
*(p::AdjointFTPlan{T, 1}, x::AbstractLowerTriangular) where T = LowerTriangular(lmul!(p, Array(x)))
794+
*(p::TransposeFTPlan{T, 1}, x::AbstractLowerTriangular) where T = LowerTriangular(lmul!(p, Array(x)))
795+
\(p::FTPlan{T, 1}, x::AbstractUpperTriangular) where T = UpperTriangular(ldiv!(p, Array(x)))
796+
\(p::AdjointFTPlan{T, 1}, x::AbstractLowerTriangular) where T = LowerTriangular(ldiv!(p, Array(x)))
797+
\(p::TransposeFTPlan{T, 1}, x::AbstractLowerTriangular) where T = LowerTriangular(ldiv!(p, Array(x)))
787798

788799
for (fJ, fC, elty) in ((:lmul!, :ft_bfmvf, :Float32),
789800
(:ldiv!, :ft_bfsvf, :Float32),

0 commit comments

Comments
 (0)