Mercurial > repos > public > sbplib_julia
annotate src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl @ 881:aa4875f9a530 feature/variable_derivatives
Start implementing the variable second derivative
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Thu, 20 Jan 2022 15:18:14 +0100 |
parents | |
children | 9098fc936776 |
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} |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 Implements a one-dimensional constant coefficients volume operator |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 """ |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 struct SecondDerivativeVariable{T,N,M,K} <: TensorMapping{T,1,1} |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 inner_stencil::NestedStencil{T,N} |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 closure_stencils::NTuple{M,NestedStencil{T,K}} |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 size::NTuple{1,Int} |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 function SecondDerivativeVariable(grid::EquidistantGrid{1}, inner_stencil, closure_stencils) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 return SecondDerivativeVariable(inner_stencil, Tuple(closure_stencils), size(grid)) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 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
|
43 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 LazyTensors.range_size(op::SecondDerivativeVariable) = op.size |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 LazyTensors.domain_size(op::SecondDerivativeVariable) = op.size |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 function LazyTensors.apply(op::SecondDerivativeVariable{T}, v::AbstractVector{T}, i::Index{Lower}) where T |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 return @inbounds apply_stencil(op.closure_stencils[Int(i)], v, Int(i)) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
50 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 function LazyTensors.apply(op::SecondDerivativeVariable{T}, v::AbstractVector{T}, i::Index{Interior}) where T |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 return apply_stencil(op.inner_stencil, v, Int(i)) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
53 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
54 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 function LazyTensors.apply(op::SecondDerivativeVariable{T}, v::AbstractVector{T}, i::Index{Upper}) where T |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
56 return @inbounds Int(op.parity)*apply_stencil_backwards(op.closure_stencils[op.size[1]-Int(i)+1], v, Int(i)) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 end |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
59 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
|
60 r = getregion(i, closure_size(op), op.size[1]) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
61 return LazyTensors.apply(op, v, Index(i, r)) |
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 end |