Mercurial > repos > public > sbplib_julia
annotate src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl @ 2096:5af7534e5b3c feature/sbp_operators/laplace_curvilinear tip
Merge default
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Mon, 02 Mar 2026 15:58:27 +0100 |
| parents | 3684db043add e21c295fb2da |
| children |
| rev | line source |
|---|---|
|
1370
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
1 """ |
|
2091
e21c295fb2da
Restructure methods for equidistant grids with a dim argument
Jonatan Werpers <jonatan@werpers.com>
parents:
2090
diff
changeset
|
2 second_derivative_variable(g, coeff, ..., [dim]) |
|
1370
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
3 |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
4 The variable second derivative operator as a `LazyTensor` on the given grid. |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
5 `coeff` is a grid function of the variable coefficient. |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
6 |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
7 Approximates the d/dξ c d/dξ on `g` along the coordinate dimension specified |
|
2089
1bc63fa55145
Change variable name from `direction` to `dim`
Jonatan Werpers <jonatan@werpers.com>
parents:
2088
diff
changeset
|
8 by `dim`. |
|
1370
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
9 """ |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
10 function second_derivative_variable end |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
11 |
|
2089
1bc63fa55145
Change variable name from `direction` to `dim`
Jonatan Werpers <jonatan@werpers.com>
parents:
2088
diff
changeset
|
12 function second_derivative_variable(g::TensorGrid, coeff, stencil_set, dim::Int) |
|
1bc63fa55145
Change variable name from `direction` to `dim`
Jonatan Werpers <jonatan@werpers.com>
parents:
2088
diff
changeset
|
13 if dim ∉ 1:ndims(g) |
|
2090
67d8fbbb9e58
Update error messages
Jonatan Werpers <jonatan@werpers.com>
parents:
2089
diff
changeset
|
14 throw(DomainError(dim, "Derivative direction must be in 1:$(ndims(g)).")) |
|
2080
0f949681d3d3
Check that direction of first/second derivative operators is within the dimension of the grid. Add 1D functions for first/second derivative operators that take a direction.
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents:
1381
diff
changeset
|
15 end |
|
1370
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
16 inner_stencil = parse_nested_stencil(eltype(coeff), stencil_set["D2variable"]["inner_stencil"]) |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
17 closure_stencils = parse_nested_stencil.(eltype(coeff), stencil_set["D2variable"]["closure_stencils"]) |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
18 |
|
2089
1bc63fa55145
Change variable name from `direction` to `dim`
Jonatan Werpers <jonatan@werpers.com>
parents:
2088
diff
changeset
|
19 return second_derivative_variable(g, coeff, inner_stencil, closure_stencils, dim) |
|
2080
0f949681d3d3
Check that direction of first/second derivative operators is within the dimension of the grid. Add 1D functions for first/second derivative operators that take a direction.
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents:
1381
diff
changeset
|
20 end |
|
0f949681d3d3
Check that direction of first/second derivative operators is within the dimension of the grid. Add 1D functions for first/second derivative operators that take a direction.
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents:
1381
diff
changeset
|
21 |
|
2091
e21c295fb2da
Restructure methods for equidistant grids with a dim argument
Jonatan Werpers <jonatan@werpers.com>
parents:
2090
diff
changeset
|
22 function second_derivative_variable(g::EquidistantGrid, coeff, stencil_set) |
|
e21c295fb2da
Restructure methods for equidistant grids with a dim argument
Jonatan Werpers <jonatan@werpers.com>
parents:
2090
diff
changeset
|
23 return second_derivative_variable(TensorGrid(g), coeff, stencil_set, 1) |
|
1370
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
24 end |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
25 |
|
2091
e21c295fb2da
Restructure methods for equidistant grids with a dim argument
Jonatan Werpers <jonatan@werpers.com>
parents:
2090
diff
changeset
|
26 function second_derivative_variable(g::EquidistantGrid, coeff, stencil_set, dim) |
|
e21c295fb2da
Restructure methods for equidistant grids with a dim argument
Jonatan Werpers <jonatan@werpers.com>
parents:
2090
diff
changeset
|
27 if dim != 1 |
|
e21c295fb2da
Restructure methods for equidistant grids with a dim argument
Jonatan Werpers <jonatan@werpers.com>
parents:
2090
diff
changeset
|
28 throw(DomainError(dim, "Derivative direction must be 1.")) |
|
e21c295fb2da
Restructure methods for equidistant grids with a dim argument
Jonatan Werpers <jonatan@werpers.com>
parents:
2090
diff
changeset
|
29 end |
|
e21c295fb2da
Restructure methods for equidistant grids with a dim argument
Jonatan Werpers <jonatan@werpers.com>
parents:
2090
diff
changeset
|
30 return second_derivative_variable(g, coeff, stencil_set) |
|
1370
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
31 end |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
32 |
|
2089
1bc63fa55145
Change variable name from `direction` to `dim`
Jonatan Werpers <jonatan@werpers.com>
parents:
2088
diff
changeset
|
33 function second_derivative_variable(g::TensorGrid, coeff, inner_stencil::NestedStencil, closure_stencils, dim) |
|
1371
d0e48c2e6aad
Remove stencil input for 1d grid and reorder methods of second_derivative_variable
Jonatan Werpers <jonatan@werpers.com>
parents:
1370
diff
changeset
|
34 check_coefficient(g, coeff) |
|
d0e48c2e6aad
Remove stencil input for 1d grid and reorder methods of second_derivative_variable
Jonatan Werpers <jonatan@werpers.com>
parents:
1370
diff
changeset
|
35 |
|
2089
1bc63fa55145
Change variable name from `direction` to `dim`
Jonatan Werpers <jonatan@werpers.com>
parents:
2088
diff
changeset
|
36 Δxᵢ = spacing(g.grids[dim]) |
|
1371
d0e48c2e6aad
Remove stencil input for 1d grid and reorder methods of second_derivative_variable
Jonatan Werpers <jonatan@werpers.com>
parents:
1370
diff
changeset
|
37 scaled_inner_stencil = scale(inner_stencil, 1/Δxᵢ^2) |
|
d0e48c2e6aad
Remove stencil input for 1d grid and reorder methods of second_derivative_variable
Jonatan Werpers <jonatan@werpers.com>
parents:
1370
diff
changeset
|
38 scaled_closure_stencils = scale.(Tuple(closure_stencils), 1/Δxᵢ^2) |
|
2089
1bc63fa55145
Change variable name from `direction` to `dim`
Jonatan Werpers <jonatan@werpers.com>
parents:
2088
diff
changeset
|
39 return SecondDerivativeVariable(coeff, scaled_inner_stencil, scaled_closure_stencils, dim) |
|
1371
d0e48c2e6aad
Remove stencil input for 1d grid and reorder methods of second_derivative_variable
Jonatan Werpers <jonatan@werpers.com>
parents:
1370
diff
changeset
|
40 end |
|
1370
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
41 |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
42 function check_coefficient(g, coeff) |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
43 if ndims(g) != ndims(coeff) |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
44 throw(ArgumentError("The coefficient has dimension $(ndims(coeff)) while the grid is dimension $(ndims(g))")) |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
45 end |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
46 |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
47 if size(g) != size(coeff) |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
48 throw(DimensionMismatch("the size $(size(coeff)) of the coefficient does not match the size $(size(g)) of the grid")) |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
49 end |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
50 end |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
51 |
|
4ef8fb75d144
Start splitting out a second_derivative_variable function
Jonatan Werpers <jonatan@werpers.com>
parents:
1368
diff
changeset
|
52 |
| 916 | 53 """ |
| 1049 | 54 SecondDerivativeVariable{Dir,T,D,...} <: LazyTensor{T,D,D} |
|
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 |
| 916 | 56 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
|
57 """ |
| 1049 | 58 struct SecondDerivativeVariable{Dir,T,D,M,IStencil<:NestedStencil{T},CStencil<:NestedStencil{T},TArray<:AbstractArray} <: LazyTensor{T,D,D} |
|
906
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
59 inner_stencil::IStencil |
|
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
60 closure_stencils::NTuple{M,CStencil} |
|
882
9098fc936776
Add the coefficient as a part of the struct. Wrap tests in testsets
Jonatan Werpers <jonatan@werpers.com>
parents:
881
diff
changeset
|
61 coefficient::TArray |
|
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
62 |
|
1374
4f3dd84891f6
Simplify constructor for SecondDerivativeVariable
Jonatan Werpers <jonatan@werpers.com>
parents:
1372
diff
changeset
|
63 function SecondDerivativeVariable(coefficient::AbstractArray, inner_stencil::NestedStencil{T}, closure_stencils::NTuple{M,NestedStencil{T}}, dir) where {T,M} |
|
4f3dd84891f6
Simplify constructor for SecondDerivativeVariable
Jonatan Werpers <jonatan@werpers.com>
parents:
1372
diff
changeset
|
64 D = ndims(coefficient) |
|
906
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
65 IStencil = typeof(inner_stencil) |
|
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
66 CStencil = eltype(closure_stencils) |
|
33c7e266e1a9
Add fix for type instability in SecondDerivativeVariable along with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
901
diff
changeset
|
67 TArray = typeof(coefficient) |
|
1374
4f3dd84891f6
Simplify constructor for SecondDerivativeVariable
Jonatan Werpers <jonatan@werpers.com>
parents:
1372
diff
changeset
|
68 return new{dir,T,D,M,IStencil,CStencil,TArray}(inner_stencil, closure_stencils, coefficient) |
|
889
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 end |
|
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 derivative_direction(::SecondDerivativeVariable{Dir}) where {Dir} = Dir |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
73 |
| 891 | 74 closure_size(op::SecondDerivativeVariable) = length(op.closure_stencils) |
|
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
75 |
|
1367
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
76 LazyTensors.range_size(op::SecondDerivativeVariable) = size(op.coefficient) |
|
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
77 LazyTensors.domain_size(op::SecondDerivativeVariable) = size(op.coefficient) |
|
881
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 |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
80 function derivative_view(op, a, I) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
81 d = derivative_direction(op) |
|
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 Iview = Base.setindex(I,:,d) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
84 return @view a[Iview...] |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
85 end |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
86 |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
87 function apply_lower(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(op.closure_stencils[i], 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 apply_interior(op::SecondDerivativeVariable, v, I...) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
96 ṽ = derivative_view(op, v, I) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
97 c̃ = derivative_view(op, op.coefficient, I) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
98 |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
99 i = I[derivative_direction(op)] |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
100 return apply_stencil(op.inner_stencil, c̃, ṽ, i) |
|
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
101 end |
|
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
102 |
|
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
103 function apply_upper(op::SecondDerivativeVariable, v, I...) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
104 ṽ = derivative_view(op, v, I) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
105 c̃ = derivative_view(op, op.coefficient, I) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
106 |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
107 i = I[derivative_direction(op)] |
|
1367
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
108 sz = domain_size(op)[derivative_direction(op)] |
|
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
109 stencil = op.closure_stencils[sz-i+1] |
|
893
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
110 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, i) |
|
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
111 end |
|
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
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::Vararg{Index}) |
|
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
114 if I[derivative_direction(op)] isa Index{Lower} |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
115 return apply_lower(op, v, Int.(I)...) |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
116 elseif I[derivative_direction(op)] isa Index{Upper} |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
117 return apply_upper(op, v, Int.(I)...) |
| 931 | 118 elseif I[derivative_direction(op)] isa Index{Interior} |
| 119 return apply_interior(op, v, Int.(I)...) | |
|
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
120 else |
| 931 | 121 error("Invalid region") |
|
889
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
122 end |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
123 end |
|
069e58fb3829
Refactor as multidimensional operator
Jonatan Werpers <jonatan@werpers.com>
parents:
884
diff
changeset
|
124 |
|
893
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
125 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractArray, I...) |
|
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
126 dir = derivative_direction(op) |
|
1367
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
127 sz = domain_size(op)[dir] |
|
893
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
128 |
|
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
129 i = I[dir] |
|
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
130 |
|
422c9f22cf92
Make higher dimensions work
Jonatan Werpers <jonatan@werpers.com>
parents:
891
diff
changeset
|
131 I = map(i->Index(i, Interior), I) |
|
930
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
132 if 0 < i <= closure_size(op) |
|
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
133 I = Base.setindex(I, Index(i, Lower), dir) |
|
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
134 return LazyTensors.apply(op, v, I...) |
|
1367
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
135 elseif closure_size(op) < i <= sz-closure_size(op) |
|
930
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
136 I = Base.setindex(I, Index(i, Interior), dir) |
|
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
137 return LazyTensors.apply(op, v, I...) |
|
1367
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
138 elseif sz-closure_size(op) < i <= sz |
|
930
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
139 I = Base.setindex(I, Index(i, Upper), dir) |
|
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
140 return LazyTensors.apply(op, v, I...) |
|
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
141 else |
| 1381 | 142 error("Bounds error") # This should be `throw(BoundsError())` but the type inference is so fragile that it doesn't work. Needs investigation. / Jonatan 2023-06-08 |
|
930
ba5f4a0ec879
Fix type stability for 2d operator
Jonatan Werpers <jonatan@werpers.com>
parents:
917
diff
changeset
|
143 end |
|
881
aa4875f9a530
Start implementing the variable second derivative
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
144 end |
|
932
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 |
| 1381 | 147 # 2D Specific implementations to avoid type instability |
| 148 # TBD: Can this be solved by fixing the general methods instead? | |
|
932
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 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
151 ## x-direction |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
152 function apply_lower(op::SecondDerivativeVariable{1}, v, i, j) |
|
1731
3684db043add
Add Base.@constprop :aggressive to src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
1381
diff
changeset
|
153 Base.@constprop :aggressive |
|
932
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 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
|
158 end |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
159 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
160 function apply_interior(op::SecondDerivativeVariable{1}, v, i, j) |
|
1731
3684db043add
Add Base.@constprop :aggressive to src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
1381
diff
changeset
|
161 Base.@constprop :aggressive |
|
932
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
162 ṽ = @view v[:,j] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
163 c̃ = @view op.coefficient[:,j] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
164 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
165 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
|
166 end |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
167 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
168 function apply_upper(op::SecondDerivativeVariable{1}, v, i, j) |
|
1731
3684db043add
Add Base.@constprop :aggressive to src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
1381
diff
changeset
|
169 Base.@constprop :aggressive |
|
932
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
170 ṽ = @view v[:,j] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
171 c̃ = @view op.coefficient[:,j] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
172 |
|
1367
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
173 sz = domain_size(op)[derivative_direction(op)] |
|
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
174 stencil = op.closure_stencils[sz-i+1] |
|
932
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
175 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, i) |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
176 end |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
177 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
178 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
179 ## y-direction |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
180 function apply_lower(op::SecondDerivativeVariable{2}, v, i, j) |
|
1731
3684db043add
Add Base.@constprop :aggressive to src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
1381
diff
changeset
|
181 Base.@constprop :aggressive |
|
932
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
182 ṽ = @view v[i,:] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
183 c̃ = @view op.coefficient[i,:] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
184 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
185 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
|
186 end |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
187 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
188 function apply_interior(op::SecondDerivativeVariable{2}, v, i, j) |
|
1731
3684db043add
Add Base.@constprop :aggressive to src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
1381
diff
changeset
|
189 Base.@constprop :aggressive |
|
932
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
190 ṽ = @view v[i,:] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
191 c̃ = @view op.coefficient[i,:] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
192 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
193 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
|
194 end |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
195 |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
196 function apply_upper(op::SecondDerivativeVariable{2}, v, i, j) |
|
1731
3684db043add
Add Base.@constprop :aggressive to src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
1381
diff
changeset
|
197 Base.@constprop :aggressive |
|
932
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
198 ṽ = @view v[i,:] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
199 c̃ = @view op.coefficient[i,:] |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
200 |
|
1367
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
201 sz = domain_size(op)[derivative_direction(op)] |
|
71e89507dd9a
Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents:
1365
diff
changeset
|
202 stencil = op.closure_stencils[sz-j+1] |
|
932
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
203 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, j) |
|
863287577ad4
Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents:
931
diff
changeset
|
204 end |
