@@ -6,6 +6,10 @@ const BACKWARD = false
6
6
const sqrtpi = 1.772453850905516027298
7
7
const edivsqrt2pi = 1.084437551419227546612
8
8
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 )
9
13
10
14
"""
11
15
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]
120
124
#
121
125
# 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.
122
126
#
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) ))
124
128
function Cx (x:: Float64 )
125
129
if x > 9.84475
126
130
xp = x+ 0.25
@@ -132,12 +136,12 @@ end
132
136
@vectorize_1arg Number Cx
133
137
134
138
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+ λ)
136
140
function Cnλ {T<:Integer} (n:: UnitRange{T} ,λ:: Number )
137
141
ret = Vector {typeof(λ)} (length (n))
138
142
ret[1 ] = Cnλ (first (n),λ)
139
143
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 ]
141
145
end
142
146
ret
143
147
end
199
203
function absf (α:: Number ,β:: Number ,m:: Int ,θ:: Number )
200
204
ret = zero (θ)
201
205
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 (β) )
203
207
end
204
208
ret
205
209
end
@@ -213,10 +217,10 @@ function absf{T<:Number}(α::Number,β::Number,m::Int,θ::AbstractArray{T,1})
213
217
ret = zero (θ)
214
218
cfs = zeros (T,m+ 1 )
215
219
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)
217
221
end
218
222
@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 (β) )
220
224
end
221
225
ret
222
226
end
@@ -245,12 +249,12 @@ end
245
249
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} )
246
250
@inbounds for i in ir
247
251
temp = inv (tempcos[i]^ m* tempcosβsinα[i])
248
- ϑ = (α+ 1 / 2 )/ 2 - (α+ β+ m+ 1 )* θ[i]/ 2
252
+ ϑ = (α+ half (α) )/ 2 - (α+ β+ m+ 1 )* θ[i]/ 2
249
253
um[i] = cfs[m+ 1 ,1 ]* cospi (ϑ)* temp
250
254
vm[i] = cfs[m+ 1 ,1 ]* sinpi (ϑ)* temp
251
255
@inbounds for l= 1 : m
252
256
temp *= tempcos[i]/ tempsin[i]
253
- ϑ = (α+ l+ 1 / 2 )/ 2 - (α+ β+ m+ 1 )* θ[i]/ 2
257
+ ϑ = (α+ l+ half (α) )/ 2 - (α+ β+ m+ 1 )* θ[i]/ 2
254
258
um[i] += cfs[m+ 1 ,l+ 1 ]* cospi (ϑ)* temp
255
259
vm[i] += cfs[m+ 1 ,l+ 1 ]* sinpi (ϑ)* temp
256
260
end
260
264
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} )
261
265
@inbounds for i in ir
262
266
temp = inv (tempsin[i]^ m* tempsinλ[i])
263
- ϑ = (m+ λ)* (1 / 2 - θ[i])
267
+ ϑ = (m+ λ)* (half (T) - θ[i])
264
268
um[i] = cospi (ϑ)* temp
265
269
vm[i] = sinpi (ϑ)* temp
266
270
end
325
329
function init_cfs {T<:AbstractFloat} (α:: T ,β:: T ,M:: Int )
326
330
cfs = zeros (T,M+ 1 ,M+ 1 )
327
331
@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)
329
333
end
330
334
cfs
331
335
end
0 commit comments