| 1 | /* |
| 2 | * vector_dist_complex_prp_unit_test.hpp |
| 3 | * |
| 4 | * Created on: Sep 18, 2016 |
| 5 | * Author: i-bird |
| 6 | */ |
| 7 | #define BOOST_TEST_DYN_LINK |
| 8 | #include <boost/test/unit_test.hpp> |
| 9 | |
| 10 | #include "Vector/vector_dist.hpp" |
| 11 | #include "Vector/performance/vector_dist_performance_util.hpp" |
| 12 | #include "vector_dist_util_unit_tests.hpp" |
| 13 | |
| 14 | extern void print_test_v(std::string test, size_t sz); |
| 15 | extern long int decrement(long int k, long int step); |
| 16 | |
| 17 | BOOST_AUTO_TEST_CASE( vector_dist_periodic_complex_prp_test_use_3d ) |
| 18 | { |
| 19 | Vcluster<> & v_cl = create_vcluster(); |
| 20 | |
| 21 | if (v_cl.getProcessingUnits() > 48) |
| 22 | return; |
| 23 | |
| 24 | // set the seed |
| 25 | // create the random generator engine |
| 26 | std::srand(v_cl.getProcessUnitID()); |
| 27 | std::default_random_engine eg; |
| 28 | std::uniform_real_distribution<float> ud(0.0f, 1.0f); |
| 29 | |
| 30 | #ifdef TEST_COVERAGE_MODE |
| 31 | long int k = 24288 * v_cl.getProcessingUnits(); |
| 32 | #else |
| 33 | long int k = 124288 * v_cl.getProcessingUnits(); |
| 34 | #endif |
| 35 | |
| 36 | long int big_step = k / 4; |
| 37 | big_step = (big_step == 0)?1:big_step; |
| 38 | |
| 39 | print_test_v( "Testing 3D vector full complex prp vector k<=" ,k); |
| 40 | |
| 41 | // 3D test |
| 42 | for ( ; k >= 2 ; k-= decrement(k,big_step) ) |
| 43 | { |
| 44 | BOOST_TEST_CHECKPOINT( "Testing 3D full complex prp vector k=" << k ); |
| 45 | |
| 46 | Box<3,float> box({0.0,0.0,0.0},{1.0,1.0,1.0}); |
| 47 | |
| 48 | // Boundary conditions |
| 49 | size_t bc[3]={NON_PERIODIC,NON_PERIODIC,NON_PERIODIC}; |
| 50 | |
| 51 | // factor |
| 52 | float factor = pow(create_vcluster().getProcessingUnits()/2.0f,1.0f/3.0f); |
| 53 | |
| 54 | // ghost |
| 55 | Ghost<3,float> ghost(0.05 / factor); |
| 56 | |
| 57 | // ghost2 (a little bigger because of round off error) |
| 58 | Ghost<3,float> ghost2(0.05001 / factor); |
| 59 | |
| 60 | // Distributed vector |
| 61 | vector_dist<3,float, aggregate<openfpm::vector<float>,grid_cpu<3,aggregate<double,double[3]>> > > vd(k,box,bc,ghost); |
| 62 | |
| 63 | auto it = vd.getIterator(); |
| 64 | |
| 65 | while (it.isNext()) |
| 66 | { |
| 67 | auto key = it.get(); |
| 68 | |
| 69 | vd.getPos(key)[0] = ud(eg); |
| 70 | vd.getPos(key)[1] = ud(eg); |
| 71 | vd.getPos(key)[2] = ud(eg); |
| 72 | |
| 73 | // initalize vector property and grid |
| 74 | |
| 75 | vd.getProp<0>(key).add(vd.getPos(key)[0]); |
| 76 | vd.getProp<0>(key).add(vd.getPos(key)[1]); |
| 77 | vd.getProp<0>(key).add(vd.getPos(key)[2]); |
| 78 | |
| 79 | vd.getProp<0>(key).add(vd.getPos(key)[0]+vd.getPos(key)[1]); |
| 80 | vd.getProp<0>(key).add(vd.getPos(key)[1]+vd.getPos(key)[2]); |
| 81 | vd.getProp<0>(key).add(vd.getPos(key)[0]+vd.getPos(key)[2]); |
| 82 | |
| 83 | // Grid |
| 84 | size_t sz[] = {3,3,3}; |
| 85 | vd.getProp<1>(key).resize(sz); |
| 86 | |
| 87 | vd.getProp<1>(key).get<0>({0,0,0}) = vd.getPos(key)[0]; |
| 88 | vd.getProp<1>(key).get<0>({0,0,1}) = vd.getPos(key)[1]; |
| 89 | vd.getProp<1>(key).get<0>({0,0,2}) = vd.getPos(key)[2]; |
| 90 | |
| 91 | vd.getProp<1>(key).get<0>({0,1,0}) = 2.0*vd.getPos(key)[0]; |
| 92 | vd.getProp<1>(key).get<0>({0,1,1}) = 2.0*vd.getPos(key)[1]; |
| 93 | vd.getProp<1>(key).get<0>({0,1,2}) = 2.0*vd.getPos(key)[2]; |
| 94 | |
| 95 | vd.getProp<1>(key).get<0>({0,2,0}) = 3.0*vd.getPos(key)[0]; |
| 96 | vd.getProp<1>(key).get<0>({0,2,1}) = 3.0*vd.getPos(key)[1]; |
| 97 | vd.getProp<1>(key).get<0>({0,2,2}) = 3.0*vd.getPos(key)[2]; |
| 98 | |
| 99 | vd.getProp<1>(key).get<0>({1,0,0}) = 4.0*vd.getPos(key)[0]; |
| 100 | vd.getProp<1>(key).get<0>({1,0,1}) = 4.0*vd.getPos(key)[1]; |
| 101 | vd.getProp<1>(key).get<0>({1,0,2}) = 4.0*vd.getPos(key)[2]; |
| 102 | |
| 103 | vd.getProp<1>(key).get<0>({1,1,0}) = 5.0*vd.getPos(key)[0]; |
| 104 | vd.getProp<1>(key).get<0>({1,1,1}) = 5.0*vd.getPos(key)[1]; |
| 105 | vd.getProp<1>(key).get<0>({1,1,2}) = 5.0*vd.getPos(key)[2]; |
| 106 | |
| 107 | vd.getProp<1>(key).get<0>({1,2,0}) = 6.0*vd.getPos(key)[0]; |
| 108 | vd.getProp<1>(key).get<0>({1,2,1}) = 6.0*vd.getPos(key)[1]; |
| 109 | vd.getProp<1>(key).get<0>({1,2,2}) = 6.0*vd.getPos(key)[2]; |
| 110 | |
| 111 | vd.getProp<1>(key).get<0>({2,0,0}) = 7.0*vd.getPos(key)[0]; |
| 112 | vd.getProp<1>(key).get<0>({2,0,1}) = 7.0*vd.getPos(key)[1]; |
| 113 | vd.getProp<1>(key).get<0>({2,0,2}) = 7.0*vd.getPos(key)[2]; |
| 114 | |
| 115 | vd.getProp<1>(key).get<0>({2,1,0}) = 8.0*vd.getPos(key)[0]; |
| 116 | vd.getProp<1>(key).get<0>({2,1,1}) = 8.0*vd.getPos(key)[1]; |
| 117 | vd.getProp<1>(key).get<0>({2,1,2}) = 8.0*vd.getPos(key)[2]; |
| 118 | |
| 119 | vd.getProp<1>(key).get<0>({2,2,0}) = 9.0*vd.getPos(key)[0]; |
| 120 | vd.getProp<1>(key).get<0>({2,2,1}) = 9.0*vd.getPos(key)[1]; |
| 121 | vd.getProp<1>(key).get<0>({2,2,2}) = 9.0*vd.getPos(key)[2]; |
| 122 | |
| 123 | ++it; |
| 124 | } |
| 125 | |
| 126 | vd.map(); |
| 127 | |
| 128 | // sync the ghost |
| 129 | vd.ghost_get<0,1>(); |
| 130 | |
| 131 | // Domain + ghost |
| 132 | Box<3,float> dom_ext = box; |
| 133 | dom_ext.enlarge(ghost2); |
| 134 | |
| 135 | // Iterate on all particles domain + ghost |
| 136 | size_t l_cnt = 0; |
| 137 | size_t nl_cnt = 0; |
| 138 | size_t n_out = 0; |
| 139 | |
| 140 | auto it2 = vd.getIterator(); |
| 141 | count_local_n_local<3,vector_dist<3,float, aggregate<openfpm::vector<float>,grid_cpu<3,aggregate<double,double[3]>>>> >(vd,it2,bc,box,dom_ext,l_cnt,nl_cnt,n_out); |
| 142 | |
| 143 | // No particles should be out of domain + ghost |
| 144 | BOOST_REQUIRE_EQUAL(n_out,0ul); |
| 145 | |
| 146 | // Ghost must populated because we synchronized them |
| 147 | if (k > 524288) |
| 148 | { |
| 149 | BOOST_REQUIRE(nl_cnt != 0); |
| 150 | BOOST_REQUIRE(l_cnt > nl_cnt); |
| 151 | } |
| 152 | |
| 153 | // Sum all the particles inside the domain |
| 154 | v_cl.sum(l_cnt); |
| 155 | v_cl.execute(); |
| 156 | BOOST_REQUIRE_EQUAL(l_cnt,(size_t)k); |
| 157 | |
| 158 | l_cnt = 0; |
| 159 | nl_cnt = 0; |
| 160 | |
| 161 | // Iterate only on the ghost particles |
| 162 | auto itg = vd.getGhostIterator(); |
| 163 | count_local_n_local<3, vector_dist<3,float, aggregate<openfpm::vector<float>,grid_cpu<3,aggregate<double,double[3]>>>> >(vd,itg,bc,box,dom_ext,l_cnt,nl_cnt,n_out); |
| 164 | |
| 165 | // No particle on the ghost must be inside the domain |
| 166 | BOOST_REQUIRE_EQUAL(l_cnt,0ul); |
| 167 | |
| 168 | // Ghost must be populated |
| 169 | if (k > 524288) |
| 170 | { |
| 171 | BOOST_REQUIRE(nl_cnt != 0); |
| 172 | } |
| 173 | |
| 174 | // check that the particles contain the correct information |
| 175 | |
| 176 | bool ret = true; |
| 177 | auto it3 = vd.getDomainAndGhostIterator(); |
| 178 | |
| 179 | while (it3.isNext()) |
| 180 | { |
| 181 | auto key = it3.get(); |
| 182 | |
| 183 | ret &= vd.getProp<0>(key).size() == 6; |
| 184 | |
| 185 | ret &= vd.getProp<0>(key).get(0) == vd.getPos(key)[0]; |
| 186 | ret &= vd.getProp<0>(key).get(1) == vd.getPos(key)[1]; |
| 187 | ret &= vd.getProp<0>(key).get(2) == vd.getPos(key)[2]; |
| 188 | |
| 189 | ret &= vd.getProp<0>(key).get(3) == vd.getPos(key)[0]+vd.getPos(key)[1]; |
| 190 | ret &= vd.getProp<0>(key).get(4) == vd.getPos(key)[1]+vd.getPos(key)[2]; |
| 191 | ret &= vd.getProp<0>(key).get(5) == vd.getPos(key)[0]+vd.getPos(key)[2]; |
| 192 | |
| 193 | // BOOST_REQUIRE_EQUAL(vd.getProp<0>(key).get(0),vd.getPos(key)[0]); |
| 194 | |
| 195 | ret &= vd.getProp<1>(key).size() == 3*3*3; |
| 196 | ret &= vd.getProp<1>(key).get<0>({0,0,0}) == vd.getPos(key)[0]; |
| 197 | ret &= vd.getProp<1>(key).get<0>({0,0,1}) == vd.getPos(key)[1]; |
| 198 | ret &= vd.getProp<1>(key).get<0>({0,0,2}) == vd.getPos(key)[2]; |
| 199 | |
| 200 | ret &= vd.getProp<1>(key).get<0>({0,1,0}) == 2.0*vd.getPos(key)[0]; |
| 201 | ret &= vd.getProp<1>(key).get<0>({0,1,1}) == 2.0*vd.getPos(key)[1]; |
| 202 | ret &= vd.getProp<1>(key).get<0>({0,1,2}) == 2.0*vd.getPos(key)[2]; |
| 203 | |
| 204 | ret &= vd.getProp<1>(key).get<0>({0,2,0}) == 3.0*vd.getPos(key)[0]; |
| 205 | ret &= vd.getProp<1>(key).get<0>({0,2,1}) == 3.0*vd.getPos(key)[1]; |
| 206 | ret &= vd.getProp<1>(key).get<0>({0,2,2}) == 3.0*vd.getPos(key)[2]; |
| 207 | |
| 208 | ret &= vd.getProp<1>(key).get<0>({1,0,0}) == 4.0*vd.getPos(key)[0]; |
| 209 | ret &= vd.getProp<1>(key).get<0>({1,0,1}) == 4.0*vd.getPos(key)[1]; |
| 210 | ret &= vd.getProp<1>(key).get<0>({1,0,2}) == 4.0*vd.getPos(key)[2]; |
| 211 | |
| 212 | ret &= vd.getProp<1>(key).get<0>({1,1,0}) == 5.0*vd.getPos(key)[0]; |
| 213 | ret &= vd.getProp<1>(key).get<0>({1,1,1}) == 5.0*vd.getPos(key)[1]; |
| 214 | ret &= vd.getProp<1>(key).get<0>({1,1,2}) == 5.0*vd.getPos(key)[2]; |
| 215 | |
| 216 | ret &= vd.getProp<1>(key).get<0>({1,2,0}) == 6.0*vd.getPos(key)[0]; |
| 217 | ret &= vd.getProp<1>(key).get<0>({1,2,1}) == 6.0*vd.getPos(key)[1]; |
| 218 | ret &= vd.getProp<1>(key).get<0>({1,2,2}) == 6.0*vd.getPos(key)[2]; |
| 219 | |
| 220 | ret &= vd.getProp<1>(key).get<0>({2,0,0}) == 7.0*vd.getPos(key)[0]; |
| 221 | ret &= vd.getProp<1>(key).get<0>({2,0,1}) == 7.0*vd.getPos(key)[1]; |
| 222 | ret &= vd.getProp<1>(key).get<0>({2,0,2}) == 7.0*vd.getPos(key)[2]; |
| 223 | |
| 224 | ret &= vd.getProp<1>(key).get<0>({2,1,0}) == 8.0*vd.getPos(key)[0]; |
| 225 | ret &= vd.getProp<1>(key).get<0>({2,1,1}) == 8.0*vd.getPos(key)[1]; |
| 226 | ret &= vd.getProp<1>(key).get<0>({2,1,2}) == 8.0*vd.getPos(key)[2]; |
| 227 | |
| 228 | ret &= vd.getProp<1>(key).get<0>({2,2,0}) == 9.0*vd.getPos(key)[0]; |
| 229 | ret &= vd.getProp<1>(key).get<0>({2,2,1}) == 9.0*vd.getPos(key)[1]; |
| 230 | ret &= vd.getProp<1>(key).get<0>({2,2,2}) == 9.0*vd.getPos(key)[2]; |
| 231 | |
| 232 | ++it3; |
| 233 | } |
| 234 | |
| 235 | BOOST_REQUIRE_EQUAL(ret,true); |
| 236 | } |
| 237 | } |
| 238 | |
| 239 | |
| 240 | |