dune-fem  2.8-git
gridpart/geogridpart/geometry.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_GRIDPART_GEOGRIDPART_GEOMETRY_HH
2 #define DUNE_FEM_GRIDPART_GEOGRIDPART_GEOMETRY_HH
3 
4 #include <type_traits>
5 
6 #include <dune/geometry/multilineargeometry.hh>
7 
8 #include <dune/grid/geometrygrid/geometry.hh>
9 
12 
13 namespace Dune
14 {
15 
16  namespace Fem
17  {
18 
19  // GeoGeometryTraits
20  // -----------------
21 
22  template< class GridFamily >
24  {
25  typedef typename std::remove_const< GridFamily >::type::Traits Traits;
26 
27  typedef typename Traits::HostGridPartType HostGridPartType;
28 
29  static const int dimension = std::remove_const< GridFamily >::type::dimension;
30 
31  public:
32  typedef typename std::remove_const< GridFamily >::type::ctype ctype;
33 
34  typedef Dune::Impl::FieldMatrixHelper< ctype > MatrixHelper;
35 
36  static ctype tolerance () { return 16 * std::numeric_limits< ctype >::epsilon(); }
37 
38  template< int mydim, int cdim >
40  {
42  };
43 
44  template< int mydim >
46  : public Dune::GeoGrid::InferHasSingleGeometryType< GridPartCapabilities::hasSingleGeometryType< HostGridPartType >, dimension, mydim >
47  {};
48  };
49 
50 
51 
52  // GeoGeometry
53  // -----------
54 
55  template< int mydim, int cdim, class GridFamily >
57  {
59 
60  public:
61  typedef typename std::remove_const< GridFamily >::type::ctype ctype;
62 
63  static const int mydimension = mydim;
64  static const int coorddimension = cdim;
65  static const int dimension = std::remove_const< GridFamily >::type::dimension;
66  static const int codimension = dimension - mydimension;
67 
68  protected:
69  typedef CachedMultiLinearGeometry< ctype, mydimension, coorddimension, GeoGeometryTraits< GridFamily > > Mapping;
70 
71  public:
72  typedef typename Mapping::LocalCoordinate LocalCoordinate;
73  typedef typename Mapping::GlobalCoordinate GlobalCoordinate;
74 
75  typedef typename Mapping::JacobianTransposed JacobianTransposed;
76  typedef typename Mapping::JacobianInverseTransposed JacobianInverseTransposed;
77 
79  : mapping_( nullptr )
80  {}
81 
82  template< class CoordVector >
83  GeoGeometry ( const GeometryType &type, const CoordVector &coords )
84  {
85  assert( int( type.dim() ) == mydimension );
86  mapping_ = new( mappingStorage_ ) Mapping( type, coords );
87  }
88 
89  GeoGeometry ( const ThisType &other )
90  {
91  if( other.mapping_ )
92  mapping_ = new( mappingStorage_ ) Mapping( *other.mapping_ );
93  else
94  mapping_ = nullptr;
95  }
96 
98  {
99  if( mapping_ )
100  mapping_->~Mapping();
101  }
102 
103  const ThisType &operator= ( const ThisType &other )
104  {
105  if( mapping_ )
106  mapping_->~Mapping();
107  if( other.mapping_ )
108  mapping_ = new( mappingStorage_ ) Mapping( *other.mapping_ );
109  else
110  mapping_ = nullptr;
111  return *this;
112  }
113 
114  operator bool () const { return bool( mapping_ ); }
115 
116  bool affine () const { return mapping_->affine(); }
117  GeometryType type () const { return mapping_->type(); }
118 
119  int corners () const { return mapping_->corners(); }
120  GlobalCoordinate corner ( const int i ) const { return mapping_->corner( i ); }
121  GlobalCoordinate center () const { return mapping_->center(); }
122 
123  GlobalCoordinate global ( const LocalCoordinate &local ) const { return mapping_->global( local ); }
124  LocalCoordinate local ( const GlobalCoordinate &global ) const { return mapping_->local( global ); }
125 
126  ctype integrationElement ( const LocalCoordinate &local ) const { return mapping_->integrationElement( local ); }
127  ctype volume () const { return mapping_->volume(); }
128 
129  JacobianTransposed jacobianTransposed ( const LocalCoordinate &local ) const { return mapping_->jacobianTransposed( local ); }
130  JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate &local ) const { return mapping_->jacobianInverseTransposed( local ); }
131 
132  private:
133  Mapping* mapping_;
134  char mappingStorage_[ sizeof( Mapping ) ];
135  };
136 
137  } // namespace Fem
138 
139 
140 } // namespace Dune
141 
142 #endif // #ifndef DUNE_FEM_GRIDPART_GEOGRIDPART_GEOMETRY_HH
Definition: bindguard.hh:11
Definition: cornerstorage.hh:279
Definition: gridpart/geogridpart/geometry.hh:24
static ctype tolerance()
Definition: gridpart/geogridpart/geometry.hh:36
Dune::Impl::FieldMatrixHelper< ctype > MatrixHelper
Definition: gridpart/geogridpart/geometry.hh:34
std::remove_const< GridFamily >::type::ctype ctype
Definition: gridpart/geogridpart/geometry.hh:32
Definition: gridpart/geogridpart/geometry.hh:40
GeoCornerStorage< mydim, cdim, GridFamily > Type
Definition: gridpart/geogridpart/geometry.hh:41
Definition: gridpart/geogridpart/geometry.hh:47
Definition: gridpart/geogridpart/geometry.hh:57
ctype integrationElement(const LocalCoordinate &local) const
Definition: gridpart/geogridpart/geometry.hh:126
GeoGeometry(const GeometryType &type, const CoordVector &coords)
Definition: gridpart/geogridpart/geometry.hh:83
~GeoGeometry()
Definition: gridpart/geogridpart/geometry.hh:97
Mapping::JacobianTransposed JacobianTransposed
Definition: gridpart/geogridpart/geometry.hh:75
Mapping::GlobalCoordinate GlobalCoordinate
Definition: gridpart/geogridpart/geometry.hh:73
static const int codimension
Definition: gridpart/geogridpart/geometry.hh:66
bool affine() const
Definition: gridpart/geogridpart/geometry.hh:116
Mapping::LocalCoordinate LocalCoordinate
Definition: gridpart/geogridpart/geometry.hh:72
int corners() const
Definition: gridpart/geogridpart/geometry.hh:119
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Definition: gridpart/geogridpart/geometry.hh:129
GeoGeometry()
Definition: gridpart/geogridpart/geometry.hh:78
std::remove_const< GridFamily >::type::ctype ctype
Definition: gridpart/geogridpart/geometry.hh:61
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Definition: gridpart/geogridpart/geometry.hh:130
static const int dimension
Definition: gridpart/geogridpart/geometry.hh:65
Mapping::JacobianInverseTransposed JacobianInverseTransposed
Definition: gridpart/geogridpart/geometry.hh:76
GeoGeometry(const ThisType &other)
Definition: gridpart/geogridpart/geometry.hh:89
static const int mydimension
Definition: gridpart/geogridpart/geometry.hh:63
GlobalCoordinate global(const LocalCoordinate &local) const
Definition: gridpart/geogridpart/geometry.hh:123
GlobalCoordinate corner(const int i) const
Definition: gridpart/geogridpart/geometry.hh:120
const ThisType & operator=(const ThisType &other)
Definition: gridpart/geogridpart/geometry.hh:103
ctype volume() const
Definition: gridpart/geogridpart/geometry.hh:127
static const int coorddimension
Definition: gridpart/geogridpart/geometry.hh:64
CachedMultiLinearGeometry< ctype, mydimension, coorddimension, GeoGeometryTraits< GridFamily > > Mapping
Definition: gridpart/geogridpart/geometry.hh:69
GeometryType type() const
Definition: gridpart/geogridpart/geometry.hh:117
GlobalCoordinate center() const
Definition: gridpart/geogridpart/geometry.hh:121
A mapping from one vector space into another This class describes a general mapping from the domain v...
Definition: mapping.hh:47