Skip to content

Commit e45e0f7

Browse files
authored
Merge pull request #44 from MikaelSlevinsky/dl/0.7
WIP Julia v0.7-beta support
2 parents 14ff27c + b42c862 commit e45e0f7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1342
-868
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ julia:
88
- nightly
99
matrix:
1010
allow_failures:
11-
- julia: nightly
11+
- julia: nightly
1212
notifications:
1313
email: false
1414
after_success:

REQUIRE

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
julia 0.6
2-
ToeplitzMatrices 0.2
2+
ToeplitzMatrices 0.4
33
HierarchicalMatrices 0.1.1
44
LowRankApprox 0.1.1
55
ProgressMeter 0.3.4
66
SpecialFunctions 0.3.4
77
Compat 0.17
88
AbstractFFTs 0.3.1
9-
FFTW 0.0.4
9+
FFTW 0.0.4
10+
DSP 0.4

src/FastTransforms.jl

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,33 @@ if VERSION < v"0.7-"
88
using Base.FFTW
99
import Base.FFTW: r2rFFTWPlan, unsafe_execute!, fftwSingle, fftwDouble, fftwNumber
1010
import Base.FFTW: libfftw, libfftwf, PlanPtr, r2rFFTWPlan
11+
const LAmul! = Base.A_mul_B!
12+
import Base: Factorization
13+
rmul!(A::AbstractArray, c::Number) = scale!(A,c)
14+
lmul!(c::Number, A::AbstractArray) = scale!(c,A)
15+
lmul!(A::AbstractArray, B::AbstractArray) = mul!(A,B)
16+
rmul!(A::AbstractArray, B::AbstractArray) = mul!(A,B)
1117
else
12-
using FFTW
18+
using FFTW, LinearAlgebra, DSP
1319
import FFTW: r2rFFTWPlan, unsafe_execute!, fftwSingle, fftwDouble, fftwNumber
14-
import FFTW: libfftw, libfftwf, PlanPtr, r2rFFTWPlan
20+
import FFTW: libfftw3, libfftw3f, PlanPtr, r2rFFTWPlan
21+
const LAmul! = LinearAlgebra.mul!
22+
const libfftw = libfftw3
23+
const libfftwf = libfftw3f
24+
import LinearAlgebra: Factorization
25+
flipdim(A,d) = reverse(A; dims=d)
1526
end
1627

28+
1729
import Base: *, \, size, view
18-
import Base: getindex, setindex!, Factorization, length
19-
import Base.LinAlg: BlasFloat, BlasInt
30+
import Base: getindex, setindex!, length
31+
import Compat.LinearAlgebra: BlasFloat, BlasInt
2032
import HierarchicalMatrices: HierarchicalMatrix, unsafe_broadcasttimes!
21-
import HierarchicalMatrices: A_mul_B!, At_mul_B!, Ac_mul_B!
33+
import HierarchicalMatrices: mul!, At_mul_B!, Ac_mul_B!
2234
import HierarchicalMatrices: ThreadSafeVector, threadsafezeros
2335
import LowRankApprox: ColPerm
2436
import AbstractFFTs: Plan
25-
37+
import Compat: range, transpose, adjoint
2638

2739
export cjt, icjt, jjt, plan_cjt, plan_icjt
2840
export leg2cheb, cheb2leg, leg2chebu, ultra2ultra, jac2jac

src/PaduaTransform.jl

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
doc"""
1+
2+
# lex indicates if its lexigraphical (i.e., x, y) or reverse (y, x)
3+
"""
24
Pre-plan an Inverse Padua Transform.
35
"""
4-
# lex indicates if its lexigraphical (i.e., x, y) or reverse (y, x)
56
struct IPaduaTransformPlan{lex,IDCTPLAN,T}
67
cfsmat::Matrix{T}
78
idctplan::IDCTPLAN
@@ -10,37 +11,38 @@ end
1011
IPaduaTransformPlan(cfsmat::Matrix{T},idctplan,::Type{Val{lex}}) where {T,lex} =
1112
IPaduaTransformPlan{lex,typeof(idctplan),T}(cfsmat,idctplan)
1213

13-
doc"""
14+
"""
1415
Pre-plan an Inverse Padua Transform.
1516
"""
1617
function plan_ipaduatransform!(::Type{T},N::Integer,lex) where T
1718
n=Int(cld(-3+sqrt(1+8N),2))
1819
if N div((n+1)*(n+2),2)
1920
error("Padua transforms can only be applied to vectors of length (n+1)*(n+2)/2.")
2021
end
21-
IPaduaTransformPlan(Array{T}(n+2,n+1),FFTW.plan_r2r!(Array{T}(n+2,n+1),FFTW.REDFT00),lex)
22+
IPaduaTransformPlan(Array{T}(undef,n+2,n+1),FFTW.plan_r2r!(Array{T}(undef,n+2,n+1),FFTW.REDFT00),lex)
2223
end
2324

2425

2526
plan_ipaduatransform!(::Type{T},N::Integer) where {T} = plan_ipaduatransform!(T,N,Val{true})
2627
plan_ipaduatransform!(v::AbstractVector{T},lex...) where {T} = plan_ipaduatransform!(eltype(v),length(v),lex...)
2728

29+
2830
function *(P::IPaduaTransformPlan,v::AbstractVector{T}) where T
2931
cfsmat=trianglecfsmat(P,v)
3032
n,m=size(cfsmat)
31-
scale!(view(cfsmat,:,2:m-1),0.5)
32-
scale!(view(cfsmat,2:n-1,:),0.5)
33+
rmul!(view(cfsmat,:,2:m-1),0.5)
34+
rmul!(view(cfsmat,2:n-1,:),0.5)
3335
tensorvals=P.idctplan*cfsmat
3436
paduavec!(v,P,tensorvals)
3537
end
3638

