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>
241 static constexpr GeometryType
geometry = GeometryTypes::vertex;
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;
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;
505 typedef MonomialBasis< geometryId, F > This;
506 typedef MonomialBasisImpl< geometryId, F > Base;
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 >
639 static constexpr GeometryType
geometry = GeometryTypes::simplex(dim);
652 template<
int dim,
class F >
654 :
public MonomialBasis< GeometryTypes::cube(dim).toId() , F >
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 >
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 >
776 static constexpr GeometryType geometry = geometryId;
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 >
842 :
public TopologySingletonFactory< MonomialBasisFactory< dim, SF > >
846 template <
int dd,
class FF >
FieldVector< Field, dimDomain > DomainVector
Definition: monomialbasis.hh:284
Definition: tensor.hh:180
Definition: monomialbasis.hh:75
unsigned int order_
Definition: monomialbasis.hh:768
FieldVector< Field, dimension > DomainVector
Definition: monomialbasis.hh:684
static const unsigned int dimension
Definition: monomialbasis.hh:844
VirtualMonomialBasis(const GeometryType >, unsigned int order)
Definition: monomialbasis.hh:687
void integrate(Vector &values) const
Definition: monomialbasis.hh:615
void evaluate(const unsigned int deriv, const DomainVector &x, Field *const values) const
Definition: monomialbasis.hh:561
~MonomialBasisSize()
Definition: monomialbasis.hh:110
F Field
Definition: monomialbasis.hh:242
Definition: monomialbasis.hh:653
static constexpr GeometryType geometry
Definition: monomialbasis.hh:660
A class representing the zero of a given Field.
Definition: field.hh:79
Definition: monomialbasis.hh:233
const unsigned int * sizes(unsigned int order) const
Definition: monomialbasis.hh:528
Base::Field Field
Definition: monomialbasis.hh:781
Definition: monomialbasis.hh:72
static constexpr GeometryType baseGeometry
Definition: monomialbasis.hh:280
static void release(Object *object)
Definition: monomialbasis.hh:832
void evaluate(const unsigned int deriv, const DomainVector &x, Field *const values) const
Definition: monomialbasis.hh:793
void integrate(Field *const values) const
Definition: monomialbasis.hh:610
Definition: monomialbasis.hh:841
void evaluate(const DomainVector &x, Vector &values) const
Definition: monomialbasis.hh:575
Definition: monomialbasis.hh:773
void integrate(Field *const values) const
Definition: monomialbasis.hh:799
virtual void integrate(Field *const values) const =0
void evaluate(const DomainVector &x, Field *const values) const
Definition: monomialbasis.hh:568
unsigned int Key
Definition: monomialbasis.hh:818
Base::Field Field
Definition: monomialbasis.hh:512
unsigned int maxOrder() const
Definition: monomialbasis.hh:121
Definition: monomialbasis.hh:632
void evaluate(const DomainVector &x, Dune::FieldVector< Field, size > *const values) const
Definition: monomialbasis.hh:719
F Field
Definition: monomialbasis.hh:277
unsigned int * sizes_
Definition: monomialbasis.hh:97
StandardBiMonomialBasis(unsigned int order)
Definition: monomialbasis.hh:663
MonomialBasisSize()
Definition: monomialbasis.hh:102
SF StorageField
Definition: monomialbasis.hh:845
const unsigned int * sizes() const
Definition: monomialbasis.hh:788
Base::DomainVector DomainVector
Definition: monomialbasis.hh:782
static const int dimension
Definition: monomialbasis.hh:681
static const unsigned int dimDomain
Definition: monomialbasis.hh:282
Definition: bdfmcube.hh:17
unsigned int topologyId() const
Definition: monomialbasis.hh:556
F StorageField
Definition: monomialbasis.hh:816
unsigned int order() const
Definition: monomialbasis.hh:700
Definition: monomialbasis.hh:822
FieldVector< Field, dimDomain > DomainVector
Definition: monomialbasis.hh:246
virtual void evaluate(const unsigned int deriv, const DomainVector &x, Field *const values) const =0
const VirtualMonomialBasis< dimension, F > Object
Definition: monomialbasis.hh:819
MonomialBasisSize< GeometryTypes::simplex(mydim).toId() > MySize
Definition: monomialbasis.hh:178
static void copy(const unsigned int deriv, F *&wit, F *&rit, const unsigned int numBaseFunctions, const F &z)
Definition: monomialbasis.hh:181
MonomialBasisProvider< dd, FF > Type
Definition: monomialbasis.hh:849
VirtualMonomialBasisImpl(unsigned int order)
Definition: monomialbasis.hh:784
const unsigned int * sizes() const
Definition: monomialbasis.hh:534
unsigned int order() const
Definition: monomialbasis.hh:551
MonomialBasisSize< geometryId > Size
Definition: monomialbasis.hh:518
FieldVector< Field, dimRange > RangeVector
Definition: monomialbasis.hh:685
void evaluate(const DVector &x, RVector &values) const
Definition: monomialbasis.hh:601
void computeSizes(unsigned int order)
Definition: monomialbasis.hh:126
unsigned int operator()(const unsigned int order) const
Definition: monomialbasis.hh:116
virtual const unsigned int * sizes() const =0
void evaluate(const DomainVector &x, FieldVector< Field, Derivatives< Field, dimension, 1, deriv, DerivativeLayoutNS::value >::size > *values) const
Definition: monomialbasis.hh:587
F Field
Definition: monomialbasis.hh:679
Base::DomainVector DomainVector
Definition: monomialbasis.hh:514
static const unsigned int dimension
Definition: monomialbasis.hh:815
void evaluate(const DomainVector &x, Field *const values) const
Definition: monomialbasis.hh:713
F StorageField
Definition: monomialbasis.hh:680
GeometryType geometry_
Definition: monomialbasis.hh:769
void evaluate(const DomainVector &x, Vector &values) const
Definition: monomialbasis.hh:594
static const int dimension
Definition: monomialbasis.hh:640
static constexpr GeometryType geometry
Definition: monomialbasis.hh:639
MonomialBasisFactory< dd, FF > Type
Definition: monomialbasis.hh:824
void evaluate(const DVector &x, RVector &values) const
Definition: monomialbasis.hh:743
unsigned int * numBaseFunctions_
Definition: monomialbasis.hh:100
unsigned int size() const
Definition: monomialbasis.hh:695
GeometryType type() const
Definition: monomialbasis.hh:705
static const unsigned int dimRange
Definition: monomialbasis.hh:510
A class representing the unit of a given Field.
Definition: field.hh:30
MonomialBasisSize< GeometryTypes::simplex(dim).toId() > Size
Definition: monomialbasis.hh:179
static const int dimension
Definition: monomialbasis.hh:661
StandardMonomialBasis(unsigned int order)
Definition: monomialbasis.hh:642
Definition: monomialbasis.hh:176
void evaluate(const DomainVector &x, Vector &values) const
Definition: monomialbasis.hh:731
unsigned int maxOrder_
Definition: monomialbasis.hh:94
void evaluate(const DomainVector &x, Derivatives< Field, dimension, 1, deriv, layout > *values) const
Definition: monomialbasis.hh:581
Dune::FieldVector< Field, dimRange > RangeVector
Definition: monomialbasis.hh:516
void evaluate(const DomainVector &x, Derivatives< Field, dimension, 1, deriv, layout > *values) const
Definition: monomialbasis.hh:725
void evaluate(const DomainVector &x, Vector &values) const
Definition: monomialbasis.hh:737
Definition: monomialbasis.hh:674
Definition: monomialbasis.hh:236
static constexpr GeometryType geometry
Definition: monomialbasis.hh:279
unsigned int size() const
Definition: monomialbasis.hh:539
static This & instance()
Definition: monomialbasis.hh:88
static const unsigned int dimRange
Definition: monomialbasis.hh:682
static const unsigned int dimension
Definition: monomialbasis.hh:509
void integrate(Vector &values) const
Definition: monomialbasis.hh:763
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:160
MonomialBasis(unsigned int order)
Definition: monomialbasis.hh:520
unsigned int derivSize(const unsigned int deriv) const
Definition: monomialbasis.hh:545
Definition: monomialbasis.hh:847
void evaluate(const DVector &x, RVector &values) const
Definition: monomialbasis.hh:752
Definition: monomialbasis.hh:813
static Object * create(const Key &order)
Definition: monomialbasis.hh:828
virtual ~VirtualMonomialBasis()
Definition: monomialbasis.hh:691