1 #ifndef DUNE_FEM_SPACE_LAGRANGE_GENERICGEOMETRY_HH 2 #define DUNE_FEM_SPACE_LAGRANGE_GENERICGEOMETRY_HH 5 #include <dune/common/fvector.hh> 8 #include <dune/geometry/type.hh> 11 #include <dune/fem/misc/metaprogramming.hh> 66 template<
unsigned int codim >
69 static_assert( (codim <= dimension),
"Codimension must be less or equal to dimension." );
78 return ((codim == 0) ? 1 : 0);
88 template<
class BaseGeometry >
96 static const unsigned int dimension = BaseGeometryType::dimension + 1;
98 template<
unsigned int codim >
101 static_assert( (codim <= dimension),
"Codimension must be less or equal to dimension." );
105 = MetaIf< (codim > 0),
107 MetaInt< Protect< BaseGeometryType::template Codim, codim, PointGeometry::template Codim< 0 >, dimension >::
numSubEntities > >,
108 MetaInt< 1 > >::value;
116 const unsigned int sameCodimCount = BaseGeometryType::numSubEntities( codim-1 );
117 if( codim < dimension )
118 return sameCodimCount + BaseGeometryType::numSubEntities( codim );
120 return (codim == dimension ? sameCodimCount+1 : 0);
133 template<
class FirstGeometry,
class SecondGeometry >
143 static const unsigned int dimension = FirstGeometryType::dimension + SecondGeometryType::dimension;
145 template<
unsigned int codim >
148 static_assert( (codim <= dimension),
"Codimension must be less or equal to dimension." );
150 template<
unsigned int i >
151 struct NumSubEntities
152 :
public MetaInt< FirstGeometryType::template Codim< codim-i >::numSubEntities * SecondGeometryType::template Codim< i >::numSubEntities >
156 static const unsigned int numSubEntities = Loop< MetaPlus, NumSubEntities, codim >::value;
162 unsigned int cnt = 0;
163 for(
unsigned int i = 0; i <= codim; ++i )
164 cnt += FirstGeometryType::numSubEntities( codim - i ) * SecondGeometryType::numSubEntities( i );
171 template<
unsigned int id,
unsigned int dim >
174 static_assert( (
id < (1 << dim)),
"id too large." );
176 static const bool isPrism = ((
id >> (dim-1)) != 0);
198 typedef typename conditional< isPrism, Prism< true >, Pyramid< false > >::type::GenericGeometryType
202 template<
unsigned int id >
205 static_assert( (
id < 2),
"id too large." );
213 template<
unsigned int id >
216 static_assert( (
id < 1),
"id too large." );
229 template<
class Geometry,
class Field,
unsigned int offset = 0 >
234 template<
class Field,
unsigned int offset >
242 static const unsigned int dimension = GeometryType::dimension;
252 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
255 ThisType &operator= (
const FieldType s )
261 ThisType &operator= (
const FieldVector< FieldType, sz > &x )
263 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
267 ThisType &operator= (
const ThisType &v )
272 ThisType &operator*= (
const FieldType s )
277 ThisType &operator+= (
const ThisType &v )
282 ThisType &operator-= (
const ThisType &v )
287 const FieldType &operator[] (
const unsigned int i )
const 289 DUNE_THROW( RangeError,
"LocalCoordinate: No such index." );
292 FieldType &operator[] (
const unsigned int i )
294 DUNE_THROW( RangeError,
"LocalCoordinate: No such index." );
300 template<
class BaseGeometry,
class Field,
unsigned int offset >
310 static const unsigned int dimension = GeometryType::dimension;
316 static const unsigned int index = offset + BaseGeometryType::dimension;
323 : myCoordinate_( x[ index ] ),
326 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
329 ThisType &operator= (
const FieldType s )
337 ThisType &operator= (
const FieldVector< FieldType, sz > &x )
339 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
341 myCoordinate_ = x[ index ];
346 ThisType &operator= (
const ThisType &v )
348 myCoordinate_ = v.myCoordinate_;
349 baseCoordinate_ = v.baseCoordinate_;
353 ThisType &operator*= (
const FieldType s )
356 baseCoordinate_ *= s;
360 ThisType &operator+= (
const ThisType &v )
362 myCoordinate_ += v.myCoordinate_;
363 baseCoordinate_ += v.baseCoordinate_;
367 ThisType &operator-= (
const ThisType &v )
369 myCoordinate_ -= v.myCoordinate_;
370 baseCoordinate_ -= v.baseCoordinate_;
374 const FieldType &operator[] (
const unsigned int i )
const 377 return myCoordinate_;
379 return baseCoordinate_[ i ];
382 FieldType &operator[] (
const unsigned int i )
385 return myCoordinate_;
387 return baseCoordinate_[ i ];
392 return myCoordinate_;
397 return myCoordinate_;
400 const BaseCoordinateType &
base ()
const 402 return baseCoordinate_;
407 return baseCoordinate_;
411 FieldType myCoordinate_;
412 BaseCoordinateType baseCoordinate_;
417 template<
class FirstGeometry,
class SecondGeometry,
class Field,
unsigned int offset >
427 static const unsigned int dimension = GeometryType::dimension;
432 static const unsigned int firstOffset = offset;
433 static const unsigned int secondOffset = offset + FirstGeometryType::dimension;
444 : firstCoordinate_( x ),
445 secondCoordinate_( x )
447 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
450 ThisType &operator= (
const FieldType s )
452 firstCoordinate_ = s;
453 secondCoordinate_ = s;
458 ThisType &operator= (
const FieldVector< FieldType, sz > &x )
460 static_assert( (sz >= offset + dimension),
"Invalid vector size" );
462 firstCoordinate_ = x;
463 secondCoordinate_ = x;
467 ThisType &operator= (
const ThisType &v )
469 firstCoordinate_ = v;
470 secondCoordinate_ = v;
474 ThisType &operator*= (
const FieldType s )
476 firstCoordinate_ *= s;
477 secondCoordinate_ *= s;
481 ThisType &operator+= (
const ThisType &v )
483 firstCoordinate_ += v;
484 secondCoordinate_ += v;
488 ThisType &operator-= (
const ThisType &v )
490 firstCoordinate_ -= v;
491 secondCoordinate_ -= v;
495 const FieldType &operator[] (
const unsigned int i )
const 497 if( i < secondOffset )
498 return firstCoordinate_[ i ];
500 return secondCoordinate_[ i ];
503 FieldType &operator[] (
const unsigned int i )
505 if( i < secondOffset )
506 return firstCoordinate_[ i ];
508 return secondCoordinate_[ i ];
511 const FirstCoordinateType &
first ()
const 513 return firstCoordinate_;
518 return firstCoordinate_;
521 const SecondCoordinateType &
second ()
const 523 return secondCoordinate_;
528 return secondCoordinate_;
532 FirstCoordinateType firstCoordinate_;
533 SecondCoordinateType secondCoordinate_;
540 #endif // #ifndef DUNE_FEM_SPACE_LAGRANGE_GENERICGEOMETRY_HH
PyramidGeometry< BaseGeometryType > GeometryType
Definition: genericgeometry.hh:308
Definition: genericgeometry.hh:230
Definition: genericgeometry.hh:67
Definition: genericgeometry.hh:301
static const unsigned int dimension
dimension of the geometry object
Definition: genericgeometry.hh:64
FirstGeometry FirstGeometryType
type of the first base geometry
Definition: genericgeometry.hh:138
BaseCoordinateType & base()
Definition: genericgeometry.hh:405
static unsigned int numSubEntities(unsigned int codim)
number of subentites of a given codimension
Definition: genericgeometry.hh:160
static unsigned int numSubEntities(unsigned int codim)
number of subentites of a given codimension
Definition: genericgeometry.hh:112
Field FieldType
Definition: genericgeometry.hh:312
LocalCoordinate< SecondGeometryType, FieldType, secondOffset > SecondCoordinateType
Definition: genericgeometry.hh:437
LocalCoordinate(const FieldVector< FieldType, sz > &x)
Definition: genericgeometry.hh:250
generic geometry modelling a pyramid over a base geometry
Definition: genericgeometry.hh:89
FirstGeometry FirstGeometryType
Definition: genericgeometry.hh:423
Field FieldType
Definition: genericgeometry.hh:244
conditional< isPrism, Prism< true >, Pyramid< false > >::type::GenericGeometryType GenericGeometryType
Definition: genericgeometry.hh:199
Definition: genericgeometry.hh:418
PyramidGeometry< PointGeometry > GenericGeometryType
Definition: genericgeometry.hh:210
LocalCoordinate()
Definition: genericgeometry.hh:318
Definition: genericgeometry.hh:146
Definition: coordinate.hh:4
LocalCoordinate()
Definition: genericgeometry.hh:246
Definition: genericgeometry.hh:172
generic geometry modelling a single point
Definition: genericgeometry.hh:60
const FirstCoordinateType & first() const
Definition: genericgeometry.hh:511
LocalCoordinate< FirstGeometryType, FieldType, firstOffset > FirstCoordinateType
Definition: genericgeometry.hh:436
static const unsigned int numSubEntities
Definition: genericgeometry.hh:72
Double operator*(const Double &a, const Double &b)
Definition: double.hh:495
BaseGeometry BaseGeometryType
Definition: genericgeometry.hh:306
BaseGeometry BaseGeometryType
type of base geometry
Definition: genericgeometry.hh:93
PointGeometry GeometryType
Definition: genericgeometry.hh:240
const SecondCoordinateType & second() const
Definition: genericgeometry.hh:521
Definition: genericgeometry.hh:235
LocalCoordinate(const FieldVector< FieldType, sz > &x)
Definition: genericgeometry.hh:443
LocalCoordinate(const FieldVector< FieldType, sz > &x)
Definition: genericgeometry.hh:322
Definition: genericgeometry.hh:99
FirstCoordinateType & first()
Definition: genericgeometry.hh:516
SecondGeometry SecondGeometryType
type of the second base geometry
Definition: genericgeometry.hh:140
SecondCoordinateType & second()
Definition: genericgeometry.hh:526
Field FieldType
Definition: genericgeometry.hh:429
LocalCoordinate()
Definition: genericgeometry.hh:439
PointGeometry GenericGeometryType
Definition: genericgeometry.hh:221
ProductGeometry< FirstGeometryType, SecondGeometryType > GeometryType
Definition: genericgeometry.hh:425
LocalCoordinate< BaseGeometry, FieldType, offset > BaseCoordinateType
Definition: genericgeometry.hh:314
static unsigned int numSubEntities(unsigned int codim)
number of subentites of a given codimension
Definition: genericgeometry.hh:76
generic geometry modelling the product of two base geometries
Definition: genericgeometry.hh:134
SecondGeometry SecondGeometryType
Definition: genericgeometry.hh:424
const BaseCoordinateType & base() const
Definition: genericgeometry.hh:400