1 // Copyright (C) 2007 Trustees of Indiana University
2
3 // Authors: Douglas Gregor
4 // Andrew Lumsdaine
5
6 // Use, modification and distribution is subject to the Boost Software
7 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 #include <boost/mpi/intercommunicator.hpp>
10 #include <boost/mpi/environment.hpp>
11 #include <boost/mpi/group.hpp>
12
13 namespace boost { namespace mpi {
14
intercommunicator(const communicator & local,int local_leader,const communicator & peer,int remote_leader)15 intercommunicator::intercommunicator(const communicator& local,
16 int local_leader,
17 const communicator& peer,
18 int remote_leader)
19 {
20 MPI_Comm comm;
21 BOOST_MPI_CHECK_RESULT(MPI_Intercomm_create,
22 ((MPI_Comm)local, local_leader,
23 (MPI_Comm)peer, remote_leader,
24 environment::collectives_tag(), &comm));
25 comm_ptr.reset(new MPI_Comm(comm), comm_free());
26 }
27
local_group() const28 boost::mpi::group intercommunicator::local_group() const
29 {
30 return this->group();
31 }
32
remote_size() const33 int intercommunicator::remote_size() const
34 {
35 int size;
36 BOOST_MPI_CHECK_RESULT(MPI_Comm_remote_size, ((MPI_Comm)*this, &size));
37 return size;
38 }
39
remote_group() const40 boost::mpi::group intercommunicator::remote_group() const
41 {
42 MPI_Group gr;
43 BOOST_MPI_CHECK_RESULT(MPI_Comm_remote_group, ((MPI_Comm)*this, &gr));
44 return boost::mpi::group(gr, /*adopt=*/true);
45 }
46
merge(bool high) const47 communicator intercommunicator::merge(bool high) const
48 {
49 MPI_Comm comm;
50 BOOST_MPI_CHECK_RESULT(MPI_Intercomm_merge, ((MPI_Comm)*this, high, &comm));
51 return communicator(comm, comm_take_ownership);
52 }
53
54 } } // end namespace boost::mpi
55