1 | /* |
2 | * grid_dist_id_unit_test_ext_dom.hpp |
3 | * |
4 | * Created on: Feb 24, 2016 |
5 | * Author: i-bird |
6 | */ |
7 | #include "Decomposition/CartDecomposition_ext.hpp" |
8 | #include "Grid/grid_dist_id.hpp" |
9 | |
10 | extern void print_test_v(std::string test, size_t sz); |
11 | |
12 | // Test duplicated topology |
13 | |
14 | void Test3D_extended_grid(const Box<3,float> & domain, long int k) |
15 | { |
16 | long int big_step = k / 30; |
17 | big_step = (big_step == 0)?1:big_step; |
18 | long int small_step = 21; |
19 | |
20 | Vcluster<> & v_cl = create_vcluster(); |
21 | |
22 | if ( v_cl.getProcessingUnits() > 32 ) |
23 | return; |
24 | |
25 | print_test_v( "Testing 3D extended grid k<=" ,k); |
26 | |
27 | // factor |
28 | float factor = pow(create_vcluster().getProcessingUnits()/2.0f,1.0f/3.0f); |
29 | |
30 | // This test in order to work must have at least one ghost |
31 | for ( ; (0.01 / factor) > ((domain.getHigh(0) - domain.getLow(0)) / k) ; k-= (k > 2*big_step)?big_step:small_step ) |
32 | { |
33 | BOOST_TEST_CHECKPOINT( "Testing 3D extended grid k=" << k ); |
34 | |
35 | // grid size |
36 | size_t sz[3]; |
37 | sz[0] = k; |
38 | sz[1] = k; |
39 | sz[2] = k; |
40 | |
41 | // Ghost |
42 | Ghost<3,float> g(0.01 / factor); |
43 | |
44 | //! [Construct an extended grid] |
45 | |
46 | // Distributed grid with id decomposition |
47 | grid_dist_id<3, float, aggregate<size_t[3],size_t>, CartDecomposition<3,float>> g_dist1(sz,domain,g); |
48 | |
49 | // Extend the grid by 2 points |
50 | Box<3,size_t> ext({2,2,2},{2,2,2}); |
51 | |
52 | // Ghost size of 1 grid point |
53 | Ghost<3,long int> gp(1); |
54 | |
55 | // another grid perfectly overlapping the previous, extended by 2 points |
56 | grid_dist_id<3, float, aggregate<size_t[3],size_t>, CartDecomposition_ext<3,float>> g_dist2(g_dist1,gp,ext); |
57 | |
58 | // Given an iterator of the grid 1 |
59 | auto dom_g1 = g_dist1.getDomainIterator(); |
60 | // And a sub-iterator of grid 2 overlapping grid 1 |
61 | auto dom_g2 = g_dist2.getSubDomainIterator({0,0,0},{k-1,k-1,k-1}); |
62 | |
63 | // the 2 iterator must match |
64 | |
65 | bool check = true; |
66 | |
67 | while (dom_g2.isNext()) |
68 | { |
69 | auto key1 = dom_g1.get(); |
70 | auto key2 = dom_g2.get(); |
71 | |
72 | grid_key_dx<3> g1_k = g_dist1.getGKey(key1); |
73 | grid_key_dx<3> g2_k = g_dist2.getGKey(key2); |
74 | |
75 | check &= (g1_k == g2_k)?true:false; |
76 | |
77 | ++dom_g1; |
78 | ++dom_g2; |
79 | } |
80 | |
81 | BOOST_REQUIRE_EQUAL(check,true); |
82 | |
83 | //! [Construct an extended grid] |
84 | |
85 | bool ret = g_dist2.getDecomposition().check_consistency(); |
86 | BOOST_REQUIRE_EQUAL(ret,true); |
87 | |
88 | // Get domain iterator |
89 | |
90 | grid_sm<3,void> info = g_dist2.getGridInfo(); |
91 | auto dom_g3 = g_dist2.getDomainIterator(); |
92 | |
93 | check = false; |
94 | |
95 | while (dom_g3.isNext()) |
96 | { |
97 | auto key1 = dom_g3.get(); |
98 | |
99 | auto keyg = g_dist2.getGKey(key1); |
100 | |
101 | g_dist2.template get<0>(key1)[0] = keyg.get(0); |
102 | g_dist2.template get<0>(key1)[1] = keyg.get(1); |
103 | g_dist2.template get<0>(key1)[2] = keyg.get(2); |
104 | |
105 | g_dist2.template get<1>(key1) = info.LinId(keyg); |
106 | |
107 | ++dom_g3; |
108 | } |
109 | |
110 | g_dist2.ghost_get<0,1>(); |
111 | |
112 | auto dom_g4 = g_dist2.getSubDomainIterator({-1,-1,-1},{(long int) sz[0]+2-2, (long int) sz[1]+2-2, (long int) sz[2]+2-2}); |
113 | |
114 | check = true; |
115 | |
116 | while (dom_g4.isNext()) |
117 | { |
118 | auto key1 = dom_g4.get(); |
119 | |
120 | key1 = key1.move(0,1); |
121 | key1 = key1.move(1,1); |
122 | key1 = key1.move(2,1); |
123 | |
124 | auto key2 = g_dist2.getGKey(key1); |
125 | |
126 | check &= g_dist2.template get<0>(key1)[0] == (size_t)key2.get(0); |
127 | check &= g_dist2.template get<0>(key1)[1] == (size_t)key2.get(1); |
128 | check &= g_dist2.template get<0>(key1)[2] == (size_t)key2.get(2); |
129 | |
130 | auto key3 = dom_g4.get(); |
131 | |
132 | key3 = key3.move(0,-1); |
133 | key3 = key3.move(1,-1); |
134 | key3 = key3.move(2,-1); |
135 | |
136 | auto key4 = g_dist2.getGKey(key3); |
137 | |
138 | check &= g_dist2.template get<0>(key3)[0] == (size_t)key4.get(0); |
139 | check &= g_dist2.template get<0>(key3)[1] == (size_t)key4.get(1); |
140 | check &= g_dist2.template get<0>(key3)[2] == (size_t)key4.get(2); |
141 | |
142 | ++dom_g4; |
143 | } |
144 | |
145 | BOOST_REQUIRE_EQUAL(check,true); |
146 | } |
147 | } |
148 | |
149 | |