69 typedef typename Message::base_value_type data_type;
70 typedef boost::transform_iterator<select2nd<size_t,mpi::request>, std::list<std::pair<size_t,mpi::request> >::iterator>
76 while (from.requests.size() != 0) {
80 std::pair<mpi::status,request_iterator> pair_status = mpi::wait_any (iter_r_waits, last_r_waits);
82 boost::optional<int> i_msg_size_opt = pair_status.first.count<data_type>();
83 check_macro (i_msg_size_opt,
"receive wait failed");
84 int iproc = pair_status.first.source();
85 check_macro (iproc >= 0,
"receive: source iproc = "<<iproc<<
" < 0 !");
87 size_t i_msg_size = (size_t)i_msg_size_opt.get();
88 std::list<std::pair<size_t,mpi::request> >::iterator i_pair_ptr = pair_status.second.base();
89 size_t i_receive = (*i_pair_ptr).first;
90 check_macro (i_msg_size == from.starts()[i_receive+1] - from.starts()[i_receive],
"unexpected size");
93 from.store_values (y, i_receive, op);
94 from.requests.erase (i_pair_ptr);
99 if (to.requests.size() != 0) {
102 mpi::wait_all (iter_s_waits, last_s_waits);
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
void mpi_scatter_end(InputIterator x, OutputIterator y, Message &from, Message &to, SetOp op, Tag tag, Comm comm)