3#ifndef DUNE_INDEXSET_HH
4#define DUNE_INDEXSET_HH
29 template<
class TG,
class TL>
37 template<
class TG,
class TL>
38 std::ostream&
operator<<(std::ostream& os,
const IndexPair<TG,TL>& pair);
40 template<
class TG,
class TL>
41 bool operator==(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
43 template<
class TG,
class TL>
44 bool operator!=(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
46 template<
class TG,
class TL>
47 bool operator<(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
49 template<
class TG,
class TL>
50 bool operator>(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
52 template<
class TG,
class TL>
53 bool operator<=(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
55 template<
class TG,
class TL>
56 bool operator >=(
const IndexPair<TG,TL>&,
const IndexPair<TG,TL>&);
58 template<
class TG,
class TL>
59 bool operator==(
const IndexPair<TG,TL>&,
const TG&);
61 template<
class TG,
class TL>
62 bool operator!=(
const IndexPair<TG,TL>&,
const TG&);
64 template<
class TG,
class TL>
65 bool operator<(
const IndexPair<TG,TL>&,
const TG&);
67 template<
class TG,
class TL>
68 bool operator>(
const IndexPair<TG,TL>&,
const TG&);
70 template<
class TG,
class TL>
71 bool operator<=(
const IndexPair<TG,TL>&,
const TG&);
73 template<
class TG,
class TL>
74 bool operator >=(
const IndexPair<TG,TL>&,
const TG&);
82 template<
class TG,
class TL>
215 template<
typename TG,
typename TL,
int N=100>
264 :
Father(father), indexSet_(&indexSet)
277 inline void markAsDeleted()
const
280 if(indexSet_->state_ !=
RESIZE)
282 <<
"while in RESIZE state!");
484 bool deletedEntries_;
498 template<
class TG,
class TL,
int N>
568 pair(
const std::size_t& local)
const;
609 std::vector<const IndexPair*> indices_;
615 struct LocalIndexComparator
617 static bool compare(
const T& t1,
const T& t2){
624 template<
class TG,
class TL>
625 struct IndexSetSortFunctor
627 bool operator()(
const IndexPair<TG,TL>& i1,
const IndexPair<TG,TL>& i2)
629 return i1.global()<i2.global() || (i1.global()==i2.global() &&
630 LocalIndexComparator<TL>::compare(i1.local(),
637 template<
class TG,
class TL>
640 os<<
"{global="<<pair.global_<<
", local="<<pair.local_<<
"}";
644 template<
class TG,
class TL,
int N>
648 Iterator end = indexSet.
end();
650 for(Iterator index = indexSet.
begin(); index != end; ++index)
657 template<
class TG,
class TL>
658 inline bool operator==(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
660 return a.global_==b.global_;
663 template<
class TG,
class TL>
664 inline bool operator!=(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
666 return a.global_!=b.global_;
669 template<
class TG,
class TL>
670 inline bool operator<(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
672 return a.global_<b.global_;
675 template<
class TG,
class TL>
676 inline bool operator>(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
678 return a.global_>b.global_;
681 template<
class TG,
class TL>
682 inline bool operator<=(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
684 return a.global_<=b.global_;
687 template<
class TG,
class TL>
688 inline bool operator >=(
const IndexPair<TG,TL>& a,
const IndexPair<TG,TL>& b)
690 return a.global_>=b.global_;
693 template<
class TG,
class TL>
694 inline bool operator==(
const IndexPair<TG,TL>& a,
const TG& b)
699 template<
class TG,
class TL>
700 inline bool operator!=(
const IndexPair<TG,TL>& a,
const TG& b)
705 template<
class TG,
class TL>
706 inline bool operator<(
const IndexPair<TG,TL>& a,
const TG& b)
711 template<
class TG,
class TL>
712 inline bool operator>(
const IndexPair<TG,TL>& a,
const TG& b)
717 template<
class TG,
class TL>
718 inline bool operator<=(
const IndexPair<TG,TL>& a,
const TG& b)
723 template<
class TG,
class TL>
724 inline bool operator >=(
const IndexPair<TG,TL>& a,
const TG& b)
731 template<
class TG,
class TL>
733 : global_(global), local_(local){}
735 template<
class TG,
class TL>
736 IndexPair<TG,TL>::IndexPair(
const TG& global)
737 : global_(global), local_(){}
739 template<
class TG,
class TL>
740 IndexPair<TG,TL>::IndexPair()
741 : global_(), local_(){}
743 template<
class TG,
class TL>
744 inline const TG& IndexPair<TG,TL>::global()
const {
748 template<
class TG,
class TL>
749 inline TL& IndexPair<TG,TL>::local() {
753 template<
class TG,
class TL>
754 inline const TL& IndexPair<TG,TL>::local()
const {
758 template<
class TG,
class TL>
759 inline void IndexPair<TG,TL>::setLocal(
int local){
763 template<
class TG,
class TL,
int N>
765 : state_(
GROUND), seqNo_(0)
768 template<
class TG,
class TL,
int N>
776 "IndexSet has to be in GROUND state, when "
777 <<
"beginResize() is called!");
781 deletedEntries_ =
false;
784 template<
class TG,
class TL,
int N>
790 DUNE_THROW(InvalidIndexSetState,
"Indices can only be added "
791 <<
"while in RESIZE state!");
793 newIndices_.push_back(IndexPair(global));
796 template<
class TG,
class TL,
int N>
802 DUNE_THROW(InvalidIndexSetState,
"Indices can only be added "
803 <<
"while in RESIZE state!");
805 newIndices_.push_back(IndexPair(global,local));
808 template<
class TG,
class TL,
int N>
814 DUNE_THROW(InvalidIndexSetState,
"Indices can only be removed "
815 <<
"while in RESIZE state!");
817 deletedEntries_ =
true;
819 global.markAsDeleted();
822 template<
class TG,
class TL,
int N>
827 DUNE_THROW(InvalidIndexSetState,
"endResize called while not "
828 <<
"in RESIZE state!");
831 std::sort(newIndices_.begin(), newIndices_.end(), IndexSetSortFunctor<TG,TL>());
838 template<
class TG,
class TL,
int N>
839 inline void ParallelIndexSet<TG,TL,N>::merge(){
840 if(localIndices_.size()==0)
842 localIndices_=newIndices_;
845 else if(newIndices_.size()>0 || deletedEntries_)
847 ArrayList<IndexPair,N> tempPairs;
848 typedef typename ArrayList<IndexPair,N>::iterator iterator;
849 typedef typename ArrayList<IndexPair,N>::const_iterator const_iterator;
851 iterator old=localIndices_.begin();
852 iterator added=newIndices_.begin();
853 const const_iterator endold=localIndices_.end();
854 const const_iterator endadded=newIndices_.end();
856 while(old != endold && added!= endadded)
858 if(old->local().state()==DELETED) {
863 if(old->global() < added->global() ||
864 (old->global() == added->global()
865 && LocalIndexComparator<TL>::compare(old->local(),added->local())))
867 tempPairs.push_back(*old);
872 tempPairs.push_back(*added);
880 if(old->local().state()!=DELETED) {
881 tempPairs.push_back(*old);
886 while(added!= endadded)
888 tempPairs.push_back(*added);
891 localIndices_ = tempPairs;
896 template<
class TG,
class TL,
int N>
897 inline const IndexPair<TG,TL>&
901 int low=0, high=localIndices_.size()-1, probe=-1;
905 probe = (high + low) / 2;
906 if(global <= localIndices_[probe].global())
915 if( localIndices_[low].global() != global)
916 DUNE_THROW(RangeError,
"Could not find entry of "<<global);
918 return localIndices_[low];
921 template<
class TG,
class TL,
int N>
922 inline const IndexPair<TG,TL>&
926 int low=0, high=localIndices_.size()-1, probe=-1;
930 probe = (high + low) / 2;
931 if(global <= localIndices_[probe].global())
937 return localIndices_[low];
939 template<
class TG,
class TL,
int N>
943 int low=0, high=localIndices_.size()-1, probe=-1;
947 probe = (high + low) / 2;
948 if(localIndices_[probe].global() >= global)
957 if( localIndices_[low].global() != global)
958 DUNE_THROW(RangeError,
"Could not find entry of "<<global);
960 return localIndices_[low];
963 template<
class TG,
class TL,
int N>
967 int low=0, high=localIndices_.size()-1, probe=-1;
971 probe = (high + low) / 2;
972 if(localIndices_[probe].global() >= global)
981 if( localIndices_[low].global() != global)
986 template<
class TG,
class TL,
int N>
990 int low=0, high=localIndices_.size()-1, probe=-1;
994 probe = (high + low) / 2;
995 if(localIndices_[probe].global() >= global)
1001 return localIndices_[low];
1003 template<
class TG,
class TL,
int N>
1004 inline typename ParallelIndexSet<TG,TL,N>::iterator
1007 return iterator(*
this, localIndices_.begin());
1011 template<
class TG,
class TL,
int N>
1012 inline typename ParallelIndexSet<TG,TL,N>::iterator
1015 return iterator(*
this,localIndices_.end());
1018 template<
class TG,
class TL,
int N>
1022 return localIndices_.begin();
1026 template<
class TG,
class TL,
int N>
1030 return localIndices_.end();
1033 template<
class TG,
class TL,
int N>
1037 DUNE_THROW(InvalidIndexSetState,
"IndexSet has to be in "
1038 <<
"GROUND state for renumberLocal()");
1041 typedef typename ArrayList<IndexPair,N>::iterator iterator;
1042 const const_iterator end_ = end();
1045 for(iterator pair=begin(); pair!=end_; index++, ++pair)
1046 pair->local()=index;
1049 template<
class TG,
class TL,
int N>
1055 template<
class TG,
class TL,
int N>
1058 return localIndices_.size();
1062 GlobalLookupIndexSet<I>::GlobalLookupIndexSet(
const I& indexset,
1064 : indexSet_(indexset), size_(size),
1065 indices_(size_, static_cast<const IndexPair*>(0))
1067 const_iterator end_ = indexSet_.end();
1069 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) {
1070 assert(pair->local()<size_);
1071 indices_[pair->local()] = &(*pair);
1076 GlobalLookupIndexSet<I>::GlobalLookupIndexSet(
const I& indexset)
1077 : indexSet_(indexset), size_(0)
1079 const_iterator end_ = indexSet_.end();
1080 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
1081 size_=
std::max(size_,
static_cast<std::size_t
>(pair->local()));
1083 indices_.resize(++size_, 0);
1085 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
1086 indices_[pair->local()] = &(*pair);
1090 GlobalLookupIndexSet<I>::~GlobalLookupIndexSet()
1094 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>*
1095 GlobalLookupIndexSet<I>::pair(
const std::size_t& local)
const
1097 return indices_[local];
1101 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>&
1102 GlobalLookupIndexSet<I>::operator[](
const GlobalIndex& global)
const
1104 return indexSet_[global];
1108 typename I::const_iterator GlobalLookupIndexSet<I>::begin()
const
1110 return indexSet_.begin();
1114 typename I::const_iterator GlobalLookupIndexSet<I>::end()
const
1116 return indexSet_.end();
1120 inline size_t GlobalLookupIndexSet<I>::size()
const
1126 inline int GlobalLookupIndexSet<I>::seqNo()
const
1128 return indexSet_.seqNo();
1131 template<
typename TG,
typename TL,
int N,
typename TG1,
typename TL1,
int N1>
1132 bool operator==(
const ParallelIndexSet<TG,TL,N>& idxset,
1133 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
1135 if(idxset.size()!=idxset1.size())
1138 typedef typename ParallelIndexSet<TG1,TL1,N1>::const_iterator Iter1;
1139 Iter iter=idxset.begin();
1140 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1) {
1141 if(iter1->global()!=iter->global())
1144 const PI& pi=iter->local(), pi1=iter1->local();
1152 template<
typename TG,
typename TL,
int N,
typename TG1,
typename TL1,
int N1>
1153 bool operator!=(
const ParallelIndexSet<TG,TL,N>& idxset,
1154 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
1156 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:256
A dynamically growing random access list.
Definition: arraylist.hh:60
A constant random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:377
Decorates an index set with the possibility to find a global index that is mapped to a specific local...
Definition: indexset.hh:508
A pair consisting of a global and local index.
Definition: indexset.hh:84
Exception indicating that the index set is not in the expected state.
Definition: indexset.hh:204
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:279
The iterator over the pairs.
Definition: indexset.hh:258
Manager class for the mapping between local indices and globally unique indices.
Definition: indexset.hh:217
Reference operator*() const
Dereferencing operator.
Definition: iteratorfacades.hh:498
A few common exception classes.
IndexPair & operator[](const GlobalIndex &global)
Find the index pair with a specific global id.
void beginResize()
Indicate that the index set is to be resized.
ParallelIndexSetState
The states the index set can be in.
Definition: indexset.hh:180
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:297
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:119
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:528
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:308
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:513
TL LocalIndex
The type of the local index, e.g. ParallelLocalIndex.
Definition: indexset.hh:238
void markAsDeleted(const iterator &position)
Mark an index as deleted.
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition: indexset.hh:518
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:225
std::ostream & operator<<(std::ostream &os, const ParallelIndexSet< TG, TL, N > &indexSet)
Print an index set.
Definition: indexset.hh:645
TG GlobalIndex
the type of the global index.
Definition: indexset.hh:106
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:523
Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair
The type of the pair stored.
Definition: indexset.hh:243
@ RESIZE
Indicates that the index set is currently being resized.
Definition: indexset.hh:189
@ GROUND
The default mode. Indicates that the index set is ready to be used.
Definition: indexset.hh:185
@ arraySize
The size of the individual arrays in the underlying ArrayList.
Definition: indexset.hh:252
#define DUNE_UNUSED_PARAMETER(parm)
A macro to mark intentionally unused function parameters with.
Definition: unused.hh:25
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
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:635
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:681
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:658
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:235
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:703
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:257
auto max(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::max()
Definition: defaults.hh:79
Provides classes for use as the local index in ParallelIndexSet.
Dune namespace.
Definition: alignedallocator.hh:14
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:38
Definition of the DUNE_UNUSED macro for the case that config.h is not available.