Mercurial > repos > public > sbplib_julia
annotate diffOp.jl @ 175:bcd2029c590d boundary_conditions
Remove a bunch of obsolete method sketches
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 12 Jun 2019 15:12:03 +0200 |
parents | 187295479984 |
children |
rev | line source |
---|---|
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
1 abstract type DiffOp end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
2 |
95
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
3 # TBD: The "error("not implemented")" thing seems to be hiding good error information. How to fix that? Different way of saying that these should be implemented? |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
4 function apply(D::DiffOp, v::AbstractVector, i::Int) |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
5 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
6 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
7 |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
8 function innerProduct(D::DiffOp, u::AbstractVector, v::AbstractVector)::Real |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
9 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
10 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
11 |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
12 function matrixRepresentation(D::DiffOp) |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
13 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
14 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
15 |
95
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
16 abstract type DiffOpCartesian{Dim} <: DiffOp end |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
17 |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
18 # DiffOp must have a grid of dimension Dim!!! |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
19 function apply!(D::DiffOpCartesian{Dim}, u::AbstractArray{T,Dim}, v::AbstractArray{T,Dim}) where {T,Dim} |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
20 for I ∈ eachindex(D.grid) |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
21 u[I] = apply(D, v, I) |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
22 end |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
23 |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
24 return nothing |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
25 end |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
26 |
112
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
27 function apply_region!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}) where T |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
28 apply_region!(D, u, v, Lower, Lower) |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
29 apply_region!(D, u, v, Lower, Interior) |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
30 apply_region!(D, u, v, Lower, Upper) |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
31 apply_region!(D, u, v, Interior, Lower) |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
32 apply_region!(D, u, v, Interior, Interior) |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
33 apply_region!(D, u, v, Interior, Upper) |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
34 apply_region!(D, u, v, Upper, Lower) |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
35 apply_region!(D, u, v, Upper, Interior) |
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
36 apply_region!(D, u, v, Upper, Upper) |
108
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
37 return nothing |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
38 end |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
39 |
114
d24497780ebd
Add comment about maybe splitting apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
113
diff
changeset
|
40 # Maybe this should be split according to b3fbef345810 after all?! Seems like it makes performance more predictable |
112
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
41 function apply_region!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}, r1::Type{<:Region}, r2::Type{<:Region}) where T |
124
631eb9b35d72
Make grid spacing a property of EquidistantGrid. Create plotting module for sbplib.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
118
diff
changeset
|
42 for I ∈ regionindices(D.grid.size, closureSize(D.op), (r1,r2)) |
110
ee071b8ed58c
Use deafult constructor for Index in apply!
Jonatan Werpers <jonatan@werpers.com>
parents:
109
diff
changeset
|
43 @inbounds indextuple = (Index{r1}(I[1]), Index{r2}(I[2])) |
108
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
44 @inbounds u[I] = apply(D, v, indextuple) |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
45 end |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
46 return nothing |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
47 end |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
48 |
113
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
49 function apply_tiled!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}) where T |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
50 apply_region_tiled!(D, u, v, Lower, Lower) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
51 apply_region_tiled!(D, u, v, Lower, Interior) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
52 apply_region_tiled!(D, u, v, Lower, Upper) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
53 apply_region_tiled!(D, u, v, Interior, Lower) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
54 apply_region_tiled!(D, u, v, Interior, Interior) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
55 apply_region_tiled!(D, u, v, Interior, Upper) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
56 apply_region_tiled!(D, u, v, Upper, Lower) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
57 apply_region_tiled!(D, u, v, Upper, Interior) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
58 apply_region_tiled!(D, u, v, Upper, Upper) |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
59 return nothing |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
60 end |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
61 |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
62 using TiledIteration |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
63 function apply_region_tiled!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}, r1::Type{<:Region}, r2::Type{<:Region}) where T |
124
631eb9b35d72
Make grid spacing a property of EquidistantGrid. Create plotting module for sbplib.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
118
diff
changeset
|
64 ri = regionindices(D.grid.size, closureSize(D.op), (r1,r2)) |
136
c6aaf061c0a9
Fix incorrect indexing of solution vector in apply_region_tiled
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
129
diff
changeset
|
65 # TODO: Pass Tilesize to function |
c6aaf061c0a9
Fix incorrect indexing of solution vector in apply_region_tiled
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
129
diff
changeset
|
66 for tileaxs ∈ TileIterator(axes(ri), padded_tilesize(T, (5,5), 2)) |
117
ff7f377433b4
Change loop order to follow memory layout
Jonatan Werpers <jonatan@werpers.com>
parents:
114
diff
changeset
|
67 for j ∈ tileaxs[2], i ∈ tileaxs[1] |
113
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
68 I = ri[i,j] |
136
c6aaf061c0a9
Fix incorrect indexing of solution vector in apply_region_tiled
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
129
diff
changeset
|
69 u[I] = apply(D, v, (Index{r1}(I[1]), Index{r2}(I[2]))) |
113
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
70 end |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
71 end |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
72 return nothing |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
73 end |
3b89aa6dc7f2
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
Jonatan Werpers <jonatan@werpers.com>
parents:
112
diff
changeset
|
74 |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
75 function apply(D::DiffOp, v::AbstractVector)::AbstractVector |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
76 u = zeros(eltype(v), size(v)) |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
77 apply!(D,v,u) |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
78 return u |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
79 end |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
80 |
168
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
81 struct NormalDerivative{N,M,K} |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
82 op::D2{Float64,N,M,K} |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
83 grid::EquidistantGrid |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
84 bId::CartesianBoundary |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
85 end |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
86 |
169
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
87 function apply_transpose(d::NormalDerivative, v::AbstractArray, I::Integer) |
172
a8bc71608588
Fix bug in dimension selection in apply_tanspose of boundary operators
Jonatan Werpers <jonatan@werpers.com>
parents:
171
diff
changeset
|
88 u = selectdim(v,3-dim(d.bId),I) |
171
d407611ed71a
Add BondaryValue operator
Jonatan Werpers <jonatan@werpers.com>
parents:
169
diff
changeset
|
89 return apply_d(d.op, d.grid.inverse_spacing[dim(d.bId)], u, region(d.bId)) |
169
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
90 end |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
91 |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
92 # Not correct abstraction level |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
93 # TODO: Not type stable D:< |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
94 function apply(d::NormalDerivative, v::AbstractArray, I::Tuple{Integer,Integer}) |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
95 i = I[dim(d.bId)] |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
96 j = I[3-dim(d.bId)] |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
97 N_i = d.grid.size[dim(d.bId)] |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
98 |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
99 r = getregion(i, closureSize(d.op), N_i) |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
100 |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
101 if r != region(d.bId) |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
102 return 0 |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
103 end |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
104 |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
105 if r == Lower |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
106 # Note, closures are indexed by offset. Fix this D:< |
171
d407611ed71a
Add BondaryValue operator
Jonatan Werpers <jonatan@werpers.com>
parents:
169
diff
changeset
|
107 return d.grid.inverse_spacing[dim(d.bId)]*d.op.dClosure[i-1]*v[j] |
169
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
108 elseif r == Upper |
171
d407611ed71a
Add BondaryValue operator
Jonatan Werpers <jonatan@werpers.com>
parents:
169
diff
changeset
|
109 return d.grid.inverse_spacing[dim(d.bId)]*d.op.dClosure[N_i-j]*v[j] |
169
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
110 end |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
111 end |
24ee4def7ffb
Move NormalDerivative methods to type definition
Jonatan Werpers <jonatan@werpers.com>
parents:
168
diff
changeset
|
112 |
173
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
113 struct BoundaryValue{N,M,K} |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
114 op::D2{Float64,N,M,K} |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
115 grid::EquidistantGrid |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
116 bId::CartesianBoundary |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
117 end |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
118 |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
119 function apply(e::BoundaryValue, v::AbstractArray, I::Tuple{Integer,Integer}) |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
120 i = I[dim(e.bId)] |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
121 j = I[3-dim(e.bId)] |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
122 N_i = e.grid.size[dim(e.bId)] |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
123 |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
124 r = getregion(i, closureSize(e.op), N_i) |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
125 |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
126 if r != region(e.bId) |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
127 return 0 |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
128 end |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
129 |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
130 if r == Lower |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
131 # Note, closures are indexed by offset. Fix this D:< |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
132 return e.op.eClosure[i-1]*v[j] |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
133 elseif r == Upper |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
134 return e.op.eClosure[N_i-j]*v[j] |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
135 end |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
136 end |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
137 |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
138 function apply_transpose(e::BoundaryValue, v::AbstractArray, I::Integer) |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
139 u = selectdim(v,3-dim(e.bId),I) |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
140 return apply_e(e.op, u, region(e.bId)) |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
141 end |
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
142 |
95
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
143 struct Laplace{Dim,T<:Real,N,M,K} <: DiffOpCartesian{Dim} |
168
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
144 grid::EquidistantGrid{Dim,T} |
76
81d9510cb2d0
Make Laplace take dimension as a parameter
Jonatan Werpers <jonatan@werpers.com>
parents:
73
diff
changeset
|
145 a::T |
84
48079bd39969
Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents:
76
diff
changeset
|
146 op::D2{Float64,N,M,K} |
173
fabd475bb258
Move definition of BoundaryValue before definition of Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
172
diff
changeset
|
147 e::BoundaryValue |
154
3193bac1c086
More sketching of how things might work
Jonatan Werpers <jonatan@werpers.com>
parents:
153
diff
changeset
|
148 d::NormalDerivative |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
149 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
150 |
95
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
151 function apply(L::Laplace{Dim}, v::AbstractArray{T,Dim} where T, I::CartesianIndex{Dim}) where Dim |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
152 error("not implemented") |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
153 end |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
154 |
6
cb8e50ca9e15
Add attempt att apply methods for Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
2
diff
changeset
|
155 # u = L*v |
65
7054230b639c
Make dimension a type parameter in Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
57
diff
changeset
|
156 function apply(L::Laplace{1}, v::AbstractVector, i::Int) |
124
631eb9b35d72
Make grid spacing a property of EquidistantGrid. Create plotting module for sbplib.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
118
diff
changeset
|
157 uᵢ = L.a * apply(L.op, L.grid.spacing[1], v, i) |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
158 return uᵢ |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
159 end |
49 | 160 |
129
1aaeb46ba5f4
Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
124
diff
changeset
|
161 @inline function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, I::Tuple{Index{R1}, Index{R2}}) where {R1, R2} |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
162 # 2nd x-derivative |
118
4c0c02a80cd4
Change uview to view. It seems the compiler is now able to remove the allocation
Jonatan Werpers <jonatan@werpers.com>
parents:
117
diff
changeset
|
163 @inbounds vx = view(v, :, Int(I[2])) |
129
1aaeb46ba5f4
Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
124
diff
changeset
|
164 @inbounds uᵢ = L.a*apply(L.op, L.grid.inverse_spacing[1], vx , I[1]) |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
165 # 2nd y-derivative |
118
4c0c02a80cd4
Change uview to view. It seems the compiler is now able to remove the allocation
Jonatan Werpers <jonatan@werpers.com>
parents:
117
diff
changeset
|
166 @inbounds vy = view(v, Int(I[1]), :) |
129
1aaeb46ba5f4
Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
124
diff
changeset
|
167 @inbounds uᵢ += L.a*apply(L.op, L.grid.inverse_spacing[2], vy, I[2]) |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
168 return uᵢ |
49 | 169 end |
99
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
170 |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
171 # Slow but maybe convenient? |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
172 function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, i::CartesianIndex{2}) |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
173 I = Index{Unknown}.(Tuple(i)) |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
174 apply(L, v, I) |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
175 end |
135
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
176 |
154
3193bac1c086
More sketching of how things might work
Jonatan Werpers <jonatan@werpers.com>
parents:
153
diff
changeset
|
177 struct BoundaryOperator |
3193bac1c086
More sketching of how things might work
Jonatan Werpers <jonatan@werpers.com>
parents:
153
diff
changeset
|
178 |
3193bac1c086
More sketching of how things might work
Jonatan Werpers <jonatan@werpers.com>
parents:
153
diff
changeset
|
179 end |
3193bac1c086
More sketching of how things might work
Jonatan Werpers <jonatan@werpers.com>
parents:
153
diff
changeset
|
180 |
168
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
181 |
135
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
182 """ |
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
183 A BoundaryCondition should implement the method |
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
184 sat(::DiffOp, v::AbstractArray, data::AbstractArray, ...) |
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
185 """ |
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
186 abstract type BoundaryCondition end |
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
187 |
174
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
188 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
189 |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
190 function sat(L::Laplace{2,T}, bc::Neumann{Bid}, v::AbstractArray{T,2}, g::AbstractVector{T}, I::CartesianIndex{2}) where {T,Bid} |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
191 e = BoundaryValue(L.op, L.grid, Bid()) |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
192 d = NormalDerivative(L.op, L.grid, Bid()) |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
193 Hᵧ = BoundaryQuadrature(L.op, L.grid, Bid()) |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
194 # TODO: Implement BoundaryQuadrature method |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
195 |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
196 return -L.Hi*e*Hᵧ*(d'*v - g) |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
197 # Need to handle d'*v - g so that it is an AbstractArray that TensorMappings can act on |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
198 end |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
199 |
145
e0c8f5cf3a3f
Rename boundary indentifiers and use them inte the sat functions
Jonatan Werpers <jonatan@werpers.com>
parents:
143
diff
changeset
|
200 struct Dirichlet{Bid<:BoundaryIdentifier} <: BoundaryCondition |
135
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
201 tau::Float64 |
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
202 end |
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
203 |
174
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
204 function sat(L::Laplace{2,T}, bc::Dirichlet{Bid}, v::AbstractArray{T,2}, g::AbstractVector{T}, i::CartesianIndex{2}) where {T,Bid} |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
205 e = BoundaryValue(L.op, L.grid, Bid()) |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
206 d = NormalDerivative(L.op, L.grid, Bid()) |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
207 Hᵧ = BoundaryQuadrature(L.op, L.grid, Bid()) |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
208 # TODO: Implement BoundaryQuadrature method |
145
e0c8f5cf3a3f
Rename boundary indentifiers and use them inte the sat functions
Jonatan Werpers <jonatan@werpers.com>
parents:
143
diff
changeset
|
209 |
174
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
210 return -L.Hi*(tau/h*e + d)*Hᵧ*(e'*v - g) |
187295479984
Sketch implementation of sat methods for Neumann and Dirichlet
Jonatan Werpers <jonatan@werpers.com>
parents:
173
diff
changeset
|
211 # Need to handle scalar multiplication and addition of TensorMapping |
135
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
212 end |
bb1cc9c7877c
Add outline of idea for implemenation of sats
Jonatan Werpers <jonatan@werpers.com>
parents:
129
diff
changeset
|
213 |
168
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
214 # function apply(s::MyWaveEq{D}, v::AbstractArray{T,D}, i::CartesianIndex{D}) where D |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
215 # return apply(s.L, v, i) + |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
216 # sat(s.L, Dirichlet{CartesianBoundary{1,Lower}}(s.tau), v, s.g_w, i) + |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
217 # sat(s.L, Dirichlet{CartesianBoundary{1,Upper}}(s.tau), v, s.g_e, i) + |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
218 # sat(s.L, Dirichlet{CartesianBoundary{2,Lower}}(s.tau), v, s.g_s, i) + |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
219 # sat(s.L, Dirichlet{CartesianBoundary{2,Upper}}(s.tau), v, s.g_n, i) |
45840a8127d6
Fix typos and add NormalDerivative
Jonatan Werpers <jonatan@werpers.com>
parents:
166
diff
changeset
|
220 # end |