1#ifndef DUNE_FEM_SPACE_LAGRANGE_GENERICGEOMETRY_HH
2#define DUNE_FEM_SPACE_LAGRANGE_GENERICGEOMETRY_HH
7#include <dune/common/fvector.hh>
10#include <dune/geometry/type.hh>
13#include <dune/fem/misc/metaprogramming.hh>
68 template<
unsigned int codim >
71 static_assert( (codim <=
dimension),
"Codimension must be less or equal to dimension." );
80 return ((codim == 0) ? 1 : 0);
90 template<
class BaseGeometry >
98 static const unsigned int dimension = BaseGeometryType::dimension + 1;
100 template<
unsigned int codim >
103 static_assert( (codim <=
dimension),
"Codimension must be less or equal to dimension." );
107 = MetaIf< (codim > 0),
110 MetaInt< 1 > >::value;
118 const unsigned int sameCodimCount = BaseGeometryType::numSubEntities( codim-1 );
120 return sameCodimCount + BaseGeometryType::numSubEntities( codim );
122 return (codim ==
dimension ? sameCodimCount+1 : 0);
135 template<
class FirstGeometry,
class SecondGeometry >
145 static const unsigned int dimension = FirstGeometryType::dimension + SecondGeometryType::dimension;
147 template<
unsigned int codim >
150 static_assert( (codim <=
dimension),
"Codimension must be less or equal to dimension." );
152 template<
unsigned int i >
153 struct NumSubEntities
154 :
public MetaInt< FirstGeometryType::template Codim< codim-i >::numSubEntities * SecondGeometryType::template Codim< i >::numSubEntities >
158 static const unsigned int numSubEntities = Loop< MetaPlus, NumSubEntities, codim >::value;
164 unsigned int cnt = 0;
165 for(
unsigned int i = 0; i <= codim; ++i )
166 cnt += FirstGeometryType::numSubEntities( codim - i ) * SecondGeometryType::numSubEntities( i );
173 template<
unsigned int id,
unsigned int dim >
176 static_assert( (
id < (1 << dim)),
"id too large." );
178 static const bool isPrism = ((
id >> (dim-1)) != 0);
200 typedef typename std::conditional< isPrism, Prism< true >, Pyramid< false > >::type::ImplType
204 template<
unsigned int id >
207 static_assert( (
id < 2),
"id too large." );
215 template<
unsigned int id >
218 static_assert( (
id < 1),
"id too large." );
231 template<
class Geometry,
class Field,
unsigned int offset = 0 >
236 template<
class Field,
unsigned int offset >
244 static const unsigned int dimension = GeometryType::dimension;
254 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
263 ThisType &operator= (
const FieldVector< FieldType, sz > &x )
265 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
289 const FieldType &operator[] (
const unsigned int i )
const
291 DUNE_THROW( RangeError,
"LocalCoordinate: No such index." );
296 DUNE_THROW( RangeError,
"LocalCoordinate: No such index." );
302 template<
class BaseGeometry,
class Field,
unsigned int offset >
312 static const unsigned int dimension = GeometryType::dimension;
318 static const unsigned int index = offset + BaseGeometryType::dimension;
325 : myCoordinate_( x[ index ] ),
328 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
339 ThisType &operator= (
const FieldVector< FieldType, sz > &x )
341 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
343 myCoordinate_ = x[ index ];
350 myCoordinate_ = v.myCoordinate_;
351 baseCoordinate_ = v.baseCoordinate_;
358 baseCoordinate_ *= s;
364 myCoordinate_ += v.myCoordinate_;
365 baseCoordinate_ += v.baseCoordinate_;
371 myCoordinate_ -= v.myCoordinate_;
372 baseCoordinate_ -= v.baseCoordinate_;
376 const FieldType &operator[] (
const unsigned int i )
const
379 return myCoordinate_;
381 return baseCoordinate_[ i ];
387 return myCoordinate_;
389 return baseCoordinate_[ i ];
394 return myCoordinate_;
399 return myCoordinate_;
404 return baseCoordinate_;
409 return baseCoordinate_;
413 FieldType myCoordinate_;
414 BaseCoordinateType baseCoordinate_;
419 template<
class FirstGeometry,
class SecondGeometry,
class Field,
unsigned int offset >
429 static const unsigned int dimension = GeometryType::dimension;
434 static const unsigned int firstOffset = offset;
435 static const unsigned int secondOffset = offset + FirstGeometryType::dimension;
446 : firstCoordinate_( x ),
447 secondCoordinate_( x )
449 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
454 firstCoordinate_ = s;
455 secondCoordinate_ = s;
460 ThisType &operator= (
const FieldVector< FieldType, sz > &x )
462 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
464 firstCoordinate_ = x;
465 secondCoordinate_ = x;
471 firstCoordinate_ = v;
472 secondCoordinate_ = v;
478 firstCoordinate_ *= s;
479 secondCoordinate_ *= s;
485 firstCoordinate_ += v;
486 secondCoordinate_ += v;
492 firstCoordinate_ -= v;
493 secondCoordinate_ -= v;
497 const FieldType &operator[] (
const unsigned int i )
const
499 if( i < secondOffset )
500 return firstCoordinate_[ i ];
502 return secondCoordinate_[ i ];
507 if( i < secondOffset )
508 return firstCoordinate_[ i ];
510 return secondCoordinate_[ i ];
515 return firstCoordinate_;
520 return firstCoordinate_;
525 return secondCoordinate_;
530 return secondCoordinate_;
534 FirstCoordinateType firstCoordinate_;
535 SecondCoordinateType secondCoordinate_;
Definition: bindguard.hh:11
Double operator*(const Double &a, const Double &b)
Definition: double.hh:506
generic geometry modelling a single point
Definition: genericgeometry.hh:63
static unsigned int numSubEntities(unsigned int codim)
number of subentites of a given codimension
Definition: genericgeometry.hh:78
static const unsigned int dimension
dimension of the geometry object
Definition: genericgeometry.hh:66
Definition: genericgeometry.hh:70
static const unsigned int numSubEntities
Definition: genericgeometry.hh:74
generic geometry modelling a pyramid over a base geometry
Definition: genericgeometry.hh:92
static unsigned int numSubEntities(unsigned int codim)
number of subentites of a given codimension
Definition: genericgeometry.hh:114
BaseGeometry BaseGeometryType
type of base geometry
Definition: genericgeometry.hh:95
static const unsigned int dimension
dimension of the geometry object
Definition: genericgeometry.hh:98
Definition: genericgeometry.hh:102
static const unsigned int numSubEntities
Definition: genericgeometry.hh:107
generic geometry modelling the product of two base geometries
Definition: genericgeometry.hh:137
static const unsigned int dimension
dimension of the geometry object
Definition: genericgeometry.hh:145
SecondGeometry SecondGeometryType
type of the second base geometry
Definition: genericgeometry.hh:142
static unsigned int numSubEntities(unsigned int codim)
number of subentites of a given codimension
Definition: genericgeometry.hh:162
FirstGeometry FirstGeometryType
type of the first base geometry
Definition: genericgeometry.hh:140
Definition: genericgeometry.hh:149
static const unsigned int numSubEntities
Definition: genericgeometry.hh:158
Definition: genericgeometry.hh:175
std::conditional< isPrism, Prism< true >, Pyramid< false > >::type::ImplType ImplType
Definition: genericgeometry.hh:201
static const unsigned int dimension
Definition: genericgeometry.hh:198
PyramidGeometry< PointGeometry > ImplType
Definition: genericgeometry.hh:212
PointGeometry ImplType
Definition: genericgeometry.hh:223
Definition: genericgeometry.hh:232
Definition: genericgeometry.hh:238
LocalCoordinate(const FieldVector< FieldType, sz > &x)
Definition: genericgeometry.hh:252
PointGeometry GeometryType
Definition: genericgeometry.hh:242
LocalCoordinate()
Definition: genericgeometry.hh:248
Field FieldType
Definition: genericgeometry.hh:246
Definition: genericgeometry.hh:304
BaseGeometry BaseGeometryType
Definition: genericgeometry.hh:308
BaseCoordinateType & base()
Definition: genericgeometry.hh:407
const BaseCoordinateType & base() const
Definition: genericgeometry.hh:402
Field FieldType
Definition: genericgeometry.hh:314
LocalCoordinate< BaseGeometry, FieldType, offset > BaseCoordinateType
Definition: genericgeometry.hh:316
LocalCoordinate(const FieldVector< FieldType, sz > &x)
Definition: genericgeometry.hh:324
LocalCoordinate()
Definition: genericgeometry.hh:320
PyramidGeometry< BaseGeometryType > GeometryType
Definition: genericgeometry.hh:310
Definition: genericgeometry.hh:421
LocalCoordinate()
Definition: genericgeometry.hh:441
const SecondCoordinateType & second() const
Definition: genericgeometry.hh:523
LocalCoordinate< SecondGeometryType, FieldType, secondOffset > SecondCoordinateType
Definition: genericgeometry.hh:439
LocalCoordinate(const FieldVector< FieldType, sz > &x)
Definition: genericgeometry.hh:445
const FirstCoordinateType & first() const
Definition: genericgeometry.hh:513
LocalCoordinate< FirstGeometryType, FieldType, firstOffset > FirstCoordinateType
Definition: genericgeometry.hh:438
ProductGeometry< FirstGeometryType, SecondGeometryType > GeometryType
Definition: genericgeometry.hh:427
SecondCoordinateType & second()
Definition: genericgeometry.hh:528
FirstCoordinateType & first()
Definition: genericgeometry.hh:518
Field FieldType
Definition: genericgeometry.hh:431
FirstGeometry FirstGeometryType
Definition: genericgeometry.hh:425
SecondGeometry SecondGeometryType
Definition: genericgeometry.hh:426