Mercurial > repos > public > sbplib_julia
annotate src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl @ 891:f72cc96a58c6 feature/variable_derivatives
Add some size tests
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 08 Feb 2022 10:58:31 +0100 |
parents | 069e58fb3829 |
children | 422c9f22cf92 |
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 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 # """ |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 # SecondDerivativeVariable(grid, inner_stencil, closure_stencils, parity, direction) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 # Creates a volume operator on a `Dim`-dimensional grid acting along the |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 # specified coordinate `direction`. The action of the operator is determined by |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 # the stencils `inner_stencil` and `closure_stencils`. When `Dim=1`, the |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 # corresponding `SecondDerivativeVariable` tensor mapping is returned. When `Dim>1`, the |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 # returned operator is the appropriate outer product of a one-dimensional |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 # operators and `IdentityMapping`s, e.g for `Dim=3` the volume operator in the |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 # y-direction is `I⊗op⊗I`. |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 # """ |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 # function volume_operator(grid::EquidistantGrid, inner_stencil, closure_stencils, parity, direction) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 # #TODO: Check that direction <= Dim? |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 # # Create 1D volume operator in along coordinate direction |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 # op = SecondDerivativeVariable(restrict(grid, direction), inner_stencil, closure_stencils, parity) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 # # Create 1D IdentityMappings for each coordinate direction |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 # one_d_grids = restrict.(Ref(grid), Tuple(1:dimension(grid))) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 # Is = IdentityMapping{eltype(grid)}.(size.(one_d_grids)) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 # # Formulate the correct outer product sequence of the identity mappings and |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 # # the volume operator |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 # parts = Base.setindex(Is, op, direction) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 # return foldl(⊗, parts) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 # end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 """ |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 SecondDerivativeVariable{T,N,M,K} <: TensorOperator{T,1} |
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 |
9098fc936776
Add the coefficient as a part of the struct. Wrap tests in testsets
Jonatan Werpers <jonatan@werpers.com>
parents:
881
diff
changeset
|
31 Implements the one-dimensional second derivative with variable coefficients. |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 """ |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
33 struct SecondDerivativeVariable{Dir,T,D,N,M,K,TArray<:AbstractArray} <: TensorMapping{T,D,D} |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 inner_stencil::NestedStencil{T,N} |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 closure_stencils::NTuple{M,NestedStencil{T,K}} |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
36 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
|
37 coefficient::TArray |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
38 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
39 function SecondDerivativeVariable{Dir, D}(inner_stencil::NestedStencil{T,N}, closure_stencils::NTuple{M,NestedStencil{T,K}}, size::NTuple{D,Int}, coefficient::TArray) where {Dir,T,D,N,M,K,TArray<:AbstractArray} |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
40 return new{Dir,T,D,N,M,K,TArray}(inner_stencil,closure_stencils,size, coefficient) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
41 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
42 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
43 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
44 function SecondDerivativeVariable(grid::EquidistantGrid, coeff::AbstractArray, inner_stencil, closure_stencils, dir) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
45 return SecondDerivativeVariable{dir, dimension(grid)}(inner_stencil, Tuple(closure_stencils), size(grid), coeff) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 |
882
9098fc936776
Add the coefficient as a part of the struct. Wrap tests in testsets
Jonatan Werpers <jonatan@werpers.com>
parents:
881
diff
changeset
|
48 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
|
49 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
|
50 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
52 derivative_direction(::SecondDerivativeVariable{Dir}) where {Dir} = Dir |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
53 |
891 | 54 closure_size(op::SecondDerivativeVariable) = length(op.closure_stencils) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
56 LazyTensors.range_size(op::SecondDerivativeVariable) = op.size |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 LazyTensors.domain_size(op::SecondDerivativeVariable) = op.size |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
59 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
60 function derivative_view(op, a, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
61 d = derivative_direction(op) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
62 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
63 Iview = Base.setindex(I,:,d) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
64 return @view a[Iview...] |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
65 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
66 # D = domain_dim(op) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
67 # Iₗ, _, Iᵣ = split_tuple(I, Val(d-1), Val(1), Val(D-d)) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
68 # return @view a[Iₗ..., :, Iᵣ...] |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
69 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
70 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
71 function apply_lower(op::SecondDerivativeVariable, v, I...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
72 ṽ = derivative_view(op, v, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
73 c̃ = derivative_view(op, op.coefficient, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
74 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
75 i = I[derivative_direction(op)] |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
76 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
|
77 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
78 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
79 function apply_interior(op::SecondDerivativeVariable, v, I...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
80 ṽ = derivative_view(op, v, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
81 c̃ = derivative_view(op, op.coefficient, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
82 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
83 i = I[derivative_direction(op)] |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
84 return apply_stencil(op.inner_stencil, c̃, ṽ, i) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
85 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
86 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
87 function apply_upper(op::SecondDerivativeVariable, v, I...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
88 ṽ = derivative_view(op, v, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
89 c̃ = derivative_view(op, op.coefficient, I) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
90 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
91 i = I[derivative_direction(op)] |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
92 return @inbounds apply_stencil_backwards(op.closure_stencils[op.size[1]-i+1], c̃, ṽ, i) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
93 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
94 |
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
95 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractVector, I::Vararg{Index}) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
96 if I[derivative_direction(op)] isa Index{Lower} |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
97 return apply_lower(op, v, Int.(I)...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
98 elseif I[derivative_direction(op)] isa Index{Upper} |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
99 return apply_upper(op, v, Int.(I)...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
100 else |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
101 return apply_interior(op, v, Int.(I)...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
102 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
103 end |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
104 |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
105 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractVector, I...) |
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
106 i = I[derivative_direction(op)] |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
107 r = getregion(i, closure_size(op), op.size[1]) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
108 return LazyTensors.apply(op, v, Index(i, r)) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
109 end |
884
d228d1b26729
Add tests for application
Jonatan Werpers <jonatan@werpers.com>
parents:
882
diff
changeset
|
110 |
d228d1b26729
Add tests for application
Jonatan Werpers <jonatan@werpers.com>
parents:
882
diff
changeset
|
111 # TODO: Rename SecondDerivativeVariable -> VariableSecondDerivative |