OpenFPM_pdata  4.1.0
Project that contain the implementation of distributed structures
amr_base_unit_tests.cpp
1 /*
2  * amr_base_unit_test.cpp
3  *
4  * Created on: Oct 5, 2017
5  * Author: i-bird
6  */
7 #define BOOST_TEST_DYN_LINK
8 #include <boost/test/unit_test.hpp>
9 
10 #include "Grid/grid_dist_id.hpp"
11 #include "Point_test.hpp"
12 #include "Grid/tests/grid_dist_id_util_tests.hpp"
13 
14 BOOST_AUTO_TEST_SUITE( amr_grid_dist_id_test )
15 
16 
17 BOOST_AUTO_TEST_CASE( grid_dist_id_amr )
18 {
19  // Domain
20  Box<2,float> domain2({0.0,0.0},{1.0,1.0});
21 
22  size_t sz[2] = {100,100};
23 
24  // Ghost
25  Ghost<2,long int> g(1);
26 
27  // periodicity
28  periodicity<2> pr = {{PERIODIC,PERIODIC}};
29 
31  C_draw.add(Box<2,long int>({20,20},{50,24}));
32  C_draw.add(Box<2,long int>({51,20},{60,24}));
33  C_draw.add(Box<2,long int>({61,20},{70,24}));
34  C_draw.add(Box<2,long int>({20,25},{24,66}));
35  C_draw.add(Box<2,long int>({15,67},{49,85}));
36  C_draw.add(Box<2,long int>({50,76},{70,81}));
37  C_draw.add(Box<2,long int>({30,25},{34,37}));
38  C_draw.add(Box<2,long int>({50,66},{70,70}));
39 
40  size_t volume_key = 0;
41  for (size_t i = 0 ; i < C_draw.size() ; i++)
42  {
43  volume_key += Box<2,long int>(C_draw.get(i)).getVolumeKey();
44  }
45 
46  // Distributed grid with id decomposition
47  grid_dist_id<2,float,Point_test<float>> g_dist(sz,domain2,g,pr,C_draw);
48 
49  // fill with gkey
50 
51  auto git = g_dist.getDomainIterator();
52  grid_sm<2,void> gs(sz);
53 
54  size_t count = 0;
55 
56  while (git.isNext())
57  {
58  auto key = git.get();
59  auto gkey = git.getGKey(key);
60 
61  g_dist.template get<0>(key) = gs.LinId(gkey);
62 
63  count++;
64 
65  ++git;
66  }
67 
68  Vcluster<> & vcl = create_vcluster();
69 
70  vcl.sum(count);
71  vcl.execute();
72 
73  BOOST_REQUIRE_EQUAL(count,volume_key);
74 
75  g_dist.ghost_get<0>();
76 
77  // Check it is correct
78 
79  bool check = true;
80  size_t check_count = 0;
81 
82  auto git2 = g_dist.getDomainGhostIterator();
83  while (git2.isNext())
84  {
85  auto key = git2.get();
86  auto gkey = git2.getGKey(key);
87 
88  float value = g_dist.template get<0>(key);
89 
90  // check if the point is inside or outside the domain
91 
92  for (size_t k = 0; k < C_draw.size() ; k++)
93  {
94  if (Box<2,long int>(C_draw.get(k)).isInside(gkey.toPoint()) == true)
95  {
96  check &= value == gs.LinId(gkey);
97 
98  // get the gdb_ext
99  auto & gdb_ext = g_dist.getLocalGridsInfo();
100 
101  for (size_t s = 0 ; s < gdb_ext.size() ; s++)
102  {
103  Box<2,long int> bx = gdb_ext.get(s).Dbox;
104  bx += gdb_ext.get(s).origin;
105  if (bx.isInside(gkey.toPoint()))
106  {
107  check_count++;
108  break;
109  }
110  }
111  break;
112  }
113  }
114 
115  ++git2;
116  }
117 
118  vcl.sum(check_count);
119  vcl.execute();
120 
121  BOOST_REQUIRE_EQUAL(check,true);
122  BOOST_REQUIRE(check_count >= volume_key);
123 }
124 
125 BOOST_AUTO_TEST_CASE( amr_grid_dist_id_iterator_test_use_2D)
126 {
127  // Domain
128  Box<2,float> domain({0.0,0.0},{1.0,1.0});
129 
130 #ifdef TEST_COVERAGE_MODE
131  long int k = 256*256*create_vcluster().getProcessingUnits();
132 #else
133  long int k = 1024*1024*create_vcluster().getProcessingUnits();
134 #endif
135  k = std::pow(k, 1/2.);
136 
137  long int big_step = k / 30;
138  big_step = (big_step == 0)?1:big_step;
139  long int small_step = 21;
140 
141  print_test( "AMR Testing 2D full grid k<=",k);
142 
143  // 2D test
144  for ( ; k >= 2 ; k-= (k > 2*big_step)?big_step:small_step )
145  {
146  BOOST_TEST_CHECKPOINT( "AMR Testing 2D full grid k=" << k );
147 
149 
150  // grid size
151  size_t sz[2];
152  sz[0] = k;
153  sz[1] = k;
154 
155  // periodicity
156  periodicity<2> pr = {{PERIODIC,PERIODIC}};
157 
158  // Ghost
159  Ghost<2,long int> g(1);
160 
162  bx_def.add(Box<2,long int>({0,0},{k-1,k-1}));
163 
164  // Distributed grid with id decomposition
165  grid_dist_id<2, float, aggregate<double>> g_dist(sz,domain,g,pr,bx_def);
166 
167  Test2D_core(g_dist,sz,k);
168  }
169 }
170 
171 BOOST_AUTO_TEST_SUITE_END()
__host__ __device__ bool isInside(const Point< dim, T > &p) const
Check if the point is inside the box.
Definition: Box.hpp:1004
size_t size()
Stub size.
Definition: map_vector.hpp:211
Definition: Ghost.hpp:39
Implementation of VCluster class.
Definition: VCluster.hpp:58
void execute()
Execute all the requests.
This is a distributed grid.
This class represent an N-dimensional box.
Definition: Box.hpp:60
void sum(T &num)
Sum the numbers across all processors and get the result.
Declaration grid_sm.
Definition: grid_sm.hpp:147
Implementation of 1-D std::vector like structure.
Definition: map_vector.hpp:202
Boundary conditions.
Definition: common.hpp:21