dune-grid  2.4.1
geometrygrid/geometry.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_GEOGRID_GEOMETRY_HH
4 #define DUNE_GEOGRID_GEOMETRY_HH
5 
6 #include <utility>
7 
8 #include <dune/common/nullptr.hh>
9 #include <dune/common/typetraits.hh>
10 
11 #include <dune/geometry/referenceelements.hh>
12 #include <dune/geometry/multilineargeometry.hh>
13 
16 
17 namespace Dune
18 {
19 
20  namespace GeoGrid
21  {
22 
23  // InferHasSingleGeometryType
24  // --------------------------
25 
26  template< class hasSingleGeometryType, int dim, int mydim >
28  {
29  private:
30  static const unsigned int id = hasSingleGeometryType::topologyId;
31  static const unsigned int idMask = (1u << mydim) - 1u;
32 
33  public:
34  static const bool v = hasSingleGeometryType::v && ((mydim == dim) || ((id | 1u) == 1u) || ((id | 1u) == idMask));
35  static const unsigned int topologyId = (v ? id & idMask : ~0u);
36  };
37 
38  template< class hasSingleGeometryType, int dim >
39  struct InferHasSingleGeometryType< hasSingleGeometryType, dim, 1 >
40  {
41  static const bool v = true;
42  static const unsigned int topologyId = GenericGeometry::CubeTopology< 1 >::type::id;
43  };
44 
45  template< class hasSingleGeometryType, int dim >
46  struct InferHasSingleGeometryType< hasSingleGeometryType, dim, 0 >
47  {
48  static const bool v = true;
49  static const unsigned int topologyId = GenericGeometry::CubeTopology< 0 >::type::id;
50  };
51 
52 
53 
54  // GeometryTraits
55  // --------------
56 
57  template< class Grid >
59  {
60  typedef typename remove_const< Grid >::type::Traits Traits;
61 
62  typedef typename Traits::ctype ctype;
63 
64  typedef GenericGeometry::MatrixHelper< GenericGeometry::DuneCoordTraits< ctype > > MatrixHelper;
65 
66  static ctype tolerance () { return 16 * std::numeric_limits< ctype >::epsilon(); }
67 
68  template< int mydim, int cdim >
70  {
72  };
73 
74  template< int mydim >
76  : public InferHasSingleGeometryType< Capabilities::hasSingleGeometryType< Grid >, Traits::dimension, mydim >
77  {};
78  };
79 
80 
81 
82  // Geometry
83  // --------
84 
85  template< int mydim, int cdim, class Grid >
86  class Geometry
87  {
89 
90  typedef typename remove_const< Grid >::type::Traits Traits;
91 
92  template< int, int, class > friend class Geometry;
93 
94  public:
95  typedef typename Traits::ctype ctype;
96 
97  static const int mydimension = mydim;
98  static const int coorddimension = cdim;
99  static const int dimension = Traits::dimension;
100  static const int codimension = dimension - mydimension;
101 
102  protected:
103  typedef CachedMultiLinearGeometry< ctype, mydimension, coorddimension, GeometryTraits< Grid > > BasicMapping;
104 
105  struct Mapping
106  : public BasicMapping
107  {
108  template< class CoordVector >
109  Mapping ( const GeometryType &type, const CoordVector &coords )
110  : BasicMapping( type, coords ),
111  refCount_( 0 )
112  {}
113 
114  void addReference () { ++refCount_; }
115  bool removeReference () { return (--refCount_ == 0); }
116 
117  private:
118  unsigned int refCount_;
119  };
120 
121  public:
122  typedef typename Mapping::LocalCoordinate LocalCoordinate;
123  typedef typename Mapping::GlobalCoordinate GlobalCoordinate;
124 
125  typedef typename Mapping::JacobianTransposed JacobianTransposed;
126  typedef typename Mapping::JacobianInverseTransposed JacobianInverseTransposed;
127 
128  Geometry () : grid_( nullptr ), mapping_( nullptr ) {}
129 
130  explicit Geometry ( const Grid &grid ) : grid_( &grid ), mapping_( nullptr ) {}
131 
132  template< class CoordVector >
133  Geometry ( const Grid &grid, const GeometryType &type, const CoordVector &coords )
134  : grid_( &grid )
135  {
136  assert( int( type.dim() ) == mydimension );
137  void *mappingStorage = grid.allocateStorage( sizeof( Mapping ) );
138  mapping_ = new( mappingStorage ) Mapping( type, coords );
139  mapping_->addReference();
140  }
141 
142  Geometry ( const This &other )
143  : grid_( other.grid_ ),
144  mapping_( other.mapping_ )
145  {
146  if( mapping_ )
147  mapping_->addReference();
148  }
149 
150  Geometry ( This&& other )
151  : grid_( other.grid_ ),
152  mapping_( other.mapping_ )
153  {
154  other.grid_ = nullptr;
155  other.mapping_ = nullptr;
156  }
157 
159  {
160  if( mapping_ && mapping_->removeReference() )
161  destroyMapping();
162  }
163 
164  const This &operator= ( const This &other )
165  {
166  if( other.mapping_ )
167  other.mapping_->addReference();
168  if( mapping_ && mapping_->removeReference() )
169  destroyMapping();
170  grid_ = other.grid_;
171  mapping_ = other.mapping_;
172  return *this;
173  }
174 
175  const This &operator= ( This&& other )
176  {
177  using std::swap;
178  swap( grid_, other.grid_ );
179  swap( mapping_, other.mapping_ );
180  return *this;
181  }
182 
183  operator bool () const { return bool( mapping_ ); }
184 
185  bool affine () const { return mapping_->affine(); }
186  GeometryType type () const { return mapping_->type(); }
187 
188  int corners () const { return mapping_->corners(); }
189  GlobalCoordinate corner ( const int i ) const { return mapping_->corner( i ); }
190  GlobalCoordinate center () const { return mapping_->center(); }
191 
192  GlobalCoordinate global ( const LocalCoordinate &local ) const { return mapping_->global( local ); }
193  LocalCoordinate local ( const GlobalCoordinate &global ) const { return mapping_->local( global ); }
194 
195  ctype integrationElement ( const LocalCoordinate &local ) const { return mapping_->integrationElement( local ); }
196  ctype volume () const { return mapping_->volume(); }
197 
198  JacobianTransposed jacobianTransposed ( const LocalCoordinate &local ) const { return mapping_->jacobianTransposed( local ); }
199  JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate &local ) const { return mapping_->jacobianInverseTransposed( local ); }
200 
201  const Grid &grid () const { assert( grid_ ); return *grid_; }
202 
203  private:
204  void destroyMapping ()
205  {
206  mapping_->~Mapping();
207  grid().deallocateStorage( mapping_, sizeof( Mapping ) );
208  }
209 
210  const Grid *grid_;
211  Mapping* mapping_;
212  };
213 
214  } // namespace GeoGrid
215 
216 } // namespace Dune
217 
218 #endif // #ifndef DUNE_GEOGRID_GEOMETRY_HH
Mapping::JacobianTransposed JacobianTransposed
Definition: geometrygrid/geometry.hh:125
static ctype tolerance()
Definition: geometrygrid/geometry.hh:66
GeoGrid::CornerStorage< mydim, cdim, Grid > Type
Definition: geometrygrid/geometry.hh:71
Definition: geometrygrid/geometry.hh:27
Mapping::GlobalCoordinate GlobalCoordinate
Definition: geometrygrid/geometry.hh:123
static const int codimension
Definition: geometrygrid/geometry.hh:100
Definition: geometrygrid/geometry.hh:86
static const unsigned int topologyId
Definition: geometrygrid/geometry.hh:35
Geometry(This &&other)
Definition: geometrygrid/geometry.hh:150
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Definition: geometrygrid/geometry.hh:198
bool removeReference()
Definition: geometrygrid/geometry.hh:115
Definition: geometrygrid/geometry.hh:105
static const bool v
Definition: geometrygrid/geometry.hh:34
Geometry(const This &other)
Definition: geometrygrid/geometry.hh:142
Definition: geometrygrid/geometry.hh:69
GlobalCoordinate center() const
Definition: geometrygrid/geometry.hh:190
GeometryType type() const
Definition: geometrygrid/geometry.hh:186
GlobalCoordinate global(const LocalCoordinate &local) const
Definition: geometrygrid/geometry.hh:192
Traits::ctype ctype
Definition: geometrygrid/geometry.hh:95
Mapping::LocalCoordinate LocalCoordinate
Definition: geometrygrid/geometry.hh:122
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
const Grid & grid() const
Definition: geometrygrid/geometry.hh:201
void addReference()
Definition: geometrygrid/geometry.hh:114
ctype volume() const
Definition: geometrygrid/geometry.hh:196
Geometry()
Definition: geometrygrid/geometry.hh:128
LocalCoordinate local(const GlobalCoordinate &global) const
Definition: geometrygrid/geometry.hh:193
Geometry(const Grid &grid, const GeometryType &type, const CoordVector &coords)
Definition: geometrygrid/geometry.hh:133
Traits::ctype ctype
Definition: geometrygrid/geometry.hh:62
remove_const< Grid >::type::Traits Traits
Definition: geometrygrid/geometry.hh:60
~Geometry()
Definition: geometrygrid/geometry.hh:158
Grid abstract base classThis class is the base class for all grid implementations. Although no virtual functions are used we call it abstract since its methods do not contain an implementation but forward to the methods of the derived class via the Barton-Nackman trick.
Definition: common/grid.hh:388
static const int dimension
Definition: geometrygrid/geometry.hh:99
Definition: geometrygrid/geometry.hh:75
A set of traits classes to store static information about grid implementation.
Geometry(const Grid &grid)
Definition: geometrygrid/geometry.hh:130
ctype integrationElement(const LocalCoordinate &local) const
Definition: geometrygrid/geometry.hh:195
GenericGeometry::MatrixHelper< GenericGeometry::DuneCoordTraits< ctype > > MatrixHelper
Definition: geometrygrid/geometry.hh:64
const This & operator=(const This &other)
Definition: geometrygrid/geometry.hh:164
static const int coorddimension
Definition: geometrygrid/geometry.hh:98
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Definition: geometrygrid/geometry.hh:199
Definition: cornerstorage.hh:172
int corners() const
Definition: geometrygrid/geometry.hh:188
bool affine() const
Definition: geometrygrid/geometry.hh:185
Mapping::JacobianInverseTransposed JacobianInverseTransposed
Definition: geometrygrid/geometry.hh:126
Mapping(const GeometryType &type, const CoordVector &coords)
Definition: geometrygrid/geometry.hh:109
CachedMultiLinearGeometry< ctype, mydimension, coorddimension, GeometryTraits< Grid > > BasicMapping
Definition: geometrygrid/geometry.hh:103
static const int mydimension
Definition: geometrygrid/geometry.hh:97
GlobalCoordinate corner(const int i) const
Definition: geometrygrid/geometry.hh:189
Definition: cornerstorage.hh:20
Definition: geometrygrid/geometry.hh:58