8 #ifndef SRC_VECTOR_VECTOR_DIST_VERLET_PERFORMANCE_TESTS_HPP_ 
    9 #define SRC_VECTOR_VECTOR_DIST_VERLET_PERFORMANCE_TESTS_HPP_ 
   17 void print_test_v(std::string test, 
size_t sz)
 
   19     if (create_vcluster().getProcessUnitID() == 0)
 
   20         std::cout << test << 
" " << sz << 
"\n";
 
   23 BOOST_AUTO_TEST_SUITE( verletlist_part_reorder_performance_test )
 
   28 openfpm::vector<
float> r_cutoff {0.004, 0.007, 0.01};
 
   31 size_t k_start = 100000;
 
   55 template<
unsigned int dim> 
void vd_verlet_random_benchmark(
size_t k_start,
 
   64     time_force_mean.resize(r_cutoff.
size());
 
   65     time_create_mean.resize(r_cutoff.
size());
 
   66     time_force_dev.resize(r_cutoff.
size());
 
   67     time_create_dev.resize(r_cutoff.
size());
 
   69     std::string str(
"Testing " + std::to_string(dim) + 
"D vector no-order, Verlet-list");
 
   74         for (
size_t r = 0; r < r_cutoff.
size(); r++ )
 
   79             float r_cut = r_cutoff.get(r);
 
   85             size_t k_count = 1 + log2(k/k_min);
 
   87             for (
size_t k_int = k ; k_int >= k_min ; k_int/=2 )
 
   89                 BOOST_TEST_CHECKPOINT( 
"Testing " << dim << 
"D vector without an Hilbert curve reordering k=" << k_int );
 
   91                 if (n_particles.
size() < k_count)
 
   92                     n_particles.add(k_int);
 
   96                 for (
size_t i = 0; i < dim; i++)
 
  104                 for (
size_t i = 0; i < dim; i++)
 
  110                 vd_initialize<dim>(vd, v_cl, k_int);
 
  112                 vd.template ghost_get<0>();
 
  117                 double sum_verlet_mean = 0;
 
  118                 double sum_verlet_dev = 0;
 
  119                 for (
size_t n = 0 ; n < N_STAT_TEST; n++)
 
  120                     measures.add(benchmark_get_verlet(vd,r_cut));
 
  121                 standard_deviation(measures,sum_verlet_mean,sum_verlet_dev);
 
  124                 time_create_mean.get(r).add(sum_verlet_mean);
 
  125                 time_create_dev.get(r).add(sum_verlet_dev);
 
  129                 auto NN = vd.getCellList(r_cut);
 
  130                 double sum_fr_mean = 0;
 
  131                 double sum_fr_dev = 0;
 
  134                 for (
size_t l = 0 ; l < N_STAT_TEST ; l++)
 
  135                     measures.add(benchmark_calc_forces<dim>(NN,vd,r_cut));
 
  136                 standard_deviation(measures,sum_fr_mean,sum_fr_dev);
 
  137                 time_force_mean.get(r).add(sum_fr_mean);
 
  138                 time_force_dev.get(r).add(sum_fr_dev);
 
  140                 if (v_cl.getProcessUnitID() == 0)
 
  141                     std::cout << 
"Particles: " << k_int << 
"," << 
"cut-off: " << r_cut << 
" time to construct a Verlet list = " << sum_verlet_mean << 
" dev: " << sum_verlet_dev << 
"    calculate force = " << sum_fr_mean << 
" dev: " << sum_fr_dev << std::endl;
 
  152     time_hilb.resize(r_cutoff.
size());
 
  153     for (
size_t r = 0; r < time_hilb.size(); r++)
 
  155         time_hilb.get(r).resize(n_particles.
size());
 
  156         for (
size_t k = 0; k < time_hilb.get(r).size(); k++)
 
  158             time_hilb.get(r).get(k).resize(orders.
size());
 
  162     time_total_hilb.resize(r_cutoff.
size());
 
  163     for (
size_t r = 0; r < time_total_hilb.size(); r++)
 
  165         time_total_hilb.get(r).resize(n_particles.
size());
 
  166         for (
size_t k = 0; k < time_total_hilb.get(r).size(); k++)
 
  168             time_total_hilb.get(r).get(k).resize(orders.
size());
 
  172     std::string str(
"Testing " + std::to_string(dim) + 
"D vector, Hilbert curve reordering, Verlet-list");
 
  176     for (
size_t r = 0; r < r_cutoff.
size(); r++ )
 
  178         Vcluster & v_cl = create_vcluster();
 
  181         float r_cut = r_cutoff.get(r);
 
  187         for ( 
size_t i = 0; i < orders.
size(); i++)
 
  189             size_t m = orders.get(i);
 
  192             for (
size_t k_int = k ; k_int >= k_min ; k_int/=2, part++ )
 
  194                 BOOST_TEST_CHECKPOINT( 
"Testing " << dim << 
"D vector with an Hilbert curve reordering k=" << k_int );
 
  198                 for (
size_t i = 0; i < dim; i++)
 
  207                 for (
size_t i = 0; i < dim; i++)
 
  213                 vd_initialize<dim>(vd, v_cl, k_int);
 
  215                 vd.template ghost_get<0>();
 
  219                 double sum_reorder = 0;
 
  220                 for (
size_t h = 0 ; h < N_VERLET_TEST; h++)
 
  221                     sum_reorder += benchmark_reorder(vd,m);
 
  222                 sum_reorder /= N_VERLET_TEST;
 
  226                 double sum_verlet = 0;
 
  228                 for (
size_t n = 0 ; n < N_VERLET_TEST; n++)
 
  229                     sum_verlet += benchmark_get_verlet(vd,r_cut);
 
  230                 sum_verlet /= N_VERLET_TEST;
 
  232                 time_total_hilb.get(r).get(part).get(i) = sum_verlet;
 
  236                 auto NN = vd.getCellList(r_cut);
 
  237                 double sum_forces = 0;
 
  239                 for (
size_t l = 0 ; l < N_VERLET_TEST; l++)
 
  240                     sum_forces += benchmark_calc_forces<dim>(NN,vd,r_cut);
 
  241                 sum_forces /= N_VERLET_TEST;
 
  242                 time_hilb.get(r).get(part).get(i) = sum_forces;
 
  244                 if (v_cl.getProcessUnitID() == 0)
 
  245                     std::cout << 
"Order = " << m << 
", Cut-off = " << r_cut << 
", Particles = " << k_int << 
". Time to reorder: " << sum_reorder << 
" time to get the verlet-list: " << sum_verlet << 
" time to calculate forces: " << sum_forces << std::endl;
 
  255 template<
unsigned int dim> 
void vd_verlet_performance_write_report(
GoogleChart & cg,
 
  264     std::string file_mean(test_dir);
 
  265     std::string file_var(test_dir);
 
  266     file_mean += std::string(
"/openfpm_pdata/verlet_comp_force_mean_" + std::to_string(dim) + std::string(
"_ref"));
 
  267     file_var += std::string(
"/openfpm_pdata/verlet_comp_force_dev_" + std::to_string(dim) + std::string(
"_ref"));
 
  269     std::string file_mean_save = std::string(
"verlet_comp_force_mean_" + std::to_string(dim) + std::to_string(
"_ref"));
 
  270     std::string file_var_save = std::string(
"verlet_comp_force_dev_" + std::to_string(dim) + std::to_string(
"_ref"));
 
  280     yp_mean.resize(time_force_mean.
size());
 
  281     yp_dev.resize(time_force_dev.
size());
 
  282     for (
size_t i = 0 ; i < yp_mean.
size() ; i++)
 
  284         yp_mean.get(i).resize(time_force_mean.get(i).
size());
 
  285         yp_dev.get(i).resize(time_force_dev.get(i).
size());
 
  287         for (
size_t j = 0 ; j < yp_mean.get(i).
size() ; j++)
 
  289             yp_mean.get(i).get(j).resize(1);
 
  290             yp_dev.get(i).get(j).resize(1);
 
  292             yp_mean.get(i).get(j).get(0) = time_force_mean.get(i).get(j);
 
  293             yp_dev.get(i).get(j).get(0) = time_force_dev.get(i).get(j);
 
  297     names.add(
"Force verlet");
 
  299     for (
size_t i = 0 ; i < r_cutoff.
size() ; i++)
 
  300         gnames.add(
"Verlet-list performance, cut-off radius: " + std::to_string(r_cutoff.get(i)));
 
  302     std::string y_string = std::string(
"Time to calculate forces (s)");
 
  303     std::string x_string = std::string(
"Number of particles");
 
  305     std::string str(
"<h1>Verlet-list " + std::to_string(dim) + 
"-D performance test force calculation: </h1>");
 
  308     StandardPerformanceGraph(file_mean,
 
  325     std::string file_mean(test_dir);
 
  326     std::string file_var(test_dir);
 
  327     file_mean += std::string(
"/openfpm_pdata/verlet_comp_create_mean_" + std::to_string(dim) + std::string(
"_ref"));
 
  328     file_var += std::string(
"/openfpm_pdata/verlet_comp_create_dev_" + std::to_string(dim) + std::string(
"_ref"));
 
  330     std::string file_mean_save = std::string(
"verlet_comp_create_mean_" + std::to_string(dim) + std::to_string(
"_ref"));
 
  331     std::string file_var_save = std::string(
"verlet_comp_create_dev_" + std::to_string(dim) + std::to_string(
"_ref"));
 
  341     yp_mean.resize(time_create_mean.
size());
 
  342     yp_dev.resize(time_create_dev.
size());
 
  343     for (
size_t i = 0 ; i < yp_mean.
size() ; i++)
 
  345         yp_mean.get(i).resize(time_create_mean.get(i).
size());
 
  346         yp_dev.get(i).resize(time_create_dev.get(i).
size());
 
  348         for (
size_t j = 0 ; j < yp_mean.get(i).
size() ; j++)
 
  350             yp_mean.get(i).get(j).resize(1);
 
  351             yp_dev.get(i).get(j).resize(1);
 
  353             yp_mean.get(i).get(j).get(0) = time_create_mean.get(i).get(j);
 
  354             yp_dev.get(i).get(j).get(0) = time_create_dev.get(i).get(j);
 
  358     names.add(
"Create verlet");
 
  360     for (
size_t i = 0 ; i < r_cutoff.
size() ; i++)
 
  361         gnames.add(
"Verlet-list performance, cut-off radius: " + std::to_string(r_cutoff.get(i)));
 
  363     std::string y_string = std::string(
"Time to construct a verlet-list (s)");
 
  364     std::string x_string = std::string(
"Number of particles");
 
  366     std::string str(
"<h1>Verlet-list " + std::to_string(dim) + 
"-D performance test force calculation: </h1>");
 
  369     StandardPerformanceGraph(file_mean,
 
  385 BOOST_AUTO_TEST_CASE( vector_dist_verlet_test )
 
  388     vd_verlet_random_benchmark<3>(k_start,k_min,r_cutoff,n_particles,time_force_mean,time_create_mean,time_force_dev,time_create_dev);
 
  389     vd_verlet_random_benchmark<2>(k_start,k_min,r_cutoff,n_particles,time_force_mean_2,time_create_mean_2,time_force_dev_2,time_create_dev_2);
 
  392 BOOST_AUTO_TEST_CASE(vector_dist_verlet_performance_write_report)
 
  397     vd_verlet_performance_write_report<3>(cg,r_cutoff,n_particles,time_force_mean,time_force_dev,time_create_mean,time_create_dev);
 
  398     vd_verlet_performance_write_report<2>(cg,r_cutoff,n_particles,time_force_mean_2,time_force_dev_2,time_create_mean_2,time_create_dev_2);
 
  400     if (create_vcluster().getProcessUnitID() == 0)
 
  404         cg.write(
"Verletlist_comp.html");
 
  408 BOOST_AUTO_TEST_SUITE_END()
 
void addHTML(const std::string &html)
Add HTML text. 
 
void setHigh(int i, T val)
set the high interval of the box 
 
Implementation of VCluster class. 
 
Small class to produce graph with Google chart in HTML. 
 
This class decompose a space into sub-sub-domains and distribute them across processors. 
 
void setLow(int i, T val)
set the low interval of the box 
 
This class represent an N-dimensional box. 
 
size_t getProcessingUnits()
Get the total number of processors.