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);
191 evaluate<deriv>( bx, values );
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());
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 >
240 assert(values.size()>=
size());
241 coeffMatrix_->template mult<deriv>(
eval_.template evaluate<deriv>( x ), values );
243 template<
unsigned int deriv,
class Fy >
247 evaluateSingle<deriv>(x,
reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*
dimRange> >&>(values));
249 template<
unsigned int deriv,
class Fy >
253 evaluateSingle<deriv>(x,
reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*
dimRange> >&>(values));
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() );
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 )
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;
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());
383 #endif // DUNE_POLYNOMIALBASIS_HH void jacobian(const DVector &x, RVector &values) const
Definition: polynomialbasis.hh:264
void evaluate(const DomainVector &x, F *values) const
Definition: polynomialbasis.hh:180
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< FieldVector< Fy, LFETensor< Fy, dimension, deriv >::size >, dimRange > > &values) const
Definition: polynomialbasis.hh:244
Definition: polynomialbasis.hh:62
Evaluator eval_
Definition: polynomialbasis.hh:332
Definition: polynomialbasis.hh:344
const Basis & basis_
Definition: polynomialbasis.hh:330
void evaluate(const DVector &x, F *values) const
Definition: polynomialbasis.hh:185
void integrate(std::vector< Fy > &values) const
Definition: polynomialbasis.hh:315
static const DomainVector & apply(const DomainVector &x)
Definition: polynomialbasis.hh:209
void evaluateSingle(const DomainVector &x, Vector &values) const
Definition: polynomialbasis.hh:238
const Basis & basis() const
Definition: polynomialbasis.hh:96
Base::Basis Basis
Definition: polynomialbasis.hh:357
Definition: bdfmcube.hh:17
static const unsigned int dimension
Definition: polynomialbasis.hh:72
const CoefficientMatrix & matrix() const
Definition: polynomialbasis.hh:101
static DomainVector apply(const DVector &x)
Definition: polynomialbasis.hh:197
CM CoefficientMatrix
Definition: polynomialbasis.hh:68
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< LFETensor< Fy, dimension, deriv >, dimRange > > &values) const
Definition: polynomialbasis.hh:250
D DomainType
domain type
Definition: common/localbasis.hh:43
Definition: polynomialbasis.hh:195
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 fill(const Matrix &matrix)
Definition: polynomialbasis.hh:364
void fill(const Matrix &matrix, int size)
Definition: polynomialbasis.hh:370
HessianFyType< R > HessianType
Definition: polynomialbasis.hh:81
PolynomialBasis & operator=(const PolynomialBasis &)
const CoefficientMatrix * coeffMatrix_
Definition: polynomialbasis.hh:331
void jacobian(const DomainVector &x, std::vector< FieldMatrix< Fy, dimRange, dimension > > &values) const
Definition: polynomialbasis.hh:257
PolynomialBasisWithMatrix(const Basis &basis)
Definition: polynomialbasis.hh:359
void hessian(const DomainVector &x, std::vector< HessianFyType< Fy >> &values) const
Definition: polynomialbasis.hh:273
PolynomialBasis(const PolynomialBasis &other)
Definition: polynomialbasis.hh:322
LocalBasisTraits< D, dimension, FieldVector< D, dimension >, R, dimRange, FieldVector< R, dimRange >, FieldMatrix< R, dimRange, dimension > > Traits
Definition: polynomialbasis.hh:76
unsigned int order() const
Definition: polynomialbasis.hh:106
unsigned int size() const
Definition: polynomialbasis.hh:111
void hessian(const DVector &x, HVector &values) const
Definition: polynomialbasis.hh:305
void evaluateHessian(const typename Traits::DomainType &x, std::vector< HessianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: polynomialbasis.hh:133
CM CoefficientMatrix
Definition: polynomialbasis.hh:348
unsigned int size_
Definition: polynomialbasis.hh:333
void evaluate(const DVector &x, RVector &values) const
Definition: polynomialbasis.hh:228
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
CoefficientMatrix::Field StorageField
Definition: polynomialbasis.hh:70
Evaluator::Basis Basis
Definition: polynomialbasis.hh:77
Evaluator::DomainVector DomainVector
Definition: polynomialbasis.hh:78
unsigned int order_
Definition: polynomialbasis.hh:333
static const unsigned int dimRange
Definition: polynomialbasis.hh:73
PolynomialBasis(const Basis &basis, const CoefficientMatrix &coeffMatrix, unsigned int size)
Definition: polynomialbasis.hh:83
void evaluate(const DVector &x, RVector &values) const
Definition: polynomialbasis.hh:215
void evaluateFunction(const typename Traits::DomainType &x, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: polynomialbasis.hh:117
Type traits for LocalBasisVirtualInterface.
Definition: common/localbasis.hh:34
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:160
FieldVector< FieldMatrix< Fy, dimension, dimension >, dimRange > HessianFyType
Definition: polynomialbasis.hh:80
void evaluate(const DomainVector &x, std::vector< FieldVector< Fy, dimRange > > &values) const
Definition: polynomialbasis.hh:223