Mercurial > repos > public > sbplib_julia
annotate src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl @ 884:d228d1b26729 feature/variable_derivatives
Add tests for application
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 28 Jan 2022 10:37:57 +0100 |
parents | 9098fc936776 |
children | 069e58fb3829 |
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 """ |
882
9098fc936776
Add the coefficient as a part of the struct. Wrap tests in testsets
Jonatan Werpers <jonatan@werpers.com>
parents:
881
diff
changeset
|
33 struct SecondDerivativeVariable{T,N,M,K,TArray<:AbstractVector} <: TensorMapping{T,1,1} |
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}} |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 size::NTuple{1,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 |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 |
882
9098fc936776
Add the coefficient as a part of the struct. Wrap tests in testsets
Jonatan Werpers <jonatan@werpers.com>
parents:
881
diff
changeset
|
40 function SecondDerivativeVariable(grid::EquidistantGrid{1}, coeff::AbstractVector, inner_stencil, closure_stencils) |
9098fc936776
Add the coefficient as a part of the struct. Wrap tests in testsets
Jonatan Werpers <jonatan@werpers.com>
parents:
881
diff
changeset
|
41 return SecondDerivativeVariable(inner_stencil, Tuple(closure_stencils), size(grid), coeff) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
43 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 closure_size(::SecondDerivativeVariable{T,N,M}) where {T,N,M} = M |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 LazyTensors.range_size(op::SecondDerivativeVariable) = op.size |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 LazyTensors.domain_size(op::SecondDerivativeVariable) = op.size |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 function LazyTensors.apply(op::SecondDerivativeVariable{T}, v::AbstractVector{T}, i::Index{Lower}) where T |
884
d228d1b26729
Add tests for application
Jonatan Werpers <jonatan@werpers.com>
parents:
882
diff
changeset
|
50 return @inbounds apply_stencil(op.closure_stencils[Int(i)], op.coefficient, v, Int(i)) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
53 function LazyTensors.apply(op::SecondDerivativeVariable{T}, v::AbstractVector{T}, i::Index{Interior}) where T |
884
d228d1b26729
Add tests for application
Jonatan Werpers <jonatan@werpers.com>
parents:
882
diff
changeset
|
54 return apply_stencil(op.inner_stencil, op.coefficient, v, Int(i)) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
56 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 function LazyTensors.apply(op::SecondDerivativeVariable{T}, v::AbstractVector{T}, i::Index{Upper}) where T |
884
d228d1b26729
Add tests for application
Jonatan Werpers <jonatan@werpers.com>
parents:
882
diff
changeset
|
58 return @inbounds apply_stencil_backwards(op.closure_stencils[op.size[1]-Int(i)+1], op.coefficient, v, Int(i)) |
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
59 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
60 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
61 function LazyTensors.apply(op::SecondDerivativeVariable{T}, v::AbstractVector{T}, i) where T |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 r = getregion(i, closure_size(op), op.size[1]) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
63 return LazyTensors.apply(op, v, Index(i, r)) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
64 end |
884
d228d1b26729
Add tests for application
Jonatan Werpers <jonatan@werpers.com>
parents:
882
diff
changeset
|
65 |
d228d1b26729
Add tests for application
Jonatan Werpers <jonatan@werpers.com>
parents:
882
diff
changeset
|
66 # TODO: Rename SecondDerivativeVariable -> VariableSecondDerivative |