My Project
indexset.hh
1 // -*- mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=2 sw=2 sts=2:
3 #ifndef DUNE_POLYHEDRALGRID_INDEXSET_HH
4 #define DUNE_POLYHEDRALGRID_INDEXSET_HH
5 
6 #include <vector>
7 
8 #include <dune/common/typetraits.hh>
9 
10 #include <dune/grid/common/gridenums.hh>
11 #include <dune/grid/common/indexidset.hh>
12 
13 #include <opm/grid/polyhedralgrid/declaration.hh>
14 
15 namespace Dune
16 {
17 
18  // PolyhedralGridIndexSet
19  // --------------
20 
21  template< int dim, int dimworld, typename coord_t >
23  : public IndexSet< PolyhedralGrid< dim, dimworld, coord_t >, PolyhedralGridIndexSet< dim, dimworld, coord_t >, int >
24  {
26 
27  protected:
29  typedef IndexSet< GridType, This, int > Base;
30 
31  typedef typename std::remove_const< GridType >::type::Traits Traits;
32 
33  public:
34  static const int dimension = Traits::dimension;
35 
36  typedef typename Base::IndexType IndexType;
37 
38  PolyhedralGridIndexSet ( const GridType& grid )
39  : grid_(&grid)
40  {
41  }
42 
43  template< class Entity >
44  IndexType index ( const Entity &entity ) const
45  {
46  return index< Entity::codimension >( entity );
47  }
48 
49  template< int cd >
50  IndexType index ( const typename Traits::template Codim< cd >::Entity &entity ) const
51  {
52 #if DUNE_VERSION_NEWER(DUNE_GRID, 2, 7)
53  return entity.impl().index();
54 #else
55  return grid().getRealImplementation(entity).index();
56 #endif
57  }
58 
59  template< int cd >
60  IndexType subIndex ( const typename Traits::template Codim< cd >::Entity &entity, int i, unsigned int codim ) const
61  {
62  return subIndex( entity, i, codim );
63  }
64 
65  template< class Entity >
66  IndexType subIndex ( const Entity &entity, int i, unsigned int codim ) const
67  {
68  if( codim == 0 )
69  return index( entity );
70  else if ( codim == 1 )
71 #if DUNE_VERSION_NEWER(DUNE_GRID, 2, 7)
72  return index( entity.impl().template subEntity< 1 > ( i ) );
73 #else
74  return index( grid().getRealImplementation( entity ).template subEntity< 1 > ( i ) );
75 #endif
76  else if ( codim == dimension )
77  {
78 #if DUNE_VERSION_NEWER(DUNE_GRID, 2, 7)
79  return index( entity.impl().template subEntity< dimension > ( i ) );
80 #else
81  return index( grid().getRealImplementation( entity ).template subEntity< dimension > ( i ) );
82 #endif
83  }
84  else
85  {
86  DUNE_THROW(NotImplemented,"codimension not available");
87  return IndexType( -1 );
88  }
89  }
90 
91  IndexType size ( GeometryType type ) const
92  {
93  return grid().size( type );
94  }
95 
96  int size ( int codim ) const
97  {
98  return grid().size( codim );
99  }
100 
101  template< class Entity >
102  bool contains ( const Entity &entity ) const
103  {
104  return index(entity) >= 0 && index(entity) < size(Entity::codimension);
105  }
106 
107  const std::vector< GeometryType > &geomTypes ( int codim ) const
108  {
109  return grid().geomTypes(codim);
110  }
111 
112  const std::vector< GeometryType >& types(int codim) const
113  {
114  return grid().geomTypes(codim);
115  }
116 
117  const GridType& grid() const { assert( grid_ ); return *grid_; }
118 
119  protected:
120  const GridType *grid_;
121  };
122 
123 } // namespace Dune
124 
125 #endif // #ifndef DUNE_POLYHEDRALGRID_INDEXSET_HH
Definition: indexset.hh:24
identical grid wrapper
Definition: grid.hh:158
Copyright 2019 Equinor AS.
Definition: CartesianIndexMapper.hpp:10