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>();
150 basis_.template evaluate<deriv>(x,&(container_[0]));
155 Base::template resize<0>();
156 basis_.integrate(&(container_[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>(std::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>(std::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 std::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)
Definition brezzidouglasmarini1cube2d.hh:14
DerivativeLayout
Definition tensor.hh:165
@ derivative
Definition tensor.hh:165
@ value
Definition tensor.hh:165
Field operator*(const Unity< Field > &u, const Field &f)
Definition field.hh:48
Definition basisevaluator.hh:30
static const int dimRange
Definition basisevaluator.hh:35
B Basis
Definition basisevaluator.hh:31
unsigned int order_
Definition basisevaluator.hh:69
const Basis & basis_
Definition basisevaluator.hh:68
MonomialEvaluator(const Basis &basis, unsigned int order, unsigned int size)
Definition basisevaluator.hh:55
Basis::Field Field
Definition basisevaluator.hh:32
unsigned int size_
Definition basisevaluator.hh:69
Basis::DomainVector DomainVector
Definition basisevaluator.hh:33
void resize()
Definition basisevaluator.hh:62
Container container_
Definition basisevaluator.hh:70
unsigned int size() const
Definition basisevaluator.hh:49
std::vector< Field > Container
Definition basisevaluator.hh:37
MonomialEvaluator(const MonomialEvaluator &)
static const int dimension
Definition basisevaluator.hh:34
Definition basisevaluator.hh:77
BaseIterator(Container &container)
Definition basisevaluator.hh:89
const Deriv & operator*() const
Definition basisevaluator.hh:94
Dune::FieldVector< Field, blockSize > Block
Definition basisevaluator.hh:81
bool done() const
Definition basisevaluator.hh:105
Container::iterator CIter
Definition basisevaluator.hh:87
const Deriv * operator->() const
Definition basisevaluator.hh:100
Deriv Derivatives
Definition basisevaluator.hh:78
std::vector< Field > Container
Definition basisevaluator.hh:86
Deriv::Field Field
Definition basisevaluator.hh:79
Definition basisevaluator.hh:44
BaseIterator< Derivatives< Field, dimension, dimRange, deriv, derivative > > All
Definition basisevaluator.hh:45
BaseIterator< Derivatives< Field, dimension, 1, 0, value > > Integrate
Definition basisevaluator.hh:46
Definition basisevaluator.hh:130
Basis::Field Field
Definition basisevaluator.hh:132
Basis::DomainVector DomainVector
Definition basisevaluator.hh:133
Iterator< deriv >::All evaluate(const DVector &x)
Definition basisevaluator.hh:147
MonomialEvaluator< B > Base
Definition basisevaluator.hh:137
StandardEvaluator(const Basis &basis)
Definition basisevaluator.hh:143
static const int dimRange
Definition basisevaluator.hh:136
std::vector< Field > Container
Definition basisevaluator.hh:134
Iterator< 0 >::Integrate integrate()
Definition basisevaluator.hh:153
B Basis
Definition basisevaluator.hh:131
StandardEvaluator(const Basis &basis, unsigned int size)
Definition basisevaluator.hh:161
static const int dimension
Definition basisevaluator.hh:135
Definition basisevaluator.hh:141