1 // Copyright (C) 2013 Andreas Hehn <hehn@phys.ethz.ch>, ETH Zurich
2
3 // Use, modification and distribution is subject to the Boost Software
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6
7 // A test of communicators created from groups.
8
9 #include <boost/mpi/environment.hpp>
10 #include <boost/mpi/communicator.hpp>
11 #include <boost/mpi/group.hpp>
12 #include <boost/test/minimal.hpp>
13 #include <vector>
14 #include <algorithm>
15
16 namespace mpi = boost::mpi;
17
18
19 template <typename T>
20 struct iota
21 {
iotaiota22 iota() : state(0){};
operator ()iota23 T operator()()
24 {
25 return state++;
26 }
27 T state;
28 };
29
group_test(const mpi::communicator & comm)30 void group_test(const mpi::communicator& comm)
31 {
32 std::vector<int> grp_a_ranks(comm.size() / 2);
33 std::generate(grp_a_ranks.begin(),grp_a_ranks.end(),iota<int>());
34
35 mpi::group grp_a = comm.group().include(grp_a_ranks.begin(),grp_a_ranks.end());
36 mpi::group grp_b = comm.group().exclude(grp_a_ranks.begin(),grp_a_ranks.end());
37
38 mpi::communicator part_a(comm,grp_a);
39 mpi::communicator part_b(comm,grp_b);
40
41 if(part_a)
42 {
43 std::cout << "comm rank: " << comm.rank() << " -> part_a rank:" << part_a.rank() << std::endl;
44 BOOST_CHECK(part_a.rank() == comm.rank());
45 }
46 if(part_b)
47 {
48 std::cout << "comm rank: " << comm.rank() << " -> part_b rank:" << part_b.rank() << std::endl;
49 BOOST_CHECK(part_b.rank() == comm.rank() - comm.size()/2);
50 }
51 }
52
test_main(int argc,char * argv[])53 int test_main(int argc, char* argv[])
54 {
55 mpi::environment env(argc,argv);
56 mpi::communicator comm;
57 group_test(comm);
58 return 0;
59 }
60