annotate src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl @ 2091:e21c295fb2da refactor/sbp_operators/direction_check

Restructure methods for equidistant grids with a dim argument
author Jonatan Werpers <jonatan@werpers.com>
date Mon, 02 Mar 2026 15:41:14 +0100
parents 67d8fbbb9e58
children 5af7534e5b3c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fc1f03fc8d65 Remove comments
Jonatan Werpers <jonatan@werpers.com>
parents: 913
diff changeset
53 """
1049
3bb94ce74697 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 940
diff changeset
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
fc1f03fc8d65 Remove comments
Jonatan Werpers <jonatan@werpers.com>
parents: 913
diff changeset
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
3bb94ce74697 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 940
diff changeset
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
f72cc96a58c6 Add some size tests
Jonatan Werpers <jonatan@werpers.com>
parents: 889
diff changeset
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
720b1358e06d More strict apply
Jonatan Werpers <jonatan@werpers.com>
parents: 930
diff changeset
118 elseif I[derivative_direction(op)] isa Index{Interior}
720b1358e06d More strict apply
Jonatan Werpers <jonatan@werpers.com>
parents: 930
diff changeset
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
720b1358e06d More strict apply
Jonatan Werpers <jonatan@werpers.com>
parents: 930
diff changeset
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
e9dfc1998d31 Fix some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1374
diff changeset
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
e9dfc1998d31 Fix some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1374
diff changeset
147 # 2D Specific implementations to avoid type instability
e9dfc1998d31 Fix some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1374
diff changeset
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)
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
153 ṽ = @view v[:,j]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
154 c̃ = @view op.coefficient[:,j]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
155
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
156 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
157 end
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
158
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
159 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
160 ṽ = @view v[:,j]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
161 c̃ = @view op.coefficient[:,j]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
162
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
163 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
164 end
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
165
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
166 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
167 ṽ = @view v[:,j]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
168 c̃ = @view op.coefficient[:,j]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
169
1367
71e89507dd9a Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents: 1365
diff changeset
170 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
171 stencil = op.closure_stencils[sz-i+1]
932
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
172 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, i)
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
173 end
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
174
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
175
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
176 ## y-direction
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
177 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
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 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
182 end
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
183
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
184 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
185 ṽ = @view v[i,:]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
186 c̃ = @view op.coefficient[i,:]
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 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
189 end
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
190
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
191 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
192 ṽ = @view v[i,:]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
193 c̃ = @view op.coefficient[i,:]
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
194
1367
71e89507dd9a Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
Jonatan Werpers <jonatan@werpers.com>
parents: 1365
diff changeset
195 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
196 stencil = op.closure_stencils[sz-j+1]
932
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
197 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, j)
863287577ad4 Temporarily add specialized methods for 2D
Jonatan Werpers <jonatan@werpers.com>
parents: 931
diff changeset
198 end