1 #ifndef _RHEO_MPI_SCATTER_END_H
2 #define _RHEO_MPI_SCATTER_END_H
24 # include "rheolef/scatter_message.h"
25 # include "rheolef/msg_left_permutation_apply.h"
27 #include "rheolef/msg_util.h"
28 #include <boost/functional.hpp>
29 #include <boost/iterator/transform_iterator.hpp>
63 typedef typename Message::base_value_type data_type;
64 typedef boost::transform_iterator<select2nd<size_t,mpi::request>, std::list<std::pair<size_t,mpi::request> >::iterator>
70 while (from.requests.size() != 0) {
74 std::pair<mpi::status,request_iterator> pair_status = mpi::wait_any (iter_r_waits, last_r_waits);
76 boost::optional<int> i_msg_size_opt = pair_status.first.count<data_type>();
77 check_macro (i_msg_size_opt,
"receive wait failed");
78 int iproc = pair_status.first.source();
79 check_macro (iproc >= 0,
"receive: source iproc = "<<iproc<<
" < 0 !");
81 size_t i_msg_size = (size_t)i_msg_size_opt.get();
82 std::list<std::pair<size_t,mpi::request> >::iterator i_pair_ptr = pair_status.second.base();
83 size_t i_receive = (*i_pair_ptr).first;
84 check_macro (i_msg_size == from.starts()[i_receive+1] - from.starts()[i_receive],
"unexpected size");
87 from.store_values (y, i_receive, op);
88 from.requests.erase (i_pair_ptr);
95 mpi::wait_all (iter_s_waits, last_s_waits);
99 #endif // _RHEO_MPI_SCATTER_END_H