1#ifndef DUNE_SPGRID_SUPERENTITYITERATOR_HH
2#define DUNE_SPGRID_SUPERENTITYITERATOR_HH
18 template<
class Gr
id >
24 typedef typename std::remove_const< Grid >::type::Traits
Traits;
26 static const int dimension = Traits::ReferenceCube::dimension;
30 typedef typename Traits::template Codim< codimension >::Entity
Entity;
50 unsigned int fBoundary;
53 struct SequenceProvider;
58 template<
class SubInfo,
class BeginEnd >
71 const bool bndLow = (
id[ i ] == 2*globalMesh.
begin()[ i ]);
72 const bool bndHigh = (
id[ i ] == 2*globalMesh.
end()[ i ]);
73 fBoundary_ |= (int( bndLow ) | 2*int( bndHigh )) << (2*i);
101 int index ()
const {
return index_; }
109 bool next ( MultiIndex &
id )
113 assert( sequence_ != 0 );
114 id += sequence_->idAdd;
115 index_ = sequence_->index;
116 skip = ((fBoundary_ & sequence_->fBoundary) != 0);
117 sequence_ = sequence_->next;
119 return (sequence_ != 0);
123 const Sequence *sequence_;
125 unsigned int fBoundary_;
133 template<
class Gr
id >
136 static const unsigned int numDirections = 1 <<
dimension;
138 static const Sequence *
141 assert( direction < numDirections );
142 return instance().begin_[ direction ];
145 static const Sequence *
148 assert( direction < numDirections );
149 return instance().end_[ direction ];
162 const Sequence *begin_[ numDirections ];
163 const Sequence *end_[ numDirections ];
168 template<
class Gr
id >
169 SPSuperEntityIterator< Grid >::SequenceProvider::SequenceProvider ()
171 SPReferenceCube< typename Grid::ctype, dimension > refCube;
175 const int codim = SPDirection< dimension >( dir ).codimension();
177 Sequence *head =
new Sequence;
179 Sequence *last = head;
186 Sequence *next =
new Sequence;
190 const int dirbit = int( (dir >> i) & 1);
191 const int dbit = int( (d >> i) & 1 );
192 next->idAdd[ i ] = (1 - dirbit) * (2*dbit - 1);
193 next->fBoundary |= (1 - dirbit) * (1 << (2*i + dbit));
196 for(
int k = 0; k < refCube.count( codim ); ++k )
198 const MultiIndex &subId = refCube.subId( codim, k );
201 found &= (next->idAdd[ i ] == -subId[ i ]);
205 assert( next->index != -1 );
206 next->idAdd -= head->idAdd;
207 head->idAdd += next->idAdd;
212 begin_[ dir ] = head->next;
214 Sequence *end =
new Sequence;
219 end->idAdd[ i ] = 3 * (1 -
int( (dir >> i) & 1 ));
223 head->index = end->index;
224 head->fBoundary = end->fBoundary;
225 head->idAdd -= end->idAdd;
232 template<
class Gr
id >
233 SPSuperEntityIterator< Grid >::SequenceProvider::~SequenceProvider ()
235 for(
unsigned int dir = 0; dir < (1 <<
dimension); ++dir )
238 while( begin_[ dir ] != 0 )
240 const Sequence *tmp = begin_[ dir ];
241 begin_[ dir ] = begin_[ dir ]->next;
Definition: iostream.hh:7
Definition: entity.hh:146
Definition: entityinfo.hh:24
const GridLevel & gridLevel() const
Definition: entityinfo.hh:66
void update()
Definition: entityinfo.hh:122
const MultiIndex & id() const
Definition: entityinfo.hh:68
bool equals(const This &other) const
Definition: entityinfo.hh:77
Definition: gridlevel.hh:35
const Mesh & globalMesh() const
Definition: gridlevel.hh:210
const MultiIndex & begin() const
Definition: mesh.hh:36
const MultiIndex & end() const
Definition: mesh.hh:37
Definition: spgrid/superentityiterator.hh:20
const GridLevel & gridLevel() const
Definition: spgrid/superentityiterator.hh:106
std::remove_const< Grid >::type::Traits Traits
Definition: spgrid/superentityiterator.hh:24
SPSuperEntityIterator(const SubInfo &subInfo, const BeginEnd &be)
Definition: spgrid/superentityiterator.hh:59
bool operator!=(const This &other) const
Definition: spgrid/superentityiterator.hh:89
Entity operator*() const
Definition: spgrid/superentityiterator.hh:86
Entity dereference() const
Definition: spgrid/superentityiterator.hh:91
EntityImpl::EntityInfo EntityInfo
Definition: spgrid/superentityiterator.hh:36
SPSuperEntityIterator(This &&)=default
bool operator==(const This &other) const
Definition: spgrid/superentityiterator.hh:88
static const int dimension
Definition: spgrid/superentityiterator.hh:26
SPSuperEntityIterator(const This &)=default
int index() const
Definition: spgrid/superentityiterator.hh:101
EntityImpl::GridLevel GridLevel
Definition: spgrid/superentityiterator.hh:37
SPSuperEntityIterator()=default
void increment()
Definition: spgrid/superentityiterator.hh:95
const EntityInfo & entityInfo() const
Definition: spgrid/superentityiterator.hh:103
Traits::template Codim< codimension >::Entity Entity
Definition: spgrid/superentityiterator.hh:30
EntityInfo & entityInfo()
Definition: spgrid/superentityiterator.hh:104
This & operator=(const This &)=default
static const int mydimension
Definition: spgrid/superentityiterator.hh:28
bool equals(const This &other) const
Definition: spgrid/superentityiterator.hh:93
static const int codimension
Definition: spgrid/superentityiterator.hh:27
Definition: spgrid/superentityiterator.hh:39
Definition: spgrid/superentityiterator.hh:40
Definition: spgrid/superentityiterator.hh:135
static const Sequence * sequence(const unsigned int direction, const End &e)
Definition: spgrid/superentityiterator.hh:146
static const unsigned int numDirections
Definition: spgrid/superentityiterator.hh:136
static const Sequence * sequence(const unsigned int direction, const Begin &b)
Definition: spgrid/superentityiterator.hh:139
interface classes for superentity iterators