1 #ifndef _RHEO_MPI_ASSEMBLY_END_H
2 #define _RHEO_MPI_ASSEMBLY_END_H
24 #include "rheolef/msg_util.h"
25 #include <boost/functional.hpp>
26 #include <boost/iterator/transform_iterator.hpp>
53 Size receive_max_size,
58 typedef typename Container::data_type data_type;
66 typedef boost::transform_iterator<select2nd<size_type,mpi::request>,
67 typename std::list<std::pair<size_type,mpi::request> >::iterator>
70 #define _RHEOLEF_BUG_FOR_NON_MPI_DATA_TYPE
71 #ifdef _RHEOLEF_BUG_FOR_NON_MPI_DATA_TYPE
72 while (receive.waits.size() != 0) {
76 std::pair<mpi::status,request_iterator> pair_status = mpi::wait_any (iter_r_waits, last_r_waits);
78 boost::optional<int> i_msg_size_opt = pair_status.first.template count<data_type>();
79 check_macro (i_msg_size_opt,
"receive wait failed");
80 int iproc = pair_status.first.source();
81 check_macro (iproc >= 0,
"receive: source iproc = "<<iproc<<
" < 0 !");
84 typename std::list<std::pair<size_type,mpi::request> >::iterator i_pair_ptr = pair_status.second.base();
85 size_type i_receive = (*i_pair_ptr).first;
86 size_type i_start = i_receive*receive_max_size;
87 for (
size_type j = i_start; j < i_start + i_msg_size; j++) {
90 receive.waits.erase (i_pair_ptr);
96 std::vector<mpi::status> recv_status (receive.waits.size());
97 mpi::wait_all (iter_r_waits, last_r_waits, recv_status.begin());
98 for (
size_type i_recv = 0, n_recv = recv_status.size(); i_recv < n_recv; i_recv++) {
99 boost::optional<int> i_msg_size_opt = recv_status[i_recv].template count<data_type>();
100 check_macro (i_msg_size_opt,
"receive wait failed");
101 int iproc = recv_status[i_recv].source();
102 check_macro (iproc >= 0,
"receive: source iproc = "<<iproc<<
" < 0 !");
105 size_type i_start = i_recv*receive_max_size;
106 for (
size_type j = i_start; j < i_start + i_msg_size; j++) {
116 Size send_nproc = send.waits.size();
117 std::vector<mpi::status> send_status(send_nproc);
118 mpi::wait_all (iter_s_waits, last_s_waits, send_status.begin());
124 receive.waits.clear();
125 receive.data.clear();
126 return x.n_new_entry();
field::size_type size_type
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
This file is part of Rheolef.
Size mpi_assembly_end(Message &receive, Message &send, Size receive_max_size, Container x)