3 #ifndef DUNE_FOAMGRID_INDEXSETS_HH
4 #define DUNE_FOAMGRID_INDEXSETS_HH
13 #include <dune/common/version.hh>
15 #include <dune/geometry/type.hh>
16 #include <dune/grid/common/indexidset.hh>
23 template<
class Gr
idImp>
25 public IndexSet<GridImp,FoamGridLevelIndexSet<GridImp> >
29 enum {dimgrid = GridImp::dimension};
32 enum {dimworld = GridImp::dimensionworld};
37 : grid_(&grid), level_(level), numQuads_(0), numTriangles_(0), numEdges_(0), numVertices_(0)
42 int index (
const typename GridImp::Traits::template Codim<codim>::Entity& e)
const
44 return e.impl().target_->levelIndex_;
49 int subIndex (
const typename GridImp::Traits::template Codim<cc>::Entity& e,
51 unsigned int codim)
const
53 return e.impl().target_->subLevelIndex(i,codim);
57 int size (
int codim)
const {
61 return numTriangles_ + numQuads_;
81 int size (GeometryType type)
const
87 if (type.isTriangle())
89 if (type.isQuadrilateral())
96 const std::vector<GeometryType>&
geomTypes (
int codim)
const
98 return myTypes_[codim];
102 std::vector<GeometryType>
types (
int codim)
const
104 assert(codim<=dimgrid);
105 return myTypes_[codim];
112 template<
class EntityType>
115 return level_ == e.level();
129 typename std::list<FoamGridEntityImp<0, dimgrid, dimworld, typename GridImp::ctype> >::const_iterator vIt;
130 for (vIt = std::get<0>(grid_->entityImps_[level_]).begin();
131 vIt != std::get<0>(grid_->entityImps_[level_]).end();
134 *
const_cast<unsigned int*
>(&(vIt->levelIndex_)) = numVertices_++;
139 typename std::list<FoamGridEntityImp<1, dimgrid, dimworld, typename GridImp::ctype> >::const_iterator edIt;
140 for (edIt = std::get<1>(grid_->entityImps_[level_]).begin();
141 edIt != std::get<1>(grid_->entityImps_[level_]).end();
144 *
const_cast<unsigned int*
>(&(edIt->levelIndex_)) = numEdges_++;
152 typename std::list<FoamGridEntityImp<dimgrid, dimgrid, dimworld, typename GridImp::ctype> >::const_iterator eIt;
153 for (eIt = std::get<dimgrid>(grid_->entityImps_[level_]).begin();
154 eIt != std::get<dimgrid>(grid_->entityImps_[level_]).end();
157 *
const_cast<unsigned int*
>(&(eIt->levelIndex_)) = (eIt->type().isTriangle()) ? numTriangles_++ : numQuads_++;
164 for (
int i = 0; i < dimgrid+1; ++i)
167 if (numTriangles_>0 && dimgrid == 2)
168 myTypes_[0].push_back(GeometryTypes::simplex(2));
170 if (numQuads_>0 && dimgrid == 2)
171 myTypes_[0].push_back(GeometryTypes::cube(2));
173 if (numEdges_>0 && dimgrid == 2)
174 myTypes_[1].push_back(GeometryTypes::simplex(1));
175 if (numEdges_>0 && dimgrid == 1)
176 myTypes_[0].push_back(GeometryTypes::simplex(1));
179 myTypes_[dimgrid].push_back(GeometryTypes::simplex(0));
183 const GridImp* grid_;
192 std::array<std::vector<GeometryType>, dimgrid+1> myTypes_;
197 template<
class Gr
idImp>
199 public IndexSet<GridImp,FoamGridLeafIndexSet<GridImp> >
203 enum {dimgrid = std::remove_const<GridImp>::type::dimension};
205 enum {dimworld = std::remove_const<GridImp>::type::dimensionworld};
211 : grid_(g), numQuads_(0), numTriangles_(0), numEdges_(0), numVertices_(0)
220 int index (
const typename GridImp::Traits::template Codim<codim>::Entity& e)
const
222 return e.impl().target_->leafIndex_;
227 int subIndex (
const typename GridImp::Traits::template Codim<cc>::Entity& e,
229 unsigned int codim)
const
231 return e.impl().target_->subLeafIndex(i,codim);
239 return numTriangles_ + numQuads_;
259 int size (GeometryType type)
const
265 if (type.isTriangle())
266 return numTriangles_;
267 if (type.isQuadrilateral())
274 const std::vector<GeometryType>&
geomTypes (
int codim)
const
276 return myTypes_[codim];
280 std::vector<GeometryType>
types (
int codim)
const
282 assert(codim<=dimgrid);
283 return myTypes_[codim];
287 template<
class EntityType>
290 return e.impl().target_->isLeaf();
305 typename GridImp::Traits::template Codim<0>::LeafIterator eIt = grid_.template leafbegin<0>();
306 typename GridImp::Traits::template Codim<0>::LeafIterator eEndIt = grid_.template leafend<0>();
308 for (; eIt!=eEndIt; ++eIt){
309 if(eIt->type().isTriangle() && dimgrid == 2)
310 *
const_cast<unsigned int*
>(&(eIt->impl().target_->leafIndex_)) = numTriangles_++;
311 if(eIt->type().isQuadrilateral() && dimgrid == 2)
312 *
const_cast<unsigned int*
>(&(eIt->impl().target_->leafIndex_)) = numQuads_++;
313 if(eIt->type().isLine() && dimgrid == 1)
314 *
const_cast<unsigned int*
>(&(eIt->impl().target_->leafIndex_)) = numEdges_++;
321 for (
int i=grid_.maxLevel(); i>=0; i--) {
323 typename GridImp::Traits::template Codim<1>::LevelIterator edIt = grid_.template lbegin<1>(i);
324 typename GridImp::Traits::template Codim<1>::LevelIterator edEndIt = grid_.template lend<1>(i);
326 for (; edIt!=edEndIt; ++edIt) {
328 const FoamGridEntityImp<dimgrid-1, dimgrid, dimworld,
typename GridImp::ctype>* target = edIt->impl().target_;
330 if (target->isLeaf()){
332 if(edIt->type().isLine() && dimgrid==2)
333 *
const_cast<unsigned int*
>(&(target->leafIndex_)) = numEdges_++;
334 if(edIt->type().isVertex() && dimgrid==1)
335 *
const_cast<unsigned int*
>(&(target->leafIndex_)) = numVertices_++;
339 if(target->nSons_==1)
343 *
const_cast<unsigned int*
>(&(target->leafIndex_)) = target->sons_[0]->leafIndex_;
354 for (
int i=grid_.maxLevel(); i>=0; i--) {
356 typename GridImp::Traits::template Codim<dimgrid>::LevelIterator vIt = grid_.template lbegin<dimgrid>(i);
357 typename GridImp::Traits::template Codim<dimgrid>::LevelIterator vEndIt = grid_.template lend<dimgrid>(i);
359 for (; vIt!=vEndIt; ++vIt) {
363 if (target->isLeaf())
365 if(vIt->type().isVertex() && dimgrid==2)
366 *
const_cast<unsigned int*
>(&(target->leafIndex_)) = numVertices_++;
369 *
const_cast<unsigned int*
>(&(target->leafIndex_)) = target->sons_[0]->leafIndex_;
378 for (
int i = 0; i < dimgrid+1; ++i)
382 if (numTriangles_>0 && dimgrid == 2)
383 myTypes_[0].push_back(GeometryTypes::simplex(2));
385 if (numQuads_>0 && dimgrid == 2)
386 myTypes_[0].push_back(GeometryTypes::cube(2));
388 if (numEdges_>0 && dimgrid == 2)
389 myTypes_[1].push_back(GeometryTypes::line);
390 if (numEdges_>0 && dimgrid == 1)
391 myTypes_[0].push_back(GeometryTypes::line);
394 myTypes_[dimgrid].push_back(GeometryTypes::vertex);
399 const GridImp& grid_;
407 std::array<std::vector<GeometryType>, dimgrid+1> myTypes_;
414 template <
class Gr
idImp>
416 public IdSet<GridImp,FoamGridIdSet<GridImp>, unsigned int>
430 IdType id (
const typename std::remove_const<GridImp>::type::Traits::template Codim<cd>::Entity& e)
const
432 return e.impl().target_->id_;
441 IdType subId (
const typename std::remove_const<GridImp>::type::Traits::template Codim<0>::Entity& e,
int i,
int codim)
const
443 return e.impl().subId(i,codim);
Definition: foamgridindexsets.hh:26
bool contains(const EntityType &e) const
Return true if the given entity is contained in the index set.
Definition: foamgridindexsets.hh:113
int index(const typename GridImp::Traits::template Codim< codim >::Entity &e) const
get index of an entity
Definition: foamgridindexsets.hh:42
FoamGridLevelIndexSet(const GridImp &grid, int level)
Definition: foamgridindexsets.hh:36
int size(int codim) const
get number of entities of given codim, type and on this level
Definition: foamgridindexsets.hh:57
int subIndex(const typename GridImp::Traits::template Codim< cc >::Entity &e, int i, unsigned int codim) const
get index of subentity of an entity
Definition: foamgridindexsets.hh:49
const std::vector< GeometryType > & geomTypes(int codim) const
Deliver all geometry types used in this grid.
Definition: foamgridindexsets.hh:96
int size(GeometryType type) const
get number of entities of given codim, type and on this level
Definition: foamgridindexsets.hh:81
void update()
Set up the index set.
Definition: foamgridindexsets.hh:119
std::vector< GeometryType > types(int codim) const
Deliver all geometry types used in this grid.
Definition: foamgridindexsets.hh:102
Definition: foamgridindexsets.hh:200
std::vector< GeometryType > types(int codim) const
Deliver all geometry types used in this grid.
Definition: foamgridindexsets.hh:280
int size(GeometryType type) const
get number of entities of given codim, type and on this level
Definition: foamgridindexsets.hh:259
int subIndex(const typename GridImp::Traits::template Codim< cc >::Entity &e, int i, unsigned int codim) const
get index of subentity of an entity
Definition: foamgridindexsets.hh:227
bool contains(const EntityType &e) const
Return true if the given entity is contained in the index set.
Definition: foamgridindexsets.hh:288
const std::vector< GeometryType > & geomTypes(int codim) const
Deliver all geometry types used in this grid.
Definition: foamgridindexsets.hh:274
int size(int codim) const
get number of entities of given codim, type and on this level
Definition: foamgridindexsets.hh:235
void update()
Definition: foamgridindexsets.hh:294
FoamGridLeafIndexSet(const GridImp &g)
Copy constructor.
Definition: foamgridindexsets.hh:210
int index(const typename GridImp::Traits::template Codim< codim >::Entity &e) const
get index of an entity
Definition: foamgridindexsets.hh:220
Definition: foamgridindexsets.hh:417
IdType subId(const typename std::remove_const< GridImp >::type::Traits::template Codim< 0 >::Entity &e, int i, int codim) const
get id of subEntity
Definition: foamgridindexsets.hh:441
IdType id(const typename std::remove_const< GridImp >::type::Traits::template Codim< cd >::Entity &e) const
get id of an entity
Definition: foamgridindexsets.hh:430
unsigned int IdType
define the type used for persistent indices
Definition: foamgridindexsets.hh:421
void update()
Definition: foamgridindexsets.hh:448
The actual entity implementation.
Definition: foamgridvertex.hh:47