Mercurial > repos > public > sbplib_julia
annotate src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl @ 932:863287577ad4 feature/variable_derivatives
Temporarily add specialized methods for 2D
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 22 Feb 2022 07:24:22 +0100 |
parents | 720b1358e06d |
children | 025a506ca2fa |
rev | line source |
---|---|
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
1 export SecondDerivativeVariable |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 |
916 | 3 # REVIEW: Fixa docs |
4 """ | |
5 SecondDerivativeVariable{Dir,T,D,...} <: TensorMapping{T,D,D} | |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 |
916 | 7 A second derivative operator in direction `Dir` with a variable coefficient. |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 """ |
906
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
9 struct SecondDerivativeVariable{Dir,T,D,M,IStencil<:NestedStencil{T},CStencil<:NestedStencil{T},TArray<:AbstractArray} <: TensorMapping{T,D,D} |
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
10 inner_stencil::IStencil |
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
11 closure_stencils::NTuple{M,CStencil} |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
12 size::NTuple{D,Int} |
882
9098fc936776
Add the coefficient as a part of the struct. Wrap tests in testsets
Jonatan Werpers <jonatan@werpers.com>
parents:
881
diff
changeset
|
13 coefficient::TArray |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
14 |
906
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
15 function SecondDerivativeVariable{Dir, D}(inner_stencil::NestedStencil{T}, closure_stencils::NTuple{M,NestedStencil{T}}, size::NTuple{D,Int}, coefficient::AbstractArray) where {Dir,T,D,M} |
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
16 IStencil = typeof(inner_stencil) |
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
17 CStencil = eltype(closure_stencils) |
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
18 TArray = typeof(coefficient) |
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
19 return new{Dir,T,D,M,IStencil,CStencil,TArray}(inner_stencil,closure_stencils,size, coefficient) |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
20 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
21 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
22 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
23 function SecondDerivativeVariable(grid::EquidistantGrid, coeff::AbstractArray, inner_stencil, closure_stencils, dir) |
901
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
24 Δxᵢ = spacing(grid)[dir] |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
25 scaled_inner_stencil = scale(inner_stencil, 1/Δxᵢ^2) |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
26 scaled_closure_stencils = scale.(Tuple(closure_stencils), 1/Δxᵢ^2) |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
27 return SecondDerivativeVariable{dir, dimension(grid)}(scaled_inner_stencil, scaled_closure_stencils, size(grid), coeff) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 |
882
9098fc936776
Add the coefficient as a part of the struct. Wrap tests in testsets
Jonatan Werpers <jonatan@werpers.com>
parents:
881
diff
changeset
|
30 function SecondDerivativeVariable(grid::EquidistantGrid{1}, coeff::AbstractVector, inner_stencil, closure_stencils) |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
31 return SecondDerivativeVariable(grid, coeff, inner_stencil, closure_stencils, 1) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 |
917 | 34 @doc raw""" |
35 SecondDerivativeVariable(grid::EquidistantGrid, coeff::AbstractArray, stencil_set, dir) | |
36 | |
37 Create a `TensorMapping` for the second derivative with a variable coefficient | |
38 `coeff` on `grid` from the stencils in `stencil_set`. The direction is | |
39 determined by `dir`. | |
40 | |
41 `coeff` is a grid function on `grid`. | |
42 | |
43 # Example | |
44 With | |
45 ``` | |
46 D = SecondDerivativeVariable(g, c, stencil_set, 2) | |
47 ``` | |
48 then `D*u` approximates | |
49 ```math | |
50 \frac{\partial}{\partial y} c(x,y) \frac{\partial u}{\partial y}, | |
51 ``` | |
52 on ``(0,1)⨯(0,1)`` represented by `g`. | |
53 """ | |
901
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
54 function SecondDerivativeVariable(grid::EquidistantGrid, coeff::AbstractArray, stencil_set, dir) |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
55 inner_stencil = parse_nested_stencil(eltype(coeff), stencil_set["D2variable"]["inner_stencil"]) |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
56 closure_stencils = parse_nested_stencil.(eltype(coeff), stencil_set["D2variable"]["closure_stencils"]) |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
57 |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
58 return SecondDerivativeVariable(grid, coeff, inner_stencil, closure_stencils, dir) |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
59 end |
5bbc3ea3821b
Implement building from stencil set. Add tests for real operators
Jonatan Werpers <jonatan@werpers.com>
parents:
893
diff
changeset
|
60 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
61 derivative_direction(::SecondDerivativeVariable{Dir}) where {Dir} = Dir |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
62 |
891 | 63 closure_size(op::SecondDerivativeVariable) = length(op.closure_stencils) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
64 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
65 LazyTensors.range_size(op::SecondDerivativeVariable) = op.size |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
66 LazyTensors.domain_size(op::SecondDerivativeVariable) = op.size |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
67 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
68 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
69 function derivative_view(op, a, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
70 d = derivative_direction(op) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
71 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
72 Iview = Base.setindex(I,:,d) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
73 return @view a[Iview...] |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
74 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
75 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
76 function apply_lower(op::SecondDerivativeVariable, v, I...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
77 ṽ = derivative_view(op, v, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
78 c̃ = derivative_view(op, op.coefficient, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
79 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
80 i = I[derivative_direction(op)] |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
81 return @inbounds apply_stencil(op.closure_stencils[i], c̃, ṽ, i) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
82 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
83 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
84 function apply_interior(op::SecondDerivativeVariable, v, I...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
85 ṽ = derivative_view(op, v, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
86 c̃ = derivative_view(op, op.coefficient, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
87 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
88 i = I[derivative_direction(op)] |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
89 return apply_stencil(op.inner_stencil, c̃, ṽ, i) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
90 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
91 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
92 function apply_upper(op::SecondDerivativeVariable, v, I...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
93 ṽ = derivative_view(op, v, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
94 c̃ = derivative_view(op, op.coefficient, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
95 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
96 i = I[derivative_direction(op)] |
893
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
97 stencil = op.closure_stencils[op.size[derivative_direction(op)]-i+1] |
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
98 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, i) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
99 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
100 |
893
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
101 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractArray, I::Vararg{Index}) |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
102 if I[derivative_direction(op)] isa Index{Lower} |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
103 return apply_lower(op, v, Int.(I)...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
104 elseif I[derivative_direction(op)] isa Index{Upper} |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
105 return apply_upper(op, v, Int.(I)...) |
931 | 106 elseif I[derivative_direction(op)] isa Index{Interior} |
107 return apply_interior(op, v, Int.(I)...) | |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
108 else |
931 | 109 error("Invalid region") |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
110 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
111 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
112 |
893
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
113 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractArray, I...) |
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
114 dir = derivative_direction(op) |
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
115 |
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
116 i = I[dir] |
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
117 |
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
118 I = map(i->Index(i, Interior), I) |
930
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
119 if 0 < i <= closure_size(op) |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
120 I = Base.setindex(I, Index(i, Lower), dir) |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
121 return LazyTensors.apply(op, v, I...) |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
122 elseif closure_size(op) < i <= op.size[dir]-closure_size(op) |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
123 I = Base.setindex(I, Index(i, Interior), dir) |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
124 return LazyTensors.apply(op, v, I...) |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
125 elseif op.size[dir]-closure_size(op) < i <= op.size[dir] |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
126 I = Base.setindex(I, Index(i, Upper), dir) |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
127 return LazyTensors.apply(op, v, I...) |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
128 else |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
129 error("Bounds error") # TODO: Make this more standard |
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
130 end |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
131 end |
932
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
132 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
133 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
134 ## 2D Specific implementations to avoid instability |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
135 ## TODO: Should really be solved by fixing the general methods instead |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
136 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
137 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
138 ## x-direction |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
139 function apply_lower(op::SecondDerivativeVariable{1}, v, i, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
140 ṽ = @view v[:,j] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
141 c̃ = @view op.coefficient[:,j] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
142 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
143 return @inbounds apply_stencil(op.closure_stencils[i], c̃, ṽ, i) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
144 end |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
145 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
146 function apply_interior(op::SecondDerivativeVariable{1}, v, i, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
147 ṽ = @view v[:,j] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
148 c̃ = @view op.coefficient[:,j] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
149 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
150 return @inbounds apply_stencil(op.inner_stencil, c̃, ṽ, i) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
151 end |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
152 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
153 function apply_upper(op::SecondDerivativeVariable{1}, v, i, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
154 ṽ = @view v[:,j] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
155 c̃ = @view op.coefficient[:,j] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
156 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
157 stencil = op.closure_stencils[op.size[derivative_direction(op)]-i+1] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
158 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, i) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
159 end |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
160 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
161 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
162 ## y-direction |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
163 function apply_lower(op::SecondDerivativeVariable{2}, v, i, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
164 ṽ = @view v[i,:] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
165 c̃ = @view op.coefficient[i,:] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
166 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
167 return @inbounds apply_stencil(op.closure_stencils[j], c̃, ṽ, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
168 end |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
169 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
170 function apply_interior(op::SecondDerivativeVariable{2}, v, i, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
171 ṽ = @view v[i,:] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
172 c̃ = @view op.coefficient[i,:] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
173 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
174 return @inbounds apply_stencil(op.inner_stencil, c̃, ṽ, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
175 end |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
176 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
177 function apply_upper(op::SecondDerivativeVariable{2}, v, i, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
178 ṽ = @view v[i,:] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
179 c̃ = @view op.coefficient[i,:] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
180 |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
181 stencil = op.closure_stencils[op.size[derivative_direction(op)]-j+1] |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
182 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, j) |
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
183 end |