dune-fem 2.12-git
Loading...
Searching...
No Matches
space/basisfunctionset/default.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_BASISFUNCTIONSET_DEFAULT_HH
2#define DUNE_FEM_BASISFUNCTIONSET_DEFAULT_HH
3
4// C++ includes
5#include <cassert>
6#include <cstddef>
7#include <memory>
8#include <type_traits>
9#include <utility>
10#include <optional>
11
12// dune-geometry includes
14#include <dune/geometry/type.hh>
15
18
19// dune-fem includes
25#include <dune/fem/version.hh>
26
29
30namespace Dune
31{
32
33 namespace Fem
34 {
35 template< class Entity, class ShapeFunctionSet >
37 {
40
41 public:
43 typedef typename BaseType :: EntityType EntityType;
45 typedef typename BaseType :: Geometry Geometry;
46
49
50 // if underlying shape function set was created with storage CodegenStorage
51 // then this value should be true (see selectcaching.hh)
52 static constexpr bool codegenShapeFunctionSet = detail::IsCodegenShapeFunctionSet< ShapeFunctionSetType >::value;
53
54 static const int pointSetId = detail::SelectPointSetId< ShapeFunctionSetType >::value;
55
58
65
71
78
79 using BaseType :: entity;
80 using BaseType :: valid;
81 using BaseType :: geometry;
82 using BaseType :: type;
83 using BaseType :: referenceElement;
84
85 // Non-interface methods
86 // ---------------------
87
90
91 // Basis Function Set Interface Methods
92 // ------------------------------------
93
95 int order () const { return shapeFunctionSet().order(); }
96
98 std::size_t size () const { return shapeFunctionSet().size(); }
99
100 protected:
102 };
103
104
105 // DefaultBasisFunctionSet
106 // -----------------------
107
121 template< class Entity, class ShapeFunctionSet >
123 : public BasisFunctionSetStorage< Entity, ShapeFunctionSet >
124 {
127
128 public:
131
133 typedef typename BaseType::Geometry Geometry ;
134
136 typedef typename Geometry::ctype ctype;
137
140
141 // if underlying shape function set was created with storage CodegenStorage
142 // then this value should be true (see selectcaching.hh)
144
145 protected:
149
151
152 public:
153 // slight misuse of struct ToLocalFunctionSpace!!!
156
158 typedef typename FunctionSpaceType::RangeType RangeType;
160 typedef typename FunctionSpaceType::DomainType DomainType;
162 typedef typename FunctionSpaceType::JacobianRangeType JacobianRangeType;
164 typedef typename FunctionSpaceType::HessianRangeType HessianRangeType;
165
166 typedef typename FunctionSpaceType::ScalarFunctionSpaceType ScalarFunctionSpaceType;
167
168 typedef typename ScalarFunctionSpaceType::RangeType ScalarRangeType;
169 typedef typename ScalarFunctionSpaceType::JacobianRangeType ScalarJacobianRangeType;
170
172 typedef std::decay_t< decltype( Dune::ReferenceElements< ctype, Geometry::coorddimension >::general( std::declval< const Dune::GeometryType & >() ) ) > ReferenceElementType;
173
174 static const int pointSetId = detail::SelectPointSetId< ShapeFunctionSetType >::value;
175
178
184
187
188 using BaseType :: entity;
189 using BaseType :: geometry;
190 using BaseType :: type;
192 using BaseType :: order;
193 using BaseType :: size;
195
199 template< class QuadratureType, class Vector, class DofVector >
200 void axpy ( const QuadratureType &quad, const Vector &values, DofVector &dofs ) const
201 {
202 axpyImpl( quad, values, dofs, values[ 0 ] );
203 }
204
211 template< class QuadratureType, class VectorA, class VectorB, class DofVector >
212 void axpy ( const QuadratureType &quad, const VectorA &valuesA, const VectorB &valuesB, DofVector &dofs ) const
213 {
214 assert( valuesA.size() > 0 );
215 assert( valuesB.size() > 0 );
216
217 axpyImpl( quad, valuesA, dofs, valuesA[ 0 ] );
218 axpyImpl( quad, valuesB, dofs, valuesB[ 0 ] );
219 }
220
224 template< class Point, class DofVector >
225 void axpy ( const Point &x, const RangeType &valueFactor, DofVector &dofs ) const
226 {
229 }
230
234 template< class Point, class DofVector >
235 void axpy ( const Point &x, const JacobianRangeType &jacobianFactor, DofVector &dofs ) const
236 {
237 typedef typename Geometry::JacobianInverseTransposed GeometryJacobianInverseTransposedType;
238 const Geometry &geo = geometry();
239 const GeometryJacobianInverseTransposedType &gjit = geo.jacobianInverseTransposed( coordinate( x ) );
240 LocalJacobianRangeType tmpJacobianFactor;
241 for( int r = 0; r < FunctionSpaceType::dimRange; ++r )
242 gjit.mtv( jacobianFactor[ r ], tmpJacobianFactor[ r ] );
243
246 }
247
251 template< class Point, class DofVector >
252 void axpy ( const Point &x, const RangeType &valueFactor, const JacobianRangeType &jacobianFactor,
253 DofVector &dofs ) const
254 {
255 axpy( x, valueFactor, dofs );
256 axpy( x, jacobianFactor, dofs );
257 }
258
261 template< class Point, class DofVector >
262 void axpy ( const Point &x, const HessianRangeType &hessianFactor, DofVector &dofs ) const
263 {
264 typedef typename Geometry::JacobianInverseTransposed GeometryJacobianInverseTransposedType;
265 const Geometry &geo = geometry();
266 const GeometryJacobianInverseTransposedType &gjit = geo.jacobianInverseTransposed( coordinate( x ) );
267 LocalHessianRangeType tmpHessianFactor( RangeFieldType(0) );
268 hessianTransformation(gjit.transposed(),hessianFactor,tmpHessianFactor);
269
272 }
273
274
276 template< class QuadratureType, class DofVector, class RangeArray >
277 void evaluateAll ( const QuadratureType &quad, const DofVector &dofs, RangeArray &ranges ) const
278 {
279 assert( ranges.size() >= quad.nop() );
280
281 // if shape function set supports codegen and quadrature supports caching
283 {
284 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, RangeArray, DofVector > Traits;
285 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
286
287 // get base function evaluate caller
288 const auto& baseEval = BaseEvaluationType::storage( *this, rangeCache( quad ), quad );
289
290 // true if implementation exists, otherwise this is a nullptr
291 if( baseEval )
292 {
293 baseEval->evaluateRanges( quad, dofs, ranges );
294 return ;
295 }
296 }
297
298 {
299 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
300 const unsigned int nop = quad.nop();
301 for( unsigned int qp = 0; qp < nop; ++qp )
302 {
303 evaluateAll( quad[ qp ], dofs, ranges[ qp ] );
304 }
305 }
306 }
307
309 template< class Point, class DofVector >
310 void evaluateAll ( const Point &x, const DofVector &dofs, RangeType &value ) const
311 {
312 value = RangeType( 0 );
315 }
316
318 template< class Point, class RangeArray >
319 void evaluateAll ( const Point &x, RangeArray &values ) const
320 {
321 assert( values.size() >= size() );
322 std::fill( values.begin(), values.end(), RangeType(0) );
323 AssignFunctor< RangeArray > f( values );
325 }
326
328 template< class QuadratureType, class DofVector, class JacobianArray >
329 void jacobianAll ( const QuadratureType &quad, const DofVector &dofs, JacobianArray &jacobians ) const
330 {
331 assert( jacobians.size() >= quad.nop() );
332
333 // if shape function set supports codegen and quadrature supports caching
335 {
336 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, JacobianArray, DofVector, Geometry > Traits;
337 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
338
339 // get base function evaluate caller (calls axpyRanges)
340 const auto& baseEval = BaseEvaluationType::storage( *this, jacobianCache( quad ), quad );
341
342 // true if implementation exists
343 if( baseEval )
344 {
345 // call appropriate axpyJacobian method
346 baseEval->evaluateJacobians( quad, geometry(), dofs, jacobians );
347 return ;
348 }
349 }
350
351 {
352 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
353 const unsigned int nop = quad.nop();
354 for( unsigned int qp = 0; qp < nop; ++qp )
355 {
356 jacobianAll( quad[ qp ], dofs, jacobians[ qp ] );
357 }
358 }
359 }
360
362 template< class Point, class DofVector >
363 void jacobianAll ( const Point &x, const DofVector &dofs, JacobianRangeType &jacobian ) const
364 {
365 LocalJacobianRangeType localJacobian( RangeFieldType( 0 ) );
368
369 typedef JacobianTransformation< Geometry > Transformation;
370 Transformation transformation( geometry(), coordinate( x ) );
371 transformation( localJacobian, jacobian );
372 }
373
375 template< class Point, class JacobianRangeArray >
376 void jacobianAll ( const Point &x, JacobianRangeArray &jacobians ) const
377 {
378 assert( jacobians.size() >= size() );
379 typedef JacobianTransformation< Geometry > Transformation;
380
381 Transformation transformation( geometry(), coordinate( x ) );
382 AssignFunctor< JacobianRangeArray, Transformation > f( jacobians, transformation );
384 }
385
387 template< class QuadratureType, class DofVector, class HessianArray >
388 void hessianAll ( const QuadratureType &quad, const DofVector &dofs, HessianArray &hessians ) const
389 {
390 assert( hessians.size() >= quad.nop() );
391 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
392 const unsigned int nop = quad.nop();
393 for( unsigned int qp = 0; qp < nop; ++qp )
394 {
395 hessianAll( quad[ qp ], dofs, hessians[ qp ] );
396 }
397 }
398
400 template< class Point, class DofVector >
401 void hessianAll ( const Point &x, const DofVector &dofs, HessianRangeType &hessian ) const
402 {
406
407 typedef HessianTransformation< Geometry > Transformation;
408 Transformation transformation( geometry(), coordinate( x ) );
409 transformation( localHessian, hessian );
410 }
411
413 template< class Point, class HessianRangeArray >
414 void hessianAll ( const Point &x, HessianRangeArray &hessians ) const
415 {
416 assert( hessians.size() >= size() );
417 typedef HessianTransformation< Geometry > Transformation;
418 Transformation transformation( geometry(), coordinate( x ) );
419 AssignFunctor< HessianRangeArray, Transformation > f( hessians, transformation );
421 }
422 protected:
424 template< class QuadratureType, class RangeArray, class DofVector >
425 void axpyImpl ( const QuadratureType &quad, const RangeArray &rangeFactors, DofVector &dofs, const RangeType& ) const
426 {
427 assert( rangeFactors.size() >= quad.nop() );
428
429 // if shape function set supports codegen and quadrature supports caching
431 {
432 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, RangeArray, DofVector > Traits;
433 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
434
435 // get base function evaluate caller (calls axpyRanges)
436 const auto& baseEval = BaseEvaluationType::storage( *this, rangeCache( quad ), quad );
437
438 // true if implementation exists
439 if( baseEval )
440 {
441 baseEval->axpyRanges( quad, rangeFactors, dofs );
442 return ;
443 }
444 }
445
446 {
447 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
448 const unsigned int nop = quad.nop();
449 for( unsigned int qp = 0; qp < nop; ++qp )
450 {
451 axpy( quad[ qp ], rangeFactors[ qp ], dofs );
452 }
453 }
454 }
455
457 template< class QuadratureType, class JacobianArray, class DofVector >
458 void axpyImpl ( const QuadratureType &quad, const JacobianArray &jacobianFactors, DofVector &dofs, const JacobianRangeType& ) const
459 {
460 assert( jacobianFactors.size() >= quad.nop() );
461 // if shape function set supports codegen and quadrature supports caching
463 {
464 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, JacobianArray, DofVector, Geometry > Traits;
465 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
466
467 // get base function evaluate caller (calls axpyRanges)
468 const auto& baseEval = BaseEvaluationType::storage( *this, jacobianCache( quad ), quad );
469
470 // true if implementation exists
471 if( baseEval )
472 {
473 // call appropriate axpyRanges method
474 baseEval->axpyJacobians( quad, geometry(), jacobianFactors, dofs );
475 return ;
476 }
477 }
478
479 {
480 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
481 const unsigned int nop = quad.nop();
482 for( unsigned int qp = 0; qp < nop; ++qp )
483 {
484 axpy( quad[ qp ], jacobianFactors[ qp ], dofs );
485 }
486 }
487 }
488
490 template< class QuadratureType, class HessianArray, class DofVector >
491 void axpyImpl ( const QuadratureType &quad, const HessianArray &hessianFactors, DofVector &dofs, const HessianRangeType& ) const
492 {
493 assert( hessianFactors.size() >= quad.nop() );
494 /* TODO add code generation for hessians
495 // if shape function set supports codegen and quadrature supports caching
496 if constexpr ( codegenShapeFunctionSet && std::is_base_of< CachingInterface, QuadratureType > :: value)
497 {
498 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, HessianArray, DofVector, Geometry > Traits;
499 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
500
501 // get base function evaluate caller (calls axpyRanges)
502 const auto& baseEval = BaseEvaluationType::storage( *this, hessianCache( quad ), quad );
503
504 // true if implementation exists
505 if( baseEval )
506 {
507 // call appropriate axpyRanges method
508 const Geometry &geo = geometry();
509 baseEval->axpyHessian( quad, geo, hessianFactors, dofs );
510 return ;
511 }
512 }
513 */
514 {
515 const unsigned int nop = quad.nop();
516 for( unsigned int qp = 0; qp < nop; ++qp )
517 {
518 axpy( quad[ qp ], hessianFactors[ qp ], dofs );
519 }
520 }
521 }
522
523 template <class QuadratureType>
524 const auto& rangeCache( const QuadratureType& quad ) const
525 {
526 return shapeFunctionSet().scalarShapeFunctionSet().impl().rangeCache( quad );
527 }
528
529 template <class QuadratureType>
530 const auto& jacobianCache( const QuadratureType& quad ) const
531 {
532 return shapeFunctionSet().scalarShapeFunctionSet().impl().jacobianCache( quad );
533 }
534 };
535
536 } // namespace Fem
537
538} // namespace Dune
539
540#endif // #ifndef DUNE_FEM_BASISFUNCTIONSET_DEFAULT_HH
IteratorRange< typename DF::DofIteratorType > dofs(DF &df)
Iterates over all DOFs.
Definition rangegenerators.hh:76
static const Point & coordinate(const Point &x)
Definition coordinate.hh:14
void hessianTransformation(const GeometryJacobianInverseTransposed &gjit, const ExplicitFieldVector< FieldMatrix< K, GeometryJacobianInverseTransposed::cols, GeometryJacobianInverseTransposed::cols >, SIZE > &a, ExplicitFieldVector< FieldMatrix< K, GeometryJacobianInverseTransposed::rows, GeometryJacobianInverseTransposed::rows >, SIZE > &b)
Definition transformation.hh:60
Implementation::JacobianInverseTransposed JacobianInverseTransposed
GridImp::ctype ctype
Definition explicitfieldvector.hh:75
Definition misc/functor.hh:31
Definition space/basisfunctionset/default.hh:37
BaseType::Geometry Geometry
type of geometry
Definition space/basisfunctionset/default.hh:45
std::size_t size() const
return size of basis function set
Definition space/basisfunctionset/default.hh:98
ShapeFunctionSet ShapeFunctionSetType
shape function set type
Definition space/basisfunctionset/default.hh:48
ShapeFunctionSetType shapeFunctionSet_
Definition space/basisfunctionset/default.hh:101
BasisFunctionSetStorage()
constructor
Definition space/basisfunctionset/default.hh:57
int order() const
return order of basis function set
Definition space/basisfunctionset/default.hh:95
static const int pointSetId
Definition space/basisfunctionset/default.hh:54
BaseType::EntityType EntityType
entity type
Definition space/basisfunctionset/default.hh:43
BasisFunctionSetStorage(const BasisFunctionSetStorage &other)
Definition space/basisfunctionset/default.hh:66
BasisFunctionSetStorage & operator=(const BasisFunctionSetStorage &other)
Definition space/basisfunctionset/default.hh:72
static constexpr bool codegenShapeFunctionSet
Definition space/basisfunctionset/default.hh:52
BasisFunctionSetStorage(const EntityType &entity, const ShapeFunctionSet &shapeFunctionSet=ShapeFunctionSet())
constructor
Definition space/basisfunctionset/default.hh:60
const ShapeFunctionSetType & shapeFunctionSet() const
return shape function set
Definition space/basisfunctionset/default.hh:89
Definition space/basisfunctionset/default.hh:124
FunctionSpaceType::DomainType DomainType
domain type
Definition space/basisfunctionset/default.hh:160
void evaluateAll(const Point &x, const DofVector &dofs, RangeType &value) const
Definition space/basisfunctionset/default.hh:310
LocalFunctionSpaceType::HessianRangeType LocalHessianRangeType
Definition space/basisfunctionset/default.hh:148
DefaultBasisFunctionSet()
constructor
Definition space/basisfunctionset/default.hh:177
FunctionSpaceType::HessianRangeType HessianRangeType
hessian range type
Definition space/basisfunctionset/default.hh:164
DefaultBasisFunctionSet(const DefaultBasisFunctionSet &other)=default
ToNewDimDomainFunctionSpace< LocalFunctionSpaceType, Geometry::coorddimension >::Type FunctionSpaceType
type of function space
Definition space/basisfunctionset/default.hh:155
void axpy(const QuadratureType &quad, const VectorA &valuesA, const VectorB &valuesB, DofVector &dofs) const
evaluate all basis function and multiply with given values and add to dofs
Definition space/basisfunctionset/default.hh:212
DefaultBasisFunctionSet & operator=(const DefaultBasisFunctionSet &other)=default
void axpy(const Point &x, const RangeType &valueFactor, const JacobianRangeType &jacobianFactor, DofVector &dofs) const
evaluate all basis function and derivatives and multiply with given values and add to dofs
Definition space/basisfunctionset/default.hh:252
FunctionSpaceType::RangeType RangeType
range type
Definition space/basisfunctionset/default.hh:158
ShapeFunctionSetType::FunctionSpaceType LocalFunctionSpaceType
Definition space/basisfunctionset/default.hh:146
LocalFunctionSpaceType::RangeFieldType RangeFieldType
Definition space/basisfunctionset/default.hh:150
LocalFunctionSpaceType::JacobianRangeType LocalJacobianRangeType
Definition space/basisfunctionset/default.hh:147
void axpy(const Point &x, const JacobianRangeType &jacobianFactor, DofVector &dofs) const
evaluate all derivatives of all basis function and multiply with given values and add to dofs
Definition space/basisfunctionset/default.hh:235
void jacobianAll(const Point &x, JacobianRangeArray &jacobians) const
Definition space/basisfunctionset/default.hh:376
DefaultBasisFunctionSet(const EntityType &entity, const ShapeFunctionSet &shapeFunctionSet=ShapeFunctionSet())
constructor
Definition space/basisfunctionset/default.hh:180
const auto & jacobianCache(const QuadratureType &quad) const
Definition space/basisfunctionset/default.hh:530
void axpy(const Point &x, const HessianRangeType &hessianFactor, DofVector &dofs) const
Add H:D^2phi to each dof.
Definition space/basisfunctionset/default.hh:262
FunctionSpaceType::JacobianRangeType JacobianRangeType
jacobian range type
Definition space/basisfunctionset/default.hh:162
void hessianAll(const Point &x, HessianRangeArray &hessians) const
Definition space/basisfunctionset/default.hh:414
void evaluateAll(const QuadratureType &quad, const DofVector &dofs, RangeArray &ranges) const
Definition space/basisfunctionset/default.hh:277
ScalarFunctionSpaceType::RangeType ScalarRangeType
Definition space/basisfunctionset/default.hh:168
void hessianAll(const Point &x, const DofVector &dofs, HessianRangeType &hessian) const
Definition space/basisfunctionset/default.hh:401
void hessianAll(const QuadratureType &quad, const DofVector &dofs, HessianArray &hessians) const
Definition space/basisfunctionset/default.hh:388
void evaluateAll(const Point &x, RangeArray &values) const
Definition space/basisfunctionset/default.hh:319
ScalarFunctionSpaceType::JacobianRangeType ScalarJacobianRangeType
Definition space/basisfunctionset/default.hh:169
BaseType::EntityType EntityType
entity type
Definition space/basisfunctionset/default.hh:130
static const int pointSetId
Definition space/basisfunctionset/default.hh:174
void axpyImpl(const QuadratureType &quad, const HessianArray &hessianFactors, DofVector &dofs, const HessianRangeType &) const
evaluate all basis function and multiply with given values and add to dofs
Definition space/basisfunctionset/default.hh:491
void jacobianAll(const Point &x, const DofVector &dofs, JacobianRangeType &jacobian) const
Definition space/basisfunctionset/default.hh:363
BaseType::Geometry Geometry
geometry
Definition space/basisfunctionset/default.hh:133
BaseType::ShapeFunctionSetType ShapeFunctionSetType
shape function set type
Definition space/basisfunctionset/default.hh:139
const auto & rangeCache(const QuadratureType &quad) const
Definition space/basisfunctionset/default.hh:524
void axpyImpl(const QuadratureType &quad, const RangeArray &rangeFactors, DofVector &dofs, const RangeType &) const
evaluate all basis function and multiply with given values and add to dofs
Definition space/basisfunctionset/default.hh:425
void axpyImpl(const QuadratureType &quad, const JacobianArray &jacobianFactors, DofVector &dofs, const JacobianRangeType &) const
evaluate all basis function and multiply with given values and add to dofs
Definition space/basisfunctionset/default.hh:458
void axpy(const Point &x, const RangeType &valueFactor, DofVector &dofs) const
evaluate all basis function and multiply with given values and add to dofs
Definition space/basisfunctionset/default.hh:225
Geometry::ctype ctype
type of coordinate field
Definition space/basisfunctionset/default.hh:136
FunctionSpaceType::ScalarFunctionSpaceType ScalarFunctionSpaceType
Definition space/basisfunctionset/default.hh:166
void jacobianAll(const QuadratureType &quad, const DofVector &dofs, JacobianArray &jacobians) const
Definition space/basisfunctionset/default.hh:329
void axpy(const QuadratureType &quad, const Vector &values, DofVector &dofs) const
evaluate all basis function and multiply with given values and add to dofs
Definition space/basisfunctionset/default.hh:200
Definition space/basisfunctionset/functor.hh:108
Definition space/basisfunctionset/functor.hh:132
Definition transformation.hh:36
Definition transformation.hh:92
A vector valued function space.
Definition functionspace.hh:60
convert functions space to space with new dim domain
Definition functionspace.hh:246
FunctionSpaceTraits::LinearMappingType JacobianRangeType
Intrinsic type used for the jacobian values has a Dune::FieldMatrix type interface.
Definition functionspaceinterface.hh:75
FunctionSpaceTraits::RangeFieldType RangeFieldType
Intrinsic type used for values in the range field (usually a double)
Definition functionspaceinterface.hh:63
Interface class for shape function sets.
Definition shapefunctionset/shapefunctionset.hh:33
void hessianEach(const Point &x, Functor functor) const
evalute hessian of each shape function
void evaluateEach(const Point &x, Functor functor) const
evalute each shape function
std::size_t size() const
return number of shape functions
int order() const
return order of shape functions
void jacobianEach(const Point &x, Functor functor) const
evalute jacobian of each shape function
implementation of entity and geometry storage for basis function set and local functions
Definition entitygeometry.hh:35
Dune::GeometryType type() const
return geometry type
Definition entitygeometry.hh:126
EntityGeometryStorageImpl & operator=(const EntityGeometryStorageImpl &other)
assignment operator
Definition entitygeometry.hh:90
const Entity & entity() const
return entity
Definition entitygeometry.hh:101
const Geometry & geometry() const
return geometry
Definition entitygeometry.hh:111
const ReferenceElementType & referenceElement() const
return reference element
Definition entitygeometry.hh:129
bool valid() const
return true if entity pointer is set
Definition entitygeometry.hh:108
T fill(T... args)
T forward(T... args)