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
10extern void print_test_v(std::string test, size_t sz);
11
12// Test duplicated topology
13
14void 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