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