Mercurial > repos > public > sbplib_julia
comparison test/SbpOperators/volumeops/volume_operator_test.jl @ 728:45966c77cb20 feature/selectable_tests
Split tests for SbpOperators over several files
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 17 Mar 2021 20:34:40 +0100 |
parents | |
children | 6114274447f5 |
comparison
equal
deleted
inserted
replaced
727:95b207729b7a | 728:45966c77cb20 |
---|---|
1 using Test | |
2 | |
3 using Sbplib.SbpOperators | |
4 using Sbplib.Grids | |
5 | |
6 import Sbplib.SbpOperators.Stencil | |
7 import Sbplib.SbpOperators.volume_operator | |
8 import Sbplib.SbpOperators.odd | |
9 import Sbplib.SbpOperators.even | |
10 | |
11 @testset "VolumeOperator" begin | |
12 inner_stencil = CenteredStencil(1/4, 2/4, 1/4) | |
13 closure_stencils = (Stencil(1/2, 1/2; center=1), Stencil(0.,1.; center=2)) | |
14 g_1D = EquidistantGrid(11,0.,1.) | |
15 g_2D = EquidistantGrid((11,12),(0.,0.),(1.,1.)) | |
16 g_3D = EquidistantGrid((11,12,10),(0.,0.,0.),(1.,1.,1.)) | |
17 @testset "Constructors" begin | |
18 @testset "1D" begin | |
19 op = VolumeOperator(inner_stencil,closure_stencils,(11,),even) | |
20 @test op == VolumeOperator(g_1D,inner_stencil,closure_stencils,even) | |
21 @test op == volume_operator(g_1D,inner_stencil,closure_stencils,even,1) | |
22 @test op isa TensorMapping{T,1,1} where T | |
23 end | |
24 @testset "2D" begin | |
25 op_x = volume_operator(g_2D,inner_stencil,closure_stencils,even,1) | |
26 op_y = volume_operator(g_2D,inner_stencil,closure_stencils,even,2) | |
27 Ix = IdentityMapping{Float64}((11,)) | |
28 Iy = IdentityMapping{Float64}((12,)) | |
29 @test op_x == VolumeOperator(inner_stencil,closure_stencils,(11,),even)⊗Iy | |
30 @test op_y == Ix⊗VolumeOperator(inner_stencil,closure_stencils,(12,),even) | |
31 @test op_x isa TensorMapping{T,2,2} where T | |
32 @test op_y isa TensorMapping{T,2,2} where T | |
33 end | |
34 @testset "3D" begin | |
35 op_x = volume_operator(g_3D,inner_stencil,closure_stencils,even,1) | |
36 op_y = volume_operator(g_3D,inner_stencil,closure_stencils,even,2) | |
37 op_z = volume_operator(g_3D,inner_stencil,closure_stencils,even,3) | |
38 Ix = IdentityMapping{Float64}((11,)) | |
39 Iy = IdentityMapping{Float64}((12,)) | |
40 Iz = IdentityMapping{Float64}((10,)) | |
41 @test op_x == VolumeOperator(inner_stencil,closure_stencils,(11,),even)⊗Iy⊗Iz | |
42 @test op_y == Ix⊗VolumeOperator(inner_stencil,closure_stencils,(12,),even)⊗Iz | |
43 @test op_z == Ix⊗Iy⊗VolumeOperator(inner_stencil,closure_stencils,(10,),even) | |
44 @test op_x isa TensorMapping{T,3,3} where T | |
45 @test op_y isa TensorMapping{T,3,3} where T | |
46 @test op_z isa TensorMapping{T,3,3} where T | |
47 end | |
48 end | |
49 | |
50 @testset "Sizes" begin | |
51 @testset "1D" begin | |
52 op = volume_operator(g_1D,inner_stencil,closure_stencils,even,1) | |
53 @test range_size(op) == domain_size(op) == size(g_1D) | |
54 end | |
55 | |
56 @testset "2D" begin | |
57 op_x = volume_operator(g_2D,inner_stencil,closure_stencils,even,1) | |
58 op_y = volume_operator(g_2D,inner_stencil,closure_stencils,even,2) | |
59 @test range_size(op_y) == domain_size(op_y) == | |
60 range_size(op_x) == domain_size(op_x) == size(g_2D) | |
61 end | |
62 @testset "3D" begin | |
63 op_x = volume_operator(g_3D,inner_stencil,closure_stencils,even,1) | |
64 op_y = volume_operator(g_3D,inner_stencil,closure_stencils,even,2) | |
65 op_z = volume_operator(g_3D,inner_stencil,closure_stencils,even,3) | |
66 @test range_size(op_z) == domain_size(op_z) == | |
67 range_size(op_y) == domain_size(op_y) == | |
68 range_size(op_x) == domain_size(op_x) == size(g_3D) | |
69 end | |
70 end | |
71 | |
72 op_x = volume_operator(g_2D,inner_stencil,closure_stencils,even,1) | |
73 op_y = volume_operator(g_2D,inner_stencil,closure_stencils,odd,2) | |
74 v = zeros(size(g_2D)) | |
75 Nx = size(g_2D)[1] | |
76 Ny = size(g_2D)[2] | |
77 for i = 1:Nx | |
78 v[i,:] .= i | |
79 end | |
80 rx = copy(v) | |
81 rx[1,:] .= 1.5 | |
82 rx[Nx,:] .= (2*Nx-1)/2 | |
83 ry = copy(v) | |
84 ry[:,Ny-1:Ny] = -v[:,Ny-1:Ny] | |
85 | |
86 @testset "Application" begin | |
87 @test op_x*v ≈ rx rtol = 1e-14 | |
88 @test op_y*v ≈ ry rtol = 1e-14 | |
89 end | |
90 | |
91 @testset "Regions" begin | |
92 @test (op_x*v)[Index(1,Lower),Index(3,Interior)] ≈ rx[1,3] rtol = 1e-14 | |
93 @test (op_x*v)[Index(2,Lower),Index(3,Interior)] ≈ rx[2,3] rtol = 1e-14 | |
94 @test (op_x*v)[Index(6,Interior),Index(3,Interior)] ≈ rx[6,3] rtol = 1e-14 | |
95 @test (op_x*v)[Index(10,Upper),Index(3,Interior)] ≈ rx[10,3] rtol = 1e-14 | |
96 @test (op_x*v)[Index(11,Upper),Index(3,Interior)] ≈ rx[11,3] rtol = 1e-14 | |
97 | |
98 @test_throws BoundsError (op_x*v)[Index(3,Lower),Index(3,Interior)] | |
99 @test_throws BoundsError (op_x*v)[Index(9,Upper),Index(3,Interior)] | |
100 | |
101 @test (op_y*v)[Index(3,Interior),Index(1,Lower)] ≈ ry[3,1] rtol = 1e-14 | |
102 @test (op_y*v)[Index(3,Interior),Index(2,Lower)] ≈ ry[3,2] rtol = 1e-14 | |
103 @test (op_y*v)[Index(3,Interior),Index(6,Interior)] ≈ ry[3,6] rtol = 1e-14 | |
104 @test (op_y*v)[Index(3,Interior),Index(11,Upper)] ≈ ry[3,11] rtol = 1e-14 | |
105 @test (op_y*v)[Index(3,Interior),Index(12,Upper)] ≈ ry[3,12] rtol = 1e-14 | |
106 | |
107 @test_throws BoundsError (op_y*v)[Index(3,Interior),Index(10,Upper)] | |
108 @test_throws BoundsError (op_y*v)[Index(3,Interior),Index(3,Lower)] | |
109 end | |
110 | |
111 @testset "Inferred" begin | |
112 @inferred apply(op_x, v,1,1) | |
113 @inferred apply(op_x, v, Index(1,Lower),Index(1,Lower)) | |
114 @inferred apply(op_x, v, Index(6,Interior),Index(1,Lower)) | |
115 @inferred apply(op_x, v, Index(11,Upper),Index(1,Lower)) | |
116 | |
117 @inferred apply(op_y, v,1,1) | |
118 @inferred apply(op_y, v, Index(1,Lower),Index(1,Lower)) | |
119 @inferred apply(op_y, v, Index(1,Lower),Index(6,Interior)) | |
120 @inferred apply(op_y, v, Index(1,Lower),Index(11,Upper)) | |
121 end | |
122 end |