3 #ifndef DUNE_POLYNOMIALBASIS_HH
4 #define DUNE_POLYNOMIALBASIS_HH
9 #include <dune/common/fmatrix.hh>
61 template<
class Eval,
class CM,
class D=
double,
class R=
double >
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
145 auto totalOrder = std::accumulate(
order.begin(),
order.end(), 0);
146 if (totalOrder == 0) {
149 else if (totalOrder == 1) {
150 std::vector<typename Traits::JacobianType> jacs(out.size());
152 for (
unsigned int i=0;i<
order.size();++i)
153 if (
order[i]==1) k=i;
155 for (
unsigned int i=0;i<out.size();++i)
156 for (
unsigned int r=0;r<Traits::RangeType::dimension;++r)
157 out[i][r] = jacs[i][r][k];
159 else if (totalOrder == 2) {
160 std::vector<HessianType> hesss(out.size());
162 for (
unsigned int i=0;i<
order.size();++i) {
163 if (
order[i]==1 && k==-1) k=i;
164 else if (
order[i]==1) l=i;
168 for (
unsigned int i=0;i<out.size();++i)
169 for (
unsigned int r=0;r<Traits::RangeType::dimension;++r)
170 out[i][r] = hesss[i][r][k][l];
173 DUNE_THROW(NotImplemented,
"Desired derivative order is not implemented");
177 template<
unsigned int deriv,
class F >
182 template<
unsigned int deriv,
class DVector,
class F >
183 void evaluate (
const DVector &x, F *values )
const
185 assert( DVector::dimension ==
dimension);
189 evaluate<deriv>( bx, values );
192 template <
bool dummy,
class DVector>
197 assert( DVector::dimension ==
dimension);
199 for(
unsigned int d = 0; d <
dimension; ++d )
204 template <
bool dummy>
212 template<
unsigned int deriv,
class DVector,
class RVector >
213 void evaluate (
const DVector &x, RVector &values )
const
215 assert(values.size()>=
size());
223 evaluate<0>(x,values);
225 template<
class DVector,
class RVector >
226 void evaluate (
const DVector &x, RVector &values )
const
228 assert( DVector::dimension ==
dimension);
230 for(
unsigned int d = 0; d <
dimension; ++d )
232 evaluate<0>( bx, values );
235 template<
unsigned int deriv,
class Vector >
238 assert(values.size()>=
size());
239 coeffMatrix_->template mult<deriv>(
eval_.template evaluate<deriv>( x ), values );
241 template<
unsigned int deriv,
class Fy >
245 evaluateSingle<deriv>(x,
reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*
dimRange> >&>(values));
247 template<
unsigned int deriv,
class Fy >
251 evaluateSingle<deriv>(x,
reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*
dimRange> >&>(values));
256 std::vector<FieldMatrix<Fy,dimRange,dimension> > &values )
const
258 assert(values.size()>=
size());
259 evaluateSingle<1>(x,
reinterpret_cast<std::vector<FieldVector<Fy,dimRange*dimension>
>&>(values));
261 template<
class DVector,
class RVector >
262 void jacobian (
const DVector &x, RVector &values )
const
264 assert( DVector::dimension ==
dimension);
266 for(
unsigned int d = 0; d <
dimension; ++d )
274 assert(values.size()>=
size());
278 std::vector< FieldVector< FieldVector<Fy,hsize>,
dimRange> > y(
size() );
279 evaluateSingle<2>( x, y );
281 for (
unsigned int i=0;i<
size();++i)
282 for (
unsigned int r=0;r<
dimRange;++r)
286 values[i][r][k][l] = y[i][r][q];
287 values[i][r][l][k] = y[i][r][q];
293 template<
class DVector,
class HVector >
294 void hessian (
const DVector &x, HVector &values )
const
296 assert( DVector::dimension ==
dimension);
298 for(
unsigned int d = 0; d <
dimension; ++d )
306 assert(values.size()>=
size());
331 template<
class Eval,
class CM = SparseCoeffMatrix<
typename Eval::Field,Eval::dimRange>,
332 class D=
double,
class R=
double>
340 typedef Eval Evaluator;
352 template <
class Matrix>
355 coeffMatrix_.fill(
matrix);
356 this->
size_ = coeffMatrix_.size();
358 template <
class Matrix>
361 coeffMatrix_.fill(
matrix);
362 assert(
size<=coeffMatrix_.size());
Definition: bdfmcube.hh:16
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:157
Type traits for LocalBasisVirtualInterface.
Definition: common/localbasis.hh:32
D DomainType
domain type
Definition: common/localbasis.hh:43
Definition: polynomialbasis.hh:63
void evaluate(const DVector &x, RVector &values) const
Definition: polynomialbasis.hh:226
void evaluate(const DomainVector &x, std::vector< FieldVector< Fy, dimRange > > &values) const
Definition: polynomialbasis.hh:221
PolynomialBasis(const PolynomialBasis &other)
Definition: polynomialbasis.hh:311
void evaluate(const DVector &x, F *values) const
Definition: polynomialbasis.hh:183
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:262
Evaluator::DomainVector DomainVector
Definition: polynomialbasis.hh:78
PolynomialBasis & operator=(const PolynomialBasis &)
const Basis & basis() const
Definition: polynomialbasis.hh:96
Evaluator::Basis Basis
Definition: polynomialbasis.hh:77
void evaluateSingle(const DomainVector &x, Vector &values) const
Definition: polynomialbasis.hh:236
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< LFETensor< Fy, dimension, deriv >, dimRange > > &values) const
Definition: polynomialbasis.hh:248
void jacobian(const DomainVector &x, std::vector< FieldMatrix< Fy, dimRange, dimension > > &values) const
Definition: polynomialbasis.hh:255
const Basis & basis_
Definition: polynomialbasis.hh:319
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
const CoefficientMatrix * coeffMatrix_
Definition: polynomialbasis.hh:320
void integrate(std::vector< Fy > &values) const
Definition: polynomialbasis.hh:304
unsigned int size() const
Definition: polynomialbasis.hh:111
void evaluate(const DomainVector &x, F *values) const
Definition: polynomialbasis.hh:178
void hessian(const DVector &x, HVector &values) const
Definition: polynomialbasis.hh:294
CM CoefficientMatrix
Definition: polynomialbasis.hh:68
HessianFyType< R > HessianType
Definition: polynomialbasis.hh:81
LocalBasisTraits< D, dimension, FieldVector< D, dimension >, R, dimRange, FieldVector< R, dimRange >, FieldMatrix< R, dimRange, dimension > > Traits
Definition: polynomialbasis.hh:76
void hessian(const DomainVector &x, std::vector< HessianFyType< Fy >> &values) const
Definition: polynomialbasis.hh:271
unsigned int order_
Definition: polynomialbasis.hh:322
const CoefficientMatrix & matrix() const
Definition: polynomialbasis.hh:101
void evaluate(const DVector &x, RVector &values) const
Definition: polynomialbasis.hh:213
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:242
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:322
Evaluator eval_
Definition: polynomialbasis.hh:321
Definition: polynomialbasis.hh:194
static DomainVector apply(const DVector &x)
Definition: polynomialbasis.hh:195
static const DomainVector & apply(const DomainVector &x)
Definition: polynomialbasis.hh:207
Definition: polynomialbasis.hh:335
PolynomialBasisWithMatrix(const Basis &basis)
Definition: polynomialbasis.hh:348
CM CoefficientMatrix
Definition: polynomialbasis.hh:337
void fill(const Matrix &matrix, int size)
Definition: polynomialbasis.hh:359
Base::Basis Basis
Definition: polynomialbasis.hh:346
void fill(const Matrix &matrix)
Definition: polynomialbasis.hh:353