dune-localfunctions 2.10
Loading...
Searching...
No Matches
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 © 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
20namespace 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>
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
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:176
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
const Deriv & operator*() const
Definition basisevaluator.hh:95
Dune::FieldVector< Field, blockSize > Block
Definition basisevaluator.hh:82
bool done() const
Definition basisevaluator.hh:106
Container::iterator CIter
Definition basisevaluator.hh:88
const Deriv * operator->() const
Definition basisevaluator.hh:101
Deriv Derivatives
Definition basisevaluator.hh:79
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:180