00001
00002
00003 namespace GMPI {
00004
00005 template <class Comm_ref_t>
00006 void Comm::Send (const Comm_ref_t& data, int dest, int tag) const {
00007 typedef typename Comm_ref_t::base_t base_t;
00008 buffer_t<base_t> buffer;
00009 buffer << data.object_ref();
00010
00011
00012 my_comm.Send (buffer.address(), buffer.size(), buffer.mpi_t, dest, tag);
00013 }
00014
00015 template <class Comm_ref_t>
00016 void Comm::Recv (Comm_ref_t& data, int source, int tag, MPI::Status& status) const {
00017 typedef typename Comm_ref_t::base_t base_t;
00018
00019
00020
00021 my_comm.Probe (source, tag, status);
00022 buffer_t<base_t> buffer;
00023 size_t bsize= status.Get_count (buffer.mpi_t);
00024 buffer.reserve (bsize);
00025
00026
00027 my_comm.Recv (buffer.address(), bsize, buffer.mpi_t, source, tag, status);
00028 }
00029
00030 template <class Comm_ref_t>
00031 void Intracomm::Bcast (Comm_ref_t& data, int root) const {
00032 typedef typename Comm_ref_t::base_t base_t;
00033 buffer_t<base_t> buffer;
00034 size_t bsize;
00035 if (Get_rank () == root) {
00036 buffer << data.object_ref(); bsize= buffer.size(); }
00037 my_comm.Bcast (&bsize, 1, mpi_size_t, root);
00038 if (Get_rank () != root)
00039 buffer.reserve (bsize);
00040 my_comm.Bcast (buffer.address(), bsize, buffer.mpi_t, root);
00041 if (Get_rank () != root)
00042 buffer >> data.object_ref();
00043 }
00044
00045 }