5#ifndef DUNE_POLYNOMIALBASIS_HH
6#define DUNE_POLYNOMIALBASIS_HH
11#include <dune/common/fmatrix.hh>
63 template<
class Eval,
class CM,
class D=
double,
class R=
double >
67 typedef Eval Evaluator;
74 static const unsigned int dimension = Evaluator::dimension;
75 static const unsigned int dimRange = Evaluator::dimRange*CoefficientMatrix::blockSize;
78 FieldMatrix<R,dimRange,dimension> >
Traits;
79 typedef typename Evaluator::Basis
Basis;
120 std::vector<typename Traits::RangeType>& out)
const
128 std::vector<typename Traits::JacobianType>& out)
const
136 std::vector<HessianType>& out)
const
145 std::vector<typename Traits::RangeType>& out)
const
148 auto totalOrder = std::accumulate(
order.begin(),
order.end(), 0);
149 if (totalOrder == 0) {
152 else if (totalOrder == 1) {
153 std::vector<typename Traits::JacobianType> jacs(out.size());
155 for (
unsigned int i=0;i<
order.size();++i)
156 if (
order[i]==1) k=i;
158 for (
unsigned int i=0;i<out.size();++i)
159 for (
unsigned int r=0;r<Traits::RangeType::dimension;++r)
160 out[i][r] = jacs[i][r][k];
162 else if (totalOrder == 2) {
163 std::vector<HessianType> hesss(out.size());
165 for (
unsigned int i=0;i<
order.size();++i) {
166 if (
order[i] >= 1 && k == -1)
168 else if (
order[i]==1) l=i;
172 for (
unsigned int i=0;i<out.size();++i)
173 for (
unsigned int r=0;r<Traits::RangeType::dimension;++r)
174 out[i][r] = hesss[i][r][k][l];
177 DUNE_THROW(NotImplemented,
"Desired derivative order is not implemented");
181 template<
unsigned int deriv,
class F >
186 template<
unsigned int deriv,
class DVector,
class F >
187 void evaluate (
const DVector &x, F *values )
const
189 assert( DVector::dimension ==
dimension);
193 evaluate<deriv>( bx, values );
196 template <
bool dummy,
class DVector>
201 assert( DVector::dimension ==
dimension);
203 for(
unsigned int d = 0; d <
dimension; ++d )
208 template <
bool dummy>
216 template<
unsigned int deriv,
class DVector,
class RVector >
217 void evaluate (
const DVector &x, RVector &values )
const
219 assert(values.size()>=
size());
227 evaluate<0>(x,values);
229 template<
class DVector,
class RVector >
230 void evaluate (
const DVector &x, RVector &values )
const
232 assert( DVector::dimension ==
dimension);
234 for(
unsigned int d = 0; d <
dimension; ++d )
236 evaluate<0>( bx, values );
239 template<
unsigned int deriv,
class Vector >
242 assert(values.size()>=
size());
243 coeffMatrix_->template mult<deriv>(
eval_.template evaluate<deriv>( x ), values );
245 template<
unsigned int deriv,
class Fy >
249 evaluateSingle<deriv>(x,
reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*
dimRange> >&>(values));
251 template<
unsigned int deriv,
class Fy >
255 evaluateSingle<deriv>(x,
reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*
dimRange> >&>(values));
260 std::vector<FieldMatrix<Fy,dimRange,dimension> > &values )
const
262 assert(values.size()>=
size());
263 evaluateSingle<1>(x,
reinterpret_cast<std::vector<FieldVector<Fy,dimRange*dimension>
>&>(values));
265 template<
class DVector,
class RVector >
266 void jacobian (
const DVector &x, RVector &values )
const
268 assert( DVector::dimension ==
dimension);
270 for(
unsigned int d = 0; d <
dimension; ++d )
278 assert(values.size()>=
size());
282 std::vector< FieldVector< FieldVector<Fy,hsize>,
dimRange> > y(
size() );
283 evaluateSingle<2>(x, y);
285 for (
unsigned int i = 0; i <
size(); ++i)
286 for (
unsigned int r = 0; r <
dimRange; ++r)
294 for (
unsigned int k = 0; k <
dimension; ++k)
295 for (
unsigned int l = 0; l <= k; ++l)
298 values[i][r][k][l] = y[i][r][q];
299 values[i][r][l][k] = y[i][r][q];
306 template<
class DVector,
class HVector >
307 void hessian (
const DVector &x, HVector &values )
const
309 assert( DVector::dimension ==
dimension);
311 for(
unsigned int d = 0; d <
dimension; ++d )
319 assert(values.size()>=
size());
344 template<
class Eval,
class CM = SparseCoeffMatrix<
typename Eval::Field,Eval::dimRange>,
345 class D=
double,
class R=
double>
353 typedef Eval Evaluator;
365 template <
class Matrix>
368 coeffMatrix_.fill(
matrix);
369 this->
size_ = coeffMatrix_.size();
371 template <
class Matrix>
374 coeffMatrix_.fill(
matrix);
375 assert(
size<=coeffMatrix_.size());
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:159
Type traits for LocalBasisVirtualInterface.
Definition common/localbasis.hh:35
D DomainType
domain type
Definition common/localbasis.hh:43
Definition polynomialbasis.hh:65
void evaluate(const DVector &x, RVector &values) const
Definition polynomialbasis.hh:230
void evaluate(const DomainVector &x, std::vector< FieldVector< Fy, dimRange > > &values) const
Definition polynomialbasis.hh:225
PolynomialBasis(const PolynomialBasis &other)
Definition polynomialbasis.hh:324
void evaluate(const DVector &x, F *values) const
Definition polynomialbasis.hh:187
void evaluateHessian(const typename Traits::DomainType &x, std::vector< HessianType > &out) const
Evaluate Jacobian of all shape functions.
Definition polynomialbasis.hh:135
CoefficientMatrix::Field StorageField
Definition polynomialbasis.hh:72
static const unsigned int dimRange
Definition polynomialbasis.hh:75
void jacobian(const DVector &x, RVector &values) const
Definition polynomialbasis.hh:266
Evaluator::DomainVector DomainVector
Definition polynomialbasis.hh:80
Evaluator::Basis Basis
Definition polynomialbasis.hh:79
void evaluateSingle(const DomainVector &x, Vector &values) const
Definition polynomialbasis.hh:240
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< LFETensor< Fy, dimension, deriv >, dimRange > > &values) const
Definition polynomialbasis.hh:252
void jacobian(const DomainVector &x, std::vector< FieldMatrix< Fy, dimRange, dimension > > &values) const
Definition polynomialbasis.hh:259
const CoefficientMatrix & matrix() const
Definition polynomialbasis.hh:103
const Basis & basis_
Definition polynomialbasis.hh:332
void evaluateFunction(const typename Traits::DomainType &x, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition polynomialbasis.hh:119
static const unsigned int dimension
Definition polynomialbasis.hh:74
void evaluateJacobian(const typename Traits::DomainType &x, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition polynomialbasis.hh:127
PolynomialBasis & operator=(const PolynomialBasis &)
const CoefficientMatrix * coeffMatrix_
Definition polynomialbasis.hh:333
void integrate(std::vector< Fy > &values) const
Definition polynomialbasis.hh:317
unsigned int size() const
Definition polynomialbasis.hh:113
void evaluate(const DomainVector &x, F *values) const
Definition polynomialbasis.hh:182
void hessian(const DVector &x, HVector &values) const
Definition polynomialbasis.hh:307
CM CoefficientMatrix
Definition polynomialbasis.hh:70
HessianFyType< R > HessianType
Definition polynomialbasis.hh:83
LocalBasisTraits< D, dimension, FieldVector< D, dimension >, R, dimRange, FieldVector< R, dimRange >, FieldMatrix< R, dimRange, dimension > > Traits
Definition polynomialbasis.hh:78
unsigned int order_
Definition polynomialbasis.hh:335
void hessian(const DomainVector &x, std::vector< HessianFyType< Fy > > &values) const
Definition polynomialbasis.hh:275
void evaluate(const DVector &x, RVector &values) const
Definition polynomialbasis.hh:217
PolynomialBasis(const Basis &basis, const CoefficientMatrix &coeffMatrix, unsigned int size)
Definition polynomialbasis.hh:85
FieldVector< FieldMatrix< Fy, dimension, dimension >, dimRange > HessianFyType
Definition polynomialbasis.hh:82
unsigned int order() const
Definition polynomialbasis.hh:108
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< FieldVector< Fy, LFETensor< Fy, dimension, deriv >::size >, dimRange > > &values) const
Definition polynomialbasis.hh:246
const Basis & basis() const
Definition polynomialbasis.hh:98
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:143
unsigned int size_
Definition polynomialbasis.hh:335
Evaluator eval_
Definition polynomialbasis.hh:334
Definition polynomialbasis.hh:198
static DomainVector apply(const DVector &x)
Definition polynomialbasis.hh:199
static const DomainVector & apply(const DomainVector &x)
Definition polynomialbasis.hh:211
Definition polynomialbasis.hh:348
PolynomialBasisWithMatrix(const Basis &basis)
Definition polynomialbasis.hh:361
CM CoefficientMatrix
Definition polynomialbasis.hh:350
void fill(const Matrix &matrix, int size)
Definition polynomialbasis.hh:372
Base::Basis Basis
Definition polynomialbasis.hh:359
void fill(const Matrix &matrix)
Definition polynomialbasis.hh:366