5#ifndef DUNE_POLYNOMIALBASIS_HH
6#define DUNE_POLYNOMIALBASIS_HH
11#include <dune/common/fmatrix.hh>
61 template<
class Eval,
class CM,
class D,
class R >
65 typedef Eval Evaluator;
72 static const unsigned int dimension = Evaluator::dimension;
73 static const unsigned int dimRange = Evaluator::dimRange*CoefficientMatrix::blockSize;
76 FieldMatrix<R,dimRange,dimension> >
Traits;
77 typedef typename Evaluator::Basis
Basis;
118 std::vector<typename Traits::RangeType>& out)
const
126 std::vector<typename Traits::JacobianType>& out)
const
134 std::vector<HessianType>& out)
const
143 std::vector<typename Traits::RangeType>& out)
const
146 auto totalOrder = std::accumulate(
order.begin(),
order.end(), 0);
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];
175 DUNE_THROW(NotImplemented,
"Desired derivative order is not implemented");
179 template<
unsigned int deriv,
class F >
184 template<
unsigned int deriv,
class DVector,
class F >
185 void evaluate (
const DVector &x, F *values )
const
187 assert( DVector::dimension ==
dimension);
194 template <
bool dummy,
class DVector>
199 assert( DVector::dimension ==
dimension);
201 for(
unsigned int d = 0; d <
dimension; ++d )
206 template <
bool dummy>
214 template<
unsigned int deriv,
class DVector,
class RVector >
215 void evaluate (
const DVector &x, RVector &values )
const
217 assert(values.size()>=
size());
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 )
237 template<
unsigned int deriv,
class Vector >
240 assert(values.size()>=
size());
243 template<
unsigned int deriv,
class Fy >
249 template<
unsigned int deriv,
class Fy >
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 )
276 assert(values.size()>=
size());
280 std::vector< FieldVector< FieldVector<Fy,hsize>,
dimRange> > y(
size() );
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 )
317 assert(values.size()>=
size());
342 template<
class Eval,
class CM = SparseCoeffMatrix<
typename Eval::Field,Eval::dimRange>,
343 class D=
double,
class R=
double>
351 typedef Eval Evaluator;
360 : Base(
basis,coeffMatrix_,0)
363 template <
class Matrix>
366 coeffMatrix_.fill(
matrix);
367 this->
size_ = coeffMatrix_.size();
369 template <
class Matrix>
372 coeffMatrix_.fill(
matrix);
373 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:160
Type traits for LocalBasisVirtualInterface.
Definition common/localbasis.hh:35
D DomainType
domain type
Definition common/localbasis.hh:43
void evaluate(const DVector &x, RVector &values) const
Definition polynomialbasis.hh:228
void evaluate(const DomainVector &x, std::vector< FieldVector< Fy, dimRange > > &values) const
Definition polynomialbasis.hh:223
PolynomialBasis(const PolynomialBasis &other)
Definition polynomialbasis.hh:322
void evaluate(const DVector &x, F *values) const
Definition polynomialbasis.hh:185
void evaluateHessian(const typename Traits::DomainType &x, std::vector< HessianType > &out) const
Evaluate Jacobian of all shape functions.
Definition polynomialbasis.hh:133
CoefficientMatrix::Field StorageField
Definition polynomialbasis.hh:70
static const unsigned int dimRange
Definition polynomialbasis.hh:73
void jacobian(const DVector &x, RVector &values) const
Definition polynomialbasis.hh:264
Evaluator::DomainVector DomainVector
Definition polynomialbasis.hh:78
Evaluator::Basis Basis
Definition polynomialbasis.hh:77
void evaluateSingle(const DomainVector &x, Vector &values) const
Definition polynomialbasis.hh:238
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< LFETensor< Fy, dimension, deriv >, dimRange > > &values) const
Definition polynomialbasis.hh:250
void jacobian(const DomainVector &x, std::vector< FieldMatrix< Fy, dimRange, dimension > > &values) const
Definition polynomialbasis.hh:257
const CoefficientMatrix & matrix() const
Definition polynomialbasis.hh:101
const Basis & basis_
Definition polynomialbasis.hh:330
void evaluateFunction(const typename Traits::DomainType &x, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition polynomialbasis.hh:117
static const unsigned int dimension
Definition polynomialbasis.hh:72
void evaluateJacobian(const typename Traits::DomainType &x, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition polynomialbasis.hh:125
PolynomialBasis & operator=(const PolynomialBasis &)
const CoefficientMatrix * coeffMatrix_
Definition polynomialbasis.hh:331
void integrate(std::vector< Fy > &values) const
Definition polynomialbasis.hh:315
unsigned int size() const
Definition polynomialbasis.hh:111
void evaluate(const DomainVector &x, F *values) const
Definition polynomialbasis.hh:180
void hessian(const DVector &x, HVector &values) const
Definition polynomialbasis.hh:305
CoefficientMatrix CoefficientMatrix
Definition polynomialbasis.hh:68
HessianFyType< Range > HessianType
Definition polynomialbasis.hh:81
LocalBasisTraits< Domain, dimension, FieldVector< Domain, dimension >, Range, dimRange, FieldVector< Range, dimRange >, FieldMatrix< Range, dimRange, dimension > > Traits
Definition polynomialbasis.hh:76
unsigned int order_
Definition polynomialbasis.hh:333
void hessian(const DomainVector &x, std::vector< HessianFyType< Fy > > &values) const
Definition polynomialbasis.hh:273
void evaluate(const DVector &x, RVector &values) const
Definition polynomialbasis.hh:215
PolynomialBasis(const Basis &basis, const CoefficientMatrix &coeffMatrix, unsigned int size)
Definition polynomialbasis.hh:83
FieldVector< FieldMatrix< Fy, dimension, dimension >, dimRange > HessianFyType
Definition polynomialbasis.hh:80
unsigned int order() const
Definition polynomialbasis.hh:106
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< FieldVector< Fy, LFETensor< Fy, dimension, deriv >::size >, dimRange > > &values) const
Definition polynomialbasis.hh:244
const Basis & basis() const
Definition polynomialbasis.hh:96
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
unsigned int size_
Definition polynomialbasis.hh:333
Evaluator eval_
Definition polynomialbasis.hh:332
Definition polynomialbasis.hh:196
static DomainVector apply(const DVector &x)
Definition polynomialbasis.hh:197
static const DomainVector & apply(const DomainVector &x)
Definition polynomialbasis.hh:209
Definition polynomialbasis.hh:346
PolynomialBasisWithMatrix(const Basis &basis)
Definition polynomialbasis.hh:359
SparseCoeffMatrix< Field, dim > CoefficientMatrix
Definition polynomialbasis.hh:348
void fill(const Matrix &matrix, int size)
Definition polynomialbasis.hh:370
Base::Basis Basis
Definition polynomialbasis.hh:357
void fill(const Matrix &matrix)
Definition polynomialbasis.hh:364
static const unsigned int size
Definition tensor.hh:40