diff options
Diffstat (limited to 'src/boost/libs/mpi/test/groups_test.cpp')
-rw-r--r-- | src/boost/libs/mpi/test/groups_test.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/boost/libs/mpi/test/groups_test.cpp b/src/boost/libs/mpi/test/groups_test.cpp new file mode 100644 index 000000000..ce81d182d --- /dev/null +++ b/src/boost/libs/mpi/test/groups_test.cpp @@ -0,0 +1,59 @@ +// Copyright (C) 2013 Andreas Hehn <hehn@phys.ethz.ch>, ETH Zurich + +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +// A test of communicators created from groups. + +#include <boost/mpi/environment.hpp> +#include <boost/mpi/communicator.hpp> +#include <boost/mpi/group.hpp> +#include <vector> +#include <algorithm> + +#define BOOST_TEST_MODULE mpi_group_test +#include <boost/test/included/unit_test.hpp> + +namespace mpi = boost::mpi; + +template <typename T> +struct iota +{ + iota() : state(0){}; + T operator()() + { + return state++; + } + T state; +}; + +void group_test(const mpi::communicator& comm) +{ + std::vector<int> grp_a_ranks(comm.size() / 2); + std::generate(grp_a_ranks.begin(),grp_a_ranks.end(),iota<int>()); + + mpi::group grp_a = comm.group().include(grp_a_ranks.begin(),grp_a_ranks.end()); + mpi::group grp_b = comm.group().exclude(grp_a_ranks.begin(),grp_a_ranks.end()); + + mpi::communicator part_a(comm,grp_a); + mpi::communicator part_b(comm,grp_b); + + if(part_a) + { + std::cout << "comm rank: " << comm.rank() << " -> part_a rank:" << part_a.rank() << std::endl; + BOOST_CHECK(part_a.rank() == comm.rank()); + } + if(part_b) + { + std::cout << "comm rank: " << comm.rank() << " -> part_b rank:" << part_b.rank() << std::endl; + BOOST_CHECK(part_b.rank() == comm.rank() - comm.size()/2); + } +} + +BOOST_AUTO_TEST_CASE(group) +{ + mpi::environment env; + mpi::communicator comm; + group_test(comm); +} |