3739
ipaduatransform!(v::AbstractVector,lex...) = plan_ipaduatransform!(v,lex...)*v
38-
doc"""
40+
"""
3941
Inverse Padua Transform maps the 2D Chebyshev coefficients to the values of the interpolation polynomial at the Padua points.
4042
"""
4143
ipaduatransform(v::AbstractVector,lex...) = plan_ipaduatransform!(v,lex...)*copy(v)
4244

43-
doc"""
45+
"""
4446
Creates ``(n+2)x(n+1)`` Chebyshev coefficient matrix from triangle coefficients.
4547
"""
4648
function trianglecfsmat(P::IPaduaTransformPlan{true},cfs::AbstractVector)
@@ -81,7 +83,7 @@ function trianglecfsmat(P::IPaduaTransformPlan{false},cfs::AbstractVector)
8183
return cfsmat
8284
end
8385

84-
doc"""
86+
"""
8587
Vectorizes the function values at the Padua points.
8688
"""
8789
function paduavec!(v,P::IPaduaTransformPlan,padmat::Matrix)
@@ -100,7 +102,7 @@ function paduavec!(v,P::IPaduaTransformPlan,padmat::Matrix)
100102
return v
101103
end
102104

103-
doc"""
105+
"""
104106
Pre-plan a Padua Transform.
105107
"""
106108
struct PaduaTransformPlan{lex,DCTPLAN,T}
@@ -111,15 +113,15 @@ end
111113
PaduaTransformPlan(vals::Matrix{T},dctplan,::Type{Val{lex}}) where {T,lex} =
112114
PaduaTransformPlan{lex,typeof(dctplan),T}(vals,dctplan)
113115

114-
doc"""
116+
"""
115117
Pre-plan a Padua Transform.
116118
"""
117119
function plan_paduatransform!(::Type{T},N::Integer,lex) where T
118120
n=Int(cld(-3+sqrt(1+8N),2))
119121
if N  ((n+1)*(n+2))÷2
120122
error("Padua transforms can only be applied to vectors of length (n+1)*(n+2)/2.")
121123
end
122-
PaduaTransformPlan(Array{T}(n+2,n+1),FFTW.plan_r2r!(Array{T}(n+2,n+1),FFTW.REDFT00),lex)
124+
PaduaTransformPlan(Array{T}(undef,n+2,n+1),FFTW.plan_r2r!(Array{T}(undef,n+2,n+1),FFTW.REDFT00),lex)
123125
end
124126

125127
plan_paduatransform!(::Type{T},N::Integer) where {T} = plan_paduatransform!(T,N,Val{true})
@@ -131,21 +133,21 @@ function *(P::PaduaTransformPlan,v::AbstractVector{T}) where T
131133
vals=paduavalsmat(P,v)
132134
tensorcfs=P.dctplan*vals
133135
m,l=size(tensorcfs)
134-
scale!(tensorcfs,T(2)/(n*(n+1)))
135-
scale!(view(tensorcfs,1,:),0.5)
136-
scale!(view(tensorcfs,:,1),0.5)
137-
scale!(view(tensorcfs,m,:),0.5)
138-
scale!(view(tensorcfs,:,l),0.5)
136+
rmul!(tensorcfs,T(2)/(n*(n+1)))
137+
rmul!(view(tensorcfs,1,:),0.5)
138+
rmul!(view(tensorcfs,:,1),0.5)
139+
rmul!(view(tensorcfs,m,:),0.5)
140+
rmul!(view(tensorcfs,:,l),0.5)
139141
trianglecfsvec!(v,P,tensorcfs)
140142
end
141143

142144
paduatransform!(v::AbstractVector,lex...) = plan_paduatransform!(v,lex...)*v
143-
doc"""
145+
"""
144146
Padua Transform maps from interpolant values at the Padua points to the 2D Chebyshev coefficients.
145147
"""
146148
paduatransform(v::AbstractVector,lex...) = plan_paduatransform!(v,lex...)*copy(v)
147149

148-
doc"""
150+
"""
149151
Creates ``(n+2)x(n+1)`` matrix of interpolant values on the tensor grid at the ``(n+1)(n+2)/2`` Padua points.
150152
"""
151153
function paduavalsmat(P::PaduaTransformPlan,v::AbstractVector)
@@ -165,7 +167,7 @@ function paduavalsmat(P::PaduaTransformPlan,v::AbstractVector)
165167
return vals
166168
end
167169

168-
doc"""
170+
"""
169171
Creates length ``(n+1)(n+2)/2`` vector from matrix of triangle Chebyshev coefficients.
170172
"""
171173
function trianglecfsvec!(v,P::PaduaTransformPlan{true},cfs::Matrix)
@@ -194,12 +196,12 @@ function trianglecfsvec!(v,P::PaduaTransformPlan{false},cfs::Matrix)
194196
return v
195197
end
196198

197-
doc"""
199+
"""
198200
Returns coordinates of the ``(n+1)(n+2)/2`` Padua points.
199201
"""
200-
function paduapoints(::Type{T},n::Integer) where T
202+
function paduapoints(::Type{T}, n::Integer) where T
201203
N=div((n+1)*(n+2),2)
202-
MM=Matrix{T}(N,2)
204+
MM=Matrix{T}(undef,N,2)
203205
m=0
204206
delta=0
205207
NN=fld(n+2,2)

0 commit comments

Comments
 (0)