Skip to content

Commit 8c26574

Browse files
committed
Start itransform
1 parent 6c5fa5e commit 8c26574

File tree

3 files changed

+59
-9
lines changed

3 files changed

+59
-9
lines changed

examples/diskhelmholtz.jl

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
1-
using MultivariateOrthogonalPolynomials
1+
using MultivariateOrthogonalPolynomials, FastTransforms, BlockBandedMatrices, Plots
22

33
WZ = Weighted(Zernike(1))
44
xy = axes(WZ,1)
55
x,y = first.(xy),last.(xy)
6-
u = WZ \ @. (exp(x*cos(y))*(1-x^2-y^2))
6+
u = Zernike(1) \ @. exp(x*cos(y))
77

8-
Δ = (Zernike(1) \ (Laplacian(xy) * WZ))
9-
C = Zernike(1) \ WZ
10-
N = 40; @time C[Block.(1:N), Block.(1:N)];
11-
k = 100
8+
N = 50
9+
KR = Block.(Base.OneTo(N))
10+
Δ = BandedBlockBandedMatrix((Zernike(1) \ (Laplacian(xy) * WZ))[KR,KR],(0,0),(0,0))
11+
C = (Zernike(1) \ WZ)[KR,KR]
12+
k = 5
1213
L = Δ - k^2 * C
1314

14-
MemoryLayout(L)
15+
v = (L \ u[KR])
16+
17+
F = factorize(Zernike(1)[:,KR])
18+
F.plan \ v
19+
F |> typeof |> fieldnames
20+
21+
grid(WZ[:,KR])
22+
23+
F |>typeof |> fieldnames
24+
F.F * v
25+
26+
m = DiskTrav(v).matrix
27+
28+
plan_disk2cxf(m, 0, 0) * m
29+
30+

src/disk.jl

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,39 @@
88
struct DiskTrav{T, AA<:AbstractMatrix{T}} <: AbstractBlockVector{T}
99
matrix::AA
1010
function DiskTrav{T, AA}(matrix::AA) where {T,AA<:AbstractMatrix{T}}
11-
n,m = size(matrix)
12-
isodd(m) && n == m ÷ 4 + 1 || throw(ArgumentError("size must match"))
11+
m,n = size(matrix)
12+
isodd(n) && m == n ÷ 4 + 1 || throw(ArgumentError("size must match"))
1313
new{T,AA}(matrix)
1414
end
1515
end
1616

1717
DiskTrav{T}(matrix::AbstractMatrix{T}) where T = DiskTrav{T,typeof(matrix)}(matrix)
1818
DiskTrav(matrix::AbstractMatrix{T}) where T = DiskTrav{T}(matrix)
1919

20+
function DiskTrav(v::AbstractVector{T}) where T
21+
N = blocksize(v,1)
22+
m = N ÷ 2 + 1
23+
n = 4(m-1) + 1
24+
mat = zeros(T, m, n)
25+
for K in blockaxes(v,1)
26+
= Int(K)
27+
w = v[K]
28+
if isodd(K̃)
29+
mat[K̃÷2 + 1,1] = w[1]
30+
for j = 2:2:-1
31+
mat[K̃÷2-j÷2+1,2(j-1)+2] = w[j]
32+
mat[K̃÷2-j÷2+1,2(j-1)+3] = w[j+1]
33+
end
34+
else
35+
for j = 1:2:
36+
mat[K̃÷2-j÷2,2(j-1)+2] = w[j]
37+
mat[K̃÷2-j÷2,2(j-1)+3] = w[j+1]
38+
end
39+
end
40+
end
41+
DiskTrav(mat)
42+
end
43+
2044
axes(A::DiskTrav) = (blockedrange(oneto(div(size(A.matrix,2),2,RoundUp))),)
2145

2246
function getindex(A::DiskTrav, K::Block{1})
@@ -165,6 +189,7 @@ function ZernikeTransform{T}(N::Int, a::Number, b::Number) where T<:Real
165189
ZernikeTransform{T}(N, plan_disk2cxf(T, Ñ, a, b), plan_disk_analysis(T, Ñ, 4-3))
166190
end
167191
*(P::ZernikeTransform{T}, f::Matrix{T}) where T = DiskTrav(P.disk2cxf \ (P.analysis * f))[Block.(1:P.N)]
192+
\(P::ZernikeTransform, f::AbstractVector) = P.analysis \ (P.disk2cxf * DiskTrav(f).matrix)
168193

169194
factorize(S::FiniteZernike{T}) where T = TransformFactorization(grid(S), ZernikeTransform{T}(blocksize(S,2), parent(S).a, parent(S).b))
170195

test/test_disk.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ import ClassicalOrthogonalPolynomials: HalfWeighted
4646
@test_throws ArgumentError DiskTrav([1 2 3 4])
4747
@test_throws ArgumentError DiskTrav([1 2 3; 4 5 6])
4848
@test_throws ArgumentError DiskTrav([1 2 3 4; 5 6 7 8])
49+
50+
for N = 1:10
51+
v = PseudoBlockArray(1:sum(1:N),1:N)
52+
if iseven(N)
53+
@test DiskTrav(v) == [v; zeros(N+1)]
54+
else
55+
@test DiskTrav(v) == v
56+
end
57+
end
4958
end
5059

5160
@testset "Transform" begin

0 commit comments

Comments
 (0)