comparison src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl @ 893:422c9f22cf92 feature/variable_derivatives

Make higher dimensions work
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 10 Feb 2022 10:02:33 +0100
parents f72cc96a58c6
children 5bbc3ea3821b
comparison
equal deleted inserted replaced
892:06c510d40ebb 893:422c9f22cf92
87 function apply_upper(op::SecondDerivativeVariable, v, I...) 87 function apply_upper(op::SecondDerivativeVariable, v, I...)
88 ṽ = derivative_view(op, v, I) 88 ṽ = derivative_view(op, v, I)
89 c̃ = derivative_view(op, op.coefficient, I) 89 c̃ = derivative_view(op, op.coefficient, I)
90 90
91 i = I[derivative_direction(op)] 91 i = I[derivative_direction(op)]
92 return @inbounds apply_stencil_backwards(op.closure_stencils[op.size[1]-i+1], c̃, ṽ, i) 92 stencil = op.closure_stencils[op.size[derivative_direction(op)]-i+1]
93 return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, i)
93 end 94 end
94 95
95 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractVector, I::Vararg{Index}) 96 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractArray, I::Vararg{Index})
96 if I[derivative_direction(op)] isa Index{Lower} 97 if I[derivative_direction(op)] isa Index{Lower}
97 return apply_lower(op, v, Int.(I)...) 98 return apply_lower(op, v, Int.(I)...)
98 elseif I[derivative_direction(op)] isa Index{Upper} 99 elseif I[derivative_direction(op)] isa Index{Upper}
99 return apply_upper(op, v, Int.(I)...) 100 return apply_upper(op, v, Int.(I)...)
100 else 101 else
101 return apply_interior(op, v, Int.(I)...) 102 return apply_interior(op, v, Int.(I)...)
102 end 103 end
103 end 104 end
104 105
105 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractVector, I...) 106 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractArray, I...)
106 i = I[derivative_direction(op)] 107 dir = derivative_direction(op)
107 r = getregion(i, closure_size(op), op.size[1]) 108
108 return LazyTensors.apply(op, v, Index(i, r)) 109 i = I[dir]
110 r = getregion(i, closure_size(op), op.size[dir])
111
112 I = map(i->Index(i, Interior), I)
113 I = Base.setindex(I, Index(i, r), dir)
114 return LazyTensors.apply(op, v, I...)
109 end 115 end
110 116
111 # TODO: Rename SecondDerivativeVariable -> VariableSecondDerivative 117 # TODO: Rename SecondDerivativeVariable -> VariableSecondDerivative