dune-spgrid  2.7
geometry.hh
Go to the documentation of this file.
1 #ifndef DUNE_SPGRID_GEOMETRY_HH
2 #define DUNE_SPGRID_GEOMETRY_HH
3 
4 #include <type_traits>
5 
6 #include <dune/geometry/type.hh>
7 
8 #include <dune/common/typetraits.hh>
9 
10 #include <dune/geometry/type.hh>
11 #include <dune/geometry/referenceelements.hh>
12 
15 
16 namespace Dune
17 {
18 
19  // SPBasicGeometry
20  // ---------------
21 
22  template< int mydim, int cdim, class Grid, class Impl >
24  {
26 
27  protected:
28  typedef typename std::remove_const< Grid >::type::Traits Traits;
29 
30  public:
31  typedef typename Traits::ReferenceCube::ctype ctype;
32 
33  static const int mydimension = mydim;
34  static const int coorddimension = cdim;
35  static const int dimension = Traits::ReferenceCube::dimension;
36  static const int codimension = dimension - mydimension;
37 
40 
41  static const int numCorners = (1 << mydimension);
42 
45 
46  // just to make the Dune interface happy
49 
52 
53  protected:
55  {}
56 
57  public:
58  GeometryType type () const { return GeometryTypes::cube( mydimension ); }
59 
60  int corners () const { return numCorners; }
61  GlobalVector corner ( const int i ) const { return global( ReferenceCube::corner( i ) ); }
62  GlobalVector center () const { return global( ReferenceCube::center() ); }
63 
64  bool affine () const { return true; }
65 
66  GlobalVector global ( const LocalVector &local ) const;
67  LocalVector local ( const GlobalVector &global ) const;
68 
69  ctype volume () const { return asImpl().geometryCache().volume(); }
70  ctype integrationElement ( const LocalVector &local ) const { return volume(); }
71 
72  const JacobianTransposed &jacobianTransposed ( const LocalVector &local ) const;
74 
75  protected:
76  const Impl &asImpl () const { return static_cast< const Impl & >( *this ); }
77  };
78 
79 
80 
81  // SPGeometry
82  // ----------
83 
84  template< int mydim, int cdim, class Grid >
85  class SPGeometry
86  : public SPBasicGeometry< mydim, cdim, Grid, SPGeometry< mydim, cdim, Grid > >
87  {
90 
91  protected:
92  typedef typename Base::Traits Traits;
93 
94  public:
95  typedef typename Base::ctype ctype;
96 
97  static const int mydimension = Base::mydimension;
98  static const int dimension = Base::dimension;
99  static const int codimension = Base::codimension;
100 
103 
106 
108  typedef typename Base::LocalVector LocalVector;
109 
110  private:
111  typedef typename EntityInfo::MultiIndex MultiIndex;
112 
113  public:
114  explicit SPGeometry ( const GridLevel &gridLevel )
115  : entityInfo_( gridLevel )
116  {}
117 
118  explicit SPGeometry ( const EntityInfo &entityInfo )
119  : entityInfo_( entityInfo ),
120  origin_( computeOrigin() )
121  {}
122 
123  SPGeometry ( const GridLevel &gridLevel, const MultiIndex &id )
124  : entityInfo_( gridLevel, id ),
125  origin_( computeOrigin() )
126  {}
127 
130 
131  GlobalVector origin () const { return origin_; }
132  const GeometryCache &geometryCache () const { return entityInfo().geometryCache(); }
133 
134  const GridLevel &gridLevel () const { return entityInfo().gridLevel(); }
135 
136  const EntityInfo &entityInfo () const { return entityInfo_; }
137  EntityInfo &entityInfo () { return entityInfo_; }
138 
139  private:
140  GlobalVector computeOrigin () const
141  {
142  const GlobalVector &h = gridLevel().h();
143  GlobalVector origin = gridLevel().domain().cube().origin();
144  for( int i = 0; i < dimension; ++i )
145  origin[ i ] += (entityInfo().id()[ i ] / 2) * h[ i ];
146  return origin;
147  }
148 
149  EntityInfo entityInfo_;
150  GlobalVector origin_;
151  };
152 
153 
154 
155  // SPLocalGeometry
156  // ---------------
157 
158  template< int mydim, int cdim, class Grid >
160  : public SPBasicGeometry< mydim, cdim, Grid, SPLocalGeometry< mydim, cdim, Grid > >
161  {
164 
165  protected:
166  typedef typename Base::Traits Traits;
167 
168  public:
169  typedef typename Base::ctype ctype;
170 
171  static const int mydimension = Base::mydimension;
172  static const int dimension = Base::dimension;
173  static const int codimension = Base::codimension;
174 
177 
179  typedef typename Base::LocalVector LocalVector;
180 
181  public:
183  const GlobalVector &origin )
184  : geometryCache_( geometryCache ),
185  origin_( origin )
186  {}
187 
190 
191  GlobalVector origin () const { return origin_; }
192  const GeometryCache &geometryCache () const { return geometryCache_; }
193 
194  private:
195  GeometryCache geometryCache_;
196  GlobalVector origin_;
197  };
198 
199 
200 
201  // Implementation of SPBasicGeometry
202  // ---------------------------------
203 
204  template< int mydim, int cdim, class Grid, class Impl >
207  {
208  GlobalVector y( asImpl().origin() );
209  asImpl().geometryCache().jacobianTransposed().umtv( local, y );
210  return y;
211  }
212 
213 
214  template< int mydim, int cdim, class Grid, class Impl >
216  SPBasicGeometry< mydim, cdim, Grid, Impl >::local ( const GlobalVector &global ) const
217  {
218  LocalVector x;
219  GlobalVector y = global - asImpl().origin();
220  asImpl().geometryCache().jacobianInverseTransposed().mtv( y, x );
221  return x;
222  }
223 
224 
225  template< int mydim, int cdim, class Grid, class Impl >
228  {
229  return asImpl().geometryCache().jacobianTransposed();
230  }
231 
232 
233  template< int mydim, int cdim, class Grid, class Impl >
236  {
237  return asImpl().geometryCache().jacobianInverseTransposed();
238  }
239 
240 } // namespace Dune
241 
242 #endif // #ifndef DUNE_SPGRID_GEOMETRY_HH
Definition: iostream.hh:7
const GridLevel & gridLevel() const
Definition: entityinfo.hh:66
const GeometryCache & geometryCache() const
Definition: entityinfo.hh:87
const GlobalVector & h() const
Definition: geometricgridlevel.hh:59
Definition: geometry.hh:24
ctype volume() const
Definition: geometry.hh:69
static const int codimension
Definition: geometry.hh:36
GlobalVector corner(const int i) const
Definition: geometry.hh:61
Traits::ReferenceCube::ctype ctype
Definition: geometry.hh:31
bool affine() const
Definition: geometry.hh:64
GeometryCache::LocalVector LocalVector
Definition: geometry.hh:44
const JacobianTransposed & jacobianTransposed(const LocalVector &local) const
Definition: geometry.hh:227
GlobalVector GlobalCoordinate
Definition: geometry.hh:47
static const int mydimension
Definition: geometry.hh:33
ctype integrationElement(const LocalVector &local) const
Definition: geometry.hh:70
int corners() const
Definition: geometry.hh:60
GeometryCache::GlobalVector GlobalVector
Definition: geometry.hh:43
const Impl & asImpl() const
Definition: geometry.hh:76
LocalVector LocalCoordinate
Definition: geometry.hh:48
GeometryCache::JacobianTransposed JacobianTransposed
Definition: geometry.hh:50
GlobalVector global(const LocalVector &local) const
Definition: geometry.hh:206
std::remove_const< Grid >::type::Traits Traits
Definition: geometry.hh:28
GeometryCache::JacobianInverseTransposed JacobianInverseTransposed
Definition: geometry.hh:51
static const int coorddimension
Definition: geometry.hh:34
GeometryType type() const
Definition: geometry.hh:58
GlobalVector center() const
Definition: geometry.hh:62
static const int numCorners
Definition: geometry.hh:41
SPBasicGeometry()
Definition: geometry.hh:54
static const int dimension
Definition: geometry.hh:35
const JacobianInverseTransposed & jacobianInverseTransposed(const LocalVector &local) const
Definition: geometry.hh:235
SPGeometryCache< ctype, dimension, codimension > GeometryCache
Definition: geometry.hh:39
SPReferenceCube< ctype, mydimension > ReferenceCube
Definition: geometry.hh:38
Definition: geometry.hh:87
EntityInfo::GridLevel GridLevel
Definition: geometry.hh:102
Base::ReferenceCube ReferenceCube
Definition: geometry.hh:104
Base::GlobalVector GlobalVector
Definition: geometry.hh:107
EntityInfo & entityInfo()
Definition: geometry.hh:137
static const int mydimension
Definition: geometry.hh:97
SPGeometry(const EntityInfo &entityInfo)
Definition: geometry.hh:118
Base::Traits Traits
Definition: geometry.hh:92
Base::ctype ctype
Definition: geometry.hh:95
GlobalVector origin() const
Definition: geometry.hh:131
const GridLevel & gridLevel() const
Definition: geometry.hh:134
static const int codimension
Definition: geometry.hh:99
const GeometryCache & geometryCache() const
Definition: geometry.hh:132
const EntityInfo & entityInfo() const
Definition: geometry.hh:136
Base::LocalVector LocalVector
Definition: geometry.hh:108
__SPGrid::EntityInfo< Grid, codimension > EntityInfo
Definition: geometry.hh:101
Base::GeometryCache GeometryCache
Definition: geometry.hh:105
SPGeometry(const GridLevel &gridLevel, const MultiIndex &id)
Definition: geometry.hh:123
SPGeometry(const GridLevel &gridLevel)
Definition: geometry.hh:114
static const int dimension
Definition: geometry.hh:98
Definition: geometry.hh:161
static const int codimension
Definition: geometry.hh:173
GlobalVector origin() const
Definition: geometry.hh:191
Base::ctype ctype
Definition: geometry.hh:169
Base::GlobalVector GlobalVector
Definition: geometry.hh:178
static const int mydimension
Definition: geometry.hh:171
Base::LocalVector LocalVector
Definition: geometry.hh:179
const GeometryCache & geometryCache() const
Definition: geometry.hh:192
SPLocalGeometry(const GeometryCache &geometryCache, const GlobalVector &origin)
Definition: geometry.hh:182
Base::ReferenceCube ReferenceCube
Definition: geometry.hh:175
Base::GeometryCache GeometryCache
Definition: geometry.hh:176
static const int dimension
Definition: geometry.hh:172
Base::Traits Traits
Definition: geometry.hh:166
void mtv(const X &x, Y &y) const
Definition: geometrycache.hh:538
Definition: geometrycache.hh:252
FieldVector< ctype, dimension > GlobalVector
Definition: geometrycache.hh:264
FieldVector< ctype, mydimension > LocalVector
Definition: geometrycache.hh:265
Definition: gridlevel.hh:35
const Domain & domain() const
Definition: gridlevel.hh:84
Definition: referencecube.hh:43
static GlobalVector corner(int i)
return i-th corner
Definition: referencecube.hh:120
static GlobalVector center()
return center
Definition: referencecube.hh:136