Skip to content

Commit bdef196

Browse files
improve type-stability of some special functions
add `half` and `two`
1 parent 6efacfa commit bdef196

File tree

2 files changed

+30
-26
lines changed

2 files changed

+30
-26
lines changed

docs/api/FastTransforms.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ See also [`icjt`](#method__icjt.1) and [`jjt`](#method__jjt.1).
1313

1414

1515
*source:*
16-
[FastTransforms/src/cjt.jl:127](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/cjt.jl#L127)
16+
[FastTransforms/src/cjt.jl:127](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/cjt.jl#L127)
1717

1818
---
1919

@@ -23,7 +23,7 @@ Calculates the Gaunt coefficients in 64-bit floating-point arithmetic.
2323

2424

2525
*source:*
26-
[FastTransforms/src/gaunt.jl:24](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/gaunt.jl#L24)
26+
[FastTransforms/src/gaunt.jl:24](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/gaunt.jl#L24)
2727

2828
---
2929

@@ -43,7 +43,7 @@ This is a Julia implementation of the stable recurrence described in:
4343

4444

4545
*source:*
46-
[FastTransforms/src/gaunt.jl:14](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/gaunt.jl#L14)
46+
[FastTransforms/src/gaunt.jl:14](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/gaunt.jl#L14)
4747

4848
---
4949

@@ -56,7 +56,7 @@ See also [`cjt`](#method__cjt.1) and [`jjt`](#method__jjt.1).
5656

5757

5858
*source:*
59-
[FastTransforms/src/cjt.jl:135](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/cjt.jl#L135)
59+
[FastTransforms/src/cjt.jl:135](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/cjt.jl#L135)
6060

6161
---
6262

@@ -69,7 +69,7 @@ See also [`cjt`](#method__cjt.1) and [`icjt`](#method__icjt.1).
6969

7070

7171
*source:*
72-
[FastTransforms/src/cjt.jl:143](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/cjt.jl#L143)
72+
[FastTransforms/src/cjt.jl:143](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/cjt.jl#L143)
7373

7474
---
7575

@@ -88,7 +88,7 @@ Optionally:
8888

8989

9090
*source:*
91-
[FastTransforms/src/cjt.jl:157](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/cjt.jl#L157)
91+
[FastTransforms/src/cjt.jl:157](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/cjt.jl#L157)
9292

9393
---
9494

@@ -107,7 +107,7 @@ Optionally:
107107

108108

109109
*source:*
110-
[FastTransforms/src/cjt.jl:176](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/cjt.jl#L176)
110+
[FastTransforms/src/cjt.jl:176](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/cjt.jl#L176)
111111

112112
## Internal
113113

@@ -122,7 +122,7 @@ Modified Chebyshev moments of the first kind with respect to the Jacobi weight:
122122

123123

124124
*source:*
125-
[FastTransforms/src/specialfunctions.jl:362](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/specialfunctions.jl#L362)
125+
[FastTransforms/src/specialfunctions.jl:366](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/specialfunctions.jl#L366)
126126

127127
---
128128

@@ -135,7 +135,7 @@ Modified Chebyshev moments of the second kind with respect to the Jacobi weight:
135135

136136

137137
*source:*
138-
[FastTransforms/src/specialfunctions.jl:380](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/specialfunctions.jl#L380)
138+
[FastTransforms/src/specialfunctions.jl:384](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/specialfunctions.jl#L384)
139139

140140
---
141141

@@ -145,7 +145,7 @@ Compute weights of the Clenshaw—Curtis quadrature rule with a Jacobi weight.
145145

146146

147147
*source:*
148-
[FastTransforms/src/clenshawcurtis.jl:12](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/clenshawcurtis.jl#L12)
148+
[FastTransforms/src/clenshawcurtis.jl:12](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/clenshawcurtis.jl#L12)
149149

150150
---
151151

@@ -155,7 +155,7 @@ Compute nodes and weights of the Clenshaw—Curtis quadrature rule with a Jacobi
155155

156156

157157
*source:*
158-
[FastTransforms/src/clenshawcurtis.jl:6](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/clenshawcurtis.jl#L6)
158+
[FastTransforms/src/clenshawcurtis.jl:6](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/clenshawcurtis.jl#L6)
159159

160160
---
161161

@@ -165,7 +165,7 @@ Compute nodes and weights of Fejer's first quadrature rule with a Jacobi weight.
165165

166166

167167
*source:*
168-
[FastTransforms/src/fejer.jl:7](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/fejer.jl#L7)
168+
[FastTransforms/src/fejer.jl:7](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/fejer.jl#L7)
169169

170170
---
171171

@@ -175,7 +175,7 @@ Compute nodes and weights of Fejer's second quadrature rule with a Jacobi weight
175175

176176

177177
*source:*
178-
[FastTransforms/src/fejer.jl:12](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/fejer.jl#L12)
178+
[FastTransforms/src/fejer.jl:12](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/fejer.jl#L12)
179179

180180
---
181181

@@ -185,7 +185,7 @@ Compute weights of Fejer's first quadrature rule with a Jacobi weight.
185185

186186

187187
*source:*
188-
[FastTransforms/src/fejer.jl:21](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/fejer.jl#L21)
188+
[FastTransforms/src/fejer.jl:21](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/fejer.jl#L21)
189189

190190
---
191191

@@ -195,7 +195,7 @@ Compute weights of Fejer's second quadrature rule with a Jacobi weight.
195195

196196

197197
*source:*
198-
[FastTransforms/src/fejer.jl:26](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/fejer.jl#L26)
198+
[FastTransforms/src/fejer.jl:26](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/fejer.jl#L26)
199199

200200
---
201201

@@ -205,5 +205,5 @@ Pochhammer symbol (x)_n = Γ(x+n)/Γ(x) for the rising factorial.
205205

206206

207207
*source:*
208-
[FastTransforms/src/specialfunctions.jl:13](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/b1dce339ed19119766d44b5ec44d954932da58d3/src/specialfunctions.jl#L13)
208+
[FastTransforms/src/specialfunctions.jl:17](https://github.com/MikaelSlevinsky/FastTransforms.jl/tree/6efacfac1164ed74c673ec2325a5bbba3197aa71/src/specialfunctions.jl#L17)
209209

src/specialfunctions.jl

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ const BACKWARD = false
66
const sqrtpi = 1.772453850905516027298
77
const edivsqrt2pi = 1.084437551419227546612
88

9+
half(x::Number) = oftype(x,0.5)
10+
half{T<:Number}(::Type{T}) = convert(T,0.5)
11+
two(x::Number) = oftype(x,2)
12+
two{T<:Number}(::Type{T}) = convert(T,2)
913

1014
"""
1115
Pochhammer symbol (x)_n = Γ(x+n)/Γ(x) for the rising factorial.
@@ -120,7 +124,7 @@ Anαβ{T<:Integer}(n::AbstractMatrix{T},α::Number,β::Number) = [ Anαβ(n[i,j]
120124
#
121125
# I. Bogaert and B. Michiels and J. Fostier, 𝒪(1) computation of Legendre polynomials and Gauss--Legendre nodes and weights for parallel computing, SIAM J. Sci. Comput., 34:C83--C101, 2012.
122126
#
123-
Cx(x::Number) = exp(lgamma(x+1/2)-lgamma(x+1))
127+
Cx(x::Number) = exp(lgamma(x+half(x))-lgamma(x+one(x)))
124128
function Cx(x::Float64)
125129
if x > 9.84475
126130
xp = x+0.25
@@ -132,12 +136,12 @@ end
132136
@vectorize_1arg Number Cx
133137

134138
Cnλ(n::Integer::Float64) = 2^λ/sqrtpi*Cx(n+λ)
135-
Cnλ(n::Integer::Number) = 2^λ/sqrt(convert(typeof(λ),π))*Cx(n+λ)
139+
Cnλ(n::Integer::Number) = 2^λ/sqrt(oftype,π))*Cx(n+λ)
136140
function Cnλ{T<:Integer}(n::UnitRange{T}::Number)
137141
ret = Vector{typeof(λ)}(length(n))
138142
ret[1] = Cnλ(first(n),λ)
139143
for i=2:length(n)
140-
ret[i] = (n[i]+λ-1/2)/(n[i]+λ)*ret[i-1]
144+
ret[i] = (n[i]+λ-half(λ))/(n[i]+λ)*ret[i-1]
141145
end
142146
ret
143147
end
@@ -199,7 +203,7 @@ end
199203
function absf::Number::Number,m::Int::Number)
200204
ret = zero(θ)
201205
for l=0:m
202-
ret += pochhammer(1/2+α,l)*pochhammer(1/2-α,l)*pochhammer(1/2+β,m-l)*pochhammer(1/2-β,m-l)/factorial(l)/factorial(m-l)/sinpi/2)^(l+α+1/2)/cospi/2)^(m-l+β+1/2)
206+
ret += pochhammer(half(α)+α,l)*pochhammer(half(α)-α,l)*pochhammer(half(β)+β,m-l)*pochhammer(half(β)-β,m-l)/factorial(l)/factorial(m-l)/sinpi/2)^(l+α+half(α))/cospi/2)^(m-l+β+half(β))
203207
end
204208
ret
205209
end
@@ -213,10 +217,10 @@ function absf{T<:Number}(α::Number,β::Number,m::Int,θ::AbstractArray{T,1})
213217
ret = zero(θ)
214218
cfs = zeros(T,m+1)
215219
for l=0:m
216-
@inbounds cfs[l+1] = pochhammer(1/2+α,l)*pochhammer(1/2-α,l)*pochhammer(1/2+β,m-l)*pochhammer(1/2-β,m-l)/factorial(l)/factorial(m-l)
220+
@inbounds cfs[l+1] = pochhammer(half(α)+α,l)*pochhammer(half(α)-α,l)*pochhammer(half(β)+β,m-l)*pochhammer(half(β)-β,m-l)/factorial(l)/factorial(m-l)
217221
end
218222
@inbounds for i=1:length(θ),l=0:m
219-
ret[i] += cfs[l+1]/sinpi(θ[i]/2)^(l+α+1/2)/cospi(θ[i]/2)^(m-l+β+1/2)
223+
ret[i] += cfs[l+1]/sinpi(θ[i]/2)^(l+α+half(α))/cospi(θ[i]/2)^(m-l+β+half(β))
220224
end
221225
ret
222226
end
@@ -245,12 +249,12 @@ end
245249
function compute_umvm!{T<:AbstractFloat}(um::Vector{T},vm::Vector{T},cfs::Matrix{T}::T::T,tempcos::Vector{T},tempsin::Vector{T},tempcosβsinα::Vector{T},m::Int::Vector{T},ir::UnitRange{Int64})
246250
@inbounds for i in ir
247251
temp = inv(tempcos[i]^m*tempcosβsinα[i])
248-
ϑ =+1/2)/2-+β+m+1)*θ[i]/2
252+
ϑ =+half(α))/2-+β+m+1)*θ[i]/2
249253
um[i] = cfs[m+1,1]*cospi(ϑ)*temp
250254
vm[i] = cfs[m+1,1]*sinpi(ϑ)*temp
251255
@inbounds for l=1:m
252256
temp *= tempcos[i]/tempsin[i]
253-
ϑ =+l+1/2)/2-+β+m+1)*θ[i]/2
257+
ϑ =+l+half(α))/2-+β+m+1)*θ[i]/2
254258
um[i] += cfs[m+1,l+1]*cospi(ϑ)*temp
255259
vm[i] += cfs[m+1,l+1]*sinpi(ϑ)*temp
256260
end
@@ -260,7 +264,7 @@ end
260264
function compute_umvm!{T<:AbstractFloat}(um::Vector{T},vm::Vector{T}::T,tempsin::Vector{T},tempsinλ::Vector{T},m::Int::Vector{T},ir::UnitRange{Int64})
261265
@inbounds for i in ir
262266
temp = inv(tempsin[i]^m*tempsinλ[i])
263-
ϑ = (m+λ)*(1/2-θ[i])
267+
ϑ = (m+λ)*(half(T)-θ[i])
264268
um[i] = cospi(ϑ)*temp
265269
vm[i] = sinpi(ϑ)*temp
266270
end
@@ -325,7 +329,7 @@ end
325329
function init_cfs{T<:AbstractFloat}::T::T,M::Int)
326330
cfs = zeros(T,M+1,M+1)
327331
@inbounds for m=0:M,l=0:m
328-
cfs[m+1,l+1] = pochhammer(1/2+α,l)*pochhammer(1/2-α,l)*pochhammer(1/2+β,m-l)*pochhammer(1/2-β,m-l)/factorial(l)/factorial(m-l)
332+
cfs[m+1,l+1] = pochhammer(half(α)+α,l)*pochhammer(half(α)-α,l)*pochhammer(half(β)+β,m-l)*pochhammer(half(β)-β,m-l)/factorial(l)/factorial(m-l)
329333
end
330334
cfs
331335
end

0 commit comments

Comments
 (0)