5#ifndef DUNE_POLYNOMIALBASIS_HH 
    6#define DUNE_POLYNOMIALBASIS_HH 
   13#include <dune/localfunctions/common/localbasis.hh> 
   15#include <dune/localfunctions/utility/coeffmatrix.hh> 
   16#include <dune/localfunctions/utility/monomialbasis.hh> 
   17#include <dune/localfunctions/utility/multiindex.hh> 
   18#include <dune/localfunctions/utility/basisevaluator.hh> 
   61  template< 
class Eval, 
class CM, 
class D, 
class R >
 
   65    typedef Eval Evaluator;
 
   68    typedef CM CoefficientMatrix;
 
   70    typedef typename CoefficientMatrix::Field StorageField;
 
   72    static const unsigned int dimension = Evaluator::dimension;
 
   73    static const unsigned int dimRange = Evaluator::dimRange*CoefficientMatrix::blockSize;
 
   77    typedef typename Evaluator::Basis Basis;
 
   78    typedef typename Evaluator::DomainVector DomainVector;
 
   84                     const CoefficientMatrix &coeffMatrix,
 
   87        coeffMatrix_(&coeffMatrix),
 
   89        order_(basis.order()),
 
   96    const Basis &basis ()
 const 
  101    const CoefficientMatrix &matrix ()
 const 
  103      return *coeffMatrix_;
 
  106    unsigned int order ()
 const 
  111    unsigned int size ()
 const 
  118                           std::vector<typename Traits::RangeType>& out)
 const 
  126                           std::vector<typename Traits::JacobianType>& out) 
const       
  134                          std::vector<HessianType>& out) 
const           
  141    void partial (
const std::array<unsigned int, dimension>& order,
 
  143                  std::vector<typename Traits::RangeType>& out) 
