1 #ifndef _RHEO_MPI_ASSEMBLY_BEGIN_H
2 #define _RHEO_MPI_ASSEMBLY_BEGIN_H
60 InputIterator first_stash_idx,
61 InputIterator last_stash_idx,
69 mpi::communicator comm = ownership.
comm();
80 std::vector<size_type> msg_size(nproc, 0);
81 std::vector<size_type> msg_mark(nproc, 0);
86 for (InputIterator iter_idx = first_stash_idx; iter_idx != last_stash_idx; iter_idx++, i++) {
87 for (; iproc < nproc; iproc++) {
88 if (*iter_idx >= ownership[iproc] && *iter_idx < ownership[iproc+1]) {
90 if (!msg_mark[iproc]) {
97 assert_macro (iproc != nproc,
"bad stash data: index "<<*iter_idx<<
" out of range [0:"<<ownership[nproc]<<
"[");
103 if (msg_size [my_proc] != 0) {
104 msg_size [my_proc] = 0;
105 msg_mark [my_proc] = 0;
112 std::vector<size_type> work (nproc);
115 msg_mark.begin().operator->(),
117 work.begin().operator->(),
118 std::plus<size_type>());
119 size_type receive_nproc = work [my_proc];
126 msg_size.begin().operator->(),
128 work.begin().operator->(),
129 mpi::maximum<size_type>());
130 size_type receive_max_size = work [my_proc];
142 receive.data.resize (receive_nproc*receive_max_size);
143 for (
size_t i_receive = 0; i_receive < receive_nproc; i_receive++) {
144 mpi::request i_req = comm.irecv (
147 receive.data.begin().operator->() + i_receive*receive_max_size,
149 receive.waits.push_back (std::make_pair(i_receive, i_req));
157 send.data.resize (stash.size());
158 copy (stash.begin(), stash.end(), send.data.begin());
165 send.waits.resize(send_nproc);
169 for (
size_type iproc = 0; iproc < nproc; iproc++) {
171 if (i_msg_size == 0)
continue;
172 mpi::request i_req = comm.isend (
175 send.data.begin().operator->() + i_start,
177 send.waits.push_back(std::make_pair(i_send,i_req));
179 i_start += i_msg_size;
182 return receive_max_size;
186 #endif //_RHEO_MPI_ASSEMBLY_BEGIN_H