1 #ifndef DUNE_FEM_SPACE_BASISFUNCTIONSET_TUPLE_HH 2 #define DUNE_FEM_SPACE_BASISFUNCTIONSET_TUPLE_HH 9 #include <dune/common/forloop.hh> 10 #include <dune/common/std/utility.hh> 11 #include <dune/common/tuples.hh> 13 #include <dune/geometry/type.hh> 30 template<
class ... BasisFunctionSets >
36 template<
int >
struct ComputeOffset;
37 template<
int >
struct EvaluateAll;
38 template<
int >
struct JacobianAll;
39 template<
int >
struct HessianAll;
40 template<
int >
struct EvaluateAllRanges;
41 template<
int >
struct JacobianAllRanges;
42 template<
int >
struct HessianAllRanges;
43 template<
int >
struct Axpy;
50 static constexpr
int size () {
return std::tuple_element< j, std::tuple< std::integral_constant< int, i > ... > >::type::value; }
53 static constexpr Std::integer_sequence< int, size< j >() ... > sizes ( Std::integer_sequence< int, j ... > )
55 return Std::integer_sequence< int, size< j >() ... >();
59 static constexpr
int offset ()
61 return mysum( sizes( Std::make_integer_sequence< int, j >() ) );
66 static constexpr
int mysum ( Std::integer_sequence< int, j ... > )
71 static constexpr
int mysum ( Std::integer_sequence< int > )
78 typedef Indices< BasisFunctionSets::FunctionSpaceType::dimRange ... > RangeIndices;
84 "TupleBasisFunctionSet needs common DomainType" );
86 typedef typename std::tuple_element< 0, BasisFunctionSetTupleType >::type::FunctionSpaceType ContainedFunctionSpaceType;
93 typedef std::array< std::size_t, setSize + 1 > OffsetType;
98 typedef std::tuple< std::vector< typename BasisFunctionSets::RangeType > ... > RangeStorageTupleType;
99 typedef std::tuple< std::vector< typename BasisFunctionSets::JacobianRangeType > ... > JacobianStorageTupleType;
100 typedef std::tuple< std::vector< typename BasisFunctionSets::HessianRangeType > ... > HessianStorageTupleType;
105 typename std::tuple_element< i, RangeStorageTupleType >::type
106 & rangeStorage()
const {
return std::get< i >( rangeStorage_ ); }
109 typename std::tuple_element< i, JacobianStorageTupleType >::type
110 & jacobianStorage()
const {
return std::get< i >( jacobianStorage_ ); }
113 typename std::tuple_element< i, HessianStorageTupleType >::type
114 & hessianStorage()
const {
return std::get< i >( hessianStorage_ ); }
117 mutable RangeStorageTupleType rangeStorage_;
118 mutable JacobianStorageTupleType jacobianStorage_;
119 mutable HessianStorageTupleType hessianStorage_;
128 typedef typename std::tuple_element< i, BasisFunctionSetTupleType >::type
type;
132 static const int dimDomain = ContainedFunctionSpaceType::dimDomain;
135 static constexpr
const int dimRange =
Std::sum( static_cast< int >( BasisFunctionSets::FunctionSpaceType::dimRange ) ... );
138 typedef FunctionSpace<
typename ContainedFunctionSpaceType::DomainFieldType,
157 "TupleBasisFunctionSet needs common EntityType" );
159 typedef typename std::tuple_element< 0, BasisFunctionSetTupleType >::type::EntityType
EntityType;
162 "TupleBasisFunctionSet needs ReferenceElementType" );
164 typedef typename std::tuple_element< 0, BasisFunctionSetTupleType >::type::ReferenceElementType
ReferenceElementType;
171 : basisFunctionSetTuple_( basisFunctionSets ... )
174 ForLoop< ComputeOffset, 0, setIterationSize >::apply( offset_, basisFunctionSetTuple_ );
179 : basisFunctionSetTuple_( basisFunctionSetTuple )
182 ForLoop< ComputeOffset, 0, setIterationSize >::apply( offset_, basisFunctionSetTuple_ );
191 return order( Std::index_sequence_for< BasisFunctionSets ... >() );
197 return size( Std::index_sequence_for< BasisFunctionSets ... >() );
201 Dune::GeometryType
type ()
const 203 return std::get< 0 >( basisFunctionSetTuple_ ).
type();
209 return std::get< 0 >( basisFunctionSetTuple_ ).
entity();
219 template<
class Po
int,
class DofVector >
220 void evaluateAll (
const Point &x,
const DofVector &dofs, RangeType &value )
const 222 ForLoop< EvaluateAll, 0, setIterationSize >::apply( x, dofs, value, offset_, basisFunctionSetTuple_ );
226 template<
class Po
int,
class RangeArray >
229 assert( values.size() >=
size() );
230 ForLoop< EvaluateAllRanges, 0, setIterationSize >::apply( x, values, storage_, offset_, basisFunctionSetTuple_ );
234 template<
class QuadratureType,
class DofVector,
class RangeArray >
235 void evaluateAll (
const QuadratureType &quad,
const DofVector &dofs, RangeArray &ranges )
const 237 const int nop = quad.nop();
238 for(
int qp = 0; qp < nop; ++qp )
243 template<
class Po
int,
class DofVector >
244 void jacobianAll (
const Point &x,
const DofVector &dofs, JacobianRangeType &jacobian )
const 246 ForLoop< JacobianAll, 0, setIterationSize >::apply( x, dofs, jacobian, offset_, basisFunctionSetTuple_ );
250 template<
class Po
int,
class JacobianRangeArray >
251 void jacobianAll (
const Point &x, JacobianRangeArray &jacobians )
const 253 assert( jacobians.size() >=
size() );
254 ForLoop< JacobianAllRanges, 0, setIterationSize >::apply( x, jacobians, storage_, offset_, basisFunctionSetTuple_ );
258 template<
class QuadratureType,
class DofVector,
class JacobianArray >
259 void jacobianAll (
const QuadratureType &quad,
const DofVector &dofs, JacobianArray &jacobians )
const 261 const int nop = quad.nop();
262 for(
int qp = 0; qp < nop; ++qp )
267 template<
class Po
int,
class DofVector >
268 void hessianAll (
const Point &x,
const DofVector &dofs, HessianRangeType &hessian )
const 270 ForLoop< HessianAll, 0, setIterationSize >::apply( x, dofs, hessian, offset_, basisFunctionSetTuple_ );
274 template<
class Po
int,
class HessianRangeArray >
275 void hessianAll (
const Point &x, HessianRangeArray &hessians )
const 277 assert( hessians.size() >=
size() );
278 ForLoop< HessianAllRanges, 0, setIterationSize >::apply( x, hessians, storage_, offset_, basisFunctionSetTuple_ );
282 template<
class QuadratureType,
class Vector,
class DofVector >
283 void axpy (
const QuadratureType &quad,
const Vector &values, DofVector &dofs )
const 286 const unsigned int nop = quad.nop();
287 for(
unsigned int qp = 0; qp < nop; ++qp )
288 axpy( quad[ qp ], values[ qp ], dofs );
292 template<
class QuadratureType,
class VectorA,
class VectorB,
class DofVector >
293 void axpy (
const QuadratureType &quad,
const VectorA &valuesA,
const VectorB &valuesB, DofVector &dofs )
const 296 const unsigned int nop = quad.nop();
297 for(
unsigned int qp = 0; qp < nop; ++qp )
299 axpy( quad[ qp ], valuesA[ qp ], dofs );
300 axpy( quad[ qp ], valuesB[ qp ], dofs );
305 template<
class Po
int,
class DofVector >
306 void axpy (
const Point &x,
const RangeType &valueFactor, DofVector &dofs )
const 308 ForLoop< Axpy, 0, setIterationSize >::apply( x, valueFactor, dofs, offset_, basisFunctionSetTuple_ );
312 template<
class Po
int,
class DofVector >
313 void axpy (
const Point &x,
const JacobianRangeType &jacobianFactor, DofVector &dofs )
const 315 ForLoop< Axpy, 0, setIterationSize >::apply( x, jacobianFactor, dofs, offset_, basisFunctionSetTuple_ );
319 template<
class Po
int,
class DofVector >
320 void axpy (
const Point &x,
const RangeType &valueFactor,
const JacobianRangeType &jacobianFactor, DofVector &dofs )
const 322 ForLoop< Axpy, 0, setIterationSize >::apply( x, valueFactor, jacobianFactor, dofs, offset_, basisFunctionSetTuple_ );
331 return std::get< i >( basisFunctionSetTuple_ );
348 template< std::size_t ... i >
349 int order ( Std::index_sequence< i ... > )
const 351 return Std::max( std::get< i >( basisFunctionSetTuple_ ).
order() ... );
355 template< std::size_t ... i >
356 std::size_t
size ( Std::index_sequence< i ... > )
const 358 return Std::sum( std::get< i >( basisFunctionSetTuple_ ).
size() ... );
362 BasisFunctionSetTupleType basisFunctionSetTuple_;
378 template<
class Tuple >
379 static void apply ( OffsetType &
offset,
const Tuple &tuple )
381 offset[ i + 1 ] = offset[ i ] + std::get< i >( tuple ).
size();
389 template<
class ... BasisFunctionSets >
394 static const int rangeOffset = RangeIndices::template offset< i >();
396 template<
class Po
int,
class DofVector,
class Tuple >
397 static void apply (
const Point &x,
const DofVector &dofVector,
RangeType &values,
const OffsetType &
offset,
const Tuple &tuple )
399 std::size_t
size = std::get< i >( tuple ).
size();
401 typedef typename DofVector::value_type DofType;
402 typename std::tuple_element< i, BasisFunctionSetTupleType >::type::RangeType thisRange;
406 std::get< i >( tuple ).
evaluateAll( x, subDofVector, thisRange );
407 std::copy( thisRange.begin(), thisRange.end(), values.begin() + rangeOffset );
415 template<
class ... BasisFunctionSets >
420 static const int rangeOffset = RangeIndices::template offset< i >();
422 template<
class Po
int,
class DofVector,
class Tuple >
423 static void apply (
const Point &x,
const DofVector &dofVector,
JacobianRangeType &values,
const OffsetType &
offset,
const Tuple &tuple )
426 std::size_t
size = std::get< i >( tuple ).
size();
427 typedef typename DofVector::value_type DofType;
428 typename std::tuple_element< i, BasisFunctionSetTupleType >::type::JacobianRangeType thisJacobian;
432 std::get< i >( tuple ).
jacobianAll( x, subDofVector, thisJacobian );
433 std::copy( thisJacobian.begin(), thisJacobian.end(), values.begin() + rangeOffset );
441 template<
class ... BasisFunctionSets >
446 static const int rangeOffset = RangeIndices::template offset< i >();
448 template<
class Po
int,
class DofVector,
class Tuple >
449 static void apply (
const Point &x,
const DofVector &dofVector,
HessianRangeType &values,
const OffsetType &
offset,
const Tuple &tuple )
452 std::size_t
size = std::get< i >( tuple ).
size();
453 typedef typename DofVector::value_type DofType;
454 typename std::tuple_element< i, BasisFunctionSetTupleType >::type::HessianRangeType thisHessian;
458 std::get< i >( tuple ).
hessianAll( x, subDofVector, thisHessian );
459 std::copy( thisHessian.begin(), thisHessian.end(), values.begin() + rangeOffset );
467 template<
class ... BasisFunctionSets >
472 typedef typename std::tuple_element< i, typename Storage::RangeStorageTupleType >::type ThisStorage;
473 static const int thisDimRange = std::tuple_element< i, BasisFunctionSetTupleType >::type::FunctionSpaceType::dimRange;
474 static const int rangeOffset = RangeIndices::template offset< i >();
476 template<
class Po
int,
class RangeArray,
class Tuple >
477 static void apply (
const Point &x, RangeArray &values,
const Storage &s,
const OffsetType &
offset,
const Tuple &tuple )
479 std::size_t
size = std::get< i >( tuple ).
size();
480 ThisStorage &thisStorage = s.template rangeStorage< i >();
481 thisStorage.resize( size );
484 std::get< i >( tuple ).
evaluateAll( x, thisStorage );
486 for( std::size_t j = 0; j <
size; ++j )
488 values[ j + offset[ i ] ] =
RangeType( 0.0 );
489 for(
int r = 0; r < thisDimRange; ++r )
490 values[ j + offset[ i ] ][ r + rangeOffset ] = thisStorage[ j ][ r ];
499 template<
class ... BasisFunctionSets >
504 typedef typename std::tuple_element< i, typename Storage::JacobianStorageTupleType >::type ThisStorage;
505 static const int thisDimRange = std::tuple_element< i, BasisFunctionSetTupleType >::type::FunctionSpaceType::dimRange;
506 static const int rangeOffset = RangeIndices::template offset< i >();
508 template<
class Po
int,
class RangeArray,
class Tuple >
509 static void apply (
const Point &x, RangeArray &values,
const Storage &s,
const OffsetType &
offset,
const Tuple &tuple )
511 std::size_t
size = std::get< i >( tuple ).
size();
512 ThisStorage &thisStorage = s.template jacobianStorage< i >();
513 thisStorage.resize( size );
515 std::get< i >( tuple ).
jacobianAll( x, thisStorage );
517 for( std::size_t j = 0; j <
size; ++j )
520 for(
int r = 0; r < thisDimRange; ++r )
521 values[ j + offset[ i ] ][ r + rangeOffset ] = thisStorage[ j ][ r ];
530 template<
class ... BasisFunctionSets >
535 typedef typename std::tuple_element< i, typename Storage::HessianStorageTupleType >::type ThisStorage;
536 static const int thisDimRange = std::tuple_element< i, BasisFunctionSetTupleType >::type::FunctionSpaceType::dimRange;
537 static const int rangeOffset = RangeIndices::template offset< i >();
539 template<
class Po
int,
class RangeArray,
class Tuple >
540 static void apply (
const Point &x, RangeArray &values,
const Storage &s,
const OffsetType &
offset,
const Tuple &tuple )
542 std::size_t
size = std::get< i >( tuple ).
size();
543 ThisStorage &thisStorage = s.template hessianStorage< i >();
544 thisStorage.resize( size );
546 std::get< i >( tuple ).
hessianAll( x, thisStorage );
548 for( std::size_t j = 0; j <
size; ++j )
551 for(
int r = 0; r < thisDimRange; ++r )
552 values[ j + offset[ i ] ][ r + rangeOffset ] = thisStorage[ j ][ r ];
561 template<
class ... BasisFunctionSets >
566 typedef typename std::tuple_element< i, BasisFunctionSetTupleType >::type::RangeType ThisRangeType;
567 typedef typename std::tuple_element< i, BasisFunctionSetTupleType >::type::JacobianRangeType ThisJacobianRangeType;
569 static const int rangeOffset = RangeIndices::template offset< i >();
575 template<
class Po
int,
class DofVector,
class Tuple >
576 static void apply (
const Point &x,
const RangeType &factor, DofVector &dofVector,
const OffsetType &
offset,
const Tuple &tuple )
578 std::size_t
size = std::get< i >( tuple ).
size();
579 SubRangeType subFactor( factor );
581 std::get< i >( tuple ).
axpy( x, (ThisRangeType) subFactor, subDofVector );
585 template<
class Po
int,
class DofVector,
class Tuple >
586 static void apply (
const Point &x,
const JacobianRangeType &factor, DofVector &dofVector,
const OffsetType &offset,
const Tuple &tuple )
588 std::size_t
size = std::get< i >( tuple ).
size();
589 SubJacobianRangeType subFactor( factor );
591 std::get< i >( tuple ).
axpy( x, (ThisJacobianRangeType) subFactor, subDofVector );
595 template<
class Po
int,
class DofVector,
class Tuple >
596 static void apply (
const Point &x,
const RangeType &rangeFactor,
const JacobianRangeType &jacobianFactor, DofVector &dofVector,
const OffsetType &offset,
const Tuple &tuple )
598 std::size_t
size = std::get< i >( tuple ).
size();
599 SubRangeType subRangeFactor( rangeFactor );
600 SubJacobianRangeType subJacobianFactor( jacobianFactor );
602 std::get< i >( tuple ).
axpy( x, (ThisRangeType) subRangeFactor, (ThisJacobianRangeType) subJacobianFactor, subDofVector );
610 #endif // #ifndef DUNE_FEM_SPACE_BASISFUNCTIONSET_TUPLE_HH FunctionSpaceType::DomainType DomainType
type of Domain Vector
Definition: basisfunctionset/tuple.hh:142
FunctionSpace< typename ContainedFunctionSpaceType::DomainFieldType, typename ContainedFunctionSpaceType::RangeFieldType, dimDomain, dimRange > FunctionSpaceType
type of analytical combiend function space
Definition: basisfunctionset/tuple.hh:139
VectorSpaceTraits< DomainField, RangeField, dimD, dimR >::RangeFieldType RangeFieldType
Intrinsic type used for values in the range field (usually a double)
Definition: functionspaceinterface.hh:62
std::size_t size() const
return size of basis function set
Definition: basisfunctionset/tuple.hh:195
Definition: utility.hh:135
A vector valued function space.
Definition: functionspace.hh:16
void axpy(const QuadratureType &quad, const VectorA &valuesA, const VectorB &valuesB, DofVector &dofs) const
Definition: basisfunctionset/tuple.hh:293
static constexpr T max(T a)
Definition: utility.hh:65
VectorSpaceTraits< DomainField, RangeField, dimD, dimR >::LinearMappingType JacobianRangeType
Intrinsic type used for the jacobian values has a Dune::FieldMatrix type interface.
Definition: functionspaceinterface.hh:74
int order(Std::index_sequence< i... >) const
Definition: basisfunctionset/tuple.hh:349
FieldVector< FieldMatrix< RangeFieldType, dimDomain, dimDomain >, dimRange > HessianRangeType
Intrinsic type used for the hessian values has a Dune::FieldMatrix type interface.
Definition: functionspaceinterface.hh:78
static const int dimDomain
size of domian space
Definition: basisfunctionset/tuple.hh:132
Definition: subobjects.hh:83
static constexpr T sum(T a)
Definition: utility.hh:33
static constexpr const int dimRange
size of range space
Definition: basisfunctionset/tuple.hh:135
Definition: basisfunctionset/tuple.hh:126
void hessianAll(const Point &x, HessianRangeArray &hessians) const
Definition: basisfunctionset/tuple.hh:275
FunctionSpaceType::RangeFieldType RangeFieldType
type of Range Vector field
Definition: basisfunctionset/tuple.hh:148
interface class representing a family of basis function sets
Definition: discontinuousgalerkin/basisfunctionsets.hh:23
const SubBasisFunctionSet< i >::type & subBasisFunctionSet() const
return i-th subbasisfunctionSet
Definition: basisfunctionset/tuple.hh:329
FunctionSpaceType::RangeType RangeType
type of Range Vector
Definition: basisfunctionset/tuple.hh:145
static const int numSubBasisFunctionSets()
return number of subBasisFunctionSets
Definition: basisfunctionset/tuple.hh:341
Dune::GeometryType type() const
Definition: basisfunctionset/tuple.hh:201
Extract Sub dof vector for single coordinate.
Definition: basisfunctionset/vectorial.hh:179
std::tuple_element< i, BasisFunctionSetTupleType >::type type
Definition: basisfunctionset/tuple.hh:128
Definition: coordinate.hh:4
void axpy(const Point &x, const JacobianRangeType &jacobianFactor, DofVector &dofs) const
Definition: basisfunctionset/tuple.hh:313
VectorSpaceTraits< DomainField, RangeField, dimD, dimR >::DomainType DomainType
Type of domain vector (using type of domain field) has a Dune::FieldVector type interface.
Definition: functionspaceinterface.hh:66
int order() const
return order of basis function set, maximal order in the tupleset
Definition: basisfunctionset/tuple.hh:189
void jacobianAll(const Point &x, const DofVector &dofs, JacobianRangeType &jacobian) const
Definition: basisfunctionset/tuple.hh:244
void evaluateAll(const QuadratureType &quad, const DofVector &dofs, RangeArray &ranges) const
Definition: basisfunctionset/tuple.hh:235
std::tuple_element< 0, BasisFunctionSetTupleType >::type::ReferenceElementType ReferenceElementType
type of reference element for this BasisFunctionSet
Definition: basisfunctionset/tuple.hh:162
void evaluateAll(const Point &x, const DofVector &dofs, RangeType &value) const
Definition: basisfunctionset/tuple.hh:220
Definition: basisfunctionset/tuple.hh:31
FunctionSpaceType::JacobianRangeType JacobianRangeType
type of Jacobian Vector/Matrix
Definition: basisfunctionset/tuple.hh:151
void hessianAll(const Point &x, const DofVector &dofs, HessianRangeType &hessian) const
Definition: basisfunctionset/tuple.hh:268
void evaluateAll(const Point &x, RangeArray &values) const
Definition: basisfunctionset/tuple.hh:227
const EntityType & entity() const
return entity
Definition: basisfunctionset/tuple.hh:207
std::size_t size(Std::index_sequence< i... >) const
Definition: basisfunctionset/tuple.hh:356
TupleBasisFunctionSet(const BasisFunctionSets &...basisFunctionSets)
Definition: basisfunctionset/tuple.hh:170
FunctionSpaceType::HessianRangeType HessianRangeType
type of Hessian Matrix
Definition: basisfunctionset/tuple.hh:154
void axpy(const Point &x, const RangeType &valueFactor, const JacobianRangeType &jacobianFactor, DofVector &dofs) const
Definition: basisfunctionset/tuple.hh:320
std::size_t offset(int i) const
return offset of the i-th subbasisfunctionSet in the whole set
Definition: basisfunctionset/tuple.hh:335
void axpy(const Point &x, const RangeType &valueFactor, DofVector &dofs) const
Definition: basisfunctionset/tuple.hh:306
void jacobianAll(const QuadratureType &quad, const DofVector &dofs, JacobianArray &jacobians) const
evaluate the jacobian of all basis functions and store the result in the jacobians array ...
Definition: basisfunctionset/tuple.hh:259
VectorSpaceTraits< DomainField, RangeField, dimD, dimR >::RangeType RangeType
Type of range vector (using type of range field) has a Dune::FieldVector type interface.
Definition: functionspaceinterface.hh:70
std::tuple_element< 0, BasisFunctionSetTupleType >::type::EntityType EntityType
type of Entity the basis function set is initialized on
Definition: basisfunctionset/tuple.hh:157
const ReferenceElementType & referenceElement() const
return entity
Definition: basisfunctionset/tuple.hh:213
void jacobianAll(const Point &x, JacobianRangeArray &jacobians) const
Definition: basisfunctionset/tuple.hh:251
TupleBasisFunctionSet()
Definition: basisfunctionset/tuple.hh:167
TupleBasisFunctionSet(const BasisFunctionSetTupleType &basisFunctionSetTuple)
Definition: basisfunctionset/tuple.hh:178
void axpy(const QuadratureType &quad, const Vector &values, DofVector &dofs) const
Definition: basisfunctionset/tuple.hh:283