changeset 1367:71e89507dd9a feature/variable_derivatives

Remove size field from SecondDerivativeVariable since it duplicates info from the coefficient field
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 26 May 2023 14:53:19 +0200
parents 4684c7f1c4cb
children 26ad90b42efd
files src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl
diffstat 1 files changed, 14 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl	Sun May 21 21:55:14 2023 +0200
+++ b/src/SbpOperators/volumeops/derivatives/second_derivative_variable.jl	Fri May 26 14:53:19 2023 +0200
@@ -9,14 +9,13 @@
 struct SecondDerivativeVariable{Dir,T,D,M,IStencil<:NestedStencil{T},CStencil<:NestedStencil{T},TArray<:AbstractArray} <: LazyTensor{T,D,D}
     inner_stencil::IStencil
     closure_stencils::NTuple{M,CStencil}
-    size::NTuple{D,Int}
     coefficient::TArray
 
-    function SecondDerivativeVariable{Dir, D}(inner_stencil::NestedStencil{T}, closure_stencils::NTuple{M,NestedStencil{T}}, size::NTuple{D,Int}, coefficient::AbstractArray) where {Dir,T,D,M}
+    function SecondDerivativeVariable{Dir, D}(inner_stencil::NestedStencil{T}, closure_stencils::NTuple{M,NestedStencil{T}}, coefficient::AbstractArray) where {Dir,T,D,M}
         IStencil = typeof(inner_stencil)
         CStencil = eltype(closure_stencils)
         TArray = typeof(coefficient)
-        return new{Dir,T,D,M,IStencil,CStencil,TArray}(inner_stencil,closure_stencils,size, coefficient)
+        return new{Dir,T,D,M,IStencil,CStencil,TArray}(inner_stencil, closure_stencils, coefficient)
     end
 end
 
@@ -26,7 +25,7 @@
     Δxᵢ = spacing(g.grids[dir])
     scaled_inner_stencil = scale(inner_stencil, 1/Δxᵢ^2)
     scaled_closure_stencils = scale.(Tuple(closure_stencils), 1/Δxᵢ^2)
-    return SecondDerivativeVariable{dir, ndims(g)}(scaled_inner_stencil, scaled_closure_stencils, size(g), coeff)
+    return SecondDerivativeVariable{dir, ndims(g)}(scaled_inner_stencil, scaled_closure_stencils, coeff)
 end
 
 function SecondDerivativeVariable(g::EquidistantGrid, coeff::AbstractVector, inner_stencil::NestedStencil, closure_stencils)
@@ -78,8 +77,8 @@
 
 closure_size(op::SecondDerivativeVariable) = length(op.closure_stencils)
 
-LazyTensors.range_size(op::SecondDerivativeVariable) = op.size
-LazyTensors.domain_size(op::SecondDerivativeVariable) = op.size
+LazyTensors.range_size(op::SecondDerivativeVariable) = size(op.coefficient)
+LazyTensors.domain_size(op::SecondDerivativeVariable) = size(op.coefficient)
 
 
 function derivative_view(op, a, I)
@@ -110,7 +109,8 @@
     c̃ = derivative_view(op, op.coefficient, I)
 
     i = I[derivative_direction(op)]
-    stencil = op.closure_stencils[op.size[derivative_direction(op)]-i+1]
+    sz = domain_size(op)[derivative_direction(op)]
+    stencil = op.closure_stencils[sz-i+1]
     return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, i)
 end
 
@@ -128,6 +128,7 @@
 
 function LazyTensors.apply(op::SecondDerivativeVariable, v::AbstractArray, I...)
     dir = derivative_direction(op)
+    sz = domain_size(op)[dir]
 
     i = I[dir]
 
@@ -135,10 +136,10 @@
     if 0 < i <= closure_size(op)
         I = Base.setindex(I, Index(i, Lower), dir)
         return LazyTensors.apply(op, v, I...)
-    elseif closure_size(op) < i <= op.size[dir]-closure_size(op)
+    elseif closure_size(op) < i <= sz-closure_size(op)
         I = Base.setindex(I, Index(i, Interior), dir)
         return LazyTensors.apply(op, v, I...)
-    elseif op.size[dir]-closure_size(op) < i <= op.size[dir]
+    elseif sz-closure_size(op) < i <= sz
         I = Base.setindex(I, Index(i, Upper), dir)
         return LazyTensors.apply(op, v, I...)
     else
@@ -170,7 +171,8 @@
     ṽ = @view v[:,j]
     c̃ = @view op.coefficient[:,j]
 
-    stencil = op.closure_stencils[op.size[derivative_direction(op)]-i+1]
+    sz = domain_size(op)[derivative_direction(op)]
+    stencil = op.closure_stencils[sz-i+1]
     return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, i)
 end
 
@@ -194,6 +196,7 @@
     ṽ = @view v[i,:]
     c̃ = @view op.coefficient[i,:]
 
-    stencil = op.closure_stencils[op.size[derivative_direction(op)]-j+1]
+    sz = domain_size(op)[derivative_direction(op)]
+    stencil = op.closure_stencils[sz-j+1]
     return @inbounds apply_stencil_backwards(stencil, c̃, ṽ, j)
 end