Go to the documentation of this file.
3 #ifndef DUNE_INDEXSET_HH
4 #define DUNE_INDEXSET_HH
29 template<
class TG,
class TL>
37 template<
class TG,
class TL>
40 template<
class TG,
class TL>
43 template<
class TG,
class TL>
46 template<
class TG,
class TL>
49 template<
class TG,
class TL>
52 template<
class TG,
class TL>
55 template<
class TG,
class TL>
58 template<
class TG,
class TL>
61 template<
class TG,
class TL>
64 template<
class TG,
class TL>
67 template<
class TG,
class TL>
70 template<
class TG,
class TL>
73 template<
class TG,
class TL>
82 template<
class TG,
class TL>
215 template<
typename TG,
typename TL,
int N=100>
264 :
Father(father), indexSet_(&indexSet)
268 :
Father(other), indexSet_(other.indexSet_)
274 indexSet_ = other.indexSet_;
287 inline void markAsDeleted()
const
290 if(indexSet_->state_ !=
RESIZE)
292 <<
"while in RESIZE state!");
427 inline iterator
begin();
433 inline iterator
end();
464 inline int seqNo()
const;
470 inline size_t size()
const;
482 bool deletedEntries_;
496 template<
class TG,
class TL,
int N>
497 std::ostream&
operator<<(std::ostream& os,
const ParallelIndexSet<TG,TL,N>& indexSet);
505 class GlobalLookupIndexSet
566 pair(
const std::size_t& local)
const;
586 inline int seqNo()
const;
592 inline size_t size()
const;
607 std::vector<const IndexPair*> indices_;
615 static bool compare(
const T& t1,
const T& t2){
622 template<
class TG,
class TL>
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>
658 return a.global_==b.global_;
661 template<
class TG,
class TL>
664 return a.global_!=b.global_;
667 template<
class TG,
class TL>
670 return a.global_<b.global_;
673 template<
class TG,
class TL>
676 return a.global_>b.global_;
679 template<
class TG,
class TL>
682 return a.global_<=b.global_;
685 template<
class TG,
class TL>
688 return a.global_>=b.global_;
691 template<
class TG,
class TL>
697 template<
class TG,
class TL>
703 template<
class TG,
class TL>
709 template<
class TG,
class TL>
715 template<
class TG,
class TL>
721 template<
class TG,
class TL>
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>
762 ParallelIndexSet<TG,TL,N>::ParallelIndexSet()
763 : state_(
GROUND), seqNo_(0)
766 template<
class TG,
class TL,
int N>
767 void ParallelIndexSet<TG,TL,N>::beginResize()
774 "IndexSet has to be in GROUND state, when "
775 <<
"beginResize() is called!");
779 deletedEntries_ =
false;
782 template<
class TG,
class TL,
int N>
783 inline void ParallelIndexSet<TG,TL,N>::add(
const GlobalIndex& global)
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>
795 inline void ParallelIndexSet<TG,TL,N>::add(
const TG& global,
const TL& local)
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>
807 inline void ParallelIndexSet<TG,TL,N>::markAsDeleted(
const iterator& global)
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>
821 void ParallelIndexSet<TG,TL,N>::endResize() {
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;
846 typedef typename ArrayList<IndexPair,N>::iterator iterator;
847 typedef typename ArrayList<IndexPair,N>::const_iterator const_iterator;
849 iterator old=localIndices_.begin();
850 iterator added=newIndices_.begin();
851 const const_iterator endold=localIndices_.end();
852 const const_iterator endadded=newIndices_.end();
854 while(old != endold && added!= endadded)
856 if(old->local().state()==
DELETED) {
861 if(old->global() < added->global() ||
862 (old->global() == added->global()
863 && LocalIndexComparator<TL>::compare(old->local(),added->local())))
865 tempPairs.push_back(*old);
870 tempPairs.push_back(*added);
878 if(old->local().state()!=
DELETED) {
879 tempPairs.push_back(*old);
884 while(added!= endadded)
886 tempPairs.push_back(*added);
889 localIndices_ = tempPairs;
894 template<
class TG,
class TL,
int N>
895 inline const IndexPair<TG,TL>&
896 ParallelIndexSet<TG,TL,N>::at(
const TG& global)
const
899 int low=0, high=localIndices_.size()-1, probe=-1;
903 probe = (high + low) / 2;
904 if(global <= localIndices_[probe].global())
913 if( localIndices_[low].global() != global)
914 DUNE_THROW(RangeError,
"Could not find entry of "<<global);
916 return localIndices_[low];
919 template<
class TG,
class TL,
int N>
920 inline const IndexPair<TG,TL>&
921 ParallelIndexSet<TG,TL,N>::operator[](
const TG& global)
const
924 int low=0, high=localIndices_.size()-1, probe=-1;
928 probe = (high + low) / 2;
929 if(global <= localIndices_[probe].global())
935 return localIndices_[low];
937 template<
class TG,
class TL,
int N>
938 inline IndexPair<TG,TL>& ParallelIndexSet<TG,TL,N>::at(
const TG& global)
941 int low=0, high=localIndices_.size()-1, probe=-1;
945 probe = (high + low) / 2;
946 if(localIndices_[probe].global() >= global)
955 if( localIndices_[low].global() != global)
956 DUNE_THROW(RangeError,
"Could not find entry of "<<global);
958 return localIndices_[low];
961 template<
class TG,
class TL,
int N>
962 inline IndexPair<TG,TL>& ParallelIndexSet<TG,TL,N>::operator[](
const TG& global)
965 int low=0, high=localIndices_.size()-1, probe=-1;
969 probe = (high + low) / 2;
970 if(localIndices_[probe].global() >= global)
976 return localIndices_[low];
978 template<
class TG,
class TL,
int N>
979 inline typename ParallelIndexSet<TG,TL,N>::iterator
980 ParallelIndexSet<TG,TL,N>::begin()
982 return iterator(*
this, localIndices_.begin());
986 template<
class TG,
class TL,
int N>
987 inline typename ParallelIndexSet<TG,TL,N>::iterator
988 ParallelIndexSet<TG,TL,N>::end()
990 return iterator(*
this,localIndices_.end());
993 template<
class TG,
class TL,
int N>
994 inline typename ParallelIndexSet<TG,TL,N>::const_iterator
995 ParallelIndexSet<TG,TL,N>::begin()
const
997 return localIndices_.begin();
1001 template<
class TG,
class TL,
int N>
1002 inline typename ParallelIndexSet<TG,TL,N>::const_iterator
1003 ParallelIndexSet<TG,TL,N>::end()
const
1005 return localIndices_.end();
1008 template<
class TG,
class TL,
int N>
1009 void ParallelIndexSet<TG,TL,N>::renumberLocal(){
1012 DUNE_THROW(InvalidIndexSetState,
"IndexSet has to be in "
1013 <<
"GROUND state for renumberLocal()");
1016 typedef typename ArrayList<IndexPair,N>::iterator iterator;
1017 const const_iterator end_ = end();
1020 for(iterator pair=begin(); pair!=end_; index++, ++pair)
1021 pair->local()=index;
1024 template<
class TG,
class TL,
int N>
1025 inline int ParallelIndexSet<TG,TL,N>::seqNo()
const
1030 template<
class TG,
class TL,
int N>
1031 inline size_t ParallelIndexSet<TG,TL,N>::size()
const
1033 return localIndices_.size();
1037 GlobalLookupIndexSet<I>::GlobalLookupIndexSet(
const I& indexset,
1039 : indexSet_(indexset), size_(size),
1040 indices_(size_, static_cast<const IndexPair*>(0))
1042 const_iterator end_ = indexSet_.end();
1044 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) {
1045 assert(pair->local()<size_);
1046 indices_[pair->local()] = &(*pair);
1051 GlobalLookupIndexSet<I>::GlobalLookupIndexSet(
const I& indexset)
1052 : indexSet_(indexset), size_(0)
1054 const_iterator end_ = indexSet_.end();
1055 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
1056 size_=std::max(size_,
static_cast<std::size_t
>(pair->local()));
1058 indices_.resize(++size_, 0);
1060 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
1061 indices_[pair->local()] = &(*pair);
1065 GlobalLookupIndexSet<I>::~GlobalLookupIndexSet()
1069 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>*
1070 GlobalLookupIndexSet<I>::pair(
const std::size_t& local)
const
1072 return indices_[local];
1076 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>&
1077 GlobalLookupIndexSet<I>::operator[](
const GlobalIndex& global)
const
1079 return indexSet_[global];
1083 typename I::const_iterator GlobalLookupIndexSet<I>::begin()
const
1085 return indexSet_.begin();
1089 typename I::const_iterator GlobalLookupIndexSet<I>::end()
const
1091 return indexSet_.end();
1095 inline size_t GlobalLookupIndexSet<I>::size()
const
1101 inline int GlobalLookupIndexSet<I>::seqNo()
const
1103 return indexSet_.seqNo();
1106 template<
typename TG,
typename TL,
int N,
typename TG1,
typename TL1,
int N1>
1107 bool operator==(
const ParallelIndexSet<TG,TL,N>& idxset,
1108 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
1110 if(idxset.size()!=idxset1.size())
1112 typedef typename ParallelIndexSet<TG,TL,N>::const_iterator Iter;
1113 typedef typename ParallelIndexSet<TG1,TL1,N1>::const_iterator Iter1;
1114 Iter iter=idxset.begin();
1115 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1) {
1116 if(iter1->global()!=iter->global())
1118 typedef typename ParallelIndexSet<TG,TL,N>::LocalIndex PI;
1119 const PI& pi=iter->local(), pi1=iter1->local();
1127 template<
typename TG,
typename TL,
int N,
typename TG1,
typename TL1,
int N1>
1128 bool operator!=(
const ParallelIndexSet<TG,TL,N>& idxset,
1129 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
1131 return !(idxset==idxset1);
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition: indexset.hh:516
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:629
IndexPair & operator[](const GlobalIndex &global)
Find the index pair with a specific global id.
iterator end()
Get an iterator over the indices positioned after the last index.
Exception indicating that the index set is not in the expected state.
Definition: indexset.hh:204
ParallelIndexSetState
The states the index set can be in.
Definition: indexset.hh:179
#define DUNE_UNUSED_PARAMETER(parm)
A macro to mark intentionally unused function parameters with.
Definition: unused.hh:25
A few common exception classes.
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:675
Dune namespace.
Definition: alignedallocator.hh:9
size_t size() const
Get the total number (public and nonpublic) indices.
TG GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition: indexset.hh:225
Implements a random-access container that can efficiently change size (similar to std::deque)
I ParallelIndexSet
The type of the index set.
Definition: indexset.hh:511
@ arraySize
The size of the individual arrays in the underlying ArrayList.
Definition: indexset.hh:252
Definition of the DUNE_UNUSED macro for the case that config.h is not available.
IndexPair()
Construct a new Pair.
A dynamically growing random access list.
Definition: arraylist.hh:59
bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:543
iterator(const iterator &other)
Definition: indexset.hh:267
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:307
@ GROUND
The default mode. Indicates that the index set is ready to be used.
Definition: indexset.hh:185
Definition: indexset.hh:613
GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size)
Constructor.
static bool compare(const T &t1, const T &t2)
Definition: indexset.hh:615
Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair
The type of the pair stored.
Definition: indexset.hh:243
const IndexPair & operator[](const GlobalIndex &global) const
Find the index pair with a specific global id.
const_iterator end() const
Get an iterator over the indices positioned after the last index.
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:652
Manager class for the mapping between local indices and globally unique indices.
Definition: indexset.hh:216
@ DELETED
Definition: localindex.hh:26
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:233
Definition: indexset.hh:77
A constant random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:20
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:279
An index present on the local process.
Definition: localindex.hh:32
IndexPair & at(const GlobalIndex &global)
Find the index pair with a specific global id.
void markAsDeleted(const iterator &position)
Mark an index as deleted.
The iterator over the pairs.
Definition: indexset.hh:256
Dune::IndexPair< typename I::GlobalIndex, typename I::LocalIndex > IndexPair
Definition: indexset.hh:528
const_iterator begin() const
Get an iterator over the indices positioned at the first index.
int seqNo() const
Get the internal sequence number.
LocalIndex & local()
Get the local index.
@ RESIZE
Indicates that the index set is currently being resized.
Definition: indexset.hh:189
bool operator!=(const IndexPair< TG, TL > &, const TG &)
Definition: indexset.hh:698
Decorates an index set with the possibility to find a global index that is mapped to a specific local...
Definition: indexset.hh:207
A pair consisting of a global and local index.
Definition: indexset.hh:30
ParallelIndexSet::const_iterator const_iterator
The iterator over the index pairs.
Definition: indexset.hh:526
ConstArrayListIterator< MemberType, N, A > const_iterator
A constant random access iterator.
Definition: arraylist.hh:111
iterator(ParallelIndexSet< TG, TL, N > &indexSet, const Father &father)
Definition: indexset.hh:263
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:255
void beginResize()
Indicate that the index set is to be resized.
iterator & operator==(const iterator &other)
Definition: indexset.hh:271
Provides classes for use as the local index in ParallelIndexSet.
~GlobalLookupIndexSet()
Destructor.
TL LocalIndex
The type of the local index, e.g. ParallelLocalIndex.
Definition: indexset.hh:238
bool operator()(const IndexPair< TG, TL > &i1, const IndexPair< TG, TL > &i2)
Definition: indexset.hh:625
const IndexPair * pair(const std::size_t &local) const
Get the index pair corresponding to a local index.
void add(const GlobalIndex &global)
Add an new index to the set.
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:272
const GlobalIndex & global() const
Get the global index.
bool operator==(const IndexPair< TG, TL > &, const TG &)
Definition: indexset.hh:692
TL LocalIndex
the type of the local index.
Definition: indexset.hh:119
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition: indexset.hh:521
int seqNo() const
Get the internal sequence number.
iterator begin()
Get an iterator over the indices positioned at the first index.
void setLocal(int index)
Set the local index.
const ParallelIndexSetState & state()
Get the state the index set is in.
Definition: indexset.hh:318
void renumberLocal()
Renumbers the local index numbers.
TG GlobalIndex
the type of the global index.
Definition: indexset.hh:106
#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:697
A random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:17
ParallelIndexSet()
Constructor.
void endResize()
Indicate that the resizing finishes.
Definition: indexset.hh:623