5#ifndef DUNE_MONOMIALBASIS_HH
6#define DUNE_MONOMIALBASIS_HH
10#include <dune/common/fvector.hh>
11#include <dune/common/fmatrix.hh>
13#include <dune/geometry/type.hh>
14#include <dune/geometry/topologyfactory.hh>
71 template< GeometryType::Id geometryId >
74 template< GeometryType::Id geometryId,
class F >
82 template< GeometryType::Id geometryId >
90 static This _instance;
135 sizes_ =
new unsigned int[ order+1 ];
138 constexpr GeometryType geometry = geometryId;
139 constexpr auto dim = geometry.dim();
142 for(
unsigned int k = 1; k <= order; ++k )
147 for(
int codim=dim-1; codim>=0; codim--)
149 if (Impl::isPrism(geometry.id(),dim,codim))
151 for(
unsigned int k = 1; k <= order; ++k )
159 for(
unsigned int k = 1; k <= order; ++k )
175 template<
int mydim,
int dim,
class F >
181 static void copy (
const unsigned int deriv, F *&wit, F *&rit,
182 const unsigned int numBaseFunctions,
const F &z )
188 const F *
const rend = rit + size( deriv )*numBaseFunctions;
189 for( ; rit != rend; )
196 for(
unsigned d = 1; d <= deriv; ++d )
199 const F *
const derivEnd = rit + mySize.
sizes_[ d ];
203 const F *
const drend = rit + mySize.
sizes_[ d ] - mySize.
sizes_[ d-1 ];
204 for( ; rit != drend ; ++rit, ++wit )
208 for (
unsigned int j=1; j<d; ++j)
210 const F *
const drend = rit + mySize.
sizes_[ d-j ] - mySize.
sizes_[ d-j-1 ];
211 for( ; rit != drend ; ++prit, ++rit, ++wit )
212 *wit = F(j) * *prit + z * *rit;
214 *wit = F(d) * *prit + z * *rit;
215 ++prit, ++rit, ++wit;
216 assert(derivEnd == rit);
219 const F *
const emptyWitEnd = wit + size.
sizes_[d] - mySize.
sizes_[d];
220 for ( ; wit != emptyWitEnd; ++wit )
232 template< GeometryType::Id geometryId,
class F>
233 class MonomialBasisImpl;
236 class MonomialBasisImpl< GeometryTypes::vertex, F >
241 static constexpr GeometryType
geometry = GeometryTypes::vertex;
250 friend class MonomialBasisImpl< GeometryTypes::prismaticExtension(geometry).toId(),
Field >;
251 friend class MonomialBasisImpl< GeometryTypes::conicalExtension(geometry).toId(), Field >;
254 void evaluate ( const unsigned int deriv, const unsigned int order,
255 const FieldVector< Field, dimD > &x,
256 const unsigned int block, const unsigned int *const offsets,
257 Field *const values ) const
260 F *
const end = values + block;
261 for(
Field *it = values+1 ; it != end; ++it )
265 void integrate (
const unsigned int order,
266 const unsigned int *
const offsets,
267 Field *
const values )
const
273 template< GeometryType::Id geometryId,
class F>
274 class MonomialBasisImpl
279 static constexpr GeometryType
geometry = geometryId;
288 friend class MonomialBasisImpl< GeometryTypes::prismaticExtension(geometry).toId(),
Field >;
289 friend class MonomialBasisImpl< GeometryTypes::conicalExtension(geometry).toId(), Field >;
294 MonomialBasisImpl< baseGeometry.toId(), Field > baseBasis_;
300 void evaluate (
const unsigned int deriv,
const unsigned int order,
301 const FieldVector< Field, dimD > &x,
302 const unsigned int block,
const unsigned int *
const offsets,
303 Field *
const values )
const
305 if constexpr (
geometry.isPrismatic())
306 evaluatePrismatic(deriv, order, x, block, offsets, values);
308 evaluateConical(deriv, order, x, block, offsets, values);
311 void integrate (
const unsigned int order,
312 const unsigned int *
const offsets,
313 Field *
const values )
const
315 if constexpr (
geometry.isPrismatic())
316 integratePrismatic(order, offsets, values);
318 integrateConical(order, offsets, values);
322 void evaluatePrismatic (
const unsigned int deriv,
const unsigned int order,
323 const FieldVector< Field, dimD > &x,
324 const unsigned int block,
const unsigned int *
const offsets,
325 Field *
const values )
const
327 typedef MonomialBasisHelper< dimDomain, dimD, Field > Helper;
329 const_cast<BaseSize&
>(size).computeSizes(order);
334 baseBasis_.evaluate( deriv, order, x, block, offsets, values );
336 Field *row0 = values;
337 for(
unsigned int k = 1; k <= order; ++k )
339 Field *row1 = values + block*offsets[ k-1 ];
340 Field *wit = row1 + block*size.sizes_[ k ];
341 Helper::copy( deriv, wit, row1, k*size.sizes_[ k ], z );
342 Helper::copy( deriv, wit, row0, size( k-1 ), z );
347 void integratePrismatic (
const unsigned int order,
348 const unsigned int *
const offsets,
349 Field *
const values )
const
354 baseBasis_.integrate( order, offsets, values );
355 const unsigned int *
const baseSizes = size.sizes_;
357 Field *row0 = values;
358 for(
unsigned int k = 1; k <= order; ++k )
360 Field *
const row1begin = values + offsets[ k-1 ];
361 Field *
const row1End = row1begin + mySize.sizes_[ k ];
362 assert( (
unsigned int)(row1End - values) <= offsets[ k ] );
364 Field *row1 = row1begin;
365 Field *it = row1begin + baseSizes[ k ];
366 for(
unsigned int j = 1; j <= k; ++j )
368 Field *
const end = it + baseSizes[ k ];
369 assert( (
unsigned int)(end - values) <= offsets[ k ] );
370 for( ; it != end; ++row1, ++it )
373 for( ; it != row1End; ++row0, ++it )
380 void evaluateSimplexBase (
const unsigned int deriv,
const unsigned int order,
381 const FieldVector< Field, dimD > &x,
382 const unsigned int block,
const unsigned int *
const offsets,
384 const BaseSize &size )
const
386 baseBasis_.evaluate( deriv, order, x, block, offsets, values );
390 void evaluatePyramidBase (
const unsigned int deriv,
const unsigned int order,
391 const FieldVector< Field, dimD > &x,
392 const unsigned int block,
const unsigned int *
const offsets,
394 const BaseSize &size )
const
398 if( Zero< Field >() < omz )
400 const Field invomz = Unity< Field >() / omz;
401 FieldVector< Field, dimD > y;
402 for(
unsigned int i = 0; i <
dimDomain-1; ++i )
403 y[ i ] = x[ i ] * invomz;
406 baseBasis_.evaluate( deriv, order, y, block, offsets, values );
409 for(
unsigned int k = 1; k <= order; ++k )
411 Field *it = values + block*offsets[ k-1 ];
412 Field *
const end = it + block*size.sizes_[ k ];
413 for( ; it != end; ++it )
421 *values = Unity< Field >();
422 for(
unsigned int k = 1; k <= order; ++k )
424 Field *it = values + block*offsets[ k-1 ];
425 Field *
const end = it + block*size.sizes_[ k ];
426 for( ; it != end; ++it )
427 *it = Zero< Field >();
433 void evaluateConical (
const unsigned int deriv,
const unsigned int order,
434 const FieldVector< Field, dimD > &x,
435 const unsigned int block,
const unsigned int *
const offsets,
436 Field *
const values )
const
438 typedef MonomialBasisHelper< dimDomain, dimD, Field > Helper;
440 const_cast<BaseSize&
>(size).computeSizes(order);
443 evaluateSimplexBase( deriv, order, x, block, offsets, values, size );
445 evaluatePyramidBase( deriv, order, x, block, offsets, values, size );
447 Field *row0 = values;
448 for(
unsigned int k = 1; k <= order; ++k )
450 Field *row1 = values + block*offsets[ k-1 ];
451 Field *wit = row1 + block*size.sizes_[ k ];
452 Helper::copy( deriv, wit, row0, size( k-1 ), x[
dimDomain-1 ] );
457 void integrateConical (
const unsigned int order,
458 const unsigned int *
const offsets,
459 Field *
const values )
const
464 baseBasis_.integrate( order, offsets, values );
466 const unsigned int *
const baseSizes = size.sizes_;
469 Field *
const col0End = values + baseSizes[ 0 ];
470 for(
Field *it = values; it != col0End; ++it )
474 Field *row0 = values;
475 for(
unsigned int k = 1; k <= order; ++k )
479 Field *
const row1 = values+offsets[ k-1 ];
480 Field *
const col0End = row1 + baseSizes[ k ];
482 for( ; it != col0End; ++it )
484 for(
unsigned int i = 1; i <= k; ++i )
486 Field *
const end = it + baseSizes[ k-i ];
487 assert( (
unsigned int)(end - values) <= offsets[ k ] );
488 for( ; it != end; ++row0, ++it )
489 *it = (*row0) * (
Field( i ) * factor);
500 template< GeometryType::Id geometryId,
class F >
502 :
public MonomialBasisImpl< geometryId, F >
504 static constexpr GeometryType geometry = geometryId;
506 typedef MonomialBasisImpl< geometryId, F > Base;
523 size_(
Size::instance())
530 size_.computeSizes(
order );
531 return size_.numBaseFunctions_;
536 return sizes( order_ );
541 size_.computeSizes( order_ );
542 return size_( order_ );
545 unsigned int derivSize (
const unsigned int deriv )
const
558 return geometry.id();
562 Field *
const values )
const
564 Base::evaluate( deriv, order_, x,
derivSize( deriv ),
sizes( order_ ), values );
567 template <
unsigned int deriv>
569 Field *
const values )
const
574 template<
unsigned int deriv,
class Vector >
576 Vector &values )
const
580 template<
unsigned int deriv, DerivativeLayoutNS::DerivativeLayout layout >
586 template<
unsigned int deriv >
593 template<
class Vector >
595 Vector &values )
const
600 template<
class DVector,
class RVector >
601 void evaluate (
const DVector &x, RVector &values )
const
603 assert( DVector::dimension ==
dimension);
612 Base::integrate( order_,
sizes( order_ ), values );
614 template <
class Vector>
621 This& operator=(
const This&);
631 template<
int dim,
class F >
633 :
public MonomialBasis< GeometryTypes::simplex(dim).toId() , F >
636 typedef MonomialBasis< GeometryTypes::simplex(dim).toId(), F > Base;
639 static constexpr GeometryType
geometry = GeometryTypes::simplex(dim);
652 template<
int dim,
class F >
654 :
public MonomialBasis< GeometryTypes::cube(dim).toId() , F >
657 typedef MonomialBasis< GeometryTypes::cube(dim).toId() , F > Base;
660 static constexpr GeometryType
geometry = GeometryTypes::cube(dim);
673 template<
int dim,
class F >
693 virtual const unsigned int *
sizes ( )
const = 0;
711 Field *
const values )
const = 0;
712 template <
unsigned int deriv >
714 Field *
const values )
const
718 template <
unsigned int deriv,
int size >
720 Dune::FieldVector<Field,size> *
const values )
const
722 evaluate( deriv, x, &(values[0][0]) );
724 template<
unsigned int deriv, DerivativeLayoutNS::DerivativeLayout layout >
730 template <
unsigned int deriv,
class Vector>
732 Vector &values )
const
736 template<
class Vector >
738 Vector &values )
const
742 template<
class DVector,
class RVector >
743 void evaluate (
const DVector &x, RVector &values )
const
745 assert( DVector::dimension ==
dimension);
751 template<
unsigned int deriv,
class DVector,
class RVector >
752 void evaluate (
const DVector &x, RVector &values )
const
754 assert( DVector::dimension ==
dimension);
762 template <
class Vector>
772 template< GeometryType::Id geometryId,
class F >
776 static constexpr GeometryType geometry = geometryId;
790 return basis_.sizes(order_);
794 Field *
const values )
const
796 basis_.evaluate(deriv,x,values);
801 basis_.integrate(values);
812 template<
int dim,
class F >
821 template <
int dd,
class FF >
827 template< GeometryType::Id geometryId >
840 template<
int dim,
class SF >
842 :
public TopologySingletonFactory< MonomialBasisFactory< dim, SF > >
846 template <
int dd,
class FF >
Definition bdfmcube.hh:18
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition field.hh:160
A class representing the unit of a given Field.
Definition field.hh:31
A class representing the zero of a given Field.
Definition field.hh:80
Definition monomialbasis.hh:84
unsigned int * numBaseFunctions_
Definition monomialbasis.hh:100
void computeSizes(unsigned int order)
Definition monomialbasis.hh:126
unsigned int * sizes_
Definition monomialbasis.hh:97
MonomialBasisSize()
Definition monomialbasis.hh:102
~MonomialBasisSize()
Definition monomialbasis.hh:110
unsigned int operator()(const unsigned int order) const
Definition monomialbasis.hh:116
unsigned int maxOrder_
Definition monomialbasis.hh:94
unsigned int maxOrder() const
Definition monomialbasis.hh:121
static This & instance()
Definition monomialbasis.hh:88
Definition monomialbasis.hh:503
unsigned int size() const
Definition monomialbasis.hh:539
static const unsigned int dimension
Definition monomialbasis.hh:509
Dune::FieldVector< Field, dimRange > RangeVector
Definition monomialbasis.hh:516
void evaluate(const unsigned int deriv, const DomainVector &x, Field *const values) const
Definition monomialbasis.hh:561
const unsigned int * sizes() const
Definition monomialbasis.hh:534
unsigned int topologyId() const
Definition monomialbasis.hh:556
void integrate(Vector &values) const
Definition monomialbasis.hh:615
Base::Field Field
Definition monomialbasis.hh:512
void integrate(Field *const values) const
Definition monomialbasis.hh:610
static const unsigned int dimRange
Definition monomialbasis.hh:510
Base::DomainVector DomainVector
Definition monomialbasis.hh:514
void evaluate(const DomainVector &x, Field *const values) const
Definition monomialbasis.hh:568
void evaluate(const DomainVector &x, Vector &values) const
Definition monomialbasis.hh:594
void evaluate(const DomainVector &x, FieldVector< Field, Derivatives< Field, dimension, 1, deriv, DerivativeLayoutNS::value >::size > *values) const
Definition monomialbasis.hh:587
void evaluate(const DomainVector &x, Derivatives< Field, dimension, 1, deriv, layout > *values) const
Definition monomialbasis.hh:581
void evaluate(const DVector &x, RVector &values) const
Definition monomialbasis.hh:601
MonomialBasisSize< geometryId > Size
Definition monomialbasis.hh:518
void evaluate(const DomainVector &x, Vector &values) const
Definition monomialbasis.hh:575
MonomialBasis(unsigned int order)
Definition monomialbasis.hh:520
unsigned int derivSize(const unsigned int deriv) const
Definition monomialbasis.hh:545
const unsigned int * sizes(unsigned int order) const
Definition monomialbasis.hh:528
unsigned int order() const
Definition monomialbasis.hh:551
Definition monomialbasis.hh:177
MonomialBasisSize< GeometryTypes::simplex(dim).toId() > Size
Definition monomialbasis.hh:179
static void copy(const unsigned int deriv, F *&wit, F *&rit, const unsigned int numBaseFunctions, const F &z)
Definition monomialbasis.hh:181
MonomialBasisSize< GeometryTypes::simplex(mydim).toId() > MySize
Definition monomialbasis.hh:178
FieldVector< Field, dimDomain > DomainVector
Definition monomialbasis.hh:284
static constexpr GeometryType geometry
Definition monomialbasis.hh:279
static constexpr GeometryType baseGeometry
Definition monomialbasis.hh:280
F Field
Definition monomialbasis.hh:277
static const unsigned int dimDomain
Definition monomialbasis.hh:282
Definition monomialbasis.hh:237
static const unsigned int dimDomain
Definition monomialbasis.hh:244
F Field
Definition monomialbasis.hh:242
FieldVector< Field, dimDomain > DomainVector
Definition monomialbasis.hh:246
static constexpr GeometryType geometry
Definition monomialbasis.hh:241
static constexpr GeometryType geometry
Definition monomialbasis.hh:639
StandardMonomialBasis(unsigned int order)
Definition monomialbasis.hh:642
static const int dimension
Definition monomialbasis.hh:640
static const int dimension
Definition monomialbasis.hh:661
static constexpr GeometryType geometry
Definition monomialbasis.hh:660
StandardBiMonomialBasis(unsigned int order)
Definition monomialbasis.hh:663
Definition monomialbasis.hh:675
GeometryType geometry_
Definition monomialbasis.hh:769
FieldVector< Field, dimension > DomainVector
Definition monomialbasis.hh:684
unsigned int order_
Definition monomialbasis.hh:768
void evaluate(const DomainVector &x, Vector &values) const
Definition monomialbasis.hh:737
void evaluate(const DomainVector &x, Field *const values) const
Definition monomialbasis.hh:713
F Field
Definition monomialbasis.hh:679
void evaluate(const DomainVector &x, Vector &values) const
Definition monomialbasis.hh:731
void evaluate(const DVector &x, RVector &values) const
Definition monomialbasis.hh:743
unsigned int order() const
Definition monomialbasis.hh:700
static const unsigned int dimRange
Definition monomialbasis.hh:682
F StorageField
Definition monomialbasis.hh:680
static const int dimension
Definition monomialbasis.hh:681
unsigned int size() const
Definition monomialbasis.hh:695
FieldVector< Field, dimRange > RangeVector
Definition monomialbasis.hh:685
virtual ~VirtualMonomialBasis()
Definition monomialbasis.hh:691
virtual void evaluate(const unsigned int deriv, const DomainVector &x, Field *const values) const =0
virtual void integrate(Field *const values) const =0
void evaluate(const DomainVector &x, Dune::FieldVector< Field, size > *const values) const
Definition monomialbasis.hh:719
void evaluate(const DVector &x, RVector &values) const
Definition monomialbasis.hh:752
GeometryType type() const
Definition monomialbasis.hh:705
void evaluate(const DomainVector &x, Derivatives< Field, dimension, 1, deriv, layout > *values) const
Definition monomialbasis.hh:725
VirtualMonomialBasis(const GeometryType >, unsigned int order)
Definition monomialbasis.hh:687
virtual const unsigned int * sizes() const =0
void integrate(Vector &values) const
Definition monomialbasis.hh:763
Definition monomialbasis.hh:775
void integrate(Field *const values) const
Definition monomialbasis.hh:799
const unsigned int * sizes() const
Definition monomialbasis.hh:788
Base::DomainVector DomainVector
Definition monomialbasis.hh:782
Base::Field Field
Definition monomialbasis.hh:781
void evaluate(const unsigned int deriv, const DomainVector &x, Field *const values) const
Definition monomialbasis.hh:793
VirtualMonomialBasisImpl(unsigned int order)
Definition monomialbasis.hh:784
Definition monomialbasis.hh:814
static void release(Object *object)
Definition monomialbasis.hh:832
const VirtualMonomialBasis< dimension, F > Object
Definition monomialbasis.hh:819
static Object * create(const Key &order)
Definition monomialbasis.hh:828
F StorageField
Definition monomialbasis.hh:816
static const unsigned int dimension
Definition monomialbasis.hh:815
unsigned int Key
Definition monomialbasis.hh:818
Definition monomialbasis.hh:823
MonomialBasisFactory< dd, FF > Type
Definition monomialbasis.hh:824
Definition monomialbasis.hh:843
static const unsigned int dimension
Definition monomialbasis.hh:844
Field StorageField
Definition monomialbasis.hh:845
Definition monomialbasis.hh:848
MonomialBasisProvider< dd, FF > Type
Definition monomialbasis.hh:849