4 #ifndef DUNE_BASISEVALUATOR_HH
5 #define DUNE_BASISEVALUATOR_HH
9 #include <dune/common/fmatrix.hh>
10 #include <dune/common/fvector.hh>
11 #include <dune/common/typetraits.hh>
13 #include <dune/geometry/genericgeometry/topologytypes.hh>
32 typedef typename Basis::Field
Field;
39 template<
class Deriv >
42 template <
unsigned int deriv>
75 template<
class Deriv >
79 typedef typename Deriv::Field
Field;
80 static const unsigned int blockSize = Deriv::size;
81 typedef Dune::FieldVector<Field,blockSize>
Block;
83 static const unsigned int dimDomain = Deriv::dimDomain;
84 static const unsigned int dimRange = Deriv::dimRange;
87 typedef typename Container::iterator
CIter;
90 : pos_( container.begin() ),
91 end_( container.end() )
97 return reinterpret_cast<const Deriv&
>(*pos_);
118 pos_ += skip*blockSize;
132 typedef typename Basis::Field
Field;
139 template <
unsigned int deriv>
144 : Base(basis,basis.order(),basis.
size())
146 template <
unsigned int deriv,
class DVector>
149 Base::template resize<deriv>();
155 Base::template resize<0>();
162 : Base( basis, basis.order(), size )
172 template<
class B,
class Fill >
174 :
public StandardEvaluator< B >
177 typedef typename Basis::Field Field;
178 static const int dimension = Basis::dimension;
179 static const int dimRange = Basis::dimRange*Fill::dimRange;
180 typedef typename Basis::DomainVector DomainVector;
181 typedef std::vector<Field> Container;
182 typedef StandardEvaluator<B> Base;
184 template <
unsigned int deriv>
187 typedef typename Base::template BaseIterator<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> > All;
190 VecEvaluator (
const Basis &basis,
const Fill &fill )
191 : Base( basis, basis.size() ),
193 size_( basis.size()*dimRange )
195 template <
unsigned int deriv>
196 typename Iterator<deriv>::All evaluate(
const DomainVector &x)
199 fill_.template apply<deriv>( x,Base::template evaluate<deriv>(x), vecContainer_ );
200 std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> >& derivContainer =
201 reinterpret_cast<std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout>
>&>(vecContainer_);
202 return typename Iterator<deriv>::All(derivContainer);
204 template <
unsigned int deriv,
class DVector>
205 typename Iterator<deriv>::All evaluate(
const DVector &x)
208 fill_.template apply<deriv>( x,Base::template evaluate<deriv>(x), vecContainer_ );
209 std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> >& derivContainer =
210 reinterpret_cast<std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout>
>&>(vecContainer_);
211 return typename Iterator<deriv>::All(derivContainer);
213 unsigned int size()
const
219 VecEvaluator (
const Basis &basis,
const Fill &fill,
unsigned int size )
220 : Base( basis, basis.size() ),
230 const int totalSize = Derivatives<Field,dimension,dimRange,deriv,derivative>::size*size_;
231 vecContainer_.resize(totalSize);
234 VecEvaluator(
const VecEvaluator&);
236 Container vecContainer_;
241 template <
int dimR,DerivativeLayout layout>
248 static const int dimRange = dimR;
249 template <
int deriv,
class Domain,
class Iter,
class Field>
250 void apply(
const Domain &x,
251 Iter iter,std::vector<Field> &vecContainer)
const
253 typedef std::vector<Field> Container;
254 typename Container::iterator vecIter = vecContainer.begin();
255 for ( ; !iter.done(); ++iter)
257 const typename Iter::Block &block = iter->block();
258 for (
int r1=0; r1<dimR; ++r1)
261 apply<Field>(r1,x,block,b,vecIter);
265 template <
class Field,
class Domain,
class Block,
class VecIter>
266 void apply(
int r1,
const Domain &x,
267 const Block &block,
unsigned int &b,
268 VecIter &vecIter)
const
270 unsigned int bStart = b;
271 unsigned int bEnd = b+Block::size;
272 apply<Field>(r1,x,block,bStart,bEnd,vecIter);
275 template <
class Field,
class Domain,
class Block,
class VecIter>
276 void apply(
int r1,
const Domain &x,
const Block &block,
277 unsigned int bStart,
unsigned int bEnd,
278 VecIter &vecIter)
const
280 for (
int r2=0; r2<dimR; ++r2)
282 for (
unsigned int bb=bStart; bb<bEnd; ++bb)
284 *vecIter = (r1==r2 ? block[bb] : Field(0));
291 struct DiagonalFill<dimR,
value>
294 static const int dimRange = dimR;
295 template <
int deriv,
class Domain,
class Iter,
class Field>
296 void apply(
const Domain &x,
297 Iter iter,std::vector<Field> &vecContainer)
const
299 typedef std::vector<Field> Container;
300 typename Container::iterator vecIter = vecContainer.begin();
301 for ( ; !iter.done(); ++iter)
303 const typename Iter::Block &block = iter->block();
304 for (
int r1=0; r1<dimR; ++r1)
307 apply<Field>(integral_constant<int,deriv>(),r1,x,block,b,vecIter);
311 template <
class Field,
class Domain,
class Block,
class VecIter,
int deriv>
312 void apply(
const integral_constat<int,deriv>&,
int r1,
const Domain &x,
313 const Block &block,
unsigned int &b,
314 VecIter &vecIter)
const
316 apply<Field>(integral_constant<int,deriv-1>(),r1,x,block,b,vecIter);
317 unsigned int bStart = b;
318 unsigned int bEnd = b+LFETensor<Field,Domain::dimension,deriv>::size;
319 apply<Field>(r1,x,block,bStart,bEnd,vecIter);
322 template <
class Field,
class Domain,
class Block,
class VecIter>
323 void apply(
const integral_constant<int,0>&,
int r1,
const Domain &x,
324 const Block &block,
unsigned int &b,
325 VecIter &vecIter)
const
327 apply<Field>(r1,x,block,b,b+1,vecIter);
330 template <
class Field,
class Domain,
class Block,
class VecIter>
331 void apply(
int r1,
const Domain &x,
const Block &block,
332 unsigned int bStart,
unsigned int bEnd,
333 VecIter &vecIter)
const
335 for (
int r2=0; r2<dimR; ++r2)
337 for (
unsigned int bb=bStart; bb<bEnd; ++bb)
339 *vecIter = (r1==r2 ? block[bb] : Field(0));
346 template <
class B,
int dimR,DerivativeLayout layout>
347 struct VectorialEvaluator
348 :
public VecEvaluator<B,DiagonalFill<dimR,layout> >
350 typedef DiagonalFill<dimR,layout> Fill;
351 typedef VecEvaluator< B,Fill > Base;
352 VectorialEvaluator(
const B &basis)
353 : Base(basis,fill_,basis.size()*dimR)
BaseIterator(Container &container)
Definition: basisevaluator.hh:89
static const int dimRange
Definition: basisevaluator.hh:35
unsigned int size_
Definition: basisevaluator.hh:69
MonomialEvaluator< B > Base
Definition: basisevaluator.hh:137
const Basis & basis_
Definition: basisevaluator.hh:68
bool done() const
Definition: basisevaluator.hh:105
std::vector< Field > Container
Definition: basisevaluator.hh:86
Basis::Field Field
Definition: basisevaluator.hh:132
Definition: basisevaluator.hh:40
static const int dimension
Definition: basisevaluator.hh:34
Basis::DomainVector DomainVector
Definition: basisevaluator.hh:33
B Basis
Definition: basisevaluator.hh:131
Iterator< deriv >::All evaluate(const DVector &x)
Definition: basisevaluator.hh:147
Definition: brezzidouglasmarini1cube2dlocalbasis.hh:14
Definition: tensor.hh:165
Basis::DomainVector DomainVector
Definition: basisevaluator.hh:133
static const int dimRange
Definition: basisevaluator.hh:136
Deriv::Field Field
Definition: basisevaluator.hh:79
Definition: tensor.hh:168
unsigned int order_
Definition: basisevaluator.hh:69
Definition: basisevaluator.hh:140
Container::iterator CIter
Definition: basisevaluator.hh:87
StandardEvaluator(const Basis &basis, unsigned int size)
Definition: basisevaluator.hh:161
BaseIterator< Derivatives< Field, dimension, dimRange, deriv, derivative > > All
Definition: basisevaluator.hh:45
DerivativeLayout
Definition: tensor.hh:165
Deriv Derivatives
Definition: basisevaluator.hh:78
Container container_
Definition: basisevaluator.hh:70
StandardEvaluator(const Basis &basis)
Definition: basisevaluator.hh:143
unsigned int size() const
Definition: basisevaluator.hh:49
void resize()
Definition: basisevaluator.hh:62
Definition: basisevaluator.hh:128
static const int dimension
Definition: basisevaluator.hh:135
Field operator*(const Unity< Field > &u, const Field &f)
Definition: field.hh:48
Definition: tensor.hh:165
Dune::FieldVector< Field, blockSize > Block
Definition: basisevaluator.hh:81
BaseIterator< Derivatives< Field, dimension, 1, 0, value > > Integrate
Definition: basisevaluator.hh:46
Definition: basisevaluator.hh:43
std::vector< Field > Container
Definition: basisevaluator.hh:37
Basis::Field Field
Definition: basisevaluator.hh:32
const Deriv & operator*() const
Definition: basisevaluator.hh:94
MonomialEvaluator(const Basis &basis, unsigned int order, unsigned int size)
Definition: basisevaluator.hh:55
std::vector< Field > Container
Definition: basisevaluator.hh:134
const Deriv * operator->() const
Definition: basisevaluator.hh:100
Definition: basisevaluator.hh:29
B Basis
Definition: basisevaluator.hh:31
Iterator< 0 >::Integrate integrate()
Definition: basisevaluator.hh:153