1#ifndef DUNE_FEM_SPACE_BASISFUNCTIONSET_TUPLE_HH
2#define DUNE_FEM_SPACE_BASISFUNCTIONSET_TUPLE_HH
12#include <dune/geometry/type.hh>
43 template<
int >
struct ComputeOffset;
44 template<
int >
struct EvaluateAll;
45 template<
int >
struct JacobianAll;
46 template<
int >
struct HessianAll;
47 template<
int >
struct EvaluateAllRanges;
48 template<
int >
struct JacobianAllRanges;
49 template<
int >
struct HessianAllRanges;
50 template<
int >
struct Axpy;
57 static constexpr int size () {
return std::tuple_element< j, std::tuple< std::integral_constant< int, i > ... > >::type::value; }
60 static constexpr std::integer_sequence< int, size< j >() ... > sizes ( std::integer_sequence< int, j ... > )
62 return std::integer_sequence< int, size< j >() ... >();
66 static constexpr int offset ()
68 return mysum( sizes( std::make_integer_sequence< int, j >() ) );
73 static constexpr int mysum ( std::integer_sequence< int, j ... > )
78 static constexpr int mysum ( std::integer_sequence< int > )
87 static_assert(
Std::are_all_same<
typename BasisFunctionSets::DomainType ... >::value,
88 "TupleBasisFunctionSet needs common DomainType" );
90 typedef typename std::tuple_element< 0, BasisFunctionSetTupleType >::type::FunctionSpaceType ContainedFunctionSpaceType;
93 static const int dimDomain = ContainedFunctionSpaceType::dimDomain;
100 typedef std::array< std::size_t, setSize + 1 > OffsetType;
105 typedef std::tuple< std::vector< typename BasisFunctionSets::RangeType > ... > RangeStorageTupleType;
106 typedef std::tuple< std::vector< typename BasisFunctionSets::JacobianRangeType > ... > JacobianStorageTupleType;
107 typedef std::tuple< std::vector< typename BasisFunctionSets::HessianRangeType > ... > HessianStorageTupleType;
112 typename std::tuple_element< i, RangeStorageTupleType >::type
113 & rangeStorage()
const {
return std::get< i >( rangeStorage_ ); }
116 typename std::tuple_element< i, JacobianStorageTupleType >::type
117 & jacobianStorage()
const {
return std::get< i >( jacobianStorage_ ); }
120 typename std::tuple_element< i, HessianStorageTupleType >::type
121 & hessianStorage()
const {
return std::get< i >( hessianStorage_ ); }
124 mutable RangeStorageTupleType rangeStorage_;
125 mutable JacobianStorageTupleType jacobianStorage_;
126 mutable HessianStorageTupleType hessianStorage_;
132 typedef Indices< BasisFunctionSets::FunctionSpaceType::dimRange ... >
RangeIndices;
135 template <
int dummy,
class CombOp>
142 static constexpr const int dimRange =
Std::sum(
static_cast< int >( BasisFunctionSets::FunctionSpaceType::dimRange ) ... );
145 typedef FunctionSpace<
typename ContainedFunctionSpaceType::DomainFieldType,
146 typename ContainedFunctionSpaceType::RangeFieldType,
149 template <
class ThisRange,
class Range>
150 static void apply(
const int rangeOffset,
const ThisRange& thisRange, Range& values)
153 std::copy( thisRange.begin(), thisRange.end(), values.begin() + rangeOffset );
159 return RangeIndices::template offset< i >();
169 template <
class ThisRange,
class Range>
170 static void apply(
const int rangeOffset,
const ThisRange& thisRange, Range& values)
191 typedef typename std::tuple_element< i, BasisFunctionSetTupleType >::type
type;
198 static const int dimRange = FunctionSpaceType::dimRange;
204 typedef typename FunctionSpaceType::RangeType
RangeType;
216 "TupleBasisFunctionSet needs common EntityType" );
218 typedef typename std::tuple_element< 0, BasisFunctionSetTupleType >::type::EntityType
EntityType;
220 static_assert(
Std::are_all_same<
typename BasisFunctionSets::ReferenceElementType ... >::value,
221 "TupleBasisFunctionSet needs ReferenceElementType" );
223 typedef typename std::tuple_element< 0, BasisFunctionSetTupleType >::type::ReferenceElementType
ReferenceElementType;
230 : basisFunctionSetTuple_( basisFunctionSets ... ),
239 : basisFunctionSetTuple_( basisFunctionSetTuple ),
252 return order( std::index_sequence_for< BasisFunctionSets ... >() );
258 return size( std::index_sequence_for< BasisFunctionSets ... >() );
262 Dune::GeometryType
type ()
const
264 return std::get< 0 >( basisFunctionSetTuple_ ).type();
270 return std::get< 0 >( basisFunctionSetTuple_ ).valid();
276 return std::get< 0 >( basisFunctionSetTuple_ ).entity();
282 return std::get< 0 >( basisFunctionSetTuple_ ).referenceElement();
286 template<
class Po
int,
class DofVector >
293 template<
class Po
int,
class RangeArray >
296 assert( values.size() >=
size() );
301 template<
class QuadratureType,
class DofVector,
class RangeArray >
302 void evaluateAll (
const QuadratureType &quad,
const DofVector &
dofs, RangeArray &ranges )
const
304 const int nop = quad.nop();
305 for(
int qp = 0; qp < nop; ++qp )
310 template<
class Po
int,
class DofVector >
317 template<
class Po
int,
class JacobianRangeArray >
318 void jacobianAll (
const Point &x, JacobianRangeArray &jacobians )
const
320 assert( jacobians.size() >=
size() );
325 template<
class QuadratureType,
class DofVector,
class JacobianArray >
326 void jacobianAll (
const QuadratureType &quad,
const DofVector &
dofs, JacobianArray &jacobians )
const
328 const int nop = quad.nop();
329 for(
int qp = 0; qp < nop; ++qp )
334 template<
class Po
int,
class DofVector >
341 template<
class QuadratureType,
class DofVector,
class HessianArray >
342 void hessianAll (
const QuadratureType &quad,
const DofVector &
dofs, HessianArray &hessians )
const
344 const int nop = quad.nop();
345 for(
int qp = 0; qp < nop; ++qp )
350 template<
class Po
int,
class HessianRangeArray >
351 void hessianAll (
const Point &x, HessianRangeArray &hessians )
const
353 assert( hessians.size() >=
size() );
358 template<
class QuadratureType,
class Vector,
class DofVector >
359 void axpy (
const QuadratureType &quad,
const Vector &values, DofVector &
dofs )
const
362 const unsigned int nop = quad.nop();
363 for(
unsigned int qp = 0; qp < nop; ++qp )
364 axpy( quad[ qp ], values[ qp ],
dofs );
368 template<
class QuadratureType,
class VectorA,
class VectorB,
class DofVector >
369 void axpy (
const QuadratureType &quad,
const VectorA &valuesA,
const VectorB &valuesB, DofVector &
dofs )
const
372 const unsigned int nop = quad.nop();
373 for(
unsigned int qp = 0; qp < nop; ++qp )
375 axpy( quad[ qp ], valuesA[ qp ],
dofs );
376 axpy( quad[ qp ], valuesB[ qp ],
dofs );
381 template<
class Po
int,
class DofVector >
388 template<
class Po
int,
class DofVector >
395 template<
class Po
int,
class DofVector >
402 template<
class Po
int,
class DofVector >
414 return std::get< i >( basisFunctionSetTuple_ );
431 template< std::size_t ... i >
432 int order ( std::index_sequence< i ... > )
const
434 return Std::max( std::get< i >( basisFunctionSetTuple_ ).
order() ... );
438 template< std::size_t ... i >
439 std::size_t
size ( std::index_sequence< i ... > )
const
441 return Std::sum( std::get< i >( basisFunctionSetTuple_ ).
size() ... );
445 BasisFunctionSetTupleType basisFunctionSetTuple_;
456 template<
class CombineOp,
class ... BasisFunctionSets >
458 struct TupleBasisFunctionSet< CombineOp, BasisFunctionSets ... >::
461 template<
class Tuple >
462 static void apply ( OffsetType &
offset,
const Tuple &tuple )
464 offset[ i + 1 ] =
offset[ i ] + std::get< i >( tuple ).size();
472 template<
class CombineOp,
class ... BasisFunctionSets >
474 struct TupleBasisFunctionSet< CombineOp, BasisFunctionSets ... >::
478 static const int rangeOffset = CombinationType :: template rangeOffset< i >();
480 template<
class Po
int,
class DofVector,
class Tuple >
481 static void apply (
const Point &x,
const DofVector &dofVector,
RangeType &values,
const OffsetType &
offset,
const Tuple &tuple )
484 std::size_t
size = std::get< i >( tuple ).size();
485 SubVector< const DofVector, OffsetSubMapper > subDofVector( dofVector, OffsetSubMapper(
size,
offset[ i ] ) );
486 typename std::tuple_element< i, BasisFunctionSetTupleType >::type::RangeType thisRange;
487 std::get< i >( tuple ).evaluateAll( x, subDofVector, thisRange );
490 CombinationType::apply( rangeOffset, thisRange, values );
498 template<
class CombineOp,
class ... BasisFunctionSets >
500 struct TupleBasisFunctionSet< CombineOp, BasisFunctionSets ... >::
504 static const int rangeOffset = CombinationType :: template rangeOffset< i >();
506 template<
class Po
int,
class DofVector,
class Tuple >
507 static void apply (
const Point &x,
const DofVector &dofVector,
JacobianRangeType &values,
const OffsetType &
offset,
const Tuple &tuple )
510 std::size_t
size = std::get< i >( tuple ).size();
511 SubVector< const DofVector, OffsetSubMapper > subDofVector( dofVector, OffsetSubMapper(
size,
offset[ i ] ) );
512 typename std::tuple_element< i, BasisFunctionSetTupleType >::type::JacobianRangeType thisJacobian;
513 std::get< i >( tuple ).jacobianAll( x, subDofVector, thisJacobian );
516 CombinationType::apply( rangeOffset, thisJacobian, values );
524 template<
class CombineOp,
class ... BasisFunctionSets >
526 struct TupleBasisFunctionSet< CombineOp, BasisFunctionSets ... >::
530 static const int rangeOffset = CombinationType :: template rangeOffset< i >();
532 template<
class Po
int,
class DofVector,
class Tuple >
533 static void apply (
const Point &x,
const DofVector &dofVector,
HessianRangeType &values,
const OffsetType &
offset,
const Tuple &tuple )
536 std::size_t
size = std::get< i >( tuple ).size();
537 SubVector< const DofVector, OffsetSubMapper > subDofVector( dofVector, OffsetSubMapper(
size,
offset[ i ] ) );
538 typename std::tuple_element< i, BasisFunctionSetTupleType >::type::HessianRangeType thisHessian;
539 std::get< i >( tuple ).hessianAll( x, subDofVector, thisHessian );
542 CombinationType::apply( rangeOffset, thisHessian, values );
550 template<
class CombineOp,
class ... BasisFunctionSets >
552 struct TupleBasisFunctionSet< CombineOp, BasisFunctionSets ... >::
555 typedef typename std::tuple_element< i, typename Storage::RangeStorageTupleType >::type ThisStorage;
556 static const int thisDimRange = std::tuple_element< i, BasisFunctionSetTupleType >::type::FunctionSpaceType::dimRange;
559 static const int rangeOffset = CombinationType :: template rangeOffset< i >();
561 template<
class Po
int,
class RangeArray,
class Tuple >
562 static void apply (
const Point &x, RangeArray &values,
const Storage &s,
const OffsetType &
offset,
const Tuple &tuple )
564 std::size_t
size = std::get< i >( tuple ).size();
565 ThisStorage &thisStorage = s.template rangeStorage< i >();
566 thisStorage.resize(
size );
568 std::get< i >( tuple ).evaluateAll( x, thisStorage );
570 for( std::size_t j = 0; j <
size; ++j )
573 for(
int r = 0; r < thisDimRange; ++r )
574 values[ j +
offset[ i ] ][ r + rangeOffset ] = thisStorage[ j ][ r ];
583 template<
class CombineOp,
class ... BasisFunctionSets >
585 struct TupleBasisFunctionSet< CombineOp, BasisFunctionSets ... >::
588 typedef typename std::tuple_element< i, typename Storage::JacobianStorageTupleType >::type ThisStorage;
589 static const int thisDimRange = std::tuple_element< i, BasisFunctionSetTupleType >::type::FunctionSpaceType::dimRange;
592 static const int rangeOffset = CombinationType :: template rangeOffset< i >();
594 template<
class Po
int,
class RangeArray,
class Tuple >
595 static void apply (
const Point &x, RangeArray &values,
const Storage &s,
const OffsetType &
offset,
const Tuple &tuple )
597 std::size_t
size = std::get< i >( tuple ).size();
598 ThisStorage &thisStorage = s.template jacobianStorage< i >();
599 thisStorage.resize(
size );
601 std::get< i >( tuple ).jacobianAll( x, thisStorage );
603 for( std::size_t j = 0; j <
size; ++j )
606 for(
int r = 0; r < thisDimRange; ++r )
607 values[ j +
offset[ i ] ][ r + rangeOffset ] = thisStorage[ j ][ r ];
616 template<
class CombineOp,
class ... BasisFunctionSets >
618 struct TupleBasisFunctionSet< CombineOp, BasisFunctionSets ... >::
621 typedef typename std::tuple_element< i, typename Storage::HessianStorageTupleType >::type ThisStorage;
622 static const int thisDimRange = std::tuple_element< i, BasisFunctionSetTupleType >::type::FunctionSpaceType::dimRange;
625 static const int rangeOffset = CombinationType :: template rangeOffset< i >();
627 template<
class Po
int,
class RangeArray,
class Tuple >
628 static void apply (
const Point &x, RangeArray &values,
const Storage &s,
const OffsetType &
offset,
const Tuple &tuple )
630 std::size_t
size = std::get< i >( tuple ).size();
631 ThisStorage &thisStorage = s.template hessianStorage< i >();
632 thisStorage.resize(
size );
634 std::get< i >( tuple ).hessianAll( x, thisStorage );
636 for( std::size_t j = 0; j <
size; ++j )
638 values[ j +
offset[ i ] ] =
typename HessianRangeType::value_type( 0.0 );
639 for(
int r = 0; r < thisDimRange; ++r )
640 values[ j +
offset[ i ] ][ r + rangeOffset ] = thisStorage[ j ][ r ];
649 template<
class CombineOp,
class ... BasisFunctionSets >
651 struct TupleBasisFunctionSet< CombineOp, BasisFunctionSets ... >::
654 typedef typename std::tuple_element< i, BasisFunctionSetTupleType >::type::RangeType ThisRangeType;
655 typedef typename std::tuple_element< i, BasisFunctionSetTupleType >::type::JacobianRangeType ThisJacobianRangeType;
656 typedef typename std::tuple_element< i, BasisFunctionSetTupleType >::type::HessianRangeType ThisHessianRangeType;
659 static const int rangeOffset = CombinationType :: template rangeOffset< i >();
661 typedef SubObject< const RangeType, const ThisRangeType, rangeOffset > SubRangeType;
662 typedef SubObject< const JacobianRangeType, const ThisJacobianRangeType, rangeOffset > SubJacobianRangeType;
663 typedef SubObject< const HessianRangeType, const ThisHessianRangeType, rangeOffset > SubHessianRangeType;
666 template<
class Po
int,
class DofVector,
class Tuple >
667 static void apply (
const Point &x,
const RangeType &factor, DofVector &dofVector,
const OffsetType &
offset,
const Tuple &tuple )
669 std::size_t
size = std::get< i >( tuple ).size();
670 SubVector< DofVector, OffsetSubMapper > subDofVector( dofVector, OffsetSubMapper(
size,
offset[ i ] ) );
671 SubRangeType subFactor( factor );
672 std::get< i >( tuple ).axpy( x, (ThisRangeType) subFactor, subDofVector );
676 template<
class Po
int,
class DofVector,
class Tuple >
677 static void apply (
const Point &x,
const JacobianRangeType &factor, DofVector &dofVector,
const OffsetType &
offset,
const Tuple &tuple )
679 std::size_t
size = std::get< i >( tuple ).size();
680 SubVector< DofVector, OffsetSubMapper > subDofVector( dofVector, OffsetSubMapper(
size,
offset[ i ] ) );
681 SubJacobianRangeType subFactor( factor );
682 std::get< i >( tuple ).axpy( x, (ThisJacobianRangeType) subFactor, subDofVector );
686 template<
class Po
int,
class DofVector,
class Tuple >
687 static void apply (
const Point &x,
const HessianRangeType &factor, DofVector &dofVector,
const OffsetType &
offset,
const Tuple &tuple )
689 std::size_t
size = std::get< i >( tuple ).size();
690 SubVector< DofVector, OffsetSubMapper > subDofVector( dofVector, OffsetSubMapper(
size,
offset[ i ] ) );
691 SubHessianRangeType subFactor( factor );
692 std::get< i >( tuple ).axpy( x, (ThisHessianRangeType) subFactor, subDofVector );
696 template<
class Po
int,
class DofVector,
class Tuple >
697 static void apply (
const Point &x,
const RangeType &rangeFactor,
const JacobianRangeType &jacobianFactor, DofVector &dofVector,
const OffsetType &
offset,
const Tuple &tuple )
699 std::size_t
size = std::get< i >( tuple ).size();
700 SubVector< DofVector, OffsetSubMapper > subDofVector( dofVector, OffsetSubMapper(
size,
offset[ i ] ) );
701 SubRangeType subRangeFactor( rangeFactor );
702 SubJacobianRangeType subJacobianFactor( jacobianFactor );
703 std::get< i >( tuple ).axpy( x, (ThisRangeType) subRangeFactor, (ThisJacobianRangeType) subJacobianFactor, subDofVector );
Definition: bindguard.hh:11
IteratorRange< typename DF::DofIteratorType > dofs(DF &df)
Iterates over all DOFs.
Definition: rangegenerators.hh:76
static constexpr T max(T a)
Definition: utility.hh:77
static constexpr std::decay_t< T > sum(T a)
Definition: utility.hh:33
static DUNE_PRIVATE void apply(Args &&... args)
Definition: forloop.hh:23
Definition: utility.hh:147
Definition: space/basisfunctionset/tuple.hh:34
Definition: space/basisfunctionset/tuple.hh:35
Definition: space/basisfunctionset/tuple.hh:39
static int numSubBasisFunctionSets()
return number of subBasisFunctionSets
Definition: space/basisfunctionset/tuple.hh:424
void hessianAll(const Point &x, const DofVector &dofs, HessianRangeType &hessian) const
Definition: space/basisfunctionset/tuple.hh:335
FunctionSpaceType::HessianRangeType HessianRangeType
type of Hessian Matrix
Definition: space/basisfunctionset/tuple.hh:213
void axpy(const Point &x, const HessianRangeType &hessianFactor, DofVector &dofs) const
Definition: space/basisfunctionset/tuple.hh:396
FunctionSpaceType::RangeFieldType RangeFieldType
type of Range Vector field
Definition: space/basisfunctionset/tuple.hh:207
TupleBasisFunctionSet(const BasisFunctionSetTupleType &basisFunctionSetTuple)
Definition: space/basisfunctionset/tuple.hh:238
TupleBasisFunctionSet(const BasisFunctionSets &... basisFunctionSets)
Definition: space/basisfunctionset/tuple.hh:229
const ReferenceElementType & referenceElement() const
return entity
Definition: space/basisfunctionset/tuple.hh:280
void evaluateAll(const QuadratureType &quad, const DofVector &dofs, RangeArray &ranges) const
Definition: space/basisfunctionset/tuple.hh:302
bool valid() const
return true if entity was set
Definition: space/basisfunctionset/tuple.hh:268
void evaluateAll(const Point &x, const DofVector &dofs, RangeType &value) const
Definition: space/basisfunctionset/tuple.hh:287
int order(std::index_sequence< i ... >) const
Definition: space/basisfunctionset/tuple.hh:432
void evaluateAll(const Point &x, RangeArray &values) const
Definition: space/basisfunctionset/tuple.hh:294
void jacobianAll(const Point &x, const DofVector &dofs, JacobianRangeType &jacobian) const
Definition: space/basisfunctionset/tuple.hh:311
int order() const
return order of basis function set, maximal order in the tupleset
Definition: space/basisfunctionset/tuple.hh:250
TupleBasisFunctionSet()
Definition: space/basisfunctionset/tuple.hh:226
const SubBasisFunctionSet< i >::type & subBasisFunctionSet() const
return i-th subbasisfunctionSet
Definition: space/basisfunctionset/tuple.hh:412
FunctionSpaceType::RangeType RangeType
type of Range Vector
Definition: space/basisfunctionset/tuple.hh:204
std::tuple_element< 0, BasisFunctionSetTupleType >::type::EntityType EntityType
type of Entity the basis function set is initialized on
Definition: space/basisfunctionset/tuple.hh:218
void axpy(const Point &x, const JacobianRangeType &jacobianFactor, DofVector &dofs) const
Definition: space/basisfunctionset/tuple.hh:389
void jacobianAll(const Point &x, JacobianRangeArray &jacobians) const
Definition: space/basisfunctionset/tuple.hh:318
std::size_t offset(int i) const
return offset of the i-th subbasisfunctionSet in the whole set
Definition: space/basisfunctionset/tuple.hh:418
std::tuple_element< 0, BasisFunctionSetTupleType >::type::ReferenceElementType ReferenceElementType
type of reference element for this BasisFunctionSet
Definition: space/basisfunctionset/tuple.hh:223
void axpy(const QuadratureType &quad, const VectorA &valuesA, const VectorB &valuesB, DofVector &dofs) const
Definition: space/basisfunctionset/tuple.hh:369
std::size_t size() const
return size of basis function set
Definition: space/basisfunctionset/tuple.hh:256
static const int dimRange
size of domain space
Definition: space/basisfunctionset/tuple.hh:198
void axpy(const Point &x, const RangeType &valueFactor, const JacobianRangeType &jacobianFactor, DofVector &dofs) const
Definition: space/basisfunctionset/tuple.hh:403
void axpy(const QuadratureType &quad, const Vector &values, DofVector &dofs) const
Definition: space/basisfunctionset/tuple.hh:359
CombinationType::FunctionSpaceType FunctionSpaceType
type of analytical combined function space
Definition: space/basisfunctionset/tuple.hh:195
void hessianAll(const QuadratureType &quad, const DofVector &dofs, HessianArray &hessians) const
evaluate the hessian of all basis functions and store the result in the hessians array
Definition: space/basisfunctionset/tuple.hh:342
void hessianAll(const Point &x, HessianRangeArray &hessians) const
Definition: space/basisfunctionset/tuple.hh:351
std::size_t size(std::index_sequence< i ... >) const
Definition: space/basisfunctionset/tuple.hh:439
FunctionSpaceType::DomainType DomainType
type of Domain Vector
Definition: space/basisfunctionset/tuple.hh:201
Indices< BasisFunctionSets::FunctionSpaceType::dimRange ... > RangeIndices
helper class to compute static rangeoffsets
Definition: space/basisfunctionset/tuple.hh:132
FunctionSpaceType::JacobianRangeType JacobianRangeType
type of Jacobian Vector/Matrix
Definition: space/basisfunctionset/tuple.hh:210
Dune::GeometryType type() const
Definition: space/basisfunctionset/tuple.hh:262
void axpy(const Point &x, const RangeType &valueFactor, DofVector &dofs) const
Definition: space/basisfunctionset/tuple.hh:382
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: space/basisfunctionset/tuple.hh:326
CombinationTraits< 0, CombineOp > CombinationType
Definition: space/basisfunctionset/tuple.hh:184
const EntityType & entity() const
return entity
Definition: space/basisfunctionset/tuple.hh:274
Definition: space/basisfunctionset/tuple.hh:136
static constexpr int rangeOffset()
Definition: space/basisfunctionset/tuple.hh:157
FunctionSpace< typename ContainedFunctionSpaceType::DomainFieldType, typename ContainedFunctionSpaceType::RangeFieldType, dimDomain, dimRange > FunctionSpaceType
type of analytical combined product function space
Definition: space/basisfunctionset/tuple.hh:147
static void apply(const int rangeOffset, const ThisRange &thisRange, Range &values)
Definition: space/basisfunctionset/tuple.hh:150
static constexpr int rangeOffset()
Definition: space/basisfunctionset/tuple.hh:177
static void apply(const int rangeOffset, const ThisRange &thisRange, Range &values)
Definition: space/basisfunctionset/tuple.hh:170
ContainedFunctionSpaceType FunctionSpaceType
type of analytical is same as contained space since its a sum
Definition: space/basisfunctionset/tuple.hh:167
Definition: space/basisfunctionset/tuple.hh:190
std::tuple_element< i, BasisFunctionSetTupleType >::type type
Definition: space/basisfunctionset/tuple.hh:191
A vector valued function space.
Definition: functionspace.hh:60
interface class representing a family of basis function sets
Definition: discontinuousgalerkin/basisfunctionsets.hh:24
ImplementationDefined EntityType
entity type
Definition: discontinuousgalerkin/basisfunctionsets.hh:29