dune-localfunctions  2.4.1
polynomialbasis.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_POLYNOMIALBASIS_HH
4 #define DUNE_POLYNOMIALBASIS_HH
5 
6 #include <fstream>
7 
8 #include <dune/common/fmatrix.hh>
9 
11 
16 
17 namespace Dune
18 {
19 
20  // PolynomialBasis
21  // ---------------
22 
60  template< class Eval, class CM, class D=double, class R=double >
62  {
64  typedef Eval Evaluator;
65 
66  public:
67  typedef CM CoefficientMatrix;
68 
69  typedef typename CoefficientMatrix::Field StorageField;
70 
71  static const unsigned int dimension = Evaluator::dimension;
72  static const unsigned int dimRange = Evaluator::dimRange*CoefficientMatrix::blockSize;
74  R,dimRange,FieldVector<R,dimRange>,
75  FieldMatrix<R,dimRange,dimension> > Traits;
76  typedef typename Evaluator::Basis Basis;
77  typedef typename Evaluator::DomainVector DomainVector;
78 
79  PolynomialBasis (const Basis &basis,
80  const CoefficientMatrix &coeffMatrix,
81  unsigned int size)
82  : basis_(basis),
83  coeffMatrix_(&coeffMatrix),
84  eval_(basis),
85  order_(basis.order()),
86  size_(size)
87  {
88  // assert(coeffMatrix_);
89  // assert(size_ <= coeffMatrix.size()); // !!!
90  }
91 
92  const Basis &basis () const
93  {
94  return basis_;
95  }
96 
97  const CoefficientMatrix &matrix () const
98  {
99  return *coeffMatrix_;
100  }
101 
102  const unsigned int order () const
103  {
104  return order_;
105  }
106 
107  const unsigned int size () const
108  {
109  return size_;
110  }
111 
113  void evaluateFunction (const typename Traits::DomainType& x,
114  std::vector<typename Traits::RangeType>& out) const
115  {
116  out.resize(size());
117  evaluate(x,out);
118  }
119 
121  void evaluateJacobian (const typename Traits::DomainType& x, // position
122  std::vector<typename Traits::JacobianType>& out) const // return value
123  {
124  out.resize(size());
125  jacobian(x,out);
126  }
127 
128  template< unsigned int deriv, class F >
129  void evaluate ( const DomainVector &x, F *values ) const
130  {
131  coeffMatrix_->mult( eval_.template evaluate<deriv>( x ), size(), values);
132  }
133  template< unsigned int deriv, class DVector, class F >
134  void evaluate ( const DVector &x, F *values ) const
135  {
136  assert( DVector::dimension == dimension);
137  DomainVector bx;
138  for( int d = 0; d < dimension; ++d )
139  field_cast( x[ d ], bx[ d ] );
140  evaluate<deriv>( bx, values );
141  }
142 
143  template <bool dummy,class DVector>
144  struct Convert
145  {
146  static DomainVector apply( const DVector &x )
147  {
148  assert( DVector::dimension == dimension);
149  DomainVector bx;
150  for( unsigned int d = 0; d < dimension; ++d )
151  field_cast( x[ d ], bx[ d ] );
152  return bx;
153  }
154  };
155  template <bool dummy>
156  struct Convert<dummy,DomainVector>
157  {
158  static const DomainVector &apply( const DomainVector &x )
159  {
160  return x;
161  }
162  };
163  template< unsigned int deriv, class DVector, class RVector >
164  void evaluate ( const DVector &x, RVector &values ) const
165  {
166  assert(values.size()>=size());
167  const DomainVector &bx = Convert<true,DVector>::apply(x);
168  coeffMatrix_->mult( eval_.template evaluate<deriv>( bx ), values );
169  }
170 
171  template <class Fy>
172  void evaluate ( const DomainVector &x, std::vector<FieldVector<Fy,dimRange> > &values ) const
173  {
174  evaluate<0>(x,values);
175  }
176  template< class DVector, class RVector >
177  void evaluate ( const DVector &x, RVector &values ) const
178  {
179  assert( DVector::dimension == dimension);
180  DomainVector bx;
181  for( unsigned int d = 0; d < dimension; ++d )
182  field_cast( x[ d ], bx[ d ] );
183  evaluate<0>( bx, values );
184  }
185 
186  template< unsigned int deriv, class Vector >
187  void evaluateSingle ( const DomainVector &x, Vector &values ) const
188  {
189  assert(values.size()>=size());
190  coeffMatrix_->template mult<deriv>( eval_.template evaluate<deriv>( x ), values );
191  }
192  template< unsigned int deriv, class Fy >
193  void evaluateSingle ( const DomainVector &x,
194  std::vector< FieldVector<FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size>,dimRange> > &values) const
195  {
196  evaluateSingle<deriv>(x,reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*dimRange> >&>(values));
197  }
198  template< unsigned int deriv, class Fy >
199  void evaluateSingle ( const DomainVector &x,
200  std::vector< FieldVector<LFETensor<Fy,dimension,deriv>,dimRange> > &values) const
201  {
202  evaluateSingle<deriv>(x,reinterpret_cast<std::vector< FieldVector<Fy,LFETensor<Fy,dimension,deriv>::size*dimRange> >&>(values));
203  }
204 
205  template <class Fy>
206  void jacobian ( const DomainVector &x, std::vector<FieldMatrix<Fy,dimRange,dimension> > &values ) const
207  {
208  assert(values.size()>=size());
209  evaluateSingle<1>(x,reinterpret_cast<std::vector<FieldVector<Fy,dimRange*dimension> >&>(values));
210  }
211  template< class DVector, class RVector >
212  void jacobian ( const DVector &x, RVector &values ) const
213  {
214  assert( DVector::dimension == dimension);
215  DomainVector bx;
216  for( unsigned int d = 0; d < dimension; ++d )
217  field_cast( x[ d ], bx[ d ] );
218  jacobian( bx, values );
219  }
220 
221  template <class Fy>
222  void integrate ( std::vector<Fy> &values ) const
223  {
224  assert(values.size()>=size());
225  coeffMatrix_->mult( eval_.template integrate(), values );
226  }
227 
228  protected:
230  : basis_(other.basis_),
231  coeffMatrix_(other.coeffMatrix_),
232  eval_(basis_),
233  order_(basis_.order()),
234  size_(other.size_)
235  {}
237  const Basis &basis_;
238  const CoefficientMatrix* coeffMatrix_;
239  mutable Evaluator eval_;
240  unsigned int order_,size_;
241  };
242 
249  template< class Eval, class CM = SparseCoeffMatrix<typename Eval::Field,Eval::dimRange>,
250  class D=double, class R=double>
252  : public PolynomialBasis< Eval, CM, D, R >
253  {
254  public:
255  typedef CM CoefficientMatrix;
256 
257  private:
258  typedef Eval Evaluator;
259 
262 
263  public:
264  typedef typename Base::Basis Basis;
265 
267  : Base(basis,coeffMatrix_,0)
268  {}
269 
270  template <class Matrix>
271  void fill(const Matrix& matrix)
272  {
273  coeffMatrix_.fill(matrix);
274  this->size_ = coeffMatrix_.size();
275  }
276  template <class Matrix>
277  void fill(const Matrix& matrix,int size)
278  {
279  coeffMatrix_.fill(matrix);
280  assert(size<=coeffMatrix_.size());
281  this->size_ = size;
282  }
283 
284  private:
287  CoefficientMatrix coeffMatrix_;
288  };
289 }
290 #endif // DUNE_POLYNOMIALBASIS_HH
CoefficientMatrix::Field StorageField
Definition: polynomialbasis.hh:69
PolynomialBasisWithMatrix(const Basis &basis)
Definition: polynomialbasis.hh:266
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< FieldVector< Fy, LFETensor< Fy, dimension, deriv >::size >, dimRange > > &values) const
Definition: polynomialbasis.hh:193
Evaluator::DomainVector DomainVector
Definition: polynomialbasis.hh:77
CM CoefficientMatrix
Definition: polynomialbasis.hh:67
const Basis & basis_
Definition: polynomialbasis.hh:237
const Basis & basis() const
Definition: polynomialbasis.hh:92
void evaluateFunction(const typename Traits::DomainType &x, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions.
Definition: polynomialbasis.hh:113
CM CoefficientMatrix
Definition: polynomialbasis.hh:255
unsigned int size_
Definition: polynomialbasis.hh:240
void evaluateSingle(const DomainVector &x, std::vector< FieldVector< LFETensor< Fy, dimension, deriv >, dimRange > > &values) const
Definition: polynomialbasis.hh:199
Definition: brezzidouglasmarini1cube2dlocalbasis.hh:14
void fill(const Matrix &matrix)
Definition: polynomialbasis.hh:271
void evaluate(const DVector &x, RVector &values) const
Definition: polynomialbasis.hh:177
void evaluate(const DVector &x, F *values) const
Definition: polynomialbasis.hh:134
void evaluate(const DVector &x, RVector &values) const
Definition: polynomialbasis.hh:164
void integrate(std::vector< Fy > &values) const
Definition: polynomialbasis.hh:222
void evaluateSingle(const DomainVector &x, Vector &values) const
Definition: polynomialbasis.hh:187
Base::Basis Basis
Definition: polynomialbasis.hh:264
const unsigned int order() const
Definition: polynomialbasis.hh:102
static const DomainVector & apply(const DomainVector &x)
Definition: polynomialbasis.hh:158
unsigned int order_
Definition: polynomialbasis.hh:240
Definition: polynomialbasis.hh:144
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:157
static const unsigned int dimRange
Definition: polynomialbasis.hh:72
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:37
Definition: polynomialbasis.hh:61
const CoefficientMatrix * coeffMatrix_
Definition: polynomialbasis.hh:238
Evaluator::Basis Basis
Definition: polynomialbasis.hh:76
PolynomialBasis & operator=(const PolynomialBasis &)
void evaluate(const DomainVector &x, std::vector< FieldVector< Fy, dimRange > > &values) const
Definition: polynomialbasis.hh:172
Definition: tensor.hh:30
void evaluateJacobian(const typename Traits::DomainType &x, std::vector< typename Traits::JacobianType > &out) const
Evaluate Jacobian of all shape functions.
Definition: polynomialbasis.hh:121
void fill(const Matrix &matrix, int size)
Definition: polynomialbasis.hh:277
Evaluator eval_
Definition: polynomialbasis.hh:239
void evaluate(const DomainVector &x, F *values) const
Definition: polynomialbasis.hh:129
const unsigned int size() const
Definition: polynomialbasis.hh:107
PolynomialBasis(const Basis &basis, const CoefficientMatrix &coeffMatrix, unsigned int size)
Definition: polynomialbasis.hh:79
const CoefficientMatrix & matrix() const
Definition: polynomialbasis.hh:97
Definition: polynomialbasis.hh:251
PolynomialBasis(const PolynomialBasis &other)
Definition: polynomialbasis.hh:229
D DomainType
domain type
Definition: localbasis.hh:49
void jacobian(const DomainVector &x, std::vector< FieldMatrix< Fy, dimRange, dimension > > &values) const
Definition: polynomialbasis.hh:206
static const unsigned int dimension
Definition: polynomialbasis.hh:71
LocalBasisTraits< D, dimension, FieldVector< D, dimension >, R, dimRange, FieldVector< R, dimRange >, FieldMatrix< R, dimRange, dimension > > Traits
Definition: polynomialbasis.hh:75
void jacobian(const DVector &x, RVector &values) const
Definition: polynomialbasis.hh:212
static DomainVector apply(const DVector &x)
Definition: polynomialbasis.hh:146