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 <vector> 13 #include <algorithm> 14 15 #define BOOST_TEST_MODULE mpi_group_test 16 #include <boost/test/included/unit_test.hpp> 17 18 namespace mpi = boost::mpi; 19 20 template <typename T> 21 struct iota 22 { iotaiota23 iota() : state(0){}; operator ()iota24 T operator()() 25 { 26 return state++; 27 } 28 T state; 29 }; 30 group_test(const mpi::communicator & comm)31void group_test(const mpi::communicator& comm) 32 { 33 std::vector<int> grp_a_ranks(comm.size() / 2); 34 std::generate(grp_a_ranks.begin(),grp_a_ranks.end(),iota<int>()); 35 36 mpi::group grp_a = comm.group().include(grp_a_ranks.begin(),grp_a_ranks.end()); 37 mpi::group grp_b = comm.group().exclude(grp_a_ranks.begin(),grp_a_ranks.end()); 38 39 mpi::communicator part_a(comm,grp_a); 40 mpi::communicator part_b(comm,grp_b); 41 42 if(part_a) 43 { 44 std::cout << "comm rank: " << comm.rank() << " -> part_a rank:" << part_a.rank() << std::endl; 45 BOOST_CHECK(part_a.rank() == comm.rank()); 46 } 47 if(part_b) 48 { 49 std::cout << "comm rank: " << comm.rank() << " -> part_b rank:" << part_b.rank() << std::endl; 50 BOOST_CHECK(part_b.rank() == comm.rank() - comm.size()/2); 51 } 52 } 53 BOOST_AUTO_TEST_CASE(group)54BOOST_AUTO_TEST_CASE(group) 55 { 56 mpi::environment env; 57 mpi::communicator comm; 58 group_test(comm); 59 } 60