DUNE-FEM (unstable)

default.hh
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
13#include <dune/geometry/referenceelements.hh>
14#include <dune/geometry/type.hh>
15
16#include <dune/fem/space/shapefunctionset/caching.hh>
17
18// dune-fem includes
19#include <dune/fem/space/basisfunctionset/functor.hh>
20#include <dune/fem/space/basisfunctionset/transformation.hh>
21#include <dune/fem/space/shapefunctionset/caching.hh>
22#include <dune/fem/quadrature/cachingpointlist.hh>
23#include <dune/fem/space/common/functionspace.hh>
24#include <dune/fem/version.hh>
25
26#include <dune/fem/space/basisfunctionset/codegen.hh>
27#include <dune/fem/space/basisfunctionset/evaluatecaller.hh>
28
29namespace Dune
30{
31
32 namespace Fem
33 {
34
35 // DefaultBasisFunctionSet
36 // -----------------------
37
51 template< class Entity, class ShapeFunctionSet >
53 {
55
56 public:
61
62 // if underlying shape function set was created with storage CodegenStorage
63 // then this value should be true (see selectcaching.hh)
64 static constexpr bool codegenShapeFunctionSet = detail::IsCodegenShapeFunctionSet< ShapeFunctionSetType >::value;
65
66 protected:
68 typedef typename LocalFunctionSpaceType::JacobianRangeType LocalJacobianRangeType;
70
71 typedef typename LocalFunctionSpaceType::RangeFieldType RangeFieldType;
72
73 typedef typename EntityType::Geometry Geometry ;
74
75 typedef typename Geometry::ctype ctype;
76 public:
77 // slight misuse of struct ToLocalFunctionSpace!!!
80
89
90 typedef typename FunctionSpaceType::ScalarFunctionSpaceType ScalarFunctionSpaceType;
91
92 typedef typename ScalarFunctionSpaceType::RangeType ScalarRangeType;
93 typedef typename ScalarFunctionSpaceType::JacobianRangeType ScalarJacobianRangeType;
94
96 typedef std::decay_t< decltype( Dune::ReferenceElements< ctype, Geometry::coorddimension >::general( std::declval< const Dune::GeometryType & >() ) ) > ReferenceElementType;
97
99
102
105 : entity_( &entity ),
106 shapeFunctionSet_( shapeFunctionSet )
107 {
108 // Note that this should be geometry_ = entity.geometry()
109 // But Dune::Geometries are not assignable ...
110 geometry_.reset();
111 geometry_.emplace( entity.geometry() );
112 }
113
115 : entity_( other.entity_ ),
116 shapeFunctionSet_( other.shapeFunctionSet_ )
117 {
118 // Note that this should be geometry_ = entity.geometry()
119 // But Dune::Geometries are not assignable ...
120 geometry_.reset();
121 if( other.geometry_ )
122 geometry_.emplace( other.geometry_.value() );
123 }
124
125 DefaultBasisFunctionSet &operator= ( const DefaultBasisFunctionSet &other )
126 {
127 entity_ = other.entity_;
128 shapeFunctionSet_ = other.shapeFunctionSet_;
129
130 // Note that this should be geometry_ = entity.geometry()
131 // But Dune::Geometries are not assignable ...
132 geometry_.reset();
133 if( other.geometry_ )
134 geometry_.emplace( other.geometry_.value() );
135 return *this;
136 }
137
138 // Basis Function Set Interface Methods
139 // ------------------------------------
140
142 int order () const { return shapeFunctionSet().order(); }
143
145 std::size_t size () const { return shapeFunctionSet().size(); }
146
148 auto referenceElement () const
149 -> decltype( Dune::ReferenceElements< ctype, Geometry::coorddimension >::general( std::declval< const Dune::GeometryType & >() ) )
150 {
152 }
153
157 template< class QuadratureType, class Vector, class DofVector >
158 void axpy ( const QuadratureType &quad, const Vector &values, DofVector &dofs ) const
159 {
160 axpyImpl( quad, values, dofs, values[ 0 ] );
161 }
162
169 template< class QuadratureType, class VectorA, class VectorB, class DofVector >
170 void axpy ( const QuadratureType &quad, const VectorA &valuesA, const VectorB &valuesB, DofVector &dofs ) const
171 {
172 assert( valuesA.size() > 0 );
173 assert( valuesB.size() > 0 );
174
175 axpyImpl( quad, valuesA, dofs, valuesA[ 0 ] );
176 axpyImpl( quad, valuesB, dofs, valuesB[ 0 ] );
177 }
178
182 template< class Point, class DofVector >
183 void axpy ( const Point &x, const RangeType &valueFactor, DofVector &dofs ) const
184 {
185 FunctionalAxpyFunctor< RangeType, DofVector > f( valueFactor, dofs );
187 }
188
192 template< class Point, class DofVector >
193 void axpy ( const Point &x, const JacobianRangeType &jacobianFactor, DofVector &dofs ) const
194 {
195 typedef typename Geometry::JacobianInverseTransposed GeometryJacobianInverseTransposedType;
196 const Geometry &geo = geometry();
197 const GeometryJacobianInverseTransposedType &gjit = geo.jacobianInverseTransposed( coordinate( x ) );
198 LocalJacobianRangeType tmpJacobianFactor;
199 for( int r = 0; r < FunctionSpaceType::dimRange; ++r )
200 gjit.mtv( jacobianFactor[ r ], tmpJacobianFactor[ r ] );
201
202 FunctionalAxpyFunctor< LocalJacobianRangeType, DofVector > f( tmpJacobianFactor, dofs );
204 }
205
209 template< class Point, class DofVector >
210 void axpy ( const Point &x, const RangeType &valueFactor, const JacobianRangeType &jacobianFactor,
211 DofVector &dofs ) const
212 {
213 axpy( x, valueFactor, dofs );
214 axpy( x, jacobianFactor, dofs );
215 }
216
219 template< class Point, class DofVector >
220 void axpy ( const Point &x, const HessianRangeType &hessianFactor, DofVector &dofs ) const
221 {
222 typedef typename Geometry::JacobianInverseTransposed GeometryJacobianInverseTransposedType;
223 const Geometry &geo = geometry();
224 const GeometryJacobianInverseTransposedType &gjit = geo.jacobianInverseTransposed( coordinate( x ) );
225 LocalHessianRangeType tmpHessianFactor( RangeFieldType(0) );
226 hessianTransformation(gjit.transposed(),hessianFactor,tmpHessianFactor);
227
228 FunctionalAxpyFunctor< LocalHessianRangeType, DofVector > f( tmpHessianFactor, dofs );
230 }
231
232
234 template< class QuadratureType, class DofVector, class RangeArray >
235 void evaluateAll ( const QuadratureType &quad, const DofVector &dofs, RangeArray &ranges ) const
236 {
237 assert( ranges.size() >= quad.nop() );
238
239 // if shape function set supports codegen and quadrature supports caching
240 if constexpr ( codegenShapeFunctionSet && std::is_base_of< CachingInterface, QuadratureType > :: value)
241 {
242 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, RangeArray, DofVector > Traits;
243 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
244
245 // get base function evaluate caller
246 const auto& baseEval = BaseEvaluationType::storage( *this, rangeCache( quad ), quad );
247
248 // true if implementation exists, otherwise this is a nullptr
249 if( baseEval )
250 {
251 baseEval->evaluateRanges( quad, dofs, ranges );
252 return ;
253 }
254 }
255
256 {
257 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
258 const unsigned int nop = quad.nop();
259 for( unsigned int qp = 0; qp < nop; ++qp )
260 {
261 evaluateAll( quad[ qp ], dofs, ranges[ qp ] );
262 }
263 }
264 }
265
267 template< class Point, class DofVector >
268 void evaluateAll ( const Point &x, const DofVector &dofs, RangeType &value ) const
269 {
270 value = RangeType( 0 );
271 AxpyFunctor< DofVector, RangeType > f( dofs, value );
273 }
274
276 template< class Point, class RangeArray >
277 void evaluateAll ( const Point &x, RangeArray &values ) const
278 {
279 assert( values.size() >= size() );
280 std::fill( values.begin(), values.end(), RangeType(0) );
281 AssignFunctor< RangeArray > f( values );
283 }
284
286 template< class QuadratureType, class DofVector, class JacobianArray >
287 void jacobianAll ( const QuadratureType &quad, const DofVector &dofs, JacobianArray &jacobians ) const
288 {
289 assert( jacobians.size() >= quad.nop() );
290
291 // if shape function set supports codegen and quadrature supports caching
292 if constexpr ( codegenShapeFunctionSet && std::is_base_of< CachingInterface, QuadratureType > :: value)
293 {
294 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, JacobianArray, DofVector, Geometry > Traits;
295 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
296
297 // get base function evaluate caller (calls axpyRanges)
298 const auto& baseEval = BaseEvaluationType::storage( *this, jacobianCache( quad ), quad );
299
300 // true if implementation exists
301 if( baseEval )
302 {
303 // call appropriate axpyJacobian method
304 const Geometry &geo = geometry();
305 baseEval->evaluateJacobians( quad, geo, dofs, jacobians );
306 return ;
307 }
308 }
309
310 {
311 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
312 const unsigned int nop = quad.nop();
313 for( unsigned int qp = 0; qp < nop; ++qp )
314 {
315 jacobianAll( quad[ qp ], dofs, jacobians[ qp ] );
316 }
317 }
318 }
319
321 template< class Point, class DofVector >
322 void jacobianAll ( const Point &x, const DofVector &dofs, JacobianRangeType &jacobian ) const
323 {
324 LocalJacobianRangeType localJacobian( RangeFieldType( 0 ) );
325 AxpyFunctor< DofVector, LocalJacobianRangeType > f( dofs, localJacobian );
327
328 typedef JacobianTransformation< Geometry > Transformation;
329 const Geometry &geo = geometry();
330 Transformation transformation( geo, coordinate( x ) );
331 transformation( localJacobian, jacobian );
332 }
333
335 template< class Point, class JacobianRangeArray >
336 void jacobianAll ( const Point &x, JacobianRangeArray &jacobians ) const
337 {
338 assert( jacobians.size() >= size() );
339 typedef JacobianTransformation< Geometry > Transformation;
340 const Geometry &geo = geometry();
341
342 Transformation transformation( geo, coordinate( x ) );
343 AssignFunctor< JacobianRangeArray, Transformation > f( jacobians, transformation );
345 }
346
348 template< class QuadratureType, class DofVector, class HessianArray >
349 void hessianAll ( const QuadratureType &quad, const DofVector &dofs, HessianArray &hessians ) const
350 {
351 assert( hessians.size() >= quad.nop() );
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 hessianAll( quad[ qp ], dofs, hessians[ qp ] );
357 }
358 }
359
361 template< class Point, class DofVector >
362 void hessianAll ( const Point &x, const DofVector &dofs, HessianRangeType &hessian ) const
363 {
364 LocalHessianRangeType localHessian( typename LocalHessianRangeType::value_type( RangeFieldType( 0 ) ) );
365 AxpyFunctor< DofVector, LocalHessianRangeType > f( dofs, localHessian );
367
368 typedef HessianTransformation< Geometry > Transformation;
369 const Geometry &geo = geometry();
370 Transformation transformation( geo, coordinate( x ) );
371 transformation( localHessian, hessian );
372 }
373
375 template< class Point, class HessianRangeArray >
376 void hessianAll ( const Point &x, HessianRangeArray &hessians ) const
377 {
378 assert( hessians.size() >= size() );
379 typedef HessianTransformation< Geometry > Transformation;
380 const Geometry &geo = geometry();
381 Transformation transformation( geo, coordinate( x ) );
382 AssignFunctor< HessianRangeArray, Transformation > f( hessians, transformation );
384 }
385
387 const Entity &entity () const
388 {
389 assert( valid() );
390 return *entity_;
391 }
392
394 bool valid () const { return bool(entity_); }
395
397 Dune::GeometryType type () const { return entity().type(); }
398
399 // Non-interface methods
400 // ---------------------
401
403 const ShapeFunctionSetType &shapeFunctionSet () const { return shapeFunctionSet_; }
404
405 protected:
407 template< class QuadratureType, class RangeArray, class DofVector >
408 void axpyImpl ( const QuadratureType &quad, const RangeArray &rangeFactors, DofVector &dofs, const RangeType& ) const
409 {
410 assert( rangeFactors.size() >= quad.nop() );
411
412 // if shape function set supports codegen and quadrature supports caching
413 if constexpr ( codegenShapeFunctionSet && std::is_base_of< CachingInterface, QuadratureType > :: value)
414 {
415 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, RangeArray, DofVector > Traits;
416 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
417
418 // get base function evaluate caller (calls axpyRanges)
419 const auto& baseEval = BaseEvaluationType::storage( *this, rangeCache( quad ), quad );
420
421 // true if implementation exists
422 if( baseEval )
423 {
424 baseEval->axpyRanges( quad, rangeFactors, dofs );
425 return ;
426 }
427 }
428
429 {
430 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
431 const unsigned int nop = quad.nop();
432 for( unsigned int qp = 0; qp < nop; ++qp )
433 {
434 axpy( quad[ qp ], rangeFactors[ qp ], dofs );
435 }
436 }
437 }
438
440 template< class QuadratureType, class JacobianArray, class DofVector >
441 void axpyImpl ( const QuadratureType &quad, const JacobianArray &jacobianFactors, DofVector &dofs, const JacobianRangeType& ) const
442 {
443 assert( jacobianFactors.size() >= quad.nop() );
444 // if shape function set supports codegen and quadrature supports caching
445 if constexpr ( codegenShapeFunctionSet && std::is_base_of< CachingInterface, QuadratureType > :: value)
446 {
447 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, JacobianArray, DofVector, Geometry > Traits;
448 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
449
450 // get base function evaluate caller (calls axpyRanges)
451 const auto& baseEval = BaseEvaluationType::storage( *this, jacobianCache( quad ), quad );
452
453 // true if implementation exists
454 if( baseEval )
455 {
456 // call appropriate axpyRanges method
457 const Geometry &geo = geometry();
458 baseEval->axpyJacobians( quad, geo, jacobianFactors, dofs );
459 return ;
460 }
461 }
462
463 {
464 // call axpy method for each entry of the given vector, e.g. rangeVector or jacobianVector
465 const unsigned int nop = quad.nop();
466 for( unsigned int qp = 0; qp < nop; ++qp )
467 {
468 axpy( quad[ qp ], jacobianFactors[ qp ], dofs );
469 }
470 }
471 }
472
474 template< class QuadratureType, class HessianArray, class DofVector >
475 void axpyImpl ( const QuadratureType &quad, const HessianArray &hessianFactors, DofVector &dofs, const HessianRangeType& ) const
476 {
477 assert( hessianFactors.size() >= quad.nop() );
478 /* TODO add code generation for hessians
479 // if shape function set supports codegen and quadrature supports caching
480 if constexpr ( codegenShapeFunctionSet && std::is_base_of< CachingInterface, QuadratureType > :: value)
481 {
482 typedef Codegen :: EvaluateCallerInterfaceTraits< QuadratureType, HessianArray, DofVector, Geometry > Traits;
483 typedef Codegen :: EvaluateCallerInterface< Traits > BaseEvaluationType;
484
485 // get base function evaluate caller (calls axpyRanges)
486 const auto& baseEval = BaseEvaluationType::storage( *this, hessianCache( quad ), quad );
487
488 // true if implementation exists
489 if( baseEval )
490 {
491 // call appropriate axpyRanges method
492 const Geometry &geo = geometry();
493 baseEval->axpyHessian( quad, geo, hessianFactors, dofs );
494 return ;
495 }
496 }
497 */
498 {
499 const unsigned int nop = quad.nop();
500 for( unsigned int qp = 0; qp < nop; ++qp )
501 {
502 axpy( quad[ qp ], hessianFactors[ qp ], dofs );
503 }
504 }
505 }
506
507 template <class QuadratureType>
508 const auto& rangeCache( const QuadratureType& quad ) const
509 {
510 return shapeFunctionSet().scalarShapeFunctionSet().impl().rangeCache( quad );
511 }
512
513 template <class QuadratureType>
514 const auto& jacobianCache( const QuadratureType& quad ) const
515 {
516 return shapeFunctionSet().scalarShapeFunctionSet().impl().jacobianCache( quad );
517 }
518
519 protected:
520 Geometry geometry () const { return geometry_.value(); }
521
522 const EntityType *entity_ = nullptr;
523 ShapeFunctionSetType shapeFunctionSet_;
524 std::optional< Geometry > geometry_;
525 };
526
527 } // namespace Fem
528
529} // namespace Dune
530
531#endif // #ifndef DUNE_FEM_BASISFUNCTIONSET_DEFAULT_HH
Wrapper class for entities.
Definition: entity.hh:66
Geometry geometry() const
obtain geometric realization of the entity
Definition: entity.hh:141
GridImp::template Codim< cd >::Geometry Geometry
The corresponding geometry type.
Definition: entity.hh:100
GeometryType type() const
Return the name of the reference element. The type can be used to access the Dune::ReferenceElement.
Definition: entity.hh:146
Definition: default.hh:53
FunctionSpaceType::DomainType DomainType
domain type
Definition: default.hh:84
void evaluateAll(const Point &x, const DofVector &dofs, RangeType &value) const
Definition: default.hh:268
DefaultBasisFunctionSet()
constructor
Definition: default.hh:101
FunctionSpaceType::HessianRangeType HessianRangeType
hessian range type
Definition: default.hh:88
ToNewDimDomainFunctionSpace< LocalFunctionSpaceType, Geometry::coorddimension >::Type FunctionSpaceType
type of function space
Definition: default.hh:79
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: default.hh:170
const ShapeFunctionSetType & shapeFunctionSet() const
return shape function set
Definition: default.hh:403
auto referenceElement() const -> decltype(Dune::ReferenceElements< ctype, Geometry::coorddimension >::general(std::declval< const Dune::GeometryType & >()))
return reference element
Definition: default.hh:148
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: default.hh:210
FunctionSpaceType::RangeType RangeType
range type
Definition: default.hh:82
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: default.hh:193
void jacobianAll(const Point &x, JacobianRangeArray &jacobians) const
Definition: default.hh:336
bool valid() const
return true if entity pointer is set
Definition: default.hh:394
DefaultBasisFunctionSet(const EntityType &entity, const ShapeFunctionSet &shapeFunctionSet=ShapeFunctionSet())
constructor
Definition: default.hh:104
void axpy(const Point &x, const HessianRangeType &hessianFactor, DofVector &dofs) const
Add H:D^2phi to each dof.
Definition: default.hh:220
FunctionSpaceType::JacobianRangeType JacobianRangeType
jacobian range type
Definition: default.hh:86
void hessianAll(const Point &x, HessianRangeArray &hessians) const
Definition: default.hh:376
void evaluateAll(const QuadratureType &quad, const DofVector &dofs, RangeArray &ranges) const
Definition: default.hh:235
std::decay_t< decltype(Dune::ReferenceElements< ctype, Geometry::coorddimension >::general(std::declval< const Dune::GeometryType & >())) > ReferenceElementType
type of reference element
Definition: default.hh:96
void hessianAll(const Point &x, const DofVector &dofs, HessianRangeType &hessian) const
Definition: default.hh:362
void hessianAll(const QuadratureType &quad, const DofVector &dofs, HessianArray &hessians) const
Definition: default.hh:349
void evaluateAll(const Point &x, RangeArray &values) const
Definition: default.hh:277
ShapeFunctionSet ShapeFunctionSetType
shape function set type
Definition: default.hh:60
const Entity & entity() const
return entity
Definition: default.hh:387
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: default.hh:475
std::size_t size() const
return size of basis function set
Definition: default.hh:145
void jacobianAll(const Point &x, const DofVector &dofs, JacobianRangeType &jacobian) const
Definition: default.hh:322
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: default.hh:408
Entity EntityType
entity type
Definition: default.hh:58
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: default.hh:441
Dune::GeometryType type() const
return geometry type
Definition: default.hh:397
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: default.hh:183
void jacobianAll(const QuadratureType &quad, const DofVector &dofs, JacobianArray &jacobians) const
Definition: default.hh:287
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: default.hh:158
int order() const
return order of basis function set
Definition: default.hh:142
Definition: explicitfieldvector.hh:75
FunctionSpaceTraits::RangeType RangeType
Type of range vector (using type of range field) has a Dune::FieldVector type interface.
Definition: functionspaceinterface.hh:71
@ dimRange
dimension of range vector space
Definition: functionspaceinterface.hh:48
FunctionSpaceTraits::LinearMappingType JacobianRangeType
Intrinsic type used for the jacobian values has a Dune::FieldMatrix type interface.
Definition: functionspaceinterface.hh:75
FunctionSpaceTraits::DomainType DomainType
Type of domain vector (using type of domain field) has a Dune::FieldVector type interface.
Definition: functionspaceinterface.hh:67
FunctionSpaceTraits::RangeFieldType RangeFieldType
Intrinsic type used for values in the range field (usually a double)
Definition: functionspaceinterface.hh:63
FunctionSpaceTraits::ScalarFunctionSpaceType ScalarFunctionSpaceType
corresponding scalar function space
Definition: functionspaceinterface.hh:83
A vector valued function space.
Definition: functionspace.hh:60
Interface class for shape function sets.
Definition: 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
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
Implementation::JacobianInverseTransposed JacobianInverseTransposed
type of jacobian inverse transposed
Definition: geometry.hh:120
GridImp::ctype ctype
define type used for coordinates in grid module
Definition: geometry.hh:100
Dune namespace.
Definition: alignedallocator.hh:13
STL namespace.
convert functions space to space with new dim domain
Definition: functionspace.hh:246
selects SFS::codegenShapeFunctionSet if available, otherwise defaultValue (default is false)
Definition: utility.hh:194
selects Obj::pointSetId if available, otherwise defaultValue (default is -1)
Definition: utility.hh:174
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:128
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:156
A unique label for each type of element that can occur in a grid.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 27, 22:29, 2024)