1#ifndef DUNE_SPGRID_IDSET_HH
2#define DUNE_SPGRID_IDSET_HH
8#include <dune/grid/spgrid/entityinfo.hh>
9#include <dune/grid/spgrid/gridlevel.hh>
17 template<
class Gr
id >
19 :
public IdSet< Grid, SPLocalIdSet< Grid >, unsigned long >
21 typedef SPLocalIdSet< Grid > This;
22 typedef IdSet< Grid, This, unsigned long > Base;
24 typedef typename std::remove_const< Grid >::type::Traits Traits;
29 static const int dimension = Traits::ReferenceCube::dimension;
34 typedef __SPGrid::EntityInfo< Grid, codim > EntityInfo;
35 typedef typename Traits::template Codim< codim >::Entity Entity;
38 typedef SPGridLevel< typename std::remove_const< Grid >::type > GridLevel;
41 typedef typename GridLevel::MultiIndex MultiIndex;
42 typedef typename GridLevel::Mesh Mesh;
44 static const int levelShift = 8*
sizeof( IdType ) - 8;
46 IdType computeId (
const GridLevel &gridLevel,
const MultiIndex &
id )
const;
49 IdType computeSubId (
const GridLevel &gridLevel,
const MultiIndex &
id,
50 int i,
int codim, std::integral_constant< int, cd > )
const;
51 IdType computeSubId (
const GridLevel &gridLevel,
const MultiIndex &
id,
52 int i,
int codim, std::integral_constant< int, 0 > )
const;
53 IdType computeSubId (
const GridLevel &gridLevel,
const MultiIndex &
id,
54 int i,
int codim, std::integral_constant< int, dimension > )
const;
57 template<
class Entity >
58 IdType
id (
const Entity &entity )
const
60 return id< Entity::codimension >( entity );
64 IdType
id (
const typename Codim< codim >::Entity &entity )
const
66 const typename Codim< codim >::EntityInfo &entityInfo
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 );
78 IdType
subId (
const typename Codim< cd >::Entity &entity,
int i,
unsigned int codim )
const
80 const typename Codim< cd >::EntityInfo &entityInfo
81 = entity.impl().entityInfo();
82 const GridLevel &gridLevel = entityInfo.gridLevel();
83 return computeSubId( gridLevel, entityInfo.id(), i, codim, std::integral_constant< int, cd >() );
88 template<
class Gr
id >
89 typename SPLocalIdSet< Grid >::IdType
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 >
117 typename SPLocalIdSet< Grid >::IdType
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 >
134 typename SPLocalIdSet< Grid >::IdType
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 >
143 typename SPLocalIdSet< Grid >::IdType
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 >
159 :
public SPLocalIdSet< Grid >
IdType subId(const typename Codim< 0 >::Entity &e, int i, unsigned int codim) const
Get id of subentity i of co-dimension codim of a co-dimension 0 entity.
Definition: indexidset.hh:486
IdType id(const typename Codim< cc >::Entity &e) const
Get id of an entity of codim cc. Unhandy because template parameter must be supplied explicitly.
Definition: indexidset.hh:479
IdTypeImp IdType
Type used to represent an id.
Definition: indexidset.hh:458
Provides base classes for index and id sets.
Dune namespace.
Definition: alignedallocator.hh:13