changeset 1034:ed19c549c506 feature/dissipation_operators

Implement undevided dissipation operators
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 22 Mar 2022 12:33:58 +0100
parents 0cb4c6b15d8e
children ceda69b8f27a
files src/SbpOperators/SbpOperators.jl src/SbpOperators/volumeops/derivatives/dissipation.jl test/SbpOperators/volumeops/derivatives/dissipation_test.jl
diffstat 3 files changed, 40 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/SbpOperators/SbpOperators.jl	Tue Mar 22 11:27:45 2022 +0100
+++ b/src/SbpOperators/SbpOperators.jl	Tue Mar 22 12:33:58 2022 +0100
@@ -9,7 +9,7 @@
 export normal_derivative
 export first_derivative
 export second_derivative
-export dissipation
+export undevided_dissipation
 
 using Sbplib.RegionIndices
 using Sbplib.LazyTensors
--- a/src/SbpOperators/volumeops/derivatives/dissipation.jl	Tue Mar 22 11:27:45 2022 +0100
+++ b/src/SbpOperators/volumeops/derivatives/dissipation.jl	Tue Mar 22 12:33:58 2022 +0100
@@ -1,11 +1,26 @@
-function dissipation(g::EquidistantGrid, p, direction)
-    h_inv = inverse_spacing(g)[direction]
+function undevided_dissipation(g::EquidistantGrid, p, direction)
+    T = eltype(g)
+    interior_weights = T.(dissipation_interior_weights(p))
 
-    # D = volume_operator(g,CenteredStencil(1),(CenteredStencil(1)), )
-    return nothing, nothing
+    D  = stencil_operator_distinct_closures(
+        g,
+        dissipation_interior_stencil(interior_weights),
+        dissipation_lower_closure_stencils(interior_weights),
+        dissipation_upper_closure_stencils(interior_weights),
+        direction,
+    )
+    Dᵀ = stencil_operator_distinct_closures(
+        g,
+        dissipation_transpose_interior_stencil(interior_weights),
+        dissipation_transpose_lower_closure_stencils(interior_weights),
+        dissipation_transpose_upper_closure_stencils(interior_weights),
+        direction,
+    )
+
+    return D, Dᵀ
 end
 
-dissipation(g::EquidistantGrid{1}, p) = dissipation(g, p, 1)
+undevided_dissipation(g::EquidistantGrid{1}, p) = undevided_dissipation(g, p, 1)
 
 function dissipation_interior_weights(p)
    if p == 0
--- a/test/SbpOperators/volumeops/derivatives/dissipation_test.jl	Tue Mar 22 11:27:45 2022 +0100
+++ b/test/SbpOperators/volumeops/derivatives/dissipation_test.jl	Tue Mar 22 12:33:58 2022 +0100
@@ -26,27 +26,36 @@
     x^k/factorial(k)
 end
 
-@testset "dissipation" begin
+@testset "undevided_dissipation" begin
     g = EquidistantGrid(20, 0., 11.)
-    D,Dᵀ = dissipation(g, 1)
+    D,Dᵀ = undevided_dissipation(g, 1)
 
-    @test_broken D isa LazyTensor{Float64,1,1} where T
-    @test_broken Dᵀ isa LazyTensor{Float64,1,1} where T
+    @test D isa LazyTensor{Float64,1,1} where T
+    @test Dᵀ isa LazyTensor{Float64,1,1} where T
 
      @testset "Accuracy conditions" begin
         N = 20
         g = EquidistantGrid(N, 0//1,2//1)
+        h = spacing(g)[1]
         @testset "D_$p" for p ∈ [1,2,3,4]
-            D,Dᵀ = dissipation(g, p)
+            D,Dᵀ = undevided_dissipation(g, p)
 
-            @testset "x^$k" for k ∈ 0:1
-                v = evalOn(g, x->monomial(x,k))
+            @testset "x^$k" for k ∈ 0:p
+                v  = evalOn(g, x->monomial(x,k))
+                vₚₓ = evalOn(g, x->monomial(x,k-p))
 
-                x, = points(g)[10]
-                @test_broken (D*v)[10] == monomial(x,k-1)
+                @test D*v == h^p * vₚₓ
             end
 
-            # Test Dᵀ works backwards and interior forwards
+
+            @testset "x^$k" for k ∈ 0:p
+                v  = evalOn(g, x->monomial(x,k))
+                vₚₓ = evalOn(g, x->monomial(x,k-p))
+
+                for i ∈ SbpOperators.lower_closure_size(Dᵀ)+1:N-SbpOperators.upper_closure_size(Dᵀ)
+                    @test (Dᵀ*v)[i] == h^p * vₚₓ[i]
+                end
+            end
         end
     end
 end