1#ifndef _RHEO_DISARRAY_H
2#define _RHEO_DISARRAY_H
184#include "rheolef/communicator.h"
185#include "rheolef/distributor.h"
186#include "rheolef/diststream.h"
187#include "rheolef/heap_allocator.h"
188#include "rheolef/msg_util.h"
189#ifdef _RHEOLEF_HAVE_MPI
190#include "rheolef/mpi_pair_datatype.h"
197 std::ostream&
operator() (std::ostream& os,
const T& x)
const {
return os << x; }
201 std::ostream&
operator() (std::ostream& os,
const T& x)
const {
return os << x <<
";"; }
206 std::istream&
operator() (std::istream& is,
T& x)
const {
return is >> x; }
216template <
class T,
class A>
234 void resize (
const distributor& ownership,
const T& init_val =
T());
236 void resize (
size_type loc_size = 0,
const T& init_val =
T());
255 void get_dis_indexes (std::set<size_type>& ext_idx_set)
const;
257 template<class SetOp = typename details::default_set_op_traits<T>::type>
259 template<class SetOp = typename details::default_set_op_traits<T>::type>
270 void reverse_permutation (
278 void dump (std::string name)
const;
286#ifdef _RHEOLEF_HAVE_MPI
289template <
class T,
class A>
311 void resize (
const distributor& ownership,
const T& init_val =
T());
322 const mpi::communicator&
comm()
const {
return ownership().
comm(); }
329 template<class SetOp = typename details::default_set_op_traits<T>::type>
330 void dis_entry_assembly_begin (SetOp my_set_op = SetOp());
331 template<class SetOp = typename details::default_set_op_traits<T>::type>
332 void dis_entry_assembly_end (SetOp my_set_op = SetOp());
333 template<class SetOp = typename details::default_set_op_traits<T>::type>
335 { dis_entry_assembly_begin (my_set_op); dis_entry_assembly_end (my_set_op); }
337 template<
class Set,
class Map>
338 void append_dis_entry (
const Set& ext_idx_set, Map& ext_idx_map)
const;
340 template<
class Set,
class Map>
343 append_dis_entry (ext_idx_set, ext_idx_map);
350 void set_dis_indexes (
const Set& ext_idx_set)
const { get_dis_entry (ext_idx_set, _ext_x); }
351 void get_dis_indexes (std::set<size_type>& ext_idx_set)
const;
352 void reset_dis_indexes()
const;
354 const_reference dis_at (
size_type dis_i)
const;
367 void permutation_apply (
372 void reverse_permutation (
381 PutFunction put_element)
const;
382 void dump (std::string name)
const;
384 template<
class U,
class SetOp>
385 void set_dis_entry (
size_type dis_i,
const U& val,
const SetOp& set_op);
387 template<
class U,
class SetOp>
388 void set_plus_dis_entry (
size_type dis_i,
const U& val,
const SetOp& set_op);
389 template<
class U,
class SetOp>
390 void set_minus_dis_entry (
size_type dis_i,
const U& val,
const SetOp& set_op);
397 struct remove_const_in_pair {
400 template<
class T1,
class T2>
401 struct remove_const_in_pair<
std::pair<T1,T2> > {
402 typedef std::pair<typename std::decay<T1>::type,
403 typename std::decay<T2>::type>
type;
405 template<
class U,
class IsContainer>
struct stash_traits {};
407 struct stash_traits<U,
std::false_type> {
412 struct stash_traits<U,
std::true_type> {
414 typedef std::multimap <size_type, mapped_type>
map_type;
417 typedef typename stash_traits<T,is_container>::mapped_type
stash_value;
422 struct message_type {
423 std::list<std::pair<size_type,mpi::request> >
waits;
424 std::vector<std::pair<size_type,stash_value> >
data;
429 template<
class Set,
class Map>
430 void append_dis_entry (
const Set& ext_idx_set, Map& ext_idx_map, std::true_type)
const;
431 template<
class Set,
class Map>
432 void append_dis_entry (
const Set& ext_idx_set, Map& ext_idx_map, std::false_type)
const;
443template <
class T,
class A>
487template <
class T,
class A>
496template <
class T,
class M = rheo_default_memory_model,
class A = std::allocator<T> >
505template <
class T,
class A>
528 void resize (
size_type loc_size = 0,
const T& init_val =
T());
530 void resize (
const distributor& ownership,
const T& init_val =
T());
538 const communicator&
comm()
const {
return ownership().
comm(); }
554 template<class SetOp = typename details::default_set_op_traits<T>::type>
556 template<class SetOp = typename details::default_set_op_traits<T>::type>
558 template<class SetOp = typename details::default_set_op_traits<T>::type>
565 void get_dis_indexes (std::set<size_type>& ext_idx_set)
const { base::data().get_dis_indexes (ext_idx_set); }
569 template<
class Set,
class Map>
void append_dis_entry (
const Set& ext_idx_set, Map& ext_idx_map)
const {}
570 template<
class Set,
class Map>
void get_dis_entry (
const Set& ext_idx_set, Map& ext_idx_map)
const {}
574 template<
class RepSize>
576 const RepSize& partition,
578 RepSize& old_numbering,
579 RepSize& new_numbering)
const
580 {
return base::data().repartition (partition, new_disarray, old_numbering, new_numbering); }
582 template<
class RepSize>
584 const RepSize& new_numbering,
586 {
return base::data().permutation_apply (new_numbering, new_disarray); }
590 { base::data().reverse_permutation (inew2dis_iold.data()); }
596 template <
class GetFunction>
598 template <
class PutFunction>
600 void dump (std::string name)
const {
return base::data().dump(name); }
602template <
class T,
class A>
608 :
base(new_macro(
rep(loc_size,init_val,alloc)))
611template <
class T,
class A>
617 :
base(new_macro(
rep(ownership,init_val,alloc)))
620template <
class T,
class A>
627 base::data().resize (loc_size,init_val);
629template <
class T,
class A>
636 base::data().resize (ownership,init_val);
638#ifdef _RHEOLEF_HAVE_MPI
640template <
class T,
class A>
671 const communicator&
comm()
const {
return base::data().comm(); }
685 template<
class Set,
class Map>
686 void append_dis_entry (
const Set& ext_idx_set, Map& ext_idx_map)
const { base::data().append_dis_entry (ext_idx_set, ext_idx_map); }
688 template<
class Set,
class Map>
689 void get_dis_entry (
const Set& ext_idx_set, Map& ext_idx_map)
const { base::data().get_dis_entry (ext_idx_set, ext_idx_map); }
692 void append_dis_indexes (
const Set& ext_idx_set)
const { base::data().append_dis_indexes (ext_idx_set); }
694 void get_dis_indexes (std::set<size_type>& ext_idx_set)
const { base::data().get_dis_indexes (ext_idx_set); }
697 void set_dis_indexes (
const Set& ext_idx_set)
const { base::data().set_dis_indexes (ext_idx_set); }
708 template<class SetOp = typename details::default_set_op_traits<T>::type>
710 template<class SetOp = typename details::default_set_op_traits<T>::type>
712 template<class SetOp = typename details::default_set_op_traits<T>::type>
715 void dis_entry_assembly_begin() { base::data().template dis_entry_assembly_begin<typename details::default_set_op_traits<T>::type>(); }
716 void dis_entry_assembly_end() { base::data().template dis_entry_assembly_end<typename details::default_set_op_traits<T>::type>(); }
721 template<
class RepSize>
723 const RepSize& partition,
725 RepSize& old_numbering,
726 RepSize& new_numbering)
const
727 {
return base::data().repartition (partition.data(), new_disarray.data(), old_numbering.data(), new_numbering.data()); }
729 template<
class RepSize>
731 const RepSize& new_numbering,
733 { base::data().permutation_apply (new_numbering.data(), new_disarray.data()); }
737 { base::data().reverse_permutation (inew2dis_iold.data()); }
743 void dump (std::string name)
const {
return base::data().dump(name); }
745 template <
class GetFunction>
747 template <
class PutFunction>
751 {
return base::data().permuted_put_values (ops, perm.data(), put_element); }
754template <
class T,
class A>
760 :
base(new_macro(
rep(ownership,init_val,alloc)))
763template <
class T,
class A>
770 base::data().resize (ownership,init_val);
777template <
class T,
class A>
782 return x.get_values(ips);
784template <
class T,
class A>
789 return x.put_values(ops);
791#ifdef _RHEOLEF_HAVE_MPI
792template <
class T,
class A>
797 return x.get_values(ips);
799template <
class T,
class A>
804 return x.put_values(ops);
812#include "rheolef/disarray_seq.icc"
813#include "rheolef/disarray_mpi.icc"
field::size_type size_type
void dis_entry_assembly_end()
rep::const_iterator const_iterator
void get_dis_entry(const Set &ext_idx_set, Map &ext_idx_map) const
void set_dis_indexes(const Set &ext_idx_set) const
rep::scatter_map_type scatter_map_type
rep::dis_reference dis_reference
const scatter_map_type & get_dis_map_entries() const
const_iterator begin() const
size_type dis_size() const
void dis_entry_assembly()
void reset_dis_indexes() const
odiststream & put_values(odiststream &ops) const
dis_reference dis_entry(size_type dis_i)
const T & dis_at(size_type dis_i) const
rep::difference_type difference_type
void dis_entry_assembly_begin()
rep::value_type value_type
disarray_rep< T, distributed, A > rep
odiststream & permuted_put_values(odiststream &ops, const disarray< size_type, distributed, A2 > &perm, PutFunction put_element) const
void repartition(const RepSize &partition, disarray< T, distributed > &new_disarray, RepSize &old_numbering, RepSize &new_numbering) const
void append_dis_indexes(const Set &ext_idx_set) const
odiststream & put_values(odiststream &ops, PutFunction put_element) const
void dis_entry_assembly_begin(SetOp my_set_op=SetOp())
void permutation_apply(const RepSize &new_numbering, disarray< T, distributed, A > &new_disarray) const
smart_pointer< rep > base
rep::const_reference const_reference
void dis_entry_assembly_end(SetOp my_set_op=SetOp())
void get_dis_indexes(std::set< size_type > &ext_idx_set) const
void dis_entry_assembly(SetOp my_set_op=SetOp())
void reverse_permutation(disarray< size_type, distributed, A > &inew2dis_iold) const
void dump(std::string name) const
const_iterator end() const
void append_dis_entry(const Set &ext_idx_set, Map &ext_idx_map) const
const distributor & ownership() const
idiststream & get_values(idiststream &ips, GetFunction get_element)
const communicator & comm() const
idiststream & get_values(idiststream &ips)
void dis_entry_assembly_end()
void reverse_permutation(disarray< size_type, sequential, A > &inew2dis_iold) const
rep::const_iterator const_iterator
void get_dis_entry(const Set &ext_idx_set, Map &ext_idx_map) const
const_reference dis_at(size_type dis_i) const
void set_dis_indexes(const Set &ext_idx_set) const
rep::dis_reference dis_reference
disarray_rep< T, sequential, A > rep
const_iterator begin() const
size_type dis_size() const
void dis_entry_assembly()
void reset_dis_indexes() const
odiststream & put_values(odiststream &ops) const
dis_reference dis_entry(size_type dis_i)
rep::difference_type difference_type
void dis_entry_assembly_begin()
rep::value_type value_type
void append_dis_indexes(const Set &ext_idx_set) const
void repartition(const RepSize &partition, disarray< T, sequential, A > &new_disarray, RepSize &old_numbering, RepSize &new_numbering) const
odiststream & put_values(odiststream &ops, PutFunction put_element) const
void dis_entry_assembly_begin(SetOp my_set_op=SetOp())
void permutation_apply(const RepSize &new_numbering, disarray< T, sequential, A > &new_disarray) const
smart_pointer< rep > base
rep::const_reference const_reference
void dis_entry_assembly_end(SetOp my_set_op=SetOp())
void get_dis_indexes(std::set< size_type > &ext_idx_set) const
void dis_entry_assembly(SetOp my_set_op=SetOp())
void dump(std::string name) const
const_iterator end() const
void append_dis_entry(const Set &ext_idx_set, Map &ext_idx_map) const
const distributor & ownership() const
idiststream & get_values(idiststream &ips, GetFunction get_element)
const communicator & comm() const
idiststream & get_values(idiststream &ips)
typename base::value_type value_type
void get_dis_entry(const Set &ext_idx_set, Map &ext_idx_map) const
void set_dis_indexes(const Set &ext_idx_set) const
typename base::const_reference const_reference
const scatter_map_type & get_dis_map_entries() const
typename base::reference reference
const_iterator begin() const
size_type dis_size() const
dis_reference dis_entry(size_type dis_i)
stash_traits< T, is_container >::mapped_type stash_value
std::map< size_type, T > scatter_map_type
size_type first_index() const
disarray_dis_reference< T, A > dis_reference
details::is_container_of_mpi_datatype< T >::type is_container
void append_dis_indexes(const Set &ext_idx_set) const
size_type _receive_max_size
const mpi::communicator & comm() const
distributor::communicator_type communicator_type
typename base::difference_type difference_type
typename base::size_type size_type
typename base::const_iterator const_iterator
void dis_entry_assembly(SetOp my_set_op=SetOp())
const_iterator end() const
typename base::iterator iterator
void set_dis_entry(size_type dis_i, const U &val, const SetOp &set_op)
const distributor & ownership() const
size_type last_index() const
stash_traits< T, is_container >::map_type stash_map_type
const_reference dis_at(size_type dis_i) const
distributor::communicator_type communicator_type
const_iterator begin() const
size_type dis_size() const
void reset_dis_indexes() const
void dis_entry_assembly_begin(SetOp=SetOp())
size_type first_index() const
base::size_type size_type
base::const_reference const_reference
void dis_entry_assembly_end(SetOp=SetOp())
base::const_iterator const_iterator
A::difference_type difference_type
const_iterator end() const
void repartition(const disarray_rep< size_type, sequential, A > &partition, disarray_rep< T, sequential, A > &new_disarray, disarray_rep< size_type, sequential, A > &old_numbering, disarray_rep< size_type, sequential, A > &new_numbering) const
base::reference reference
const distributor & ownership() const
size_type last_index() const
reference dis_entry(size_type dis_i)
see the disarray page for the full documentation
disarray_rep< T, sequential, A > rep
rep::base::const_iterator const_iterator
rep::base::iterator iterator
rep::base::size_type size_type
see the distributor page for the full documentation
size_type last_index(size_type iproc) const
size_type dis_size() const
global and local sizes
communicator communicator_type
size_type first_index(size_type iproc) const
global index range and local size owned by ip-th process
const communicator_type & comm() const
idiststream: see the diststream page for the full documentation
odiststream: see the diststream page for the full documentation
see the smart_pointer page for the full documentation
#define trace_macro(message)
#define error_macro(message)
verbose clean transpose logscale grid shrink ball stereo iso volume skipvtk deformation fastfieldload lattice reader_on_stdin color format format format format format format format format format format format format format format format format format format dump
This file is part of Rheolef.
std::ostream & operator<<(std::ostream &os, const catchmark &m)
std::istream & operator>>(std::istream &is, const catchmark &m)
t operator()(const t &a, const t &b)
disarray element input helper
std::istream & operator()(std::istream &is, T &x) const
disarray element output helper
std::ostream & operator()(std::ostream &os, const T &x) const
std::ostream & operator()(std::ostream &os, const T &x) const
disarray_rep< T, distributed, A > & _x
disarray_dis_reference< T, A > & operator-=(const U &value)
disarray_dis_reference< T, A > & operator=(const disarray_dis_reference< T, A > &r)
disarray_dis_reference(disarray_rep< T, distributed, A > &x, size_type dis_i)
typename disarray_rep< T, distributed, A >::size_type size_type
disarray_dis_reference< T, A > & operator+=(const U &value)
disarray_dis_reference(const disarray_dis_reference< T, A > &r)
std::vector< std::pair< size_type, stash_value > > data
std::list< std::pair< size_type, mpi::request > > waits
std::pair< typename std::decay< T1 >::type, typename std::decay< T2 >::type > type
std::map< size_type, U > map_type
remove_const_in_pair< typenameU::value_type >::type mapped_type
std::multimap< size_type, mapped_type > map_type