diff --git a/example/Makefile b/example/Makefile index 63062d5be263b695c74fa60c6542aeed2fbeda88..7cdcff373a948a09d8e9b3d9b06502ba47432dce 100644 --- a/example/Makefile +++ b/example/Makefile @@ -1,11 +1,15 @@ SUBDIRS := $(wildcard */.) -all clean: +all: $(SUBDIRS) + +clean: for dir in $(SUBDIRS); do \ - $(MAKE) -C $$dir $@; \ + $(MAKE) -C $$dir clean; \ done -clean: $(SUBDIRS) +$(SUBDIRS): + $(MAKE) -C $@ + -.PHONY: all clean $(SUBDIRS) +.PHONY: all clean $(SUBDIRS) diff --git a/example/Numerics/Agent_sim/Makefile b/example/Numerics/Agent_sim/Makefile deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/example/Numerics/Agent_sim/Makefile.nop b/example/Numerics/Agent_sim/Makefile.nop deleted file mode 100644 index 1638aae67fd2cccf352bef2205c34b0a8f622f33..0000000000000000000000000000000000000000 --- a/example/Numerics/Agent_sim/Makefile.nop +++ /dev/null @@ -1,21 +0,0 @@ -include ../../../example.mk - -CC=mpic++ - -LDIR = - -OBJ = main.o - -%.o: %.cpp - $(CC) -O3 -g -c --std=c++11 -o $@ $< $(INCLUDE_PATH) -I/home/i-bird/HDF5/include - -agsim: $(OBJ) - $(CC) -o $@ $^ $(CFLAGS) $(LIBS_PATH) $(LIBS) - -all: agsim - -.PHONY: clean all - -clean: - rm -f *.o *~ core agsim - diff --git a/example/Numerics/Agent_sim/main.cpp b/example/Numerics/Agent_sim/main.cpp deleted file mode 100644 index 4ef26a6d9cbfeb5a1dce00b2ac2e3bc9ff536808..0000000000000000000000000000000000000000 --- a/example/Numerics/Agent_sim/main.cpp +++ /dev/null @@ -1,365 +0,0 @@ -/* - * ### WIKI 1 ### - * - * ## Simple example - * - * In this example show an agent based simulation - * - * ### WIKI END ### - * - */ - -#include "Vector/vector_dist.hpp" -#include "Decomposition/CartDecomposition.hpp" -#include "PSE/Kernels.hpp" -#include "Plot/util.hpp" -#include "Plot/GoogleChart.hpp" -#include "data_type/aggregate.hpp" -#include <cmath> - -struct animal -{ - typedef boost::fusion::vector<float[2], size_t, size_t, long int> type; - - //! Attributes name - struct attributes - { - static const std::string name[]; - }; - - //! type of the positional field - typedef float s_type; - - //! The data - type data; - - //! position property id in boost::fusion::vector - static const unsigned int pos = 0; - //! genre of animal property id in boost::fusion::vector - static const unsigned int genre = 1; - //! state property id in boost::fusion::vector - static const unsigned int status = 2; - //! alive time property id in boost::fusion::vector - static const unsigned int time_a = 3; - - //! total number of properties boost::fusion::vector - static const unsigned int max_prop = 4; - - animal() - { - } - - inline animal(const animal & p) - { - boost::fusion::at_c<0>(data)[0] = boost::fusion::at_c<0>(p.data)[0]; - boost::fusion::at_c<0>(data)[1] = boost::fusion::at_c<0>(p.data)[1]; - //boost::fusion::at_c<0>(data)[2] = boost::fusion::at_c<0>(p.data)[2]; - boost::fusion::at_c<1>(data) = boost::fusion::at_c<1>(p.data); - boost::fusion::at_c<2>(data) = boost::fusion::at_c<2>(p.data); - boost::fusion::at_c<3>(data) = boost::fusion::at_c<3>(p.data); - } - - template<unsigned int id> inline auto get() -> decltype(boost::fusion::at_c < id > (data)) - { - return boost::fusion::at_c<id>(data); - } - - template<unsigned int id> inline auto get() const -> const decltype(boost::fusion::at_c < id > (data)) - { - return boost::fusion::at_c<id>(data); - } - - template<unsigned int dim, typename Mem> inline animal(const encapc<dim, animal, Mem> & p) - { - this->operator=(p); - } - - template<unsigned int dim, typename Mem> inline animal & operator=(const encapc<dim, animal, Mem> & p) - { - boost::fusion::at_c<0>(data)[0] = p.template get<0>()[0]; - boost::fusion::at_c<0>(data)[1] = p.template get<0>()[1]; - //boost::fusion::at_c<0>(data)[2] = p.template get<0>()[2]; - boost::fusion::at_c<1>(data) = p.template get<1>(); - boost::fusion::at_c<2>(data) = p.template get<2>(); - boost::fusion::at_c<3>(data) = p.template get<3>(); - - return *this; - } - - static bool noPointers() - { - return true; - } -}; - -const std::string animal::attributes::name[] = { "pos", "genre", "status", "time_a", "j_repr" }; - -int main(int argc, char* argv[]) -{ - init_global_v_cluster(&argc,&argv); - - Vcluster & v_cl = *global_v_cluster; - - //time the animal stays alive without eating - size_t PRED_TIME_A = 14; - - size_t PREY_TIME_A = 7; - - size_t PREDATOR = 1, PREY = 0; - size_t ALIVE = 1, DEAD = 0; - - // Predators reproducing probability - float PRED_REPR = 0.2; - - // Predators eating probability - float PRED_EAT = 0.6; - - // Prey reproducing probability - float PREY_REPR = 0.5; - - // set the seed - // create the random generator engine - std::srand(v_cl.getProcessUnitID()); - unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); - std::default_random_engine eg(seed); - std::uniform_real_distribution<float> ud(0.0f, 1.0f); - std::uniform_real_distribution<float> md(-1.0f, 1.0f); - std::uniform_real_distribution<float> uc(0.0f, 0.7f); - std::uniform_real_distribution<float> lc(0.3f, 1.0f); - - size_t k = 100000; - - Box<2, float> box( { 0.0, 0.0 }, { 1.0, 1.0 }); - - // Grid info - grid_sm<2, void> info( { 8, 8 }); - - // Boundary conditions - size_t bc[2] = { PERIODIC, PERIODIC }; - - // factor - float factor = pow(global_v_cluster->getProcessingUnits() / 2.0f, 1.0f / 3.0f); - - // interaction radius - float r_cut = 0.01 / factor; - - // ghost - Ghost<2, float> ghost(r_cut); - - // Distributed vector - vector_dist<2, float, animal, CartDecomposition<2, float, HeapMemory, ParMetisDistribution<2, float>>> vd(k,box,bc,ghost); - - // Init DLB tool - DLB dlb(v_cl); - - // Set unbalance threshold - dlb.setHeurisitc(DLB::Heuristic::UNBALANCE_THRLD); - dlb.setThresholdLevel(DLB::ThresholdLevel::THRLD_MEDIUM); - - auto it = vd.getIterator(); - - while (it.isNext()) - { - auto key = it.get(); - if(ud(eg) < 0.7 ) - { - vd.template getPos<animal::pos>(key)[0] = lc(eg); - vd.template getPos<animal::pos>(key)[1] = lc(eg); - vd.template getProp<animal::genre>(key) = PREY; - vd.template getProp<animal::status>(key) = ALIVE; - vd.template getProp<animal::time_a>(key) = PREY_TIME_A; - } - else - { - vd.template getPos<animal::pos>(key)[0] = uc(eg); - vd.template getPos<animal::pos>(key)[1] = uc(eg); - vd.template getProp<animal::genre>(key) = PREDATOR; - vd.template getProp<animal::status>(key) = ALIVE; - vd.template getProp<animal::time_a>(key) = PRED_TIME_A; - } - ++it; - } - - vd.map(); - - vd.addComputationCosts(); - - vd.getDecomposition().rebalance(dlb); - - vd.map(); - - //vd.getDecomposition().getDistribution().write("parmetis_prey_predators_" + std::to_string(0) + ".vtk"); - //vd.write("particles_", 0, NO_GHOST); - - // 100 step random walk - for (size_t j = 0; j < 100; j++) - { - size_t prey = 0, predators = 0; - - auto it = vd.getDomainIterator(); - - while (it.isNext()) - { - auto key = it.get(); - - vd.template getPos<animal::pos>(key)[0] += 0.01 * md(eg); - vd.template getPos<animal::pos>(key)[1] += 0.01 * md(eg); - - if(vd.template getProp<animal::genre>(key) == PREY) - prey++; - else - predators++; - - ++it; - } - - vd.map(); - - - /////// Interactions /// - // get ghosts - - vd.ghost_get<0>(); - - // vector of dead animals - openfpm::vector<size_t> deads; - openfpm::vector<vect_dist_key_dx> reps_prey; - openfpm::vector<vect_dist_key_dx> reps_pred; - - // get the cell list with a cutoff radius - - bool error = false; - - auto NN = vd.getCellList(0.01/factor); - - // iterate across the domain particle - - auto it2 = vd.getDomainIterator(); - - while (it2.isNext()) - { - auto p = it2.get(); - - Point<2,float> xp = vd.getPos<0>(p); - - size_t gp = vd.getProp<animal::genre>(p); - size_t sp = vd.getProp<animal::status>(p); - - if(sp == ALIVE) - { - if(gp == PREY) - { - if( prey < k/1.5 && ud(eg) < PREY_REPR ) - reps_prey.add(p); - - vd.getProp<animal::time_a>(p)--; - - if(vd.getProp<animal::time_a>(p) <= 0) - { - vd.getProp<animal::status>(p) = DEAD; - prey--; - } - } - else if(gp == PREDATOR) - { - vd.getProp<animal::time_a>(p)--; - - if(vd.getProp<animal::time_a>(p) <= 0) - { - vd.getProp<animal::status>(p) = DEAD; - } - else - { - auto Np = NN.getIterator(NN.getCell(xp)); - - while (Np.isNext()) - { - auto q = Np.get(); - - size_t gq = vd.getProp<animal::genre>(q); - size_t sq = vd.getProp<animal::status>(q); - - Point<2,float> xq = vd.getPos<0>(q); - Point<2,float> f = (xp - xq); - - float distance = f.norm(); - - if (distance < 2*r_cut*sqrt(2) && gq == PREY && sq == ALIVE) - { - if( ud(eg) < PRED_EAT ) - { - vd.getProp<animal::status>(q) = DEAD; - vd.getProp<animal::time_a>(p) = PRED_TIME_A; - - if( ud(eg) < PRED_REPR ) - reps_pred.add(p); - } - } - ++Np; - } - } - } - - } - - ++it2; - } - - vd.deleteGhost(); - - // Replicate - - for (size_t i = 0 ; i < reps_prey.size() ; i++) - { - vd.add(); - vd.getLastPos<animal::pos>()[0] = vd.getPos<0>(reps_prey.get(i))[0]; - vd.getLastPos<animal::pos>()[1] = vd.getPos<0>(reps_prey.get(i))[1]; - vd.getLastProp<animal::genre>() = PREY; - vd.getLastProp<animal::status>() = ALIVE; - vd.getLastProp<animal::time_a>() = PREY_TIME_A; - } - - for (size_t i = 0 ; i < reps_pred.size() ; i++) - { - vd.add(); - vd.getLastPos<animal::pos>()[0] = vd.getPos<0>(reps_pred.get(i))[0]; - vd.getLastPos<animal::pos>()[1] = vd.getPos<0>(reps_pred.get(i))[1]; - vd.getLastProp<animal::genre>() = PREDATOR; - vd.getLastProp<animal::status>() = ALIVE; - vd.getLastProp<animal::time_a>() = PRED_TIME_A; - } - - auto it3 = vd.getDomainIterator(); - while (it3.isNext()) - { - auto key = it3.get(); - if(vd.getProp<animal::status>(key.getKey()) == DEAD) - { - deads.add(key.getKey()); - } - ++it3; - } - - deads.sort(); - vd.remove(deads, 0); - - deads.resize(0); - - vd.deleteGhost(); - - //////////////////////// - - vd.addComputationCosts(); - - vd.getDecomposition().rebalance(dlb); - - vd.map(); - } - - // - // ### WIKI 10 ### - // - // Deinitialize the library - // - delete_global_v_cluster(); -} diff --git a/src/Vector/vector_dist_cl_hilb_performance_tests.hpp b/src/Vector/vector_dist_cl_hilb_performance_tests.hpp new file mode 100644 index 0000000000000000000000000000000000000000..7b0c77bde064932719ba6a80f287d9cc90a93d11 --- /dev/null +++ b/src/Vector/vector_dist_cl_hilb_performance_tests.hpp @@ -0,0 +1,68 @@ +/* + * vector_dist_cl_hilb_performance_tests.hpp + * + * Created on: May 24, 2016 + * Author: Yaroslav Zaluzhnyi + */ + +#ifndef SRC_VECTOR_VECTOR_DIST_CL_HILB_PERFORMANCE_TESTS_HPP_ +#define SRC_VECTOR_VECTOR_DIST_CL_HILB_PERFORMANCE_TESTS_HPP_ + +#include "Vector/vector_dist.hpp" +#include "data_type/aggregate.hpp" +#include "Plot/GoogleChart.hpp" +#include "vector_dist_performance_util.hpp" + +BOOST_AUTO_TEST_SUITE( vector_dist_celllist_hilb_performance_test ) + +///////////////////// INPUT DATA ////////////////////// + +// Cut-off radiuses. Can be put different number of values +openfpm::vector<float> r_cutoff {0.01, 0.02, 0.03}; +// The starting amount of particles (remember that this number is multiplied by number of processors you use for testing) +size_t k_start = 100000; +// The lower threshold for number of particles +size_t k_min = 15000; +// Ghost part of distributed vector +double ghost_part = 0.03; + +/////////////////////////////////////////////////////// + +// Numbers of particles vector +openfpm::vector<size_t> n_particles; +// Vectors to store the data for 2D +openfpm::vector<openfpm::vector<double>> time_rand; +openfpm::vector<openfpm::vector<double>> time_hilb; +openfpm::vector<openfpm::vector<double>> time_total_rand; +openfpm::vector<openfpm::vector<double>> time_total_hilb; +// Vectors to store the data for 3D +openfpm::vector<openfpm::vector<double>> time_rand_2; +openfpm::vector<openfpm::vector<double>> time_hilb_2; +openfpm::vector<openfpm::vector<double>> time_total_rand_2; +openfpm::vector<openfpm::vector<double>> time_total_hilb_2; + + +BOOST_AUTO_TEST_CASE( vector_dist_celllist_random_test ) +{ + //Benchmark test for 2D and 3D + vd_celllist_random_benchmark<2>(k_start,k_min,ghost_part,r_cutoff,n_particles,time_rand,time_total_rand); + vd_celllist_random_benchmark<3>(k_start,k_min,ghost_part,r_cutoff,n_particles,time_rand_2,time_total_rand_2); +} + +BOOST_AUTO_TEST_CASE( vector_dist_celllist_hilbert_test ) +{ + //Benchmark test for 2D and 3D + vd_celllist_hilbert_benchmark<2>(k_start,k_min,ghost_part,r_cutoff,n_particles,time_hilb,time_total_hilb); + vd_celllist_hilbert_benchmark<3>(k_start,k_min,ghost_part,r_cutoff,n_particles,time_hilb_2,time_total_hilb_2); +} + +BOOST_AUTO_TEST_CASE(vector_dist_cl_performance_write_report) +{ + //Write report for 2D and 3D + vd_celllist_performance_write_report<2>(r_cutoff,n_particles,time_hilb,time_rand,time_total_hilb,time_total_rand); + vd_celllist_performance_write_report<3>(r_cutoff,n_particles,time_hilb_2,time_rand_2,time_total_hilb_2,time_total_rand_2); +} + +BOOST_AUTO_TEST_SUITE_END() + +#endif /* SRC_VECTOR_VECTOR_DIST_CL_HILB_PERFORMANCE_TESTS_HPP_ */ diff --git a/src/Vector/vector_dist_cl_performance_tests.hpp b/src/Vector/vector_dist_cl_performance_tests.hpp new file mode 100644 index 0000000000000000000000000000000000000000..a9f590d730a6f122777a9b134ec6a4af8502f51a --- /dev/null +++ b/src/Vector/vector_dist_cl_performance_tests.hpp @@ -0,0 +1,78 @@ +/* + * vector_dist_cl_performance_tests.hpp + * + * + * Created on: Mar 22, 2016 + * Author: Yaroslav Zaluzhnyi + */ + +#ifndef SRC_VECTOR_VECTOR_DIST_CL_PERFORMANCE_TESTS_HPP_ +#define SRC_VECTOR_VECTOR_DIST_CL_PERFORMANCE_TESTS_HPP_ + +#include "Vector/vector_dist.hpp" +#include "data_type/aggregate.hpp" +#include "Vector/vector_dist_unit_test.hpp" +#include "Plot/GoogleChart.hpp" +#include <functional> + +BOOST_AUTO_TEST_SUITE( vector_dist_cl_perf_test ) + +///////////////////// INPUT DATA ////////////////////// + +// Cut-off radiuses. Can be put different number of values +openfpm::vector<float> r_cutoff {0.007,0.02}; +// Orders of a curve. Can be put different number of values +openfpm::vector<size_t> orders = {1,2,3,5,7}; +// Number of steps of moving the particles +size_t n_moving = 8; +// Moving distance (step size) +double dist = 0.1; +// The starting amount of particles (remember that this number is multiplied by number of processors you use for testing) +size_t k_start = 100000; +// The minimal amount of particles +size_t k_min = 15000; +// Ghost part of distributed vector +double ghost_part = 0.01; + +/////////////////////////////////////////////////////// + +// Numbers of particles vector +openfpm::vector<size_t> n_particles; +// Vectors to store the data for 2D +openfpm::vector<openfpm::vector<double>> time_rand; +openfpm::vector<openfpm::vector<openfpm::vector<double>>> time_hilb; +openfpm::vector<openfpm::vector<double>> time_total_rand; +openfpm::vector<openfpm::vector<openfpm::vector<double>>> time_total_hilb; +openfpm::vector<openfpm::vector<openfpm::vector<openfpm::vector<double>>>> time_hilb_moved; +// Vectors to store the data for 3D +openfpm::vector<openfpm::vector<double>> time_rand_2; +openfpm::vector<openfpm::vector<openfpm::vector<double>>> time_hilb_2; +openfpm::vector<openfpm::vector<double>> time_total_rand_2; +openfpm::vector<openfpm::vector<openfpm::vector<double>>> time_total_hilb_2; +openfpm::vector<openfpm::vector<openfpm::vector<openfpm::vector<double>>>> time_hilb_moved_2; + + +BOOST_AUTO_TEST_CASE( vector_dist_cl_random_test ) +{ + //Benchmark test for 2D and 3D + vd_cl_random_benchmark<2>(k_start,k_min,ghost_part,r_cutoff,n_particles,time_rand,time_total_rand); + vd_cl_random_benchmark<3>(k_start,k_min,ghost_part,r_cutoff,n_particles,time_rand_2,time_total_rand_2); +} + +BOOST_AUTO_TEST_CASE( vector_dist_cl_hilbert_test ) +{ + //Benchmark test for 2D and 3D + vd_cl_hilbert_benchmark<2>(k_start,k_min,ghost_part,n_moving,dist,r_cutoff,n_particles,orders,time_hilb,time_total_hilb,time_hilb_moved); + vd_cl_hilbert_benchmark<3>(k_start,k_min,ghost_part,n_moving,dist,r_cutoff,n_particles,orders,time_hilb_2,time_total_hilb_2,time_hilb_moved_2); +} + +BOOST_AUTO_TEST_CASE(vector_dist_cl_performance_write_report) +{ + //Write report for 2D and 3D + vd_cl_performance_write_report<2>(n_moving,r_cutoff,n_particles,orders,time_hilb,time_rand,time_total_hilb,time_total_rand,time_hilb_moved); + vd_cl_performance_write_report<3>(n_moving,r_cutoff,n_particles,orders,time_hilb_2,time_rand_2,time_total_hilb_2,time_total_rand_2,time_hilb_moved_2); +} + +BOOST_AUTO_TEST_SUITE_END() + +#endif /* SRC_VECTOR_VECTOR_DIST_CL_PERFORMANCE_TESTS_HPP_ */ diff --git a/src/Vector/vector_dist_verlet_performance_tests.hpp b/src/Vector/vector_dist_verlet_performance_tests.hpp new file mode 100644 index 0000000000000000000000000000000000000000..ab23cf9b827c6171e0d4afd51eae9749f03496b5 --- /dev/null +++ b/src/Vector/vector_dist_verlet_performance_tests.hpp @@ -0,0 +1,71 @@ +/* + * vector_dist_verlet_performance_tests.hpp + * + * Created on: Mar 9, 2016 + * Author: Yaroslav Zaluzhnyi + */ + +#ifndef SRC_VECTOR_VECTOR_DIST_VERLET_PERFORMANCE_TESTS_HPP_ +#define SRC_VECTOR_VECTOR_DIST_VERLET_PERFORMANCE_TESTS_HPP_ + +#include "Vector/vector_dist.hpp" +#include "data_type/aggregate.hpp" +#include "Plot/GoogleChart.hpp" +#include "vector_dist_performance_util.hpp" + + +BOOST_AUTO_TEST_SUITE( vector_dist_verlet_perf_test ) + +///////////////////// INPUT DATA ////////////////////// + +// Cut-off radiuses. Can be put different number of values +openfpm::vector<float> r_cutoff {0.007,0.02}; +// Orders of a curve. Can be put different number of values +openfpm::vector<size_t> orders = {1,2,3,5,7}; +// The starting amount of particles (remember that this number is multiplied by number of processors you use for testing) +size_t k_start = 100000; +// The minimal amount of particles +size_t k_min = 15000; +// Ghost part of distributed vector +double ghost_part = 0.01; + +/////////////////////////////////////////////////////// + +// Numbers of particles vector +openfpm::vector<size_t> n_particles; +// Vectors to store the data for 2D +openfpm::vector<openfpm::vector<double>> time_rand; +openfpm::vector<openfpm::vector<openfpm::vector<double>>> time_hilb; +openfpm::vector<openfpm::vector<double>> time_total_rand; +openfpm::vector<openfpm::vector<openfpm::vector<double>>> time_total_hilb; +// Vectors to store the data for 3D +openfpm::vector<openfpm::vector<double>> time_rand_2; +openfpm::vector<openfpm::vector<openfpm::vector<double>>> time_hilb_2; +openfpm::vector<openfpm::vector<double>> time_total_rand_2; +openfpm::vector<openfpm::vector<openfpm::vector<double>>> time_total_hilb_2; + + +BOOST_AUTO_TEST_CASE( vector_dist_verlet_random_test ) +{ + //Benchmark test for 2D and 3D + vd_verlet_random_benchmark<2>(k_start,k_min,ghost_part,r_cutoff,n_particles,time_rand,time_total_rand); + vd_verlet_random_benchmark<3>(k_start,k_min,ghost_part,r_cutoff,n_particles,time_rand_2,time_total_rand_2); +} + +BOOST_AUTO_TEST_CASE( vector_dist_verlet_hilbert_test ) +{ + //Benchmark test for 2D and 3D + vd_verlet_hilbert_benchmark<2>(k_start,k_min,ghost_part,r_cutoff,n_particles,orders,time_hilb,time_total_hilb); + vd_verlet_hilbert_benchmark<3>(k_start,k_min,ghost_part,r_cutoff,n_particles,orders,time_hilb_2,time_total_hilb_2); +} + +BOOST_AUTO_TEST_CASE(vector_dist_verlet_performance_write_report) +{ + //Write report for 2D and 3D + vd_verlet_performance_write_report<2>(r_cutoff,n_particles,orders,time_hilb,time_rand,time_total_hilb,time_total_rand); + vd_verlet_performance_write_report<3>(r_cutoff,n_particles,orders,time_hilb_2,time_rand_2,time_total_hilb_2,time_total_rand_2); +} + +BOOST_AUTO_TEST_SUITE_END() + +#endif /* SRC_VECTOR_VECTOR_DIST_VERLET_PERFORMANCE_TESTS_HPP_ */