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"
42 template<
class Container>
44 scatter_message<Container,true>::multi_init ()
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;
124 template<
class Container>
125 template<
class InputIterator>
127 scatter_message<Container,false>::load_values (InputIterator x)
136 template<
class Container>
137 template<
class InputIterator>
139 scatter_message<Container,true>::load_values (InputIterator x)
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;
149 template<
class Container>
150 template<
class OutputIterator,
class SetOp>
152 scatter_message<Container,false>::store_values (OutputIterator y,
size_type i_recv, SetOp op)
const
155 _values.begin() + _starts[i_recv],
157 _indices.begin() + _starts[i_recv],
158 _indices.begin() + _starts[i_recv+1],
162 template<
class Container>
163 template<
class OutputIterator,
class SetOp>
165 scatter_message<Container,true>::store_values (OutputIterator y,
size_type i_multi_recv, SetOp op)
const
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];
field::size_type size_type
This file is part of Rheolef.
OutputIterator msg_right_permutation_apply(InputIterator perm, InputIterator last_perm, const InputRandomIterator &x, OutputIterator y, SetOp set_op)
void msg_left_permutation_apply(InputIterator1 x, SetOp op, InputIterator2 py, InputIterator2 last_py, OutputRandomIterator y)