1#ifndef DUNE_SPGRID_GEOMETRY_HH
2#define DUNE_SPGRID_GEOMETRY_HH
9#include <dune/common/transpose.hh>
12#include <dune/geometry/referenceelements.hh>
14#include <dune/grid/spgrid/referencecube.hh>
15#include <dune/grid/spgrid/entityinfo.hh>
23 template<
int mydim,
int cdim,
class Gr
id,
class Impl >
26 typedef SPBasicGeometry< mydim, cdim, Grid, Impl > This;
29 typedef typename std::remove_const< Grid >::type::Traits Traits;
32 typedef typename Traits::ReferenceCube::ctype ctype;
34 static const int mydimension = mydim;
35 static const int coorddimension = cdim;
36 static const int dimension = Traits::ReferenceCube::dimension;
37 static const int codimension = dimension - mydimension;
39 typedef SPReferenceCube< ctype, mydimension > ReferenceCube;
40 typedef SPGeometryCache< ctype, dimension, codimension > GeometryCache;
42 static const int numCorners = (1 << mydimension);
44 typedef typename GeometryCache::GlobalVector GlobalVector;
45 typedef typename GeometryCache::LocalVector LocalVector;
48 typedef GlobalVector GlobalCoordinate;
49 typedef LocalVector LocalCoordinate;
51 typedef typename GeometryCache::JacobianTransposed JacobianTransposed;
52 typedef typename GeometryCache::JacobianInverseTransposed JacobianInverseTransposed;
54 using Jacobian = std::decay_t<decltype(transposedView(std::declval<const JacobianTransposed&>()))>;
55 using JacobianInverse = std::decay_t<decltype(transposedView(std::declval<const JacobianInverseTransposed&>()))>;
64 int corners ()
const {
return numCorners; }
65 GlobalVector corner (
const int i )
const {
return global( ReferenceCube::corner( i ) ); }
66 GlobalVector center ()
const {
return global( ReferenceCube::center() ); }
68 bool affine ()
const {
return true; }
70 GlobalVector global (
const LocalVector &local )
const;
71 LocalVector local (
const GlobalVector &global )
const;
73 ctype volume ()
const {
return asImpl().geometryCache().volume(); }
74 ctype integrationElement (
const LocalVector &local )
const {
return volume(); }
76 const JacobianTransposed &jacobianTransposed (
const LocalVector &local )
const;
77 const JacobianInverseTransposed &jacobianInverseTransposed (
const LocalVector &local )
const;
79 auto jacobian (
const LocalVector &local )
const;
80 auto jacobianInverse (
const LocalVector &local )
const;
83 const Impl &asImpl ()
const {
return static_cast< const Impl &
>( *this ); }
91 template<
int mydim,
int cdim,
class Gr
id >
93 :
public SPBasicGeometry< mydim, cdim, Grid, SPGeometry< mydim, cdim, Grid > >
95 typedef SPGeometry< mydim, cdim, Grid > This;
96 typedef SPBasicGeometry< mydim, cdim, Grid, This > Base;
99 typedef typename Base::Traits Traits;
102 typedef typename Base::ctype ctype;
104 static const int mydimension = Base::mydimension;
105 static const int dimension = Base::dimension;
106 static const int codimension = Base::codimension;
108 typedef __SPGrid::EntityInfo< Grid, codimension > EntityInfo;
109 typedef typename EntityInfo::GridLevel GridLevel;
111 typedef typename Base::ReferenceCube ReferenceCube;
112 typedef typename Base::GeometryCache GeometryCache;
114 typedef typename Base::GlobalVector GlobalVector;
115 typedef typename Base::LocalVector LocalVector;
118 typedef typename EntityInfo::MultiIndex MultiIndex;
121 explicit SPGeometry (
const GridLevel &gridLevel )
122 : entityInfo_( gridLevel )
125 explicit SPGeometry (
const EntityInfo &entityInfo )
126 : entityInfo_( entityInfo ),
127 origin_( computeOrigin() )
130 SPGeometry (
const GridLevel &gridLevel,
const MultiIndex &
id )
131 : entityInfo_( gridLevel, id ),
132 origin_( computeOrigin() )
135 using Base::jacobianTransposed;
136 using Base::jacobianInverseTransposed;
138 using Base::jacobian;
139 using Base::jacobianInverse;
141 GlobalVector origin ()
const {
return origin_; }
142 const GeometryCache &geometryCache ()
const {
return entityInfo().geometryCache(); }
144 const GridLevel &gridLevel ()
const {
return entityInfo().gridLevel(); }
146 const EntityInfo &entityInfo ()
const {
return entityInfo_; }
147 EntityInfo &entityInfo () {
return entityInfo_; }
150 GlobalVector computeOrigin ()
const
152 const GlobalVector &h = gridLevel().h();
153 GlobalVector origin = gridLevel().domain().cube().origin();
154 for(
int i = 0; i < dimension; ++i )
155 origin[ i ] += (entityInfo().
id()[ i ] / 2) * h[ i ];
159 EntityInfo entityInfo_;
160 GlobalVector origin_;
168 template<
int mydim,
int cdim,
class Gr
id >
169 class SPLocalGeometry
170 :
public SPBasicGeometry< mydim, cdim, Grid, SPLocalGeometry< mydim, cdim, Grid > >
172 typedef SPLocalGeometry< mydim, cdim, Grid > This;
173 typedef SPBasicGeometry< mydim, cdim, Grid, This > Base;
176 typedef typename Base::Traits Traits;
179 typedef typename Base::ctype ctype;
181 static const int mydimension = Base::mydimension;
182 static const int dimension = Base::dimension;
183 static const int codimension = Base::codimension;
185 typedef typename Base::ReferenceCube ReferenceCube;
186 typedef typename Base::GeometryCache GeometryCache;
188 typedef typename Base::GlobalVector GlobalVector;
189 typedef typename Base::LocalVector LocalVector;
192 SPLocalGeometry (
const GeometryCache &geometryCache,
193 const GlobalVector &origin )
194 : geometryCache_( geometryCache ),
198 using Base::jacobianTransposed;
199 using Base::jacobianInverseTransposed;
201 using Base::jacobian;
202 using Base::jacobianInverse;
204 GlobalVector origin ()
const {
return origin_; }
205 const GeometryCache &geometryCache ()
const {
return geometryCache_; }
208 GeometryCache geometryCache_;
209 GlobalVector origin_;
217 template<
int mydim,
int cdim,
class Gr
id,
class Impl >
218 inline typename SPBasicGeometry< mydim, cdim, Grid, Impl >::GlobalVector
219 SPBasicGeometry< mydim, cdim, Grid, Impl >::global (
const LocalVector &local )
const
221 GlobalVector y( asImpl().origin() );
222 asImpl().geometryCache().jacobianTransposed().umtv( local, y );
227 template<
int mydim,
int cdim,
class Gr
id,
class Impl >
228 inline typename SPBasicGeometry< mydim, cdim, Grid, Impl >::LocalVector
229 SPBasicGeometry< mydim, cdim, Grid, Impl >::local (
const GlobalVector &global )
const
232 GlobalVector y = global - asImpl().origin();
233 asImpl().geometryCache().jacobianInverseTransposed().mtv( y, x );
238 template<
int mydim,
int cdim,
class Gr
id,
class Impl >
239 inline const typename SPBasicGeometry< mydim, cdim, Grid, Impl >::JacobianTransposed &
240 SPBasicGeometry< mydim, cdim, Grid, Impl >::jacobianTransposed (
const LocalVector &local )
const
242 return asImpl().geometryCache().jacobianTransposed();
246 template<
int mydim,
int cdim,
class Gr
id,
class Impl >
247 inline const typename SPBasicGeometry< mydim, cdim, Grid, Impl >::JacobianInverseTransposed &
248 SPBasicGeometry< mydim, cdim, Grid, Impl >::jacobianInverseTransposed (
const LocalVector &local )
const
250 return asImpl().geometryCache().jacobianInverseTransposed();
253 template<
int mydim,
int cdim,
class Gr
id,
class Impl >
254 inline auto SPBasicGeometry< mydim, cdim, Grid, Impl >::jacobian (
const LocalVector &local )
const
262 template<
int mydim,
int cdim,
class Gr
id,
class Impl >
263 inline auto SPBasicGeometry< mydim, cdim, Grid, Impl >::jacobianInverse (
const LocalVector &local )
const
Traits for type conversions and type information.
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:132
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
Dune namespace.
Definition: alignedallocator.hh:13
auto transposedView(const Matrix &matrix)
Create a view modelling the transposed matrix.
Definition: transpose.hh:261
A unique label for each type of element that can occur in a grid.