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>
76 template<
class Deriv >
80 typedef typename Deriv::Field
Field;
81 static const unsigned int blockSize = Deriv::size;
82 typedef Dune::FieldVector<Field,blockSize>
Block;
84 static const unsigned int dimDomain = Deriv::dimDomain;
85 static const unsigned int dimRange = Deriv::dimRange;
88 typedef typename Container::iterator
CIter;
91 : pos_( container.begin() ),
92 end_( container.end() )
98 return reinterpret_cast<const Deriv&
>(*pos_);
101 const Deriv *operator->()
const
119 pos_ += skip*blockSize;
133 typedef typename Basis::Field
Field;
140 template <
unsigned int deriv>
146 :
Base(basis,basis.order(),basis.
size())
149 template <
unsigned int deriv,
class DVector>
152 Base::template resize<deriv>();
158 Base::template resize<0>();
165 :
Base( basis, basis.order(), size )
175 template<
class B,
class Fill >
177 :
public StandardEvaluator< B >
180 typedef typename Basis::Field Field;
181 static const int dimension = Basis::dimension;
182 static const int dimRange = Basis::dimRange*Fill::dimRange;
183 typedef typename Basis::DomainVector DomainVector;
184 typedef std::vector<Field> Container;
185 typedef StandardEvaluator<B> Base;
187 template <
unsigned int deriv>
190 typedef typename Base::template BaseIterator<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> > All;
193 VecEvaluator (
const Basis &basis,
const Fill &fill )
194 : Base( basis, basis.size() ),
196 size_( basis.size()*dimRange )
199 template <
unsigned int deriv>
200 typename Iterator<deriv>::All evaluate(
const DomainVector &x)
203 fill_.template apply<deriv>( x,Base::template evaluate<deriv>(x), vecContainer_ );
204 std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> >& derivContainer =
205 reinterpret_cast<std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout>
>&>(vecContainer_);
206 return typename Iterator<deriv>::All(derivContainer);
208 template <
unsigned int deriv,
class DVector>
209 typename Iterator<deriv>::All evaluate(
const DVector &x)
212 fill_.template apply<deriv>( x,Base::template evaluate<deriv>(x), vecContainer_ );
213 std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> >& derivContainer =
214 reinterpret_cast<std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout>
>&>(vecContainer_);
215 return typename Iterator<deriv>::All(derivContainer);
217 unsigned int size()
const
223 VecEvaluator (
const Basis &basis,
const Fill &fill,
unsigned int size )
224 : Base( basis, basis.size() ),
234 const int totalSize = Derivatives<Field,dimension,dimRange,deriv,derivative>::size*size_;
235 vecContainer_.resize(totalSize);
238 VecEvaluator(
const VecEvaluator&);
240 Container vecContainer_;
245 template <
int dimR,DerivativeLayout layout>
252 static const int dimRange = dimR;
253 template <
int deriv,
class Domain,
class Iter,
class Field>
254 void apply(
const Domain &x,
255 Iter iter,std::vector<Field> &vecContainer)
const
257 typedef std::vector<Field> Container;
258 typename Container::iterator vecIter = vecContainer.begin();
259 for ( ; !iter.done(); ++iter)
261 const typename Iter::Block &block = iter->block();
262 for (
int r1=0;r1<dimR;++r1)
265 apply<Field>(r1,x,block,b,vecIter);
269 template <
class Field,
class Domain,
class Block,
class VecIter>
270 void apply(
int r1,
const Domain &x,
271 const Block &block,
unsigned int &b,
272 VecIter &vecIter)
const
274 unsigned int bStart = b;
275 unsigned int bEnd = b+Block::size;
276 apply<Field>(r1,x,block,bStart,bEnd,vecIter);
279 template <
class Field,
class Domain,
class Block,
class VecIter>
280 void apply(
int r1,
const Domain &x,
const Block &block,
281 unsigned int bStart,
unsigned int bEnd,
282 VecIter &vecIter)
const
284 for (
int r2=0;r2<dimR;++r2)
286 for (
unsigned int bb=bStart;bb<bEnd;++bb)
288 *vecIter = (r1==r2?block[bb]:Field(0));
295 struct DiagonalFill<dimR,
value>
298 static const int dimRange = dimR;
299 template <
int deriv,
class Domain,
class Iter,
class Field>
300 void apply(
const Domain &x,
301 Iter iter,std::vector<Field> &vecContainer)
const
303 typedef std::vector<Field> Container;
304 typename Container::iterator vecIter = vecContainer.begin();
305 for ( ; !iter.done(); ++iter)
307 const typename Iter::Block &block = iter->block();
308 for (
int r1=0;r1<dimR;++r1)
311 apply<Field>(integral_constant<int,deriv>(),r1,x,block,b,vecIter);
315 template <
class Field,
class Domain,
class Block,
class VecIter,
int deriv>
316 void apply(
const integral_constat<int,deriv>&,
int r1,
const Domain &x,
317 const Block &block,
unsigned int &b,
318 VecIter &vecIter)
const
320 apply<Field>(integral_constant<int,deriv-1>(),r1,x,block,b,vecIter);
321 unsigned int bStart = b;
322 unsigned int bEnd = b+LFETensor<Field,Domain::dimension,deriv>::size;
323 apply<Field>(r1,x,block,bStart,bEnd,vecIter);
326 template <
class Field,
class Domain,
class Block,
class VecIter>
327 void apply(
const integral_constant<int,0>&,
int r1,
const Domain &x,
328 const Block &block,
unsigned int &b,
329 VecIter &vecIter)
const
331 apply<Field>(r1,x,block,b,b+1,vecIter);
334 template <
class Field,
class Domain,
class Block,
class VecIter>
335 void apply(
int r1,
const Domain &x,
const Block &block,
336 unsigned int bStart,
unsigned int bEnd,
337 VecIter &vecIter)
const
339 for (
int r2=0;r2<dimR;++r2)
341 for (
unsigned int bb=bStart;bb<bEnd;++bb)
343 *vecIter = (r1==r2?block[bb]:Field(0));
350 template <
class B,
int dimR,DerivativeLayout layout>
351 struct VectorialEvaluator
352 :
public VecEvaluator<B,DiagonalFill<dimR,layout> >
354 typedef DiagonalFill<dimR,layout> Fill;
355 typedef VecEvaluator< B,Fill > Base;
356 VectorialEvaluator(
const B &basis)
357 : Base(basis,fill_,basis.size()*dimR)