1#ifndef _RHEOLEF_SCATTER_MESSAGE_ICC
2#define _RHEOLEF_SCATTER_MESSAGE_ICC
27#include "rheolef/compiler.h"
29#ifdef _RHEOLEF_HAVE_MPI
30#include "rheolef/scatter_message.h"
31#include "rheolef/msg_left_permutation_apply.h"
32#include "rheolef/msg_right_permutation_apply.h"
42template<
class Container>
50 _ptr.resize (n_data+1);
54 _ptr [i+1] = _ptr[i] + size_i;
61 _multi_values.resize (n_multi_data);
63 _multi_indices.resize (n_multi_data);
64 typename std::vector<size_type>::const_iterator
p = base::_indices.begin();
65 std::vector<size_type> ip (n_data);
71 std::vector<size_type> yptr (n_data+1);
75 yptr[j+1] = yptr[j] + size_j;
81 _multi_indices [yptr[j]+k] = _ptr[i] + k;
93 std::vector<size_type> msg_size (nproc, 0);
95 for (
size_type iproc = 0; iproc < nproc; iproc++) {
97 last_i = base::_starts[iproc+1]; i < last_i; i++) {
99 msg_size[iproc] += size_i;
101 if (msg_size[iproc] != 0) {
108 _multi_procs.resize (multi_nproc);
109 _multi_starts.resize (multi_nproc+1);
110 _multi_irecv2base_irecv.resize (multi_nproc);
111 _multi_starts [0] = 0;
112 for (
size_type iproc = 0, multi_iproc = 0; iproc < nproc; iproc++) {
113 if (msg_size[iproc] == 0)
continue;
114 _multi_procs [multi_iproc] = base::_procs [iproc];
115 _multi_starts [multi_iproc+1] = _multi_starts [multi_iproc] + msg_size[iproc];
116 _multi_irecv2base_irecv [multi_iproc] = iproc;
124template<
class Container>
125template<
class InputIterator>
136template<
class Container>
137template<
class InputIterator>
141 for (
size_type i = 0, n_data = base::_indices.size(), z = 0; i < n_data; i++) {
143 for (
typename value_type::const_iterator first = x[pi].begin(), last = x[pi].end(); first != last; first++, z++) {
144 _multi_values [z] = *first;
149template<
class Container>
150template<
class OutputIterator,
class SetOp>
155 _values.begin() + _starts[i_recv],
157 _indices.begin() + _starts[i_recv],
158 _indices.begin() + _starts[i_recv+1],
162template<
class Container>
163template<
class OutputIterator,
class SetOp>
167 size_type i_recv = _multi_irecv2base_irecv [i_multi_recv];
168 for (
size_type i = base::_starts[i_recv], n_data = base::_starts[i_recv+1]; i < n_data; i++) {
170 for (
size_type z = _ptr[i], last_z = _ptr[i+1]; z < last_z; z++) {
171 y[pi] += _multi_values [z];
Container::size_type size_type
base::size_type size_type
This file is part of Rheolef.
void msg_left_permutation_apply(InputIterator1 x, SetOp op, InputIterator2 py, InputIterator2 last_py, OutputRandomIterator y)
OutputIterator msg_right_permutation_apply(InputIterator perm, InputIterator last_perm, const InputRandomIterator &x, OutputIterator y, SetOp set_op)