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.