1#ifndef DUNE_SPGRID_IDSET_HH
2#define DUNE_SPGRID_IDSET_HH
6#include <dune/grid/common/indexidset.hh>
17 template<
class Gr
id >
19 :
public IdSet< Grid, SPLocalIdSet< Grid >, unsigned long >
22 typedef IdSet< Grid, This, unsigned long > Base;
24 typedef typename std::remove_const< Grid >::type::Traits Traits;
27 typedef typename Base::IdType
IdType;
29 static const int dimension = Traits::ReferenceCube::dimension;
44 static const int levelShift = 8*
sizeof(
IdType ) - 8;
50 int i,
int codim, std::integral_constant< int, cd > )
const;
52 int i,
int codim, std::integral_constant< int, 0 > )
const;
54 int i,
int codim, std::integral_constant< int, dimension > )
const;
57 template<
class Entity >
60 return id< Entity::codimension >( entity );
67 = entity.impl().entityInfo();
68 return computeId( entityInfo.
gridLevel(), entityInfo.
id() );
71 template<
class Entity >
72 IdType subId (
const Entity &entity,
int i,
unsigned int codim )
const
74 return subId< Entity::codimension >( entity, i, codim );
81 = entity.impl().entityInfo();
83 return computeSubId( gridLevel, entityInfo.
id(), i, codim, std::integral_constant< int, cd >() );
88 template<
class Gr
id >
90 inline SPLocalIdSet< Grid >
91 ::computeId (
const GridLevel &gridLevel,
const MultiIndex &
id )
const
93 const unsigned int level = gridLevel.level();
94 if( (level > 0) && gridLevel.refinement().isCopy(
id ) )
96 const Grid &grid = gridLevel.grid();
97 MultiIndex fatherId(
id );
98 gridLevel.refinement().father( fatherId );
99 return computeId( grid.gridLevel( level-1 ), fatherId );
102 const Mesh &globalMesh = gridLevel.globalMesh();
106 for(
int i = 0; i < dimension; ++i )
108 index += IdType(
id[ i ] ) * factor;
109 factor *= IdType( 2*globalMesh.width( i ) + 1 );
111 return index | (IdType( level ) << levelShift);
115 template<
class Gr
id >
118 inline SPLocalIdSet< Grid >
119 ::computeSubId (
const GridLevel &gridLevel,
const MultiIndex &
id,
120 int i,
int codim, std::integral_constant< int, cd > )
const
122 const int mydim = dimension - cd;
123 const SPMultiIndex< mydim > refId = gridLevel.template referenceCube< cd >().subId( codim - cd, i );
124 MultiIndex subId(
id );
125 for(
int k = 0, l = 0; k < dimension; ++k )
127 if( (
id[ k ] & 1) != 0 )
128 subId[ k ] += refId[ l++ ];
130 return computeId( gridLevel, subId );
133 template<
class Gr
id >
135 inline SPLocalIdSet< Grid >
136 ::computeSubId (
const GridLevel &gridLevel,
const MultiIndex &
id,
137 int i,
int codim, std::integral_constant< int, 0 > )
const
139 return computeId( gridLevel,
id + gridLevel.referenceCube().subId( codim, i ) );
142 template<
class Gr
id >
144 inline SPLocalIdSet< Grid >
145 ::computeSubId (
const GridLevel &gridLevel,
const MultiIndex &
id,
146 int i,
int codim, std::integral_constant< int, dimension > )
const
148 assert( (codim == dimension) && (i == 0) );
149 return computeId( gridLevel,
id );
157 template<
class Gr
id >
Definition: iostream.hh:7
Definition: entityinfo.hh:24
const GridLevel & gridLevel() const
Definition: entityinfo.hh:66
const MultiIndex & id() const
Definition: entityinfo.hh:68
Definition: gridlevel.hh:35
IdType id(const Entity &entity) const
Definition: idset.hh:58
IdType subId(const typename Codim< cd >::Entity &entity, int i, unsigned int codim) const
Definition: idset.hh:78
IdType subId(const Entity &entity, int i, unsigned int codim) const
Definition: idset.hh:72
SPGridLevel< typename std::remove_const< Grid >::type > GridLevel
Definition: idset.hh:38
static const int dimension
Definition: idset.hh:29
Base::IdType IdType
Definition: idset.hh:27
IdType id(const typename Codim< codim >::Entity &entity) const
Definition: idset.hh:64
__SPGrid::EntityInfo< Grid, codim > EntityInfo
Definition: idset.hh:34
Traits::template Codim< codim >::Entity Entity
Definition: idset.hh:35