comparison +grid/boundaryoptimizedTest.m @ 1289:2fd2e2337b77 feature/boundary_optimized_grids

Add utility function for constructing a (possibly multidimensional) grid based on the grid points used by the boundary optimized SBP operators
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Wed, 01 Jul 2020 15:15:30 +0200
parents
children
comparison
equal deleted inserted replaced
1288:e059a43bb675 1289:2fd2e2337b77
1 function tests = boundaryoptimizedTest()
2 tests = functiontests(localfunctions);
3 end
4
5 function testErrorInvalidParam(testCase)
6 in = {
7 %Invalid order
8 {[10 10],{0,1},{0,2},3},
9 %Invalid grid size
10 {5, {0,1}, 4},
11 {[10 5],{0,1},{0,2},4},
12 {[10 5],{0,1},{0,2},6,'M'},
13 %Invalid limits
14 {10,{1},4},
15 {[10,10],{0,1},{1},4},
16 {[10,10],{1},{1,0},4},
17 {10,{1,0},4},
18 {[10, 5],{1,0},{0,-1},4},
19 };
20
21 for i = 1:length(in)
22 testCase.verifyError(@()grid.boundaryoptimized(in{i}{:}),'grid:boundaryoptimized:InvalidParameter',sprintf('in(%d) = %s',i,toString(in{i})));
23 end
24 end
25
26 function testErrorInvalidOption(testCase)
27 in = {
28 {[8 8],{0,1},{0,2},4,'acrurate'},
29 };
30
31 for i = 1:length(in)
32 testCase.verifyError(@()grid.boundaryoptimized(in{i}{:}),'grid:boundaryoptimized:InvalidOption',sprintf('in(%d) = %s',i,toString(in{i})));
33 end
34 end
35
36 function testErrorNonMatchingParam(testCase)
37 in = {
38 {[],{1},4},
39 {[],{0,1},{0,1},4},
40 {[5,5],{0,1},{0,1},{0,1},4},
41 {[5,5,4],{0,1},{0,1},4,'accurate'}
42 {[5,5,4],{0,1},{0,1},{0,1},4,4},
43 };
44
45 for i = 1:length(in)
46 testCase.verifyError(@()grid.boundaryoptimized(in{i}{:}),'grid:boundaryoptimized:NonMatchingParameters',sprintf('in(%d) = %s',i,toString(in{i})));
47 end
48 end
49
50 % Tests that the expected grid points are obtained for a boundary optimized grid with a 4th order
51 % accurate stencil and 8th order minimal stencil.
52 % The boundary grid point distance weights are taken from the D1Nonequidistant operators and
53 % grid spacing is calculated according to Mattsson et al 2018. The test uses minimal number of grid
54 % points required by the operators.
55 function testCompiles(testCase)
56
57 %% 1D 4th order accurate stencil
58 % Boundary weights, number of non-equidistantly spaced points for 4th order accurate stencil
59 bw = [0.0000000000000e+00 6.8764546205559e-01 1.8022115125776e+00];
60 n = length(bw)-1;
61 xi_n = bw(end);
62
63 % Grid points in x-direction.
64 Lx = 1;
65 mx = 8;
66 hx_4 = Lx/(2*xi_n+(mx-2*n-1));
67
68 bp_l = hx_4*bw;
69 bp_r = Lx-flip(hx_4*bw);
70 interior = [hx_4*(xi_n+1) hx_4*(xi_n+2)];
71 x_4 = [bp_l interior bp_r];
72
73 % Boundary weights, number of non-equidistantly spaced points for 8th order minimal stencil
74 bw = [0.0000000000000e+00, 4.9439570885261e-01, 1.4051531374839e+00];
75 n = length(bw)-1;
76 xi_n = bw(end);
77
78 %% 2D 8th order minimal stencil
79 % Grid points in x-direction.
80 hx_8 = Lx/(2*xi_n+(mx-2*n-1));
81
82 bp_l = hx_8*bw;
83 bp_r = Lx-flip(hx_8*bw);
84 interior = [hx_8*(xi_n+1) hx_8*(xi_n+2)];
85 x_8 = [bp_l interior bp_r];
86
87 % Grid points in y-direction.
88 Ly = 2;
89 my = 9;
90 hy = Ly/(2*xi_n+(my-2*n-1));
91
92 bp_l = hy*bw;
93 bp_r = Ly-flip(hy*bw);
94 interior = [hy*(xi_n+1) hy*(xi_n+2) hy*(xi_n+3)];
95 y = [bp_l interior bp_r];
96
97 in = {
98 {mx, {0,Lx},4},
99 {[mx, my],{0,Lx},{0,Ly},8,'M'},
100 };
101
102 out = {
103 {[x_4'],hx_4}
104 {[kr(x_8',ones(size(y'))),kr(ones(size(x_8')),y')],[hx_8, hy]}
105 };
106
107 for i = 1:length(in)
108 g = grid.boundaryoptimized(in{i}{:});
109 testCase.verifyEqual(g.points(),out{i}{1},'AbsTol', 1e-14, 'RelTol', 1e-14);
110 testCase.verifyEqual(g.scaling(),out{i}{2},'AbsTol', 1e-14, 'RelTol', 1e-14);
111 end
112 end