changeset 565:15423a868d28 feature/boundary_ops

Restructure and extend tests for BoundaryRestriction
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 30 Nov 2020 23:19:20 +0100
parents ccb41095def6
children fe026b4f99ec
files test/testSbpOperators.jl
diffstat 1 files changed, 126 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- a/test/testSbpOperators.jl	Mon Nov 30 23:18:33 2020 +0100
+++ b/test/testSbpOperators.jl	Mon Nov 30 23:19:20 2020 +0100
@@ -175,82 +175,148 @@
 
 @testset "BoundaryRestrictrion" begin
     op = readOperator(sbp_operators_path()*"d2_4th.txt",sbp_operators_path()*"h_4th.txt")
-
-    g = EquidistantGrid(4, 0.0, 1.0)
+    g_1D = EquidistantGrid(4, 0.0, 1.0)
+    g_2D = EquidistantGrid((4,5), (0.0, 0.0), (1.0,1.0))
 
-    e_l = BoundaryRestriction(g,op.eClosure,Lower())
-    e_r = BoundaryRestriction(g,op.eClosure,Upper())
+    @testset "Constructors" begin
+        # 1D
+        e_l = BoundaryRestriction{Float64,4,Lower}(op.eClosure,size(g_1D))
+        @test e_l == BoundaryRestriction(g_1D,op.eClosure,Lower())
+        @test e_l == boundary_restriction(g_1D,op.eClosure,CartesianBoundary{1,Lower}())
+        @test e_l isa TensorMapping{T,0,1} where T
 
-    v = evalOn(g,x->1+x^2)
-    u = fill(3.124)
+        e_r = BoundaryRestriction{Float64,4,Upper}(op.eClosure,size(g_1D))
+        @test e_r == BoundaryRestriction(g_1D,op.eClosure,Upper())
+        @test e_r == boundary_restriction(g_1D,op.eClosure,CartesianBoundary{1,Upper}())
+        @test e_r isa TensorMapping{T,0,1} where T
 
-    @test (e_l*v)[] == v[1]
-    @test (e_r*v)[] == v[end]
-    @test e_l'*u == [u[], 0, 0, 0]
-    @test e_r'*u == [0, 0, 0, u[]]
-    @test_throws BoundsError (e_l*v)[Index{Lower}(3)]
-    @test_throws BoundsError (e_r*v)[Index{Upper}(3)]
+        # 2D
+        e_w = boundary_restriction(g_2D,op.eClosure,CartesianBoundary{1,Upper}())
+        @test e_w isa InflatedTensorMapping
+        @test e_w isa TensorMapping{T,1,2} where T
+    end
+
+    e_l = boundary_restriction(g_1D, op.eClosure, CartesianBoundary{1,Lower}())
+    e_r = boundary_restriction(g_1D, op.eClosure, CartesianBoundary{1,Upper}())
 
-    g = EquidistantGrid((4,5), (0.0, 0.0), (1.0,1.0))
+    e_w = boundary_restriction(g_2D, op.eClosure, CartesianBoundary{1,Lower}())
+    e_e = boundary_restriction(g_2D, op.eClosure, CartesianBoundary{1,Upper}())
+    e_s = boundary_restriction(g_2D, op.eClosure, CartesianBoundary{2,Lower}())
+    e_n = boundary_restriction(g_2D, op.eClosure, CartesianBoundary{2,Upper}())
+
+    @testset "Sizes" begin
+        # 1D
+        @test domain_size(e_l) == (4,)
+        @test domain_size(e_r) == (4,)
 
-    e_w = boundary_restriction(g, op.eClosure, CartesianBoundary{1,Lower}())
-    e_e = boundary_restriction(g, op.eClosure, CartesianBoundary{1,Upper}())
-    e_s = boundary_restriction(g, op.eClosure, CartesianBoundary{2,Lower}())
-    e_n = boundary_restriction(g, op.eClosure, CartesianBoundary{2,Upper}())
+        @test range_size(e_l) == ()
+        @test range_size(e_r) == ()
+
+        # 2D
+        @test domain_size(e_w) == (4,5)
+        @test domain_size(e_e) == (4,5)
+        @test domain_size(e_s) == (4,5)
+        @test domain_size(e_n) == (4,5)
+
+        @test range_size(e_w) == (5,)
+        @test range_size(e_e) == (5,)
+        @test range_size(e_s) == (4,)
+        @test range_size(e_n) == (4,)
+    end
+
 
-    v = zeros(Float64, 4, 5)
-    v[:,5] = [1, 2, 3,4]
-    v[:,4] = [1, 2, 3,4]
-    v[:,3] = [4, 5, 6, 7]
-    v[:,2] = [7, 8, 9, 10]
-    v[:,1] = [10, 11, 12, 13]
+    @testset "Application" begin
+        # 1D
+        v = evalOn(g_1D,x->1+x^2)
+        u = fill(3.124)
+        @test (e_l*v)[] == v[1]
+        @test (e_r*v)[] == v[end]
+        @test (e_r*v)[1] == v[end]
+        @test e_l'*u == [u[], 0, 0, 0]
+        @test e_r'*u == [0, 0, 0, u[]]
+        @test_throws BoundsError (e_l*v)[2]
+        @test_throws BoundsError (e_l'*u)[5]
 
-    @test e_w isa TensorMapping{T,1,2} where T
-    @test e_w'  isa TensorMapping{T,2,1} where T
-
-    @test domain_size(e_w) == (4,5)
-    @test domain_size(e_e) == (4,5)
-    @test domain_size(e_s) == (4,5)
-    @test domain_size(e_n) == (4,5)
+        # 2D
+        v = zeros(Float64, 4, 5)
+        v[:,5] = [1, 2, 3,4]
+        v[:,4] = [1, 2, 3,4]
+        v[:,3] = [4, 5, 6, 7]
+        v[:,2] = [7, 8, 9, 10]
+        v[:,1] = [10, 11, 12, 13]
 
-    @test range_size(e_w) == (5,)
-    @test range_size(e_e) == (5,)
-    @test range_size(e_s) == (4,)
-    @test range_size(e_n) == (4,)
+        @test e_w*v == [10,7,4,1.0,1]
+        @test e_e*v == [13,10,7,4,4.0]
+        @test e_s*v == [10,11,12,13.0]
+        @test e_n*v == [1,2,3,4.0]
+
+        I_w = [(Index{Lower}(1),),
+               (Index{Interior}(2),),
+               (Index{Interior}(3),),
+               (Index{Interior}(4),),
+               (Index{Upper}(5),)]
+       for i = 1:length(I_w)
+           @test (e_w*v)[I_w[i]...] == [10,7,4,1.0,1][i];
+       end
+
+       g_x = [1,2,3,4.0]
+       g_y = [5,4,3,2,1.0]
 
-    I_w = [(Index{Lower}(1),),
-           (Index{Interior}(2),),
-           (Index{Interior}(3),),
-           (Index{Interior}(4),),
-           (Index{Upper}(5),)]
-    v_w = [10,7,4,1.0,1];
-    for i = 1:length(I_w)
-        @test (e_w*v)[I_w[i]...] == v_w[i];
+       G_w = zeros(Float64, (4,5))
+       G_w[1,:] = g_y
+
+       G_e = zeros(Float64, (4,5))
+       G_e[4,:] = g_y
+
+       G_s = zeros(Float64, (4,5))
+       G_s[:,1] = g_x
+
+       G_n = zeros(Float64, (4,5))
+       G_n[:,5] = g_x
+
+       @test e_w'*g_y == G_w
+       @test e_e'*g_y == G_e
+       @test e_s'*g_x == G_s
+       @test e_n'*g_x == G_n
     end
-    @test e_w*v == [10,7,4,1.0,1]
-    @test e_e*v == [13,10,7,4,4.0]
-    @test e_s*v == [10,11,12,13.0]
-    @test e_n*v == [1,2,3,4.0]
 
-    g_x = [1,2,3,4.0]
-    g_y = [5,4,3,2,1.0]
+    @testset "Inferred" begin
+        # 1D
+        v = ones(Float64, 4)
+        u = fill(1.)
+        @inferred (e_l*v)[] == 1
+        @inferred (e_r*v)[] == 1
+        @inferred e_l'*u == [1., 0., 0., 0.]
+        @inferred e_r'*u == [0., 0., 0., 1.]
 
-    G_w = zeros(Float64, (4,5))
-    G_w[1,:] = g_y
+        # 2D
+        v = ones(Float64, 4, 5)
+        @inferred e_w*v == ones(Float64, 5)
+        @inferred e_e*v == ones(Float64, 5)
+        @inferred e_s*v == ones(Float64, 4)
+        @inferred e_n*v == ones(Float64, 4)
 
-    G_e = zeros(Float64, (4,5))
-    G_e[4,:] = g_y
+        g_x = ones(Float64,4)
+        g_y = ones(Float64,5)
 
-    G_s = zeros(Float64, (4,5))
-    G_s[:,1] = g_x
+        G_w = zeros(Float64, (4,5))
+        G_w[1,:] = g_y
+
+        G_e = zeros(Float64, (4,5))
+        G_e[4,:] = g_y
+
+        G_s = zeros(Float64, (4,5))
+        G_s[:,1] = g_x
 
-    G_n = zeros(Float64, (4,5))
-    G_n[:,5] = g_x
+        G_n = zeros(Float64, (4,5))
+        G_n[:,5] = g_x
 
-    @test e_w'*g_y == G_w
-    @test e_e'*g_y == G_e
-    @test e_s'*g_x == G_s
-    @test e_n'*g_x == G_n
+        @inferred e_w'*g_y == G_w
+        @inferred e_e'*g_y == G_e
+        @inferred e_s'*g_x == G_s
+        @inferred e_n'*g_x == G_n
+    end
+
 end
 #
 # @testset "NormalDerivative" begin