5#ifndef DUNE_COMMON_PARALLEL_INDEXSET_HH
6#define DUNE_COMMON_PARALLEL_INDEXSET_HH
30 template<
class TG,
class TL>
38 template<
class TG,
class TL>
39 std::ostream&
operator<<(std::ostream& os,
const IndexPair<TG,TL>& pair);
41 template<
class TG,
class TL>
42 bool operator==(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
44 template<
class TG,
class TL>
45 bool operator!=(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
47 template<
class TG,
class TL>
48 bool operator<(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
50 template<
class TG,
class TL>
51 bool operator>(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
53 template<
class TG,
class TL>
54 bool operator<=(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
56 template<
class TG,
class TL>
57 bool operator >=(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
59 template<
class TG,
class TL>
60 bool operator==(
const IndexPair<TG,TL>&,
const TG&);
62 template<
class TG,
class TL>
63 bool operator!=(
const IndexPair<TG,TL>&,
const TG&);
65 template<
class TG,
class TL>
66 bool operator<(
const IndexPair<TG,TL>&,
const TG&);
68 template<
class TG,
class TL>
69 bool operator>(
const IndexPair<TG,TL>&,
const TG&);
71 template<
class TG,
class TL>
72 bool operator<=(
const IndexPair<TG,TL>&,
const TG&);
74 template<
class TG,
class TL>
75 bool operator >=(
const IndexPair<TG,TL>&,
const TG&);
83 template<
class TG,
class TL>
216 template<
typename TG,
typename TL,
int N=100>
263 :
Father(father), indexSet_(&indexSet)
276 inline void markAsDeleted()
const
279 if(indexSet_->state_ !=
RESIZE)
281 <<
"while in RESIZE state!");
483 bool deletedEntries_;
497 template<
class TG,
class TL,
int N>
567 pair(
const std::size_t& local)
const;
608 std::vector<const IndexPair*> indices_;
614 struct LocalIndexComparator
616 static bool compare([[maybe_unused]]
const T& t1, [[maybe_unused]]
const T& t2)
622 template<
class TG,
class TL>
623 struct IndexSetSortFunctor
625 bool operator()(
const IndexPair<TG,TL>& i1,
const IndexPair<TG,TL>& i2)
627 return i1.global()<i2.global() || (i1.global()==i2.global() &&
628 LocalIndexComparator<TL>::compare(i1.local(),
635 template<
class TG,
class TL>
638 os<<
"{global="<<pair.global_<<
", local="<<pair.local_<<
"}";
642 template<
class TG,
class TL,
int N>
646 Iterator end = indexSet.
end();
648 for(Iterator index = indexSet.
begin(); index != end; ++index)
655 template<
class TG,
class TL>
656 inline bool operator==(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
658 return a.global_==b.global_;
661 template<
class TG,
class TL>
662 inline bool operator!=(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
664 return a.global_!=b.global_;
667 template<
class TG,
class TL>
668 inline bool operator<(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
670 return a.global_<b.global_;
673 template<
class TG,
class TL>
674 inline bool operator>(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
676 return a.global_>b.global_;
679 template<
class TG,
class TL>
680 inline bool operator<=(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
682 return a.global_<=b.global_;
685 template<
class TG,
class TL>
686 inline bool operator >=(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
688 return a.global_>=b.global_;
691 template<
class TG,
class TL>
692 inline bool operator==(
const IndexPair<TG,TL>& a,
const TG& b)
697 template<
class TG,
class TL>
698 inline bool operator!=(
const IndexPair<TG,TL>& a,
const TG& b)
703 template<
class TG,
class TL>
704 inline bool operator<(
const IndexPair<TG,TL>& a,
const TG& b)
709 template<
class TG,
class TL>
710 inline bool operator>(
const IndexPair<TG,TL>& a,
const TG& b)
715 template<
class TG,
class TL>
716 inline bool operator<=(
const IndexPair<TG,TL>& a,
const TG& b)
721 template<
class TG,
class TL>
722 inline bool operator >=(
const IndexPair<TG,TL>& a,
const TG& b)
729 template<
class TG,
class TL>
731 : global_(global), local_(local){}
733 template<
class TG,
class TL>
734 IndexPair<TG,TL>::IndexPair(
const TG& global)
735 : global_(global), local_(){}
737 template<
class TG,
class TL>
738 IndexPair<TG,TL>::IndexPair()
739 : global_(), local_(){}
741 template<
class TG,
class TL>
742 inline const TG& IndexPair<TG,TL>::global()
const {
746 template<
class TG,
class TL>
747 inline TL& IndexPair<TG,TL>::local() {
751 template<
class TG,
class TL>
752 inline const TL& IndexPair<TG,TL>::local()
const {
756 template<
class TG,
class TL>
757 inline void IndexPair<TG,TL>::setLocal(
int local){
761 template<
class TG,
class TL,
int N>
763 : state_(
GROUND), seqNo_(0), deletedEntries_()
766 template<
class TG,
class TL,
int N>
774 "IndexSet has to be in GROUND state, when "
775 <<
"beginResize() is called!");
779 deletedEntries_ =
false;
782 template<
class TG,
class TL,
int N>
788 DUNE_THROW(InvalidIndexSetState,
"Indices can only be added "
789 <<
"while in RESIZE state!");
791 newIndices_.push_back(IndexPair(global));
794 template<
class TG,
class TL,
int N>
800 DUNE_THROW(InvalidIndexSetState,
"Indices can only be added "
801 <<
"while in RESIZE state!");
803 newIndices_.push_back(IndexPair(global,local));
806 template<
class TG,
class TL,
int N>
812 DUNE_THROW(InvalidIndexSetState,
"Indices can only be removed "
813 <<
"while in RESIZE state!");
815 deletedEntries_ =
true;
817 global.markAsDeleted();
820 template<
class TG,
class TL,
int N>
825 DUNE_THROW(InvalidIndexSetState,
"endResize called while not "
826 <<
"in RESIZE state!");
829 std::sort(newIndices_.begin(), newIndices_.end(), IndexSetSortFunctor<TG,TL>());
836 template<
class TG,
class TL,
int N>
837 inline void ParallelIndexSet<TG,TL,N>::merge(){
838 if(localIndices_.size()==0)
840 localIndices_=newIndices_;
843 else if(newIndices_.size()>0 || deletedEntries_)
845 ArrayList<IndexPair,N> tempPairs;
847 auto old = localIndices_.begin();
848 auto added = newIndices_.begin();
849 const auto endold = localIndices_.end();
850 const auto endadded = newIndices_.end();
852 while(old != endold && added!= endadded)
854 if(old->local().state()==DELETED) {
859 if(old->global() < added->global() ||
860 (old->global() == added->global()
861 && LocalIndexComparator<TL>::compare(old->local(),added->local())))
863 tempPairs.push_back(*old);
868 tempPairs.push_back(*added);
876 if(old->local().state()!=DELETED) {
877 tempPairs.push_back(*old);
882 while(added!= endadded)
884 tempPairs.push_back(*added);
887 localIndices_ = tempPairs;
892 template<
class TG,
class TL,
int N>
893 inline const IndexPair<TG,TL>&
897 int low=0, high=localIndices_.size()-1, probe=-1;
901 probe = (high + low) / 2;
902 if(global <= localIndices_[probe].global())
911 if( localIndices_[low].global() != global)
912 DUNE_THROW(RangeError,
"Could not find entry of "<<global);
914 return localIndices_[low];
917 template<
class TG,
class TL,
int N>
918 inline const IndexPair<TG,TL>&
922 int low=0, high=localIndices_.size()-1, probe=-1;
926 probe = (high + low) / 2;
927 if(global <= localIndices_[probe].global())
933 return localIndices_[low];
935 template<
class TG,
class TL,
int N>
939 int low=0, high=localIndices_.size()-1, probe=-1;
943 probe = (high + low) / 2;
944 if(localIndices_[probe].global() >= global)
953 if( localIndices_[low].global() != global)
954 DUNE_THROW(RangeError,
"Could not find entry of "<<global);
956 return localIndices_[low];
959 template<
class TG,
class TL,
int N>
963 int low=0, high=localIndices_.size()-1, probe=-1;
967 probe = (high + low) / 2;
968 if(localIndices_[probe].global() >= global)
977 if( localIndices_[low].global() != global)
982 template<
class TG,
class TL,
int N>
986 int low=0, high=localIndices_.size()-1, probe=-1;
990 probe = (high + low) / 2;
991 if(localIndices_[probe].global() >= global)
997 return localIndices_[low];
999 template<
class TG,
class TL,
int N>
1000 inline typename ParallelIndexSet<TG,TL,N>::iterator
1003 return iterator(*
this, localIndices_.begin());
1007 template<
class TG,
class TL,
int N>
1008 inline typename ParallelIndexSet<TG,TL,N>::iterator
1011 return iterator(*
this,localIndices_.end());
1014 template<
class TG,
class TL,
int N>
1018 return localIndices_.begin();
1022 template<
class TG,
class TL,
int N>
1026 return localIndices_.end();
1029 template<
class TG,
class TL,
int N>
1033 DUNE_THROW(InvalidIndexSetState,
"IndexSet has to be in "
1034 <<
"GROUND state for renumberLocal()");
1037 const auto end_ = end();
1040 for(
auto pair=begin(); pair!=end_; index++, ++pair)
1041 pair->local()=index;
1044 template<
class TG,
class TL,
int N>
1050 template<
class TG,
class TL,
int N>
1053 return localIndices_.size();
1057 GlobalLookupIndexSet<I>::GlobalLookupIndexSet(
const I& indexset,
1059 : indexSet_(indexset), size_(size),
1060 indices_(size_, static_cast<const IndexPair*>(0))
1062 const_iterator end_ = indexSet_.end();
1064 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) {
1065 assert(pair->local()<size_);
1066 indices_[pair->local()] = &(*pair);
1071 GlobalLookupIndexSet<I>::GlobalLookupIndexSet(
const I& indexset)
1072 : indexSet_(indexset), size_(0)
1074 const_iterator end_ = indexSet_.end();
1075 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
1076 size_=std::max<std::size_t>(size_,pair->local());
1078 indices_.resize(++size_, 0);
1080 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
1081 indices_[pair->local()] = &(*pair);
1085 GlobalLookupIndexSet<I>::~GlobalLookupIndexSet()
1089 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>*
1090 GlobalLookupIndexSet<I>::pair(
const std::size_t& local)
const
1092 return indices_[local];
1096 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>&
1097 GlobalLookupIndexSet<I>::operator[](
const GlobalIndex& global)
const
1099 return indexSet_[global];
1103 typename I::const_iterator GlobalLookupIndexSet<I>::begin()
const
1105 return indexSet_.begin();
1109 typename I::const_iterator GlobalLookupIndexSet<I>::end()
const
1111 return indexSet_.end();
1115 inline size_t GlobalLookupIndexSet<I>::size()
const
1121 inline int GlobalLookupIndexSet<I>::seqNo()
const
1123 return indexSet_.seqNo();
1126 template<
typename TG,
typename TL,
int N,
typename TG1,
typename TL1,
int N1>
1127 bool operator==(
const ParallelIndexSet<TG,TL,N>& idxset,
1128 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
1130 if(idxset.size()!=idxset1.size())
1133 typedef typename ParallelIndexSet<TG1,TL1,N1>::const_iterator Iter1;
1134 Iter iter=idxset.begin();
1135 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1) {
1136 if(iter1->global()!=iter->global())
1139 const PI& pi=iter->local(), pi1=iter1->local();
1147 template<
typename TG,
typename TL,
int N,
typename TG1,
typename TL1,
int N1>
1148 bool operator!=(
const ParallelIndexSet<TG,TL,N>& idxset,
1149 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
1151 return !(idxset==idxset1);
Implements a random-access container that can efficiently change size (similar to std::deque)
A random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:255
A dynamically growing random access list.
Definition: arraylist.hh:62
A constant random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:368
Decorates an index set with the possibility to find a global index that is mapped to a specific local...
Definition: indexset.hh:507
A pair consisting of a global and local index.
Definition: indexset.hh:85
Exception indicating that the index set is not in the expected state.
Definition: indexset.hh:205
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:373
The iterator over the pairs.
Definition: indexset.hh:257
Manager class for the mapping between local indices and globally unique indices.
Definition: indexset.hh:218
Reference operator*() const
Dereferencing operator.
Definition: iteratorfacades.hh:501
A few common exception classes.
IndexPair & operator[](const GlobalIndex &global)
Find the index pair with a specific global id.
static constexpr int arraySize
The size of the individual arrays in the underlying ArrayList.
Definition: indexset.hh:252
void beginResize()
Indicate that the index set is to be resized.
ParallelIndexSetState
The states the index set can be in.
Definition: indexset.hh:181
void renumberLocal()
Renumbers the local index numbers.
bool exists(const GlobalIndex &global) const
Find the index pair with a specific global id.
size_t size() const
Get the total number (public and nonpublic) indices.
ArrayList< IndexPair, N >::const_iterator const_iterator
The constant iterator over the pairs.
Definition: indexset.hh:296
void add(const GlobalIndex &global)
Add an new index to the set.
const_iterator end() const
Get an iterator over the indices positioned after the last index.
const LocalIndex & local() const
Get the local index.
const IndexPair & at(const GlobalIndex &global) const
Find the index pair with a specific global id.
GlobalLookupIndexSet(const ParallelIndexSet &indexset)
Constructor.
TL LocalIndex
the type of the local index.
Definition: indexset.hh:120
int seqNo() const
Get the internal sequence number.
iterator begin()
Get an iterator over the indices positioned at the first index.
iterator end()
Get an iterator over the indices positioned after the last index.
ParallelIndexSet::const_iterator const_iterator
The iterator over the index pairs.
Definition: indexset.hh:527
const_iterator begin() const
Get an iterator over the indices positioned at the first index.
const IndexPair & operator[](const GlobalIndex &global) const
Find the index pair with a specific global id.
const ParallelIndexSetState & state()
Get the state the index set is in.
Definition: indexset.hh:307
const_iterator begin() const
Get an iterator over the indices positioned at the first index.
const IndexPair & operator[](const GlobalIndex &global) const
Find the index pair with a specific global id.
IndexPair()
Construct a new Pair.
I ParallelIndexSet
The type of the index set.
Definition: indexset.hh:512
TL LocalIndex
The type of the local index, e.g. ParallelLocalIndex.
Definition: indexset.hh:239
void markAsDeleted(const iterator &position)
Mark an index as deleted.
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition: indexset.hh:517
IndexPair(const GlobalIndex &global, const LocalIndex &local)
Constructs a new Pair.
void setLocal(int index)
Set the local index.
const GlobalIndex & global() const
Get the global index.
void add(const GlobalIndex &global, const LocalIndex &local)
Add an new index to the set.
const_iterator end() const
Get an iterator over the indices positioned after the last index.
IndexPair & at(const GlobalIndex &global)
Find the index pair with a specific global id.
ParallelIndexSet()
Constructor.
void endResize()
Indicate that the resizing finishes.
~GlobalLookupIndexSet()
Destructor.
const IndexPair * pair(const std::size_t &local) const
Get the index pair corresponding to a local index.
LocalIndex & local()
Get the local index.
size_t size() const
Get the total number (public and nonpublic) indices.
IndexPair(const GlobalIndex &global)
Constructs a new Pair.
TG GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition: indexset.hh:226
std::ostream & operator<<(std::ostream &os, const ParallelIndexSet< TG, TL, N > &indexSet)
Print an index set.
Definition: indexset.hh:643
TG GlobalIndex
the type of the global index.
Definition: indexset.hh:107
int seqNo() const
Get the internal sequence number.
GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size)
Constructor.
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition: indexset.hh:522
Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair
The type of the pair stored.
Definition: indexset.hh:244
@ RESIZE
Indicates that the index set is currently being resized.
Definition: indexset.hh:190
@ GROUND
The default mode. Indicates that the index set is ready to be used.
Definition: indexset.hh:186
#define DUNE_THROW(E,...)
Definition: exceptions.hh:312
EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:638
EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:684
EnableIfInterOperable< T1, T2, bool >::type operator<=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:661
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:238
EnableIfInterOperable< T1, T2, bool >::type operator>=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:706
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:260
Provides classes for use as the local index in ParallelIndexSet.
Traits classes for mapping types onto MPI_Datatype.
Dune namespace.
Definition: alignedallocator.hh:13
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:41