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>
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>
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>
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>
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);
400 template<
class T1,
class T2>
402 typedef std::pair<typename std::decay<T1>::type,
403 typename std::decay<T2>::type>
type;
414 typedef std::multimap <size_type, mapped_type>
map_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>
457 _x = r._x;
_dis_i = r._dis_i;
return *
this; }
463 _x.set_dis_entry (
_dis_i, value, details::generic_set_op());
470 _x.set_dis_entry (
_dis_i, value, details::generic_set_plus_op());
477 _x.set_dis_entry (
_dis_i, value, details::generic_set_minus_op());
487template <
class T,
class A>
496template <
class T,
class M = rheo_default_memory_model,
class A = std::allocator<T> >
505template <
class T,
class A>
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>
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>
602template <
class T,
class A>
608 :
base(new_macro(
rep(loc_size,init_val,alloc)))
611template <
class T,
class A>
620template <
class T,
class A>
629template <
class T,
class A>
638#ifdef _RHEOLEF_HAVE_MPI
640template <
class T,
class A>
685 template<
class Set,
class 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); }
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>
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()); }
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>
763template <
class T,
class A>
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"
see the communicator page for the full documentation
void dis_entry_assembly_end()
void resize(const distributor &ownership=distributor(), const T &init_val=T())
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
disarray(const distributor &ownership=distributor(), const T &init_val=T(), const A &alloc=A())
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 resize(size_type loc_size=0, const T &init_val=T())
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
disarray(size_type loc_size=0, const T &init_val=T(), const A &alloc=A())
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
void dis_entry_assembly_begin(SetOp my_set_op=SetOp())
disarray_rep< T, sequential, A > base
distributor::communicator_type communicator_type
typename base::difference_type difference_type
typename base::size_type size_type
void dis_entry_assembly_end(SetOp my_set_op=SetOp())
typename base::const_iterator const_iterator
void dis_entry_assembly(SetOp my_set_op=SetOp())
const_iterator end() const
typename base::iterator iterator
void resize(const distributor &ownership, const T &init_val=T())
disarray_rep(const distributor &ownership, const T &init_val=T(), const A &alloc=A())
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
const distributor & ownership() const
size_type last_index() const
stash_traits< T, is_container >::map_type stash_map_type
reference operator[](size_type i)
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
disarray_rep(const A &alloc=A())
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
void resize(const distributor &ownership, const T &init_val=T())
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< row_type, 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
communicator communicator_type
idiststream: see the diststream page for the full documentation
odiststream: see the diststream 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