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