1#ifndef DUNE_FEM_BASISFUNCTIONSET_VECTORIAL_HH
2#define DUNE_FEM_BASISFUNCTIONSET_VECTORIAL_HH
8#include <dune/geometry/referenceelements.hh>
9#include <dune/geometry/type.hh>
32 template<
class Implementation >
74 const Implementation &
impl ()
const
76 return static_cast< const Implementation &
>( *this );
93 template<
class ScalarBasisFunctionSet,
class Range >
95 :
public DofAlignment< HorizontalDofAlignment< ScalarBasisFunctionSet, Range > >
107 : scalarSize_( scalarBasisFunctionSet.size() )
123 std::size_t scalarSize_;
138 template<
class ScalarBasisFunctionSet,
class Range >
140 :
public DofAlignment< VerticalDofAlignment< ScalarBasisFunctionSet, Range > >
145 static const int dimRange = Range::dimension;
178 template<
class DofVector,
class DofAlignment >
182 template<
class DofVector,
class ScalarBasisFunctionSet,
class Range >
187 typedef typename Range::value_type RangeFieldType;
193 typedef typename std::conditional<
194 std::is_const< DofVector > :: value,
195 const RangeFieldType,
196 RangeFieldType > :: type DofType;
202 : dofs_( &(
dofs[ dofAlignment.globalDof( LocalDofType(
coordinate, 0 ) ) ] ) )
205 DofType &operator[] ( std::size_t i )
212 RangeFieldType operator[] ( std::size_t i )
const
222 template<
class DofVector,
class ScalarBasisFunctionSet,
class Range >
227 typedef typename Range::value_type RangeFieldType;
233 typedef typename std::conditional<
234 std::is_const< DofVector > :: value,
235 const RangeFieldType,
236 RangeFieldType > :: type DofType;
244 dofAlignment_( dofAlignment )
247 DofType &operator[] ( std::size_t i )
249 return dofs_[ dofAlignment_.globalDof( LocalDofType( coordinate_, i ) ) ];
254 RangeFieldType operator[] ( std::size_t i )
const
256 return dofs_[ dofAlignment_.globalDof( LocalDofType( coordinate_, i ) ) ];
262 DofAlignmentType dofAlignment_;
277 template<
class ScalarBasisFunctionSet,
class Range,
template<
class,
class >
class DofAlignment = VerticalDofAlignment >
285 typedef typename ScalarBasisFunctionSetType::EntityType
EntityType;
289 typedef typename ScalarBasisFunctionSetType::FunctionSpaceType ScalarFunctionSpaceType;
290 static const int dimRange = Range::dimension;
296 typedef typename FunctionSpaceType::RangeType
RangeType;
318 dofAlignment_( scalarBasisFunctionSet_ )
327 template<
class Po
int,
class DofVector >
330 axpy< EvaluateAll >( x, valueFactor,
dofs );
333 template<
class Po
int,
class DofVector >
336 axpy< JacobianAll >( x, jacobianFactor,
dofs );
339 template<
class Po
int,
class DofVector >
342 axpyH( x, hessianFactor,
dofs );
345 template<
class Po
int,
class DofVector >
347 DofVector &
dofs )
const
353 template<
class Quadrature,
class Vector,
class DofVector >
356 const unsigned int nop = quad.
nop();
357 for(
unsigned int qp = 0; qp < nop ; ++qp )
358 axpy( quad[ qp ], values[ qp ],
dofs );
361 template<
class Quadrature,
class VectorA,
class VectorB,
class DofVector >
362 void axpy (
const Quadrature &quad,
const VectorA &valuesA,
const VectorB &valuesB, DofVector &
dofs )
const
364 const unsigned int nop = quad.
nop();
365 for(
unsigned int qp = 0; qp < nop ; ++qp )
367 axpy( quad[ qp ], valuesA[ qp ],
dofs );
368 axpy( quad[ qp ], valuesB[ qp ],
dofs );
372 template<
class Po
int,
class DofVector >
375 evaluateAll< EvaluateAll >( x,
dofs, value );
378 template<
class Po
int,
class RangeArray >
381 evaluateAll< EvaluateAll >( x, values );
384 template<
class Quadrature,
class DofVector,
class RangeArray >
387 const unsigned int nop = quad.
nop();
388 for(
unsigned int qp = 0; qp < nop ; ++qp )
392 template<
class Po
int,
class DofVector >
395 evaluateAll< JacobianAll >( x,
dofs, jacobian );
398 template<
class Po
int,
class JacobianRangeArray >
399 void jacobianAll (
const Point &x, JacobianRangeArray &jacobians )
const
401 evaluateAll< JacobianAll >( x, jacobians );
404 template<
class Quadrature,
class DofVector,
class JacobianArray >
407 const unsigned int nop = quad.
nop();
408 for(
unsigned int qp = 0; qp < nop ; ++qp )
412 template<
class Po
int,
class DofVector >
415 evaluateAll< HessianAll >( x,
dofs, hessian );
418 template<
class Po
int,
class HessianRangeArray >
419 void hessianAll (
const Point &x, HessianRangeArray &hessians )
const
421 evaluateAll< HessianAll >( x, hessians );
424 template<
class Quadrature,
class DofVector,
class HessianArray >
427 const unsigned int nop = quad.
nop();
428 for(
unsigned int qp = 0; qp < nop ; ++qp )
439 return scalarBasisFunctionSet_;
443 template<
class Evaluate,
class Po
int,
class DofVector >
444 void axpy (
const Point &x,
const typename Evaluate::Vector &factor, DofVector &
dofs )
const
447 std::vector< typename Evaluate::Scalar > scalars(
size );
450 for(
int r = 0; r < dimRange; ++r )
452 for( std::size_t i = 0; i <
size; ++i )
455 dofs[ globalDof ] += factor[ r ] * scalars[ i ][ 0 ];
459 template<
class Po
int,
class DofVector >
463 std::vector< typename HessianAll::Scalar > scalars(
size );
466 const int xSize = DomainType::dimension;
467 for(
int r = 0; r < dimRange; ++r )
469 for( std::size_t i = 0; i <
size; ++i )
472 for (
int j = 0; j < xSize; ++j )
473 dofs[ globalDof ] += factor[ r ][ j ] * scalars[ i ][ 0 ][ j ];
478 template<
class Evaluate,
class Po
int,
class DofVector >
479 void evaluateAll (
const Point &x,
const DofVector &
dofs,
typename Evaluate::Vector &vector )
const
481 typename Evaluate::Scalar scalar;
482 for(
int r = 0; r < dimRange; ++r )
484 SubDofVector< const DofVector, DofAlignmentType > subDofs(
dofs, r, dofAlignment_ );
486 vector[ r ] = scalar[ 0 ];
490 template<
class Evaluate,
class Po
int,
class VectorArray >
491 void evaluateAll (
const Point &x, VectorArray &vectorials )
const
494 std::vector< typename Evaluate::Scalar > scalars(
size );
497 typedef typename Evaluate::Vector Vector;
499 for(
int r = 0; r < dimRange; ++r )
501 for( std::size_t i = 0; i <
size; ++i )
504 Vector &vector = vectorials[ globalDof ];
505 vector = Vector(
typename Vector::value_type( 0 ) );
506 vector[ r ] = scalars[ i ][ 0 ];
520 template<
class ScalarBasisFunctionSet,
class Range,
template<
class,
class >
class DofAlignment >
523 typedef typename ScalarFunctionSpaceType::RangeType
Scalar;
526 template<
class Po
int,
class SubDofVector >
533 template<
class Po
int,
class ScalarArray >
535 const Point &x, ScalarArray &scalars )
546 template<
class ScalarBasisFunctionSet,
class Range,
template<
class,
class >
class DofAlignment >
549 typedef typename ScalarFunctionSpaceType::JacobianRangeType
Scalar;
552 template<
class Po
int,
class SubDofVector >
559 template<
class Po
int,
class ScalarArray >
561 const Point &x, ScalarArray &scalars )
572 template<
class ScalarBasisFunctionSet,
class Range,
template<
class,
class >
class DofAlignment >
575 typedef typename ScalarFunctionSpaceType::HessianRangeType
Scalar;
578 template<
class Po
int,
class SubDofVector >
585 template<
class Po
int,
class ScalarArray >
587 const Point &x, ScalarArray &scalars )
Definition: bindguard.hh:11
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
int nop() const
obtain the number of integration points
Definition: quadrature.hh:295
actual interface class for quadratures
Definition: quadrature.hh:405
Interface documentation for Dof alignment classes used in VectorialBasisFunctionSet.
Definition: basisfunctionset/vectorial.hh:34
std::size_t GlobalDofType
global Dof type
Definition: basisfunctionset/vectorial.hh:37
LocalDofType localDof(const GlobalDofType &globalDof) const
map global to local Dof
Definition: basisfunctionset/vectorial.hh:68
const Implementation & impl() const
Definition: basisfunctionset/vectorial.hh:74
std::pair< int, std::size_t > LocalDofType
local Dof type consists of coordinate number and Dof number in scalar basis function set
Definition: basisfunctionset/vectorial.hh:41
GlobalDofType globalDof(const LocalDofType &localDof) const
map local to global Dof
Definition: basisfunctionset/vectorial.hh:55
Implementation of DofAlignment.
Definition: basisfunctionset/vectorial.hh:96
GlobalDofType globalDof(const LocalDofType &localDof) const
map local to global Dof
Definition: basisfunctionset/vectorial.hh:111
HorizontalDofAlignment()=default
LocalDofType localDof(const GlobalDofType &globalDof) const
map global to local Dof
Definition: basisfunctionset/vectorial.hh:117
BaseType::LocalDofType LocalDofType
Definition: basisfunctionset/vectorial.hh:102
BaseType::GlobalDofType GlobalDofType
Definition: basisfunctionset/vectorial.hh:101
HorizontalDofAlignment(const ScalarBasisFunctionSet &scalarBasisFunctionSet)
Definition: basisfunctionset/vectorial.hh:106
Implementation of DofAlignment.
Definition: basisfunctionset/vectorial.hh:141
VerticalDofAlignment()=default
BaseType::LocalDofType LocalDofType
Definition: basisfunctionset/vectorial.hh:149
BaseType::GlobalDofType GlobalDofType
Definition: basisfunctionset/vectorial.hh:148
VerticalDofAlignment(const ScalarBasisFunctionSet &)
Definition: basisfunctionset/vectorial.hh:153
LocalDofType localDof(const GlobalDofType &globalDof) const
map global to local Dof
Definition: basisfunctionset/vectorial.hh:162
GlobalDofType globalDof(const LocalDofType &localDof) const
map local to global Dof
Definition: basisfunctionset/vectorial.hh:156
Extract Sub dof vector for single coordinate.
Definition: basisfunctionset/vectorial.hh:179
Definition: basisfunctionset/vectorial.hh:184
SubDofVector(DofVector &dofs, int coordinate, const DofAlignmentType &dofAlignment)
Definition: basisfunctionset/vectorial.hh:201
RangeFieldType value_type
Definition: basisfunctionset/vectorial.hh:199
Definition: basisfunctionset/vectorial.hh:224
SubDofVector(DofVector &dofs, int coordinate, const DofAlignmentType &dofAlignment)
Definition: basisfunctionset/vectorial.hh:241
RangeFieldType value_type
Definition: basisfunctionset/vectorial.hh:239
Builds a vectorial basis function set from given scalar basis function set.
Definition: basisfunctionset/vectorial.hh:279
ScalarBasisFunctionSetType::ReferenceElementType ReferenceElementType
Definition: basisfunctionset/vectorial.hh:286
FunctionSpaceType::JacobianRangeType JacobianRangeType
Definition: basisfunctionset/vectorial.hh:297
FunctionSpaceType::RangeType RangeType
Definition: basisfunctionset/vectorial.hh:296
ScalarBasisFunctionSet ScalarBasisFunctionSetType
Definition: basisfunctionset/vectorial.hh:283
DofAlignment< ScalarBasisFunctionSet, Range > DofAlignmentType
Definition: basisfunctionset/vectorial.hh:300
void axpy(const Quadrature &quad, const VectorA &valuesA, const VectorB &valuesB, DofVector &dofs) const
Definition: basisfunctionset/vectorial.hh:362
void axpy(const Point &x, const RangeType &valueFactor, const JacobianRangeType &jacobianFactor, DofVector &dofs) const
Definition: basisfunctionset/vectorial.hh:346
void jacobianAll(const Point &x, const DofVector &dofs, JacobianRangeType &jacobian) const
Definition: basisfunctionset/vectorial.hh:393
void jacobianAll(const Point &x, JacobianRangeArray &jacobians) const
Definition: basisfunctionset/vectorial.hh:399
const ScalarBasisFunctionSetType & scalarBasisFunctionSet() const
Definition: basisfunctionset/vectorial.hh:437
DofAlignmentType dofAlignment() const
Definition: basisfunctionset/vectorial.hh:435
void jacobianAll(const Quadrature &quad, const DofVector &dofs, JacobianArray &jacobians) const
Definition: basisfunctionset/vectorial.hh:405
void hessianAll(const Point &x, HessianRangeArray &hessians) const
Definition: basisfunctionset/vectorial.hh:419
void evaluateAll(const Quadrature &quad, const DofVector &dofs, RangeArray &ranges) const
Definition: basisfunctionset/vectorial.hh:385
void evaluateAll(const Point &x, const DofVector &dofs, RangeType &value) const
Definition: basisfunctionset/vectorial.hh:373
void axpy(const Quadrature &quad, const Vector &values, DofVector &dofs) const
Definition: basisfunctionset/vectorial.hh:354
void axpy(const Point &x, const RangeType &valueFactor, DofVector &dofs) const
Definition: basisfunctionset/vectorial.hh:328
VectorialBasisFunctionSet(const ScalarBasisFunctionSetType &scalarBasisFunctionSet)
Definition: basisfunctionset/vectorial.hh:316
DofAlignmentType::GlobalDofType GlobalDofType
Definition: basisfunctionset/vectorial.hh:302
DofAlignmentType::LocalDofType LocalDofType
Definition: basisfunctionset/vectorial.hh:303
FunctionSpaceType::HessianRangeType HessianRangeType
Definition: basisfunctionset/vectorial.hh:298
void hessianAll(const Quadrature &quad, const DofVector &dofs, HessianArray &hessians) const
Definition: basisfunctionset/vectorial.hh:425
void hessianAll(const Point &x, const DofVector &dofs, HessianRangeType &hessian) const
Definition: basisfunctionset/vectorial.hh:413
ToNewDimRangeFunctionSpace< ScalarFunctionSpaceType, dimRange >::Type FunctionSpaceType
Definition: basisfunctionset/vectorial.hh:293
const EntityType & entity() const
Definition: basisfunctionset/vectorial.hh:432
std::size_t size() const
Definition: basisfunctionset/vectorial.hh:323
const ReferenceElementType & referenceElement() const
Definition: basisfunctionset/vectorial.hh:325
void axpy(const Point &x, const JacobianRangeType &jacobianFactor, DofVector &dofs) const
Definition: basisfunctionset/vectorial.hh:334
VectorialBasisFunctionSet()
Definition: basisfunctionset/vectorial.hh:314
void evaluateAll(const Point &x, RangeArray &values) const
Definition: basisfunctionset/vectorial.hh:379
FunctionSpaceType::RangeFieldType RangeFieldType
Definition: basisfunctionset/vectorial.hh:306
void axpy(const Point &x, const HessianRangeType &hessianFactor, DofVector &dofs) const
Definition: basisfunctionset/vectorial.hh:340
FunctionSpaceType::DomainType DomainType
Definition: basisfunctionset/vectorial.hh:295
ScalarBasisFunctionSetType::EntityType EntityType
Definition: basisfunctionset/vectorial.hh:285
int order() const
Definition: basisfunctionset/vectorial.hh:321
FunctionSpaceType::DomainFieldType DomainFieldType
Definition: basisfunctionset/vectorial.hh:305
bool valid() const
Definition: basisfunctionset/vectorial.hh:433
Definition: basisfunctionset/vectorial.hh:522
ScalarFunctionSpaceType::RangeType Scalar
Definition: basisfunctionset/vectorial.hh:523
static void apply(const ScalarBasisFunctionSetType &scalarBasisFunctionSet, const Point &x, const SubDofVector &dofs, Scalar &scalar)
Definition: basisfunctionset/vectorial.hh:527
static void apply(const ScalarBasisFunctionSetType &scalarBasisFunctionSet, const Point &x, ScalarArray &scalars)
Definition: basisfunctionset/vectorial.hh:534
RangeType Vector
Definition: basisfunctionset/vectorial.hh:524
Definition: basisfunctionset/vectorial.hh:548
JacobianRangeType Vector
Definition: basisfunctionset/vectorial.hh:550
ScalarFunctionSpaceType::JacobianRangeType Scalar
Definition: basisfunctionset/vectorial.hh:549
static void apply(const ScalarBasisFunctionSetType &scalarBasisFunctionSet, const Point &x, const SubDofVector &dofs, Scalar &scalar)
Definition: basisfunctionset/vectorial.hh:553
static void apply(const ScalarBasisFunctionSetType &scalarBasisFunctionSet, const Point &x, ScalarArray &scalars)
Definition: basisfunctionset/vectorial.hh:560
Definition: basisfunctionset/vectorial.hh:574
static void apply(const ScalarBasisFunctionSetType &scalarBasisFunctionSet, const Point &x, const SubDofVector &dofs, Scalar &scalar)
Definition: basisfunctionset/vectorial.hh:579
static void apply(const ScalarBasisFunctionSetType &scalarBasisFunctionSet, const Point &x, ScalarArray &scalars)
Definition: basisfunctionset/vectorial.hh:586
ScalarFunctionSpaceType::HessianRangeType Scalar
Definition: basisfunctionset/vectorial.hh:575
HessianRangeType Vector
Definition: basisfunctionset/vectorial.hh:576
convert functions space to space with new dim range
Definition: functionspace.hh:250