changeset 1035:ceda69b8f27a feature/dissipation_operators

Add test for transpose equality and fix bugs found
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 22 Mar 2022 13:28:06 +0100
parents ed19c549c506
children 0e31b9901160
files src/SbpOperators/volumeops/derivatives/dissipation.jl test/SbpOperators/volumeops/derivatives/dissipation_test.jl
diffstat 2 files changed, 45 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/SbpOperators/volumeops/derivatives/dissipation.jl	Tue Mar 22 12:33:58 2022 +0100
+++ b/src/SbpOperators/volumeops/derivatives/dissipation.jl	Tue Mar 22 13:28:06 2022 +0100
@@ -33,8 +33,16 @@
 midpoint(weights) = length(weights)÷2 + 1
 midpoint_transpose(weights) = length(weights)+1 - midpoint(weights)
 
-dissipation_interior_stencil(weights) =           Stencil(weights..., center=midpoint(weights))
-dissipation_transpose_interior_stencil(weights) = Stencil(weights..., center=midpoint_transpose(weights))
+function dissipation_interior_stencil(weights)
+    return Stencil(weights..., center=midpoint(weights))
+end
+function dissipation_transpose_interior_stencil(weights)
+    if iseven(length(weights))
+        weights = map(-, weights)
+    end
+
+    return Stencil(weights..., center=midpoint_transpose(weights))
+end
 
 dissipation_lower_closure_size(weights) = midpoint(weights) - 1
 dissipation_upper_closure_size(weights) = length(weights) - midpoint(weights)
--- a/test/SbpOperators/volumeops/derivatives/dissipation_test.jl	Tue Mar 22 12:33:58 2022 +0100
+++ b/test/SbpOperators/volumeops/derivatives/dissipation_test.jl	Tue Mar 22 13:28:06 2022 +0100
@@ -36,7 +36,7 @@
      @testset "Accuracy conditions" begin
         N = 20
         g = EquidistantGrid(N, 0//1,2//1)
-        h = spacing(g)[1]
+        h = only(spacing(g))
         @testset "D_$p" for p ∈ [1,2,3,4]
             D,Dᵀ = undevided_dissipation(g, p)
 
@@ -46,16 +46,35 @@
 
                 @test D*v == h^p * vₚₓ
             end
+        end
+    end
 
+    @testset "tanspose equality" begin
+        function get_matrix(D)
+            N = only(range_size(D))
+            M = only(domain_size(D))
 
-            @testset "x^$k" for k ∈ 0:p
-                v  = evalOn(g, x->monomial(x,k))
-                vₚₓ = evalOn(g, x->monomial(x,k-p))
+            Dmat = zeros(N,M)
+            e = zeros(M)
+            for i ∈ 1:M
+                if i > 1
+                    e[i-1] = 0.
+                end
+                e[i] = 1.
+                Dmat[:,i] = D*e
+            end
 
-                for i ∈ SbpOperators.lower_closure_size(Dᵀ)+1:N-SbpOperators.upper_closure_size(Dᵀ)
-                    @test (Dᵀ*v)[i] == h^p * vₚₓ[i]
-                end
-            end
+            return Dmat
+        end
+
+        g = EquidistantGrid(11, 0., 1.)
+        @testset "D_$p" for p ∈ [1,2,3,4]
+            D,Dᵀ = undevided_dissipation(g, p)
+
+            D̄  = get_matrix(D)
+            D̄ᵀ = get_matrix(Dᵀ)
+
+            @test D̄ == D̄ᵀ'
         end
     end
 end
@@ -68,17 +87,17 @@
 end
 
 @testset "dissipation_interior_stencil" begin
-    @test dissipation_interior_stencil(dissipation_interior_weights(1)) == Stencil(-1,1, center=2)
-    @test dissipation_interior_stencil(dissipation_interior_weights(2)) == Stencil(1,-2,1, center=2)
-    @test dissipation_interior_stencil(dissipation_interior_weights(3)) == Stencil(-1,3,-3,1, center=3)
-    @test dissipation_interior_stencil(dissipation_interior_weights(4)) == Stencil(1, -4, 6, -4, 1, center=3)
+    @test dissipation_interior_stencil(dissipation_interior_weights(1)) == Stencil(-1, 1, center=2)
+    @test dissipation_interior_stencil(dissipation_interior_weights(2)) == Stencil( 1,-2, 1, center=2)
+    @test dissipation_interior_stencil(dissipation_interior_weights(3)) == Stencil(-1, 3,-3, 1, center=3)
+    @test dissipation_interior_stencil(dissipation_interior_weights(4)) == Stencil( 1,-4, 6,-4, 1, center=3)
 end
 
 @testset "dissipation_transpose_interior_stencil" begin
-    @test dissipation_transpose_interior_stencil(dissipation_interior_weights(1)) == Stencil(-1,1, center=1)
-    @test dissipation_transpose_interior_stencil(dissipation_interior_weights(2)) == Stencil(1,-2,1, center=2)
-    @test dissipation_transpose_interior_stencil(dissipation_interior_weights(3)) == Stencil(-1,3,-3,1, center=2)
-    @test dissipation_transpose_interior_stencil(dissipation_interior_weights(4)) == Stencil(1, -4, 6, -4, 1, center=3)
+    @test dissipation_transpose_interior_stencil(dissipation_interior_weights(1)) == Stencil(1,-1, center=1)
+    @test dissipation_transpose_interior_stencil(dissipation_interior_weights(2)) == Stencil(1,-2, 1, center=2)
+    @test dissipation_transpose_interior_stencil(dissipation_interior_weights(3)) == Stencil(1,-3, 3,-1, center=2)
+    @test dissipation_transpose_interior_stencil(dissipation_interior_weights(4)) == Stencil(1,-4, 6,-4, 1, center=3)
 end
 
 @testset "midpoint" begin