changeset 260:f89718833620 boundary_conditions

Store the inverse quadrature closure for D2. Implement the stencil application for the inverse quadrature
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Tue, 26 Nov 2019 08:18:23 -0800
parents 5571d2c5bf0f
children 01017d2b46b0
files SbpOperators/src/d2.jl SbpOperators/src/readoperator.jl
diffstat 2 files changed, 17 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/SbpOperators/src/d2.jl	Fri Jun 28 14:17:13 2019 +0200
+++ b/SbpOperators/src/d2.jl	Tue Nov 26 08:18:23 2019 -0800
@@ -7,6 +7,7 @@
 
 struct D2{T,N,M,K} <: ConstantStencilOperator
     quadratureClosure::NTuple{M,T}
+    inverseQuadratureClosure::NTuple{M,T}
     innerStencil::Stencil{T,N}
     closureStencils::NTuple{M,Stencil{T,K}}
     eClosure::Stencil{T,M}
@@ -18,16 +19,30 @@
     return length(D.quadratureClosure)
 end
 
+# TODO: Dispatch on Index{R}?
 apply_quadrature(op::D2{T}, h::Real, v::T, i::Integer, N::Integer, ::Type{Lower}) where T = v*h*op.quadratureClosure[i]
 apply_quadrature(op::D2{T}, h::Real, v::T, i::Integer, N::Integer, ::Type{Upper}) where T = v*h*op.quadratureClosure[N-i+1]
 apply_quadrature(op::D2{T}, h::Real, v::T, i::Integer, N::Integer, ::Type{Interior}) where T = v*h
 
+# TODO: Avoid branching in inner loops
 function apply_quadrature(op::D2{T}, h::Real, v::T, i::Integer, N::Integer) where T
     r = getregion(i, closuresize(op), N)
     return apply_quadrature(op, h, v, i, N, r)
 end
 export apply_quadrature
 
+# TODO: Dispatch on Index{R}?
+apply_inverse_quadrature(op::D2{T}, h_inv::Real, v::T, i::Integer, N::Integer, ::Type{Lower}) where T = v*h_inv*op.inverseQuadratureClosure[i]
+apply_inverse_quadrature(op::D2{T}, h_inv::Real, v::T, i::Integer, N::Integer, ::Type{Upper}) where T = v*h_inv*op.inverseQuadratureClosure[N-i+1]
+apply_inverse_quadrature(op::D2{T}, h_inv::Real, v::T, i::Integer, N::Integer, ::Type{Interior}) where T = v*h_inv
+
+# TODO: Avoid branching in inner loops
+function apply_inverse_quadrature(op::D2{T}, h_inv::Real, v::T, i::Integer, N::Integer) where T
+    r = getregion(i, closuresize(op), N)
+    return apply_inverse_quadrature(op, h_inv, v, i, N, r)
+end
+export apply_inverse_quadrature
+
 function apply_e_T(op::D2, v::AbstractVector, ::Type{Lower})
     @boundscheck if length(v) < closuresize(op)
         throw(BoundsError())
--- a/SbpOperators/src/readoperator.jl	Fri Jun 28 14:17:13 2019 +0200
+++ b/SbpOperators/src/readoperator.jl	Tue Nov 26 08:18:23 2019 -0800
@@ -21,11 +21,13 @@
     end
 
     quadratureClosure = pad_tuple(stringToTuple(Float64, h["closure"][1]), boundarySize)
+    inverseQuadratureClosure = 1.0 ./ quadratureClosure
     eClosure = Stencil((0,boundarySize-1), pad_tuple(stringToTuple(Float64, d["e"][1]), boundarySize))
     dClosure = Stencil((0,boundarySize-1), pad_tuple(stringToTuple(Float64, d["d1"][1]), boundarySize))
 
     d2 = D2(
         quadratureClosure,
+        inverseQuadratureClosure,
         innerStencil,
         closureStencils,
         eClosure,