dune-localfunctions  2.8.0
basisevaluator.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_BASISEVALUATOR_HH
4 #define DUNE_BASISEVALUATOR_HH
5 
6 #include <vector>
7 
8 #include <dune/common/fmatrix.hh>
9 #include <dune/common/fvector.hh>
10 #include <dune/common/typetraits.hh>
11 
12 #include <dune/geometry/type.hh>
13 
17 
18 namespace Dune
19 {
20  /*******************************************
21  * Should be removed as soon as the Tensor
22  * classes have been revisited. See remarks
23  * in tensor.hh (also hold true here).
24  *******************************************/
25 
26 
27  template <class B>
29  {
30  typedef B Basis;
31  typedef typename Basis::Field Field;
32  typedef typename Basis::DomainVector DomainVector;
33  static const int dimension = Basis::dimension;
34  static const int dimRange = Basis::dimRange;
35 
36  typedef std::vector<Field> Container;
37 
38  template< class Deriv >
39  struct BaseIterator;
40 
41  template <unsigned int deriv>
42  struct Iterator
43  {
46  };
47 
48  unsigned int size() const
49  {
50  return size_;
51  }
52 
53  protected:
54  MonomialEvaluator(const Basis &basis,unsigned int order,unsigned int size)
55  : basis_(basis),
56  order_(order),
57  size_(size),
58  container_(0)
59  {}
60  template <int deriv>
61  void resize()
62  {
64  container_.resize(totalSize);
65  }
67  const Basis &basis_;
68  unsigned int order_,size_;
70  };
71 
72 
73  template< class B >
74  template< class Deriv >
76  {
77  typedef Deriv Derivatives;
78  typedef typename Deriv::Field Field;
79  static const unsigned int blockSize = Deriv::size;
80  typedef Dune::FieldVector<Field,blockSize> Block;
81  static const DerivativeLayoutNS::DerivativeLayout layout = Deriv::layout;
82  static const unsigned int dimDomain = Deriv::dimDomain;
83  static const unsigned int dimRange = Deriv::dimRange;
84 
85  typedef std::vector<Field> Container;
86  typedef typename Container::iterator CIter;
87 
88  explicit BaseIterator ( Container &container )
89  : pos_( container.begin() ),
90  end_( container.end() )
91  {}
92 
93  const Deriv &operator*() const
94  {
95  assert(!done());
96  return reinterpret_cast<const Deriv&>(*pos_);
97  }
98 
99  const Deriv *operator->() const
100  {
101  return &(operator*());
102  }
103 
104  bool done () const
105  {
106  return pos_ == end_;
107  }
108 
109  BaseIterator &operator++ ()
110  {
111  pos_ += blockSize;
112  return *this;
113  }
114 
115  BaseIterator &operator+= ( unsigned int skip )
116  {
117  pos_ += skip*blockSize;
118  return *this;
119  }
120 
121  private:
122  CIter pos_;
123  const CIter end_;
124  };
125 
126  template< class B >
128  : public MonomialEvaluator< B >
129  {
130  typedef B Basis;
131  typedef typename Basis::Field Field;
132  typedef typename Basis::DomainVector DomainVector;
133  typedef std::vector<Field> Container;
134  static const int dimension = Basis::dimension;
135  static const int dimRange = Basis::dimRange;
137 
138  template <unsigned int deriv>
139  struct Iterator : public Base::template Iterator<deriv>
140  {};
141 
142  StandardEvaluator(const Basis &basis)
143  : Base(basis,basis.order(),basis.size())
144  {}
145  template <unsigned int deriv,class DVector>
146  typename Iterator<deriv>::All evaluate(const DVector &x)
147  {
148  Base::template resize<deriv>();
149  basis_.template evaluate<deriv>(x,&(container_[0]));
150  return typename Iterator<deriv>::All(container_);
151  }
153  {
154  Base::template resize<0>();
155  basis_.integrate(&(container_[0]));
156  return typename Iterator<0>::Integrate(container_);
157  }
158 
159  protected:
160  StandardEvaluator ( const Basis &basis, unsigned int size )
161  : Base( basis, basis.order(), size )
162  {}
163 
164  private:
166  using Base::basis_;
167  using Base::container_;
168  };
169 
170 }
171 
172 #endif
Definition: bdfmcube.hh:16
Field operator*(const Unity< Field > &u, const Field &f)
Definition: field.hh:48
DerivativeLayout
Definition: tensor.hh:166
Definition: basisevaluator.hh:29
static const int dimRange
Definition: basisevaluator.hh:34
B Basis
Definition: basisevaluator.hh:30
unsigned int order_
Definition: basisevaluator.hh:68
const Basis & basis_
Definition: basisevaluator.hh:67
MonomialEvaluator(const Basis &basis, unsigned int order, unsigned int size)
Definition: basisevaluator.hh:54
Basis::Field Field
Definition: basisevaluator.hh:31
unsigned int size_
Definition: basisevaluator.hh:68
Basis::DomainVector DomainVector
Definition: basisevaluator.hh:32
void resize()
Definition: basisevaluator.hh:61
Container container_
Definition: basisevaluator.hh:69
unsigned int size() const
Definition: basisevaluator.hh:48
std::vector< Field > Container
Definition: basisevaluator.hh:36
MonomialEvaluator(const MonomialEvaluator &)
static const int dimension
Definition: basisevaluator.hh:33
Definition: basisevaluator.hh:76
BaseIterator(Container &container)
Definition: basisevaluator.hh:88
Dune::FieldVector< Field, blockSize > Block
Definition: basisevaluator.hh:80
bool done() const
Definition: basisevaluator.hh:104
const Deriv * operator->() const
Definition: basisevaluator.hh:99
Container::iterator CIter
Definition: basisevaluator.hh:86
Deriv Derivatives
Definition: basisevaluator.hh:77
const Deriv & operator*() const
Definition: basisevaluator.hh:93
std::vector< Field > Container
Definition: basisevaluator.hh:85
Deriv::Field Field
Definition: basisevaluator.hh:78
Definition: basisevaluator.hh:43
BaseIterator< Derivatives< Field, dimension, 1, 0, DerivativeLayoutNS::value > > Integrate
Definition: basisevaluator.hh:45
BaseIterator< Derivatives< Field, dimension, dimRange, deriv, DerivativeLayoutNS::derivative > > All
Definition: basisevaluator.hh:44
Definition: basisevaluator.hh:129
Basis::Field Field
Definition: basisevaluator.hh:131
Basis::DomainVector DomainVector
Definition: basisevaluator.hh:132
Iterator< deriv >::All evaluate(const DVector &x)
Definition: basisevaluator.hh:146
MonomialEvaluator< B > Base
Definition: basisevaluator.hh:136
StandardEvaluator(const Basis &basis)
Definition: basisevaluator.hh:142
static const int dimRange
Definition: basisevaluator.hh:135
std::vector< Field > Container
Definition: basisevaluator.hh:133
Iterator< 0 >::Integrate integrate()
Definition: basisevaluator.hh:152
B Basis
Definition: basisevaluator.hh:130
StandardEvaluator(const Basis &basis, unsigned int size)
Definition: basisevaluator.hh:160
static const int dimension
Definition: basisevaluator.hh:134
Definition: basisevaluator.hh:140
Definition: tensor.hh:170