dune-spgrid  2.7
geometricgridlevel.hh
Go to the documentation of this file.
1 #ifndef DUNE_SPGRID_GEOMETRICGRIDLEVEL_HH
2 #define DUNE_SPGRID_GEOMETRICGRIDLEVEL_HH
3 
4 #include <array>
5 #include <cassert>
6 
7 #include <dune/common/hybridutilities.hh>
8 
9 #include <dune/geometry/dimension.hh>
10 
15 
16 namespace Dune
17 {
18 
19  // SPGeometricGridLevel
20  // --------------------
21 
22  template< class ct, int dim >
24  {
26 
27  public:
29 
31 
32  typedef typename ReferenceCube::ctype ctype;
33  static const int dimension = ReferenceCube::dimension;
34 
36 
37  static const unsigned int numDirections = ReferenceCube::numCorners;
38 
40 
41  template< int codim >
42  struct Codim
43  {
44  typedef typename ReferenceCubeContainer::template Codim< codim >::ReferenceCube ReferenceCube;
46  };
47 
49  SPGeometricGridLevel ( const This &other );
50 
52 
53  const ReferenceCube &referenceCube () const { return refCubes_.get(); }
54 
55  template< int codim >
56  const typename Codim< codim >::ReferenceCube &
57  referenceCube () const { return refCubes_.template get< codim >(); }
58 
59  const GlobalVector &h () const { return h_; }
60 
61  template< int codim >
62  const typename Codim< codim >::GeometryCache &
63  geometryCache ( Direction dir, Dune::Codim< codim > = Dune::Codim< codim >() ) const
64  {
65  assert( dir.mydimension() == dimension - codim );
66  return *static_cast< const typename Codim< codim >::GeometryCache * >( geometryCache_[ dir.bits() ] );
67  }
68 
69  const typename Codim< 0 >::GeometryCache &geometryCache ( Dune::Codim< 0 > ) const
70  {
72  return geometryCache< 0 >( *dirIt );
73  }
74 
75  ctype faceVolume ( int i ) const { assert( (i >= 0) && (i < ReferenceCube::numFaces) ); return faceVolume_[ i ]; }
76 
77  private:
78  void buildGeometry ();
79 
80  const ReferenceCubeContainer &refCubes_;
81 
82  GlobalVector h_;
83  std::array< void *, numDirections > geometryCache_;
84  std::array< ctype, ReferenceCube::numFaces > faceVolume_;
85  };
86 
87 
88 
89  // Implementation of SPGeometricGridLevel
90  // --------------------------------------
91 
92  template< class ct, int dim >
95  : refCubes_( refCubes ),
96  h_( h )
97  {
98  buildGeometry();
99  }
100 
101 
102  template< class ct, int dim >
104  : refCubes_( other.refCubes_ ),
105  h_( other.h_ )
106  {
107  buildGeometry();
108  }
109 
110 
111  template< class ct, int dim >
113  {
114  Hybrid::forEach( std::make_integer_sequence< int, dimension+1 >(), [ this ] ( auto codim ) {
115  for( SPDirectionIterator< dimension, codim > dirIt; dirIt; ++dirIt )
116  {
117  delete static_cast< typename Codim< codim >::GeometryCache * >( geometryCache_[ (*dirIt).bits() ] );
118  geometryCache_[ (*dirIt).bits() ] = nullptr;
119  }
120  } );
121  }
122 
123 
124  template< class ct, int dim >
126  {
127  Hybrid::forEach( std::make_integer_sequence< int, dimension+1 >(), [ this ] ( auto codim ) {
128  typedef typename Codim< codim >::GeometryCache GeometryCache;
129  for( SPDirectionIterator< dimension, codim > dirIt; dirIt; ++dirIt )
130  geometryCache_[ (*dirIt).bits() ] = new GeometryCache( h_, *dirIt );
131  } );
132 
133  const ctype volume = geometryCache( Dune::Codim< 0 >() ).volume();
134  for( int face = 0; face < ReferenceCube::numFaces; ++face )
135  {
136  SPNormalId< dimension > normalId( face );
137  SPNormalVector< ctype, dimension > normal( normalId );
138  faceVolume_[ face ] = std::abs( volume / (normal * h_) );
139  }
140  }
141 
142 } // namespace Dune
143 
144 #endif // #ifndef DUNE_SPGRID_GEOMETRICGRIDLEVEL_HH
Definition: iostream.hh:7
Definition: direction.hh:18
unsigned long bits() const
Definition: direction.hh:41
int mydimension() const
Definition: direction.hh:38
Definition: direction.hh:157
Definition: geometricgridlevel.hh:24
ReferenceCube::GlobalVector GlobalVector
Definition: geometricgridlevel.hh:35
const GlobalVector & h() const
Definition: geometricgridlevel.hh:59
const ReferenceCube & referenceCube() const
Definition: geometricgridlevel.hh:53
const Codim< 0 >::GeometryCache & geometryCache(Dune::Codim< 0 >) const
Definition: geometricgridlevel.hh:69
SPReferenceCubeContainer< ct, dim > ReferenceCubeContainer
Definition: geometricgridlevel.hh:28
~SPGeometricGridLevel()
Definition: geometricgridlevel.hh:112
static const unsigned int numDirections
Definition: geometricgridlevel.hh:37
SPGeometricGridLevel(const ReferenceCubeContainer &refCubes, const GlobalVector &h)
Definition: geometricgridlevel.hh:94
ctype faceVolume(int i) const
Definition: geometricgridlevel.hh:75
const Codim< codim >::GeometryCache & geometryCache(Direction dir, Dune::Codim< codim >=Dune::Codim< codim >()) const
Definition: geometricgridlevel.hh:63
const Codim< codim >::ReferenceCube & referenceCube() const
Definition: geometricgridlevel.hh:57
ReferenceCube::ctype ctype
Definition: geometricgridlevel.hh:32
SPGeometricGridLevel(const This &other)
Definition: geometricgridlevel.hh:103
SPDirection< dimension > Direction
Definition: geometricgridlevel.hh:39
static const int dimension
Definition: geometricgridlevel.hh:33
ReferenceCubeContainer::ReferenceCube ReferenceCube
Definition: geometricgridlevel.hh:30
Definition: geometricgridlevel.hh:43
ReferenceCubeContainer::template Codim< codim >::ReferenceCube ReferenceCube
Definition: geometricgridlevel.hh:44
SPGeometryCache< ctype, dimension, codim > GeometryCache
Definition: geometricgridlevel.hh:45
Definition: geometrycache.hh:252
Definition: referencecube.hh:43
static const int numFaces
Definition: referencecube.hh:55
FieldVector< ctype, dimension > GlobalVector
Definition: referencecube.hh:51
ct ctype
Definition: referencecube.hh:47
static const int numCorners
Definition: referencecube.hh:54
static const int dimension
Definition: referencecube.hh:49
Definition: referencecube.hh:189
const ReferenceCube & get() const
Definition: referencecube.hh:205