5#ifndef DUNE_MONOMIALBASIS_HH
6#define DUNE_MONOMIALBASIS_HH
71 template< GeometryType::Id geometryId >
72 class MonomialBasisSize;
74 template< GeometryType::Id geometryId,
class F >
82 template< GeometryType::Id geometryId >
90 static This _instance;
135 sizes_ =
new unsigned int[ order+1 ];
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);
218 prit +=
size.sizes_[d-1] - mySize.
sizes_[d-1];
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;
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>
289 friend class
MonomialBasisImpl< GeometryTypes::conicalExtension(geometry).toId(), Field >;
300 void evaluate (
const unsigned int deriv,
const unsigned int order,
302 const unsigned int block,
const unsigned int *
const offsets,
303 Field *
const values )
const
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
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 ];
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 ];
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 >
523 size_(
Size::instance())
536 return sizes( 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
578 evaluate<deriv>(x,&(values[0]));
580 template<
unsigned int deriv, DerivativeLayoutNS::DerivativeLayout layout >
584 evaluate<deriv>(x,&(values->block()));
586 template<
unsigned int deriv >
593 template<
class Vector >
595 Vector &values )
const
597 evaluate<0>(x,&(values[0]));
600 template<
class DVector,
class RVector >
601 void evaluate (
const DVector &x, RVector &values )
const
603 assert( DVector::dimension ==
dimension);
607 evaluate<0>( bx, values );
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 >
652 template<
int dim,
class F >
654 :
public MonomialBasis< GeometryTypes::cube(dim).toId() , F >
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 >
722 evaluate( deriv, x, &(values[0][0]) );
724 template<
unsigned int deriv, DerivativeLayoutNS::DerivativeLayout layout >
728 evaluate<deriv>(x,&(values->block()));
730 template <
unsigned int deriv,
class Vector>
732 Vector &values )
const
734 evaluate<deriv>( x, &(values[ 0 ]) );
736 template<
class Vector >
738 Vector &values )
const
740 evaluate<0>(x,values);
742 template<
class DVector,
class RVector >
743 void evaluate (
const DVector &x, RVector &values )
const
745 assert( DVector::dimension ==
dimension);
749 evaluate<0>( bx, values );
751 template<
unsigned int deriv,
class DVector,
class RVector >
752 void evaluate (
const DVector &x, RVector &values )
const
754 assert( DVector::dimension ==
dimension);
758 evaluate<deriv>( bx, values );
762 template <
class Vector>
772 template< GeometryType::Id geometryId,
class F >
790 return basis_.
sizes(order_);
794 Field *
const values )
const
812 template<
int dim,
class F >
821 template <
int dd,
class FF >
827 template< GeometryType::Id geometryId >
840 template<
int dim,
class SF >
846 template <
int dd,
class FF >
virtual void operator()()=0
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition field.hh:160
constexpr unsigned int dim() const
constexpr bool isPrismatic() const
constexpr unsigned int id() const
constexpr bool isSimplex() const
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 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
Definition monomialbasis.hh:275
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
F Field
Definition monomialbasis.hh:242
FieldVector< Field, dimDomain > DomainVector
Definition monomialbasis.hh:246
Definition monomialbasis.hh:634
static constexpr GeometryType geometry
Definition monomialbasis.hh:639
StandardMonomialBasis(unsigned int order)
Definition monomialbasis.hh:642
static const int dimension
Definition monomialbasis.hh:640
Definition monomialbasis.hh:655
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
SF StorageField
Definition monomialbasis.hh:845
Definition monomialbasis.hh:848
MonomialBasisProvider< dd, FF > Type
Definition monomialbasis.hh:849