21#include "rheolef/config.h"
22#ifdef _RHEOLEF_HAVE_MPI
24#include "rheolef/hack_array.h"
31template<
class T,
class A>
41template<
class T,
class A>
51template <
class T,
class A>
66template <
class T,
class A>
79 typename generic_value_type::const_iterator iter = val._data_begin();
80 for (
size_type loc_iraw = 0, loc_nraw = val._data_size(); loc_iraw < loc_nraw; loc_iraw++, iter++) {
81 _stash.insert (std::pair<const size_type,raw_type>(dis_iraw + loc_iraw, *iter));
84template <
class T,
class A>
92 raw_base::ownership(),
98template <
class T,
class A>
107 raw_base::begin() - raw_base::ownership().first_index(),
108 details::generic_set_op(),
125template <
class T,
class A>
126template <
class Set,
class Map>
136 typename Set::const_iterator iter = ext_idx_set.begin();
137 for (
size_type i = 0; i < ext_idx_set.size(); i++, iter++) {
142 raw_ext_idx [raw_i] = raw_idx;
146 std::vector<size_type> raw_id (raw_ext_idx.size());
147 for (
size_type i = 0; i < raw_id.size(); i++) raw_id[i] = i;
156 raw_ext_idx.begin().operator->(),
158 raw_id.begin().operator->(),
160 raw_ownership.
begin().operator->(),
162 raw_ownership.
comm(),
167 std::vector<raw_type> raw_buffer (raw_ext_idx.size());
171 typename raw_base::const_iterator raw_begin = raw_base::begin();
174 raw_buffer.begin().operator->(),
177 details::generic_set_op(),
179 raw_ownership.
comm());
184 raw_buffer.begin().operator->(),
187 details::generic_set_op(),
189 raw_ownership.
comm());
192 iter = ext_idx_set.begin();
193 for (
size_type i = 0; i < ext_idx_set.size(); i++, iter++) {
196 typename automatic_value_type::iterator
p = value._data_begin();
199 *
p = raw_buffer[raw_i];
201 ext_idx_map.insert (std::make_pair (idx, value));
204template <
class T,
class A>
212 typename scatter_map_type::const_iterator iter =
_ext_x.find (dis_i);
214 return (*iter).second;
216template <
class T,
class A>
220 std::set<size_type> ext_i;
221 for (
typename scatter_map_type::const_iterator
223 last =
_ext_x.end(); iter != last; ++iter) {
224 ext_i.insert ((*iter).first);
231template <
class T,
class A>
232template <
class PutFunction>
237 std::ostream& os = ops.
os();
241 mpi::reduce(
comm(),
size(), max_size, mpi::maximum<size_type>(), 0);
247 std::vector<raw_type> raw_values (max_size*
base::_data_size, std::numeric_limits<raw_type>::max());
249 if (iproc == io_proc)
continue;
251 if (loc_sz_i == 0)
continue;
252 mpi::status status =
comm().recv(iproc, tag, raw_values.begin().operator->(), raw_values.size());
253 boost::optional<int> n_data_opt = status.count<
raw_type>();
258 for (
size_type i = 0; i < loc_sz_i; i++) {
259 typename T::iterator
p = tmp._data_begin();
263 put_element (os, tmp);
270 std::vector<raw_type> raw_values (
size()*
base::_data_size, std::numeric_limits<raw_type>::max());
276 comm().send(io_proc, tag, raw_values.begin().operator->(), raw_values.size());
281template <
class T,
class A>
287template <
class T,
class A>
288template <
class GetFunction>
293 std::istream& is = ips.
is();
300 distributor io_ownership (size_max,
comm(), (my_proc == io_proc) ? size_max : 0);
302 if (my_proc == io_proc) {
308 std::vector<raw_type> raw_values (size_max*
base::_data_size, std::numeric_limits<raw_type>::max());
313 if (jproc == io_proc)
continue;
316 if (loc_sz_j == 0)
continue;
319 for (
size_type i = 0, n = loc_sz_j; i < n; i++) {
329 std::vector<raw_type> raw_values (
size()*
base::_data_size, std::numeric_limits<raw_type>::max());
341template <
class T,
class A>
347template <
class T,
class A>
348template <
class PutFunction,
class Permutation>
352 const Permutation& perm,
353 PutFunction put_element)
const
365 perm_x.hack_array_seq_rep<T,A>::put_values (ops, put_element);
371template <
class T,
class A>
384 vector<size_type> send_local_elt_size (nproc, 0);
386 for (
size_type ie = 0; ie < partition.size(); ie++, iter_part++) {
387 send_local_elt_size [*iter_part]++;
389 vector<size_type> recv_local_elt_size (nproc, 0);
390 all_to_all (
comm, send_local_elt_size, recv_local_elt_size);
391 vector<size_type> recv_local_elt_start (nproc+1);
392 recv_local_elt_start [0] = 0;
393 for (
size_type iproc = 0; iproc < nproc; iproc++) {
394 recv_local_elt_start [iproc+1] = recv_local_elt_start [iproc] + recv_local_elt_size[iproc];
396 vector<size_type> send_local_elt_start (nproc);
397 all_to_all (
comm, recv_local_elt_start.begin().operator->(), send_local_elt_start.begin().operator->());
398 size_type new_local_n_elt = recv_local_elt_start [nproc];
404 old_numbering.resize (new_elt_ownership, numeric_limits<size_type>::max());
405 new_numbering.resize (
ownership(), numeric_limits<size_type>::max());
406 iter_part = partition.begin();
409 for (
size_type ie = 0, ne = partition.size(); ie < ne; ie++, iter_part++, iter_elt++, iter_new_num_elt++) {
412 size_type new_global_ie = new_elt_ownership[iproc] + send_local_elt_start[iproc];
413 new_array.dis_entry (new_global_ie) = x;
414 *iter_new_num_elt = new_global_ie;
416 old_numbering.dis_entry (new_global_ie) = old_global_ie;
417 send_local_elt_start[iproc]++;
419 new_array.dis_entry_assembly();
field::size_type size_type
see the communicator page for the full documentation
see the distributor page for the full documentation
size_type dis_size() const
global and local sizes
static tag_type get_new_tag()
returns a new tag
const communicator_type & comm() const
void dis_entry_assembly_end()
const_reference dis_at(size_type dis_i) const
void get_dis_entry(const Set &ext_idx_set, Map &ext_idx_map) const
const generic_value_type & operator[](size_type ie) const
hack_array_seq_rep< T, A > base
size_type dis_size() const
void dis_entry_assembly()
odiststream & put_values(odiststream &ops) const
dis_reference dis_entry(size_type dis_i)
void repartition(const disarray_rep< size_type, distributed, A2 > &partition, hack_array_mpi_rep< T, A > &new_array, disarray_rep< size_type, distributed, A2 > &old_numbering, disarray_rep< size_type, distributed, A2 > &new_numbering) const
void dis_entry_assembly_begin()
odiststream & permuted_put_values(odiststream &ops, const Permutation &perm, PutFunction put_element) const
base::size_type size_type
base::const_reference const_reference
hack_array_mpi_rep(const A &alloc=A())
size_type _receive_max_size
void resize(const distributor &ownership, const parameter_type ¶m)
base::const_iterator const_iterator
base::parameter_type parameter_type
base::automatic_value_type automatic_value_type
void update_dis_entries() const
void append_dis_entry(const Set &ext_idx_set, Map &ext_idx_map) const
get values from ext_idx_set, that are managed by another proc new version: instead of sending automat...
base::generic_value_type generic_value_type
const distributor & ownership() const
void set_dis_entry(size_type dis_i, const generic_value_type &val)
const communicator & comm() const
idiststream & get_values(idiststream &ips)
disarray_rep< typename T::raw_type, sequential, A > base
odiststream & put_values(odiststream &ops) const
hack_array_seq_rep(const A &alloc=A())
parameter_type _parameter
void resize(const distributor &ownership, const parameter_type ¶m)
hack_array_iterator< generic_value_type, generic_value_type &, generic_value_type *, raw_type, raw_type * > iterator
idiststream: see the diststream page for the full documentation
odiststream: see the diststream page for the full documentation
static size_type io_proc()
#define assert_macro(ok_condition, message)
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)
void mpi_scatter_end(InputIterator x, OutputIterator y, Message &from, Message &to, SetOp op, Tag tag, Comm comm)
void mpi_scatter_begin(InputIterator x, OutputIterator y, Message &from, Message &to, SetOp op, Tag tag, Comm comm)
bool load_chunk(std::istream &s, RandomIterator iter, RandomIterator last)
disarray_store< OutputRandomIterator, SetOp, Size, IsContainer > disarray_make_store(OutputRandomIterator x, SetOp op, Size, IsContainer)
void mpi_scatter_init(Size nidx, SizeRandomIterator1 idx, Size nidy, SizeRandomIterator2 idy, Size idy_maxval, SizeRandomIterator3 ownership, Tag tag, const distributor::communicator_type &comm, Message &from, Message &to)
apply_iterator< Iterator, Operator > make_apply_iterator(Iterator i, Operator op)
Stash::size_type mpi_assembly_begin(const Stash &stash, InputIterator first_stash_idx, InputIterator last_stash_idx, const distributor &ownership, Message &receive, Message &send)
disarray element input helper
disarray element output helper