const       
  147      if (totalOrder == 0) {
 
  150      else if (totalOrder == 1) {
 
  151        std::vector<typename Traits::JacobianType> jacs(out.size());
 
  153        for (
unsigned int i=0;i<order.size();++i)
 
  154          if (order[i]==1) k=i;
 
  156        for (
unsigned int i=0;i<out.size();++i)
 
  157          for (
unsigned int r=0;r<Traits::RangeType::dimension;++r)
 
  158            out[i][r] = jacs[i][r][k];
 
  160      else if (totalOrder == 2) {
 
  161        std::vector<HessianType> hesss(out.size());
 
  163        for (
unsigned int i=0;i<order.size();++i) {
 
  164          if (order[i] >= 1 && k == -1)
 
  166          else if (order[i]==1) l=i;
 
  170        for (
unsigned int i=0;i<out.size();++i)
 
  171          for (
unsigned int r=0;r<Traits::RangeType::dimension;++r)
 
  172            out[i][r] = hesss[i][r][k][l];
 
  179    template< 
unsigned int deriv, 
class F >
 
  180    void evaluate ( 
const DomainVector &x, F *values )
 const 
  182      coeffMatrix_->mult( eval_.template evaluate<deriv>( x ), size(), values);
 
  184    template< 
unsigned int deriv, 
class DVector, 
class F >
 
  185    void evaluate ( 
const DVector &x, F *values )
 const 
  187      assert( DVector::dimension == dimension);
 
  189      for( 
int d = 0; d < dimension; ++d )
 
  191      evaluate<deriv>( bx, values );
 
  194    template <
bool dummy,
class DVector>
 
  197      static DomainVector apply( 
const DVector &x )
 
  199        assert( DVector::dimension == dimension);
 
  201        for( 
unsigned int d = 0; d < dimension; ++d )
 
  206    template <
bool dummy>
 
  207    struct Convert<dummy,DomainVector>
 
  209      static const DomainVector &apply( 
const DomainVector &x )
 
  214    template< 
unsigned int deriv, 
class DVector, 
class RVector >
 
  215    void evaluate ( 
const DVector &x, RVector &values )
 const 
  217      assert(values.size()>=size());
 
  218      const DomainVector &bx = Convert<true,DVector>::apply(x);
 
  219      coeffMatrix_->mult( eval_.template evaluate<deriv>( bx ), values );
 
  223    void evaluate ( 
const DomainVector &x, std::vector<FieldVector<Fy,dimRange> > &values )
 const 
  225      evaluate<0>(x,values);
 
  227    template< 
class DVector, 
class RVector >
 
  228    void evaluate ( 
const DVector &x, RVector &values )
 const 
  230      assert( DVector::dimension == dimension);
 
  232      for( 
unsigned int d = 0; d < dimension; ++d )
 
  234      evaluate<0>( bx, values );
 
  237    template< 
unsigned int deriv, 
class Vector >
 
  238    void evaluateSingle ( 
const DomainVector &x, Vector &values )
 const 
  240      assert(values.size()>=size());
 
  241      coeffMatrix_->template mult<deriv>( eval_.template evaluate<deriv>( x ), values );
 
  243    template< 
unsigned int deriv, 
class Fy >
 
  244    void evaluateSingle ( 
const DomainVector &x,
 
  245                          std::vector< FieldVector<FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size>,dimRange> > &values)
 const 
  247      evaluateSingle<deriv>(x,
reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*dimRange
> >&>(values));
 
  249    template< 
unsigned int deriv, 
class Fy >
 
  250    void evaluateSingle ( 
const DomainVector &x,
 
  251                          std::vector< FieldVector<LFETensor<Fy,dimension,deriv>,dimRange> > &values)
 const 
  253      evaluateSingle<deriv>(x,
reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*dimRange
> >&>(values));
 
  257    void jacobian ( 
const DomainVector &x,
 
  258        std::vector<FieldMatrix<Fy,dimRange,dimension> > &values )
 const 
  260      assert(values.size()>=size());
 
  261      evaluateSingle<1>(x,
reinterpret_cast<std::vector<FieldVector<Fy,dimRange*dimension> 
>&>(values));
 
  263    template< 
class DVector, 
class RVector >
 
  264    void jacobian ( 
const DVector &x, RVector &values )
 const 
  266      assert( DVector::dimension == dimension);
 
  268      for( 
unsigned int d = 0; d < dimension; ++d )
 
  270      jacobian( bx, values );
 
  273    void hessian ( 
const DomainVector &x,
 
  274        std::vector<HessianFyType<Fy>> &values )
 const 
  276      assert(values.size()>=size());
 
  279      const unsigned int hsize = LFETensor<Fy,dimension,2>::size;
 
  280      std::vector< FieldVector< FieldVector<Fy,hsize>, dimRange> > y( size() );
 
  281      evaluateSingle<2>(x, y);
 
  283      for (
unsigned int i = 0; i < size(); ++i)
 
  284        for (
unsigned int r = 0; r < dimRange; ++r)
 
  292          for (
unsigned int k = 0; k < dimension; ++k)
 
  293            for (
unsigned int l = 0; l <= k; ++l)
 
  296              values[i][r][k][l] = y[i][r][q];
 
  297              values[i][r][l][k] = y[i][r][q];
 
  304    template< 
class DVector, 
class HVector >
 
  305    void hessian ( 
const DVector &x, HVector &values )
 const 
  307      assert( DVector::dimension == dimension);
 
  309      for( 
unsigned int d = 0; d < dimension; ++d )
 
  311      hessian( bx, values );
 
  315    void integrate ( std::vector<Fy> &values )
 const 
  317      assert(values.size()>=size());
 
  318      coeffMatrix_->mult( eval_.integrate(), values );
 
  322    PolynomialBasis(
const PolynomialBasis &other)
 
  323      : basis_(other.basis_),
 
  324        coeffMatrix_(other.coeffMatrix_),
 
  326        order_(basis_.order()),
 
  329    PolynomialBasis &operator=(
const PolynomialBasis&);
 
  331    const CoefficientMatrix* coeffMatrix_;
 
  332    mutable Evaluator eval_;
 
  333    unsigned int order_,size_;
 
  342  template< 
class Eval, 
class CM = SparseCoeffMatrix<
typename Eval::Field,Eval::dimRange>,
 
  343      class D=
double, 
class R=
double>
 
  348    typedef CM CoefficientMatrix;
 
  351    typedef Eval Evaluator;
 
  357    typedef typename Base::Basis Basis;
 
  360      : 
Base(basis,coeffMatrix_,0)
 
  363    template <
class Matrix>
 
  364    void fill(
const Matrix& matrix)
 
  366      coeffMatrix_.fill(matrix);
 
  367      this->size_ = coeffMatrix_.size();
 
  369    template <
class Matrix>
 
  370    void fill(
const Matrix& matrix,
int size)
 
  372      coeffMatrix_.fill(matrix);
 
  373      assert(size<=coeffMatrix_.size());
 
  380    CoefficientMatrix coeffMatrix_;
 
A dense n x m matrix.
Definition: fmatrix.hh:117
 
vector space out of a tensor product of fields.
Definition: fvector.hh:97
 
A generic dynamic dense matrix.
Definition: matrix.hh:561
 
Default exception for dummy implementations.
Definition: exceptions.hh:357
 
Definition: polynomialbasis.hh:346
 
Definition: polynomialbasis.hh:63
 
void evaluateHessian(const typename Traits::DomainType &x, std::vector< HessianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: polynomialbasis.hh:133
 
void evaluateFunction(const typename Traits::DomainType &x, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: polynomialbasis.hh:117
 
void evaluateJacobian(const typename Traits::DomainType &x, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: polynomialbasis.hh:125
 
void partial(const std::array< unsigned int, dimension > &order, const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate partial derivatives of all shape functions.
Definition: polynomialbasis.hh:141
 
Implements a matrix constructed from a given type representing a field and compile-time given number ...
 
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
 
constexpr T accumulate(Range &&range, T value, F &&f)
Accumulate values.
Definition: hybridutilities.hh:280
 
Dune namespace.
Definition: alignedallocator.hh:13
 
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:160
 
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:35
 
D DomainType
domain type
Definition: localbasis.hh:43