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
16namespace 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;
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
const Codim< codim >::GeometryCache & geometryCache(Direction dir, Dune::Codim< codim >=Dune::Codim< codim >()) const
Definition: geometricgridlevel.hh:63
const ReferenceCube & referenceCube() const
Definition: geometricgridlevel.hh:53
ReferenceCube::GlobalVector GlobalVector
Definition: geometricgridlevel.hh:35
const Codim< 0 >::GeometryCache & geometryCache(Dune::Codim< 0 >) const
Definition: geometricgridlevel.hh:69
const GlobalVector & h() const
Definition: geometricgridlevel.hh:59
SPReferenceCubeContainer< ct, dim > ReferenceCubeContainer
Definition: geometricgridlevel.hh:28
~SPGeometricGridLevel()
Definition: geometricgridlevel.hh:112
const Codim< codim >::ReferenceCube & referenceCube() const
Definition: geometricgridlevel.hh:57
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
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
SPGeometryCache< ctype, dimension, codim > GeometryCache
Definition: geometricgridlevel.hh:45
ReferenceCubeContainer::template Codim< codim >::ReferenceCube ReferenceCube
Definition: geometricgridlevel.hh:44
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