8 #ifndef SRC_DECOMPOSITION_DISTRIBUTION_DISTRIBUTION_UNIT_TESTS_HPP_
9 #define SRC_DECOMPOSITION_DISTRIBUTION_DISTRIBUTION_UNIT_TESTS_HPP_
12 #include "SpaceDistribution.hpp"
25 template<
unsigned int dim,
typename Distribution>
void setSphereComputationCosts(Distribution & dist,
grid_sm<dim, void> & gr,
Point<3, float> center,
float radius,
size_t max_l,
size_t min_l)
27 float radius2 = radius * radius;
33 for (
size_t i = 0; i < dist.getNSubSubDomains(); i++)
35 dist.getSubSubDomainPosition(i, pos);
38 for (
size_t j = 0; j < dim; j++)
39 eq += (pos[j] - center.
get(j)) * (pos[j] - center.
get(j));
43 dist.setComputationCost(i, max_l);
44 dist.setMigrationCost(i, max_l * 2);
48 dist.setComputationCost(i, min_l);
49 dist.setMigrationCost(i, min_l * 2);
53 for (
size_t j = 0; j < dist.getNSubSubDomainNeighbors(i); j++)
54 dist.setCommunicationCost(i, j, 1);
58 BOOST_AUTO_TEST_SUITE (Distribution_test)
60 BOOST_AUTO_TEST_CASE( Metis_distribution_test)
72 size_t sz[3] = { GS_SIZE, GS_SIZE, GS_SIZE };
85 met_dist.createCartGraph(info,box);
88 BOOST_REQUIRE_EQUAL(met_dist.get_ndec(),1ul);
92 BOOST_REQUIRE(met_dist.getUnbalance() < 0.03);
95 {met_dist.write(
"vtk_metis_distribution");}
97 size_t b = GS_SIZE * GS_SIZE * GS_SIZE / 5;
106 for (
size_t k = 0; k < met_dist.getNOwnerSubSubDomains(); k++)
108 size_t i = met_dist.getOwnerSubSubDomain(k);
110 if (i == 0 || i == b || i == 2*b || i == 3*b || i == 4*b)
111 met_dist.setComputationCost(i,10);
113 met_dist.setComputationCost(i,1);
116 for (
size_t i = 0 ; i < met_dist.getNSubSubDomains() ; i++)
120 met_dist.setMigrationCost(i,1);
122 for (
size_t j = 0; j < met_dist.getNSubSubDomainNeighbors(i); j++)
123 met_dist.setCommunicationCost(i,j,1);
126 met_dist.decompose();
128 BOOST_REQUIRE_EQUAL(met_dist.get_ndec(),2ul);
132 BOOST_REQUIRE(met_dist.getUnbalance() < 0.06);
135 {met_dist.write(
"vtk_metis_distribution_red");}
145 test = compare(
"0_vtk_metis_distribution.vtk",
"src/Decomposition/Distribution/test_data/vtk_metis_distribution_osx_test.vtk");
146 BOOST_REQUIRE_EQUAL(
true,test);
147 test = compare(
"0_vtk_metis_distribution_red.vtk",
"src/Decomposition/Distribution/test_data/vtk_metis_distribution_red_osx_test.vtk");
148 BOOST_REQUIRE_EQUAL(
true,test);
150 #elif __GNUC__ == 6 && __GNUC_MINOR__ == 3
152 test = compare(
"0_vtk_metis_distribution.vtk",
"src/Decomposition/Distribution/test_data/vtk_metis_distribution_test.vtk");
153 BOOST_REQUIRE_EQUAL(
true,test);
154 test = compare(
"0_vtk_metis_distribution_red.vtk",
"src/Decomposition/Distribution/test_data/vtk_metis_distribution_red_test.vtk");
155 BOOST_REQUIRE_EQUAL(
true,test);
164 met_dist2 = met_dist;
166 test = (met_dist2 == met_dist);
168 BOOST_REQUIRE_EQUAL(test,
true);
181 BOOST_AUTO_TEST_CASE( Parmetis_distribution_test)
183 Vcluster & v_cl = create_vcluster();
199 pmet_dist.createCartGraph(info,box);
206 setSphereComputationCosts(pmet_dist, info, center, 2.0f, 5ul, 1ul);
209 pmet_dist.decompose();
211 BOOST_REQUIRE_EQUAL(pmet_dist.get_ndec(),1ul);
218 pmet_dist.write(
"vtk_parmetis_distribution_0");
222 bool test = compare(std::to_string(v_cl.
getProcessUnitID()) +
"_vtk_parmetis_distribution_0.vtk",
"src/Decomposition/Distribution/test_data/" + std::to_string(v_cl.
getProcessUnitID()) +
"_vtk_parmetis_distribution_0_osx_test.vtk");
223 BOOST_REQUIRE_EQUAL(
true,test);
227 bool test = compare(std::to_string(v_cl.
getProcessUnitID()) +
"_vtk_parmetis_distribution_0.vtk",
"src/Decomposition/Distribution/test_data/" + std::to_string(v_cl.
getProcessUnitID()) +
"_vtk_parmetis_distribution_0_test.vtk");
228 BOOST_REQUIRE_EQUAL(
true,test);
235 float stime = 0.0, etime = 10.0, tstep = 0.1;
243 for(
float t = stime; t < etime; t = t + tstep, iter++)
250 setSphereComputationCosts(pmet_dist, info, center, 2.0f, 5, 1);
253 if ((
size_t)iter % 10 == 0)
257 BOOST_REQUIRE_EQUAL(pmet_dist.get_ndec(),n_dec);
261 std::stringstream str;
262 str <<
"vtk_parmetis_distribution_" << iter;
263 pmet_dist.write(str.str());
268 bool test = compare(std::to_string(v_cl.
getProcessUnitID()) +
"_" + str.str() +
".vtk",
"src/Decomposition/Distribution/test_data/" + std::to_string(v_cl.
getProcessUnitID()) +
"_" + str.str() +
"_osx_test.vtk");
269 BOOST_REQUIRE_EQUAL(
true,test);
274 bool test = compare(std::to_string(v_cl.
getProcessUnitID()) +
"_" + str.str() +
".vtk",
"src/Decomposition/Distribution/test_data/" + std::to_string(v_cl.
getProcessUnitID()) +
"_" + str.str() +
"_test.vtk");
275 BOOST_REQUIRE_EQUAL(
true,test);
287 BOOST_AUTO_TEST_CASE( DistParmetis_distribution_test)
289 Vcluster & v_cl = create_vcluster();
305 pmet_dist.createCartGraph(info,box);
312 setSphereComputationCosts(pmet_dist, info, center, 2.0f, 5ul, 1ul);
315 pmet_dist.decompose();
320 pmet_dist.write(
"vtk_dist_parmetis_distribution_0");
328 bool test = compare(
"vtk_dist_parmetis_distribution_0.vtk",
"src/Decomposition/Distribution/test_data/vtk_dist_parmetis_distribution_0_osx_test.vtk");
329 BOOST_REQUIRE_EQUAL(
true,test);
333 bool test = compare(
"vtk_dist_parmetis_distribution_0.vtk",
"src/Decomposition/Distribution/test_data/vtk_dist_parmetis_distribution_0_test.vtk");
334 BOOST_REQUIRE_EQUAL(
true,test);
342 float stime = 0.0, etime = 10.0, tstep = 0.1;
349 for(
float t = stime; t < etime; t = t + tstep, iter++)
356 setSphereComputationCosts(pmet_dist, info, center, 2.0f, 5, 1);
359 if ((
size_t)iter % 10 == 0)
363 std::stringstream str;
364 str <<
"vtk_dist_parmetis_distribution_" << iter;
365 pmet_dist.write(str.str());
371 bool test = compare(str.str() +
".vtk",std::string(
"src/Decomposition/Distribution/test_data/") + str.str() +
"_osx_test.vtk");
372 BOOST_REQUIRE_EQUAL(
true,test);
376 bool test = compare(str.str() +
".vtk",std::string(
"src/Decomposition/Distribution/test_data/") + str.str() +
"_test.vtk");
377 BOOST_REQUIRE_EQUAL(
true,test);
388 BOOST_AUTO_TEST_CASE( Space_distribution_test)
390 Vcluster & v_cl = create_vcluster();
406 space_dist.createCartGraph(info,box);
409 space_dist.decompose();
416 space_dist.write(
"vtk_dist_space_distribution_0");
418 bool test = compare(std::to_string(v_cl.
getProcessUnitID()) +
"_vtk_dist_space_distribution_0.vtk",
"src/Decomposition/Distribution/test_data/" + std::to_string(v_cl.
getProcessUnitID()) + +
"_vtk_dist_space_distribution_0_test.vtk");
419 BOOST_REQUIRE_EQUAL(
true,test);
426 BOOST_AUTO_TEST_SUITE_END()
size_t getProcessUnitID()
Get the process unit id.
Class that distribute sub-sub-domains across processors using an hilbert curve to divide the space...
This class implement the point shape in an N-dimensional space.
Implementation of VCluster class.
Class that distribute sub-sub-domains across processors using ParMetis Library.
const T & get(size_t i) const
Get coordinate.
Class that distribute sub-sub-domains across processors using Metis Library.
size_t getProcessingUnits()
Get the total number of processors.