1#ifndef DUNE_SPGRID_ITERATOR_HH
2#define DUNE_SPGRID_ITERATOR_HH
7#include <dune/grid/spgrid/direction.hh>
9#include <dune/grid/spgrid/entity.hh>
17 template<
int codim,
class Gr
id >
18 class SPPartitionIterator
20 typedef SPPartitionIterator< codim, Grid > This;
23 typedef typename std::remove_const< Grid >::type::Traits Traits;
25 static const int dimension = Traits::ReferenceCube::dimension;
26 static const int codimension = codim;
27 static const int mydimension = dimension - codimension;
29 typedef typename Traits::template Codim< codimension >::Entity Entity;
32 typedef SPEntity< codimension, dimension, Grid > EntityImpl;
35 typedef typename EntityImpl::EntityInfo EntityInfo;
36 typedef typename EntityImpl::GridLevel GridLevel;
38 typedef SPPartitionList< dimension > PartitionList;
40 typedef typename EntityInfo::Direction Direction;
42 static const unsigned int numDirections = GridLevel::numDirections;
48 typedef typename EntityInfo::MultiIndex MultiIndex;
50 typedef SPDirectionIterator< dimension, codimension > DirectionIterator;
53 SPPartitionIterator () =
default;
55 SPPartitionIterator (
const GridLevel &gridLevel,
const PartitionList &partitionList,
56 const Begin &b,
const unsigned int sweepDir = 0 );
57 SPPartitionIterator (
const GridLevel &gridLevel,
const PartitionList &partitionList,
58 const End &e,
const unsigned int sweepDir = 0 );
60 operator bool ()
const {
return bool( partition_ ); }
62 Entity operator* ()
const {
return dereference(); }
67 This &operator++ () { increment();
return *
this; }
69 Entity dereference ()
const {
return EntityImpl( entityInfo() ); }
71 bool equals (
const This &other )
const {
return entityInfo().equals( other.entityInfo() ); }
75 const EntityInfo &entityInfo ()
const {
return entityInfo_; }
76 EntityInfo &entityInfo () {
return entityInfo_; }
78 const GridLevel &gridLevel ()
const {
return entityInfo().gridLevel(); }
81 int begin (
int i, Direction dir )
const;
82 int end (
int i, Direction dir )
const;
87 EntityInfo entityInfo_;
88 typename PartitionList::Iterator partition_;
89 unsigned int sweepDirection_;
97 template<
int codim,
class Gr
id >
98 inline SPPartitionIterator< codim, Grid >
99 ::SPPartitionIterator (
const GridLevel &gridLevel,
const PartitionList &partitionList,
100 const Begin &b,
unsigned int sweepDir )
101 : entityInfo_( gridLevel ),
102 partition_( partitionList.begin() ),
103 sweepDirection_( sweepDir )
105 assert( sweepDir < numDirections );
110 template<
int codim,
class Gr
id >
111 inline SPPartitionIterator< codim, Grid >
112 ::SPPartitionIterator (
const GridLevel &gridLevel,
const PartitionList &partitionList,
113 const End &e,
unsigned int sweepDir )
114 : entityInfo_( gridLevel ),
115 partition_( partitionList.end() ),
116 sweepDirection_( sweepDir )
118 assert( sweepDir < numDirections );
123 template<
int codim,
class Gr
id >
124 inline void SPPartitionIterator< codim, Grid >::increment ()
126 MultiIndex &
id = entityInfo().id();
127 for(
int i = 0; i < dimension; ++i )
129 const unsigned int sweep = (sweepDirection_ >> i) & 1;
130 id[ i ] += (2 - 4*sweep);
131 if(
id[ i ] != end( i, entityInfo().direction() ) )
132 return entityInfo().update();
133 id[ i ] = begin( i, entityInfo().direction() );
136 DirectionIterator dirIt( entityInfo().direction() );
138 for( ; dirIt && partition_->empty( *dirIt ); ++dirIt )
142 for(
int i = 0; i < dimension; ++i )
143 id[ i ] = begin( i, *dirIt );
144 entityInfo().update();
154 template<
int codim,
class Gr
id >
155 inline int SPPartitionIterator< codim, Grid >::begin (
int i, Direction dir )
const
157 const unsigned int s = (sweepDirection_ >> i) & 1;
158 return partition_->bound( s, i, dir[ i ] );
162 template<
int codim,
class Gr
id >
163 inline int SPPartitionIterator< codim, Grid >::end (
int i, Direction dir )
const
165 const unsigned int s = (sweepDirection_ >> i) & 1;
166 const int bnd = partition_->bound( 1-s, i, dir[ i ] );
167 return bnd + 2*(2*(1-s) - 1);
171 template<
int codim,
class Gr
id >
172 inline void SPPartitionIterator< codim, Grid >::init ()
174 MultiIndex &
id = entityInfo().id();
177 DirectionIterator dirIt;
178 for( ; dirIt && partition_->empty( *dirIt ); ++dirIt )
182 for(
int i = 0; i < dimension; ++i )
183 id[ i ] = begin( i, *dirIt );
184 entityInfo().update( partition_->number() );
miscellaneous helper functions
constexpr auto equals(T1 &&t1, T2 &&t2)
Equality comparison.
Definition: hybridutilities.hh:402
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:237
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:259
auto max(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::max()
Definition: defaults.hh:81
Dune namespace.
Definition: alignedallocator.hh:13