@@ -4,26 +4,24 @@ Pre-plan an Inverse Padua Transform.
4
4
# lex indicates if its lexigraphical (i.e., x, y) or reverse (y, x)
5
5
immutable IPaduaTransformPlan{lex,IDCTPLAN,T}
6
6
cfsmat:: Matrix{T}
7
- padvals:: Vector{T}
8
7
idctplan:: IDCTPLAN
9
8
end
10
9
11
- IPaduaTransformPlan {T,lex} (cfsmat:: Matrix{T} ,padvals :: Vector{T} , idctplan,:: Type{Val{lex}} ) =
12
- IPaduaTransformPlan {lex,typeof(idctplan),T} (cfsmat,padvals, idctplan)
10
+ IPaduaTransformPlan {T,lex} (cfsmat:: Matrix{T} ,idctplan,:: Type{Val{lex}} ) =
11
+ IPaduaTransformPlan {lex,typeof(idctplan),T} (cfsmat,idctplan)
13
12
14
- function plan_ipaduatransform {T} (:: Type{T} ,N:: Integer ,lex)
13
+ function plan_ipaduatransform! {T} (:: Type{T} ,N:: Integer ,lex)
15
14
n= Int (cld (- 3 + sqrt (1 + 8 N),2 ))
16
15
if N ≠ div ((n+ 1 )* (n+ 2 ),2 )
17
16
error (" Padua transforms can only be applied to vectors of length (n+1)*(n+2)/2." )
18
17
end
19
- IPaduaTransformPlan (Array {T} (n+ 2 ,n+ 1 ),Array {T} (N),
20
- FFTW. plan_r2r! (Array {T} (n+ 2 ,n+ 1 ),FFTW. REDFT00),lex)
18
+ IPaduaTransformPlan (Array {T} (n+ 2 ,n+ 1 ),FFTW. plan_r2r! (Array {T} (n+ 2 ,n+ 1 ),FFTW. REDFT00),lex)
21
19
end
22
20
23
21
24
- plan_ipaduatransform {T} (:: Type{T} ,N:: Integer ) = plan_ipaduatransform (T,N,Val{true })
22
+ plan_ipaduatransform! {T} (:: Type{T} ,N:: Integer ) = plan_ipaduatransform! (T,N,Val{true })
25
23
26
- plan_ipaduatransform {T} (v:: AbstractVector{T} ,lex... ) = plan_ipaduatransform (eltype (v),length (v),lex... )
24
+ plan_ipaduatransform! {T} (v:: AbstractVector{T} ,lex... ) = plan_ipaduatransform! (eltype (v),length (v),lex... )
27
25
28
26
"""
29
27
Inverse Padua Transform maps the 2D Chebyshev coefficients to the values of the interpolation polynomial at the Padua points.
@@ -34,11 +32,11 @@ function *{T}(P::IPaduaTransformPlan,v::AbstractVector{T})
34
32
scale! (view (cfsmat,:,2 : m- 1 ),0.5 )
35
33
scale! (view (cfsmat,2 : n- 1 ,:),0.5 )
36
34
tensorvals= P. idctplan* cfsmat
37
- paduavals= paduavec (P,tensorvals)
38
- return paduavals
35
+ paduavec! (v,P,tensorvals)
39
36
end
40
37
41
- ipaduatransform (v:: AbstractVector ,lex... ) = plan_ipaduatransform (v,lex... )* v
38
+ ipaduatransform! (v:: AbstractVector ,lex... ) = plan_ipaduatransform! (v,lex... )* v
39
+ ipaduatransform (v:: AbstractVector ,lex... ) = plan_ipaduatransform! (v,lex... )* copy (v)
42
40
43
41
"""
44
42
Creates (n+2)x(n+1) Chebyshev coefficient matrix from triangle coefficients.
84
82
"""
85
83
Vectorizes the function values at the Padua points.
86
84
"""
87
- function paduavec ( P:: IPaduaTransformPlan ,padmat:: Matrix )
85
+ function paduavec! (v, P:: IPaduaTransformPlan ,padmat:: Matrix )
88
86
n= size (padmat,2 )- 1
89
87
N= (n+ 1 )* (n+ 2 )
90
88
if iseven (n)> 0
91
89
d= div (n+ 2 ,2 )
92
90
m= 0
93
91
@inbounds for i= 1 : n+ 1
94
- P . padvals [m+ 1 : m+ d]= view (padmat,1 + mod (i,2 ): 2 : n+ 1 + mod (i,2 ),i)
92
+ v [m+ 1 : m+ d]= view (padmat,1 + mod (i,2 ): 2 : n+ 1 + mod (i,2 ),i)
95
93
m+= d
96
94
end
97
95
else
98
- @inbounds P . padvals [:]= view (padmat,1 : 2 : N- 1 )
96
+ @inbounds v [:]= view (padmat,1 : 2 : N- 1 )
99
97
end
100
- return P . padvals
98
+ return v
101
99
end
102
100
103
101
"""
104
102
Pre-plan a Padua Transform.
105
103
"""
106
104
immutable PaduaTransformPlan{lex,DCTPLAN,T}
107
105
vals:: Matrix{T}
108
- retvec:: Vector{T}
109
106
dctplan:: DCTPLAN
110
107
end
111
108
112
- PaduaTransformPlan {T,lex} (vals:: Matrix{T} ,retvec :: Vector{T} , dctplan,:: Type{Val{lex}} ) =
113
- PaduaTransformPlan {lex,typeof(dctplan),T} (vals,retvec, dctplan)
109
+ PaduaTransformPlan {T,lex} (vals:: Matrix{T} ,dctplan,:: Type{Val{lex}} ) =
110
+ PaduaTransformPlan {lex,typeof(dctplan),T} (vals,dctplan)
114
111
115
- function plan_paduatransform {T} (:: Type{T} ,N:: Integer ,lex)
112
+ function plan_paduatransform! {T} (:: Type{T} ,N:: Integer ,lex)
116
113
n= Int (cld (- 3 + sqrt (1 + 8 N),2 ))
117
114
if N ≠ ((n+ 1 )* (n+ 2 ))÷ 2
118
115
error (" Padua transforms can only be applied to vectors of length (n+1)*(n+2)/2." )
119
116
end
120
- PaduaTransformPlan (Array {T} (n+ 2 ,n+ 1 ),Array {T} (N),
121
- FFTW. plan_r2r! (Array {T} (n+ 2 ,n+ 1 ),FFTW. REDFT00),lex)
117
+ PaduaTransformPlan (Array {T} (n+ 2 ,n+ 1 ),FFTW. plan_r2r! (Array {T} (n+ 2 ,n+ 1 ),FFTW. REDFT00),lex)
122
118
end
123
119
124
- plan_paduatransform {T} (:: Type{T} ,N:: Integer ) = plan_paduatransform (T,N,Val{true })
125
- plan_paduatransform {T} (v:: AbstractVector{T} ,lex... ) = plan_paduatransform (eltype (v),length (v),lex... )
120
+ plan_paduatransform! {T} (:: Type{T} ,N:: Integer ) = plan_paduatransform! (T,N,Val{true })
121
+ plan_paduatransform! {T} (v:: AbstractVector{T} ,lex... ) = plan_paduatransform! (eltype (v),length (v),lex... )
126
122
127
123
"""
128
124
Padua Transform maps from interpolant values at the Padua points to the 2D Chebyshev coefficients.
@@ -138,11 +134,11 @@ function *{T}(P::PaduaTransformPlan,v::AbstractVector{T})
138
134
scale! (view (tensorcfs,:,1 ),0.5 )
139
135
scale! (view (tensorcfs,m,:),0.5 )
140
136
scale! (view (tensorcfs,:,l),0.5 )
141
- cfs= trianglecfsvec (P,tensorcfs)
142
- return cfs
137
+ trianglecfsvec! (v,P,tensorcfs)
143
138
end
144
139
145
- paduatransform (v:: AbstractVector ,lex... ) = plan_paduatransform (v,lex... )* v
140
+ paduatransform! (v:: AbstractVector ,lex... ) = plan_paduatransform! (v,lex... )* v
141
+ paduatransform (v:: AbstractVector ,lex... ) = plan_paduatransform! (v,lex... )* copy (v)
146
142
147
143
"""
148
144
Creates (n+2)x(n+1) matrix of interpolant values on the tensor grid at the (n+1)(n+2)/2 Padua points.
@@ -167,30 +163,30 @@ end
167
163
"""
168
164
Creates length (n+1)(n+2)/2 vector from matrix of triangle Chebyshev coefficients.
169
165
"""
170
- function trianglecfsvec ( P:: PaduaTransformPlan{true} ,cfs:: Matrix )
166
+ function trianglecfsvec! (v, P:: PaduaTransformPlan{true} ,cfs:: Matrix )
171
167
m= size (cfs,2 )
172
168
l= 1
173
169
for d= 1 : m
174
170
@inbounds for k= 1 : d
175
171
j= d- k+ 1
176
- P . retvec [l]= cfs[k,j]
172
+ v [l]= cfs[k,j]
177
173
l+= 1
178
174
end
179
175
end
180
- return P . retvec
176
+ return v
181
177
end
182
178
183
- function trianglecfsvec ( P:: PaduaTransformPlan{false} ,cfs:: Matrix )
179
+ function trianglecfsvec! (v, P:: PaduaTransformPlan{false} ,cfs:: Matrix )
184
180
m= size (cfs,2 )
185
181
l= 1
186
182
for d= 1 : m
187
183
@inbounds for k= d: - 1 : 1
188
184
j= d- k+ 1
189
- P . retvec [l]= cfs[k,j]
185
+ v [l]= cfs[k,j]
190
186
l+= 1
191
187
end
192
188
end
193
- return P . retvec
189
+ return v
194
190
end
195
191
196
192
"""
0 commit comments