Mercurial > repos > public > sbplib_julia
annotate diffOp.jl @ 113:3b89aa6dc7f2 cell_based_test
Add apply_tiled! that tiles the iteration to optimize cache usage. Doesn't improve runtime at all at the moment
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 08 Feb 2019 21:19:34 +0100 |
parents | 98c788cba9bf |
children | d24497780ebd |
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 |
55
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
16 function boundaryCondition(D::DiffOp,b::Grid.BoundaryId,type)::(Closure, Penalty) |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
17 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
18 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
19 |
54
4300a3fbd818
switch grid to Grid in diffOp
Ylva Rydin <ylva.rydin@telia.com>
parents:
49
diff
changeset
|
20 function interface(Du::DiffOp, Dv::DiffOp, b::Grid.BoundaryId; type) |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
21 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
22 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
23 |
55
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
24 abstract type Closure end |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
25 |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
26 function apply(c::Closure, v::AbstractVector, i::Int) |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
27 error("not implemented") |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
28 end |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
29 |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
30 abstract type Penalty end |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
31 |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
32 function apply(c::Penalty, g, i::Int) |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
33 error("not implemented") |
c62ea0112d4d
Add abstract types for Closure and Penalty
Ylva Rydin <ylva.rydin@telia.com>
parents:
54
diff
changeset
|
34 end |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
35 |
95
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
36 abstract type DiffOpCartesian{Dim} <: DiffOp end |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
37 |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
38 # DiffOp must have a grid of dimension Dim!!! |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
39 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
|
40 for I ∈ eachindex(D.grid) |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
41 u[I] = apply(D, v, I) |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
42 end |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
43 |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
44 return nothing |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
45 end |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
46 |
112
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
47 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
|
48 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
|
49 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
|
50 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
|
51 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
|
52 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
|
53 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
|
54 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
|
55 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
|
56 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
|
57 return nothing |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
58 end |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
59 |
112
98c788cba9bf
Rename the apply! that applies in regions to apply_region!
Jonatan Werpers <jonatan@werpers.com>
parents:
111
diff
changeset
|
60 function apply_region!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}, r1::Type{<:Region}, r2::Type{<:Region}) where T |
108
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
61 N = D.grid.numberOfPointsPerDim |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
62 closuresize = closureSize(D.op) |
111
18b86c33b35a
Backed out changeset b3fbef345810, splitting apply! just complicates things
Jonatan Werpers <jonatan@werpers.com>
parents:
110
diff
changeset
|
63 for I ∈ regionindices(N, closuresize, (r1,r2)) |
110
ee071b8ed58c
Use deafult constructor for Index in apply!
Jonatan Werpers <jonatan@werpers.com>
parents:
109
diff
changeset
|
64 @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
|
65 @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
|
66 end |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
67 return nothing |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
68 end |
d0a28888528a
Change input type of apply(::Laplace) to ::DiffOpCartesian
Jonatan Werpers <jonatan@werpers.com>
parents:
107
diff
changeset
|
69 |
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 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
|
71 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
|
72 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
|
73 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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 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
|
80 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
|
81 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
|
82 |
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
|
83 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
|
84 function apply_region_tiled!(D::DiffOpCartesian{2}, u::AbstractArray{T,2}, v::AbstractArray{T,2}, r1::Type{<:Region}, r2::Type{<:Region}) 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
|
85 N = D.grid.numberOfPointsPerDim |
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
|
86 closuresize = closureSize(D.op) |
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
|
87 ri = regionindices(N, closuresize, (r1,r2)) |
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
|
88 |
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
|
89 for tileaxs ∈ TileIterator(axes(ri), padded_tilesize(T, (5,5), 2)) # TBD: Is this the right way, the right size? |
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
|
90 for i ∈ tileaxs[1], j ∈ tileaxs[2] |
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
|
91 I = ri[i,j] |
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
|
92 u[i,j] = apply(D, v, (Index{r1}(I[1]), Index{r2}(I[2]))) |
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
|
93 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
|
94 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
|
95 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
|
96 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
|
97 |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
98 function apply(D::DiffOp, v::AbstractVector)::AbstractVector |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
99 u = zeros(eltype(v), size(v)) |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
100 apply!(D,v,u) |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
101 return u |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
102 end |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
103 |
95
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
104 struct Laplace{Dim,T<:Real,N,M,K} <: DiffOpCartesian{Dim} |
84
48079bd39969
Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents:
76
diff
changeset
|
105 grid::Grid.EquidistantGrid{Dim,T} |
76
81d9510cb2d0
Make Laplace take dimension as a parameter
Jonatan Werpers <jonatan@werpers.com>
parents:
73
diff
changeset
|
106 a::T |
84
48079bd39969
Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents:
76
diff
changeset
|
107 op::D2{Float64,N,M,K} |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
108 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
109 |
95
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
110 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
|
111 error("not implemented") |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
112 end |
9d53ecca34f7
Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
113 |
6
cb8e50ca9e15
Add attempt att apply methods for Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
2
diff
changeset
|
114 # u = L*v |
65
7054230b639c
Make dimension a type parameter in Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
57
diff
changeset
|
115 function apply(L::Laplace{1}, v::AbstractVector, i::Int) |
54
4300a3fbd818
switch grid to Grid in diffOp
Ylva Rydin <ylva.rydin@telia.com>
parents:
49
diff
changeset
|
116 h = Grid.spacings(L.grid)[1] |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
117 uᵢ = L.a * apply(L.op, h, v, i) |
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
118 return uᵢ |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
119 end |
49 | 120 |
82 | 121 using UnsafeArrays |
99
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
122 function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, I::Tuple{Index{R1}, Index{R2}}) where {R1, R2} |
54
4300a3fbd818
switch grid to Grid in diffOp
Ylva Rydin <ylva.rydin@telia.com>
parents:
49
diff
changeset
|
123 h = Grid.spacings(L.grid) |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
124 # 2nd x-derivative |
99
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
125 @inbounds vx = uview(v, :, Int(I[2])) |
103
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
99
diff
changeset
|
126 @inbounds uᵢ = L.a*apply(L.op, h[1], vx , I[1]) |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
127 # 2nd y-derivative |
99
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
128 @inbounds vy = uview(v, Int(I[1]), :) |
103
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
99
diff
changeset
|
129 @inbounds uᵢ += L.a*apply(L.op, h[2], vy, I[2]) |
56
27a8d3021a1c
Convert apply functions to cell-based
Ylva Rydin <ylva.rydin@telia.com>
parents:
55
diff
changeset
|
130 return uᵢ |
49 | 131 end |
99
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
132 |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
133 # Slow but maybe convenient? |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
134 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
|
135 I = Index{Unknown}.(Tuple(i)) |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
136 apply(L, v, I) |
6b6d680f2e25
Allow apply(::Laplace) to take Index types
Jonatan Werpers <jonatan@werpers.com>
parents:
95
diff
changeset
|
137 end |