3 #ifndef DUNE_BASISEVALUATOR_HH
4 #define DUNE_BASISEVALUATOR_HH
8 #include <dune/common/fmatrix.hh>
9 #include <dune/common/fvector.hh>
10 #include <dune/common/typetraits.hh>
12 #include <dune/geometry/type.hh>
31 typedef typename Basis::Field
Field;
33 static const int dimension = Basis::dimension;
38 template<
class Deriv >
41 template <
unsigned int deriv>
74 template<
class Deriv >
78 typedef typename Deriv::Field
Field;
79 static const unsigned int blockSize = Deriv::size;
80 typedef Dune::FieldVector<Field,blockSize>
Block;
82 static const unsigned int dimDomain = Deriv::dimDomain;
83 static const unsigned int dimRange = Deriv::dimRange;
86 typedef typename Container::iterator
CIter;
89 : pos_( container.begin() ),
90 end_( container.end() )
96 return reinterpret_cast<const Deriv&
>(*pos_);
117 pos_ += skip*blockSize;
131 typedef typename Basis::Field
Field;
138 template <
unsigned int deriv>
143 :
Base(basis,basis.order(),basis.
size())
145 template <
unsigned int deriv,
class DVector>
148 Base::template resize<deriv>();
154 Base::template resize<0>();
161 :
Base( basis, basis.order(),
size )
171 template<
class B,
class Fill >
173 :
public StandardEvaluator< B >
176 typedef typename Basis::Field Field;
177 static const int dimension = Basis::dimension;
178 static const int dimRange = Basis::dimRange*Fill::dimRange;
179 typedef typename Basis::DomainVector DomainVector;
180 typedef std::vector<Field> Container;
181 typedef StandardEvaluator<B> Base;
183 template <
unsigned int deriv>
186 typedef typename Base::template BaseIterator<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> > All;
189 VecEvaluator (
const Basis &basis,
const Fill &fill )
190 : Base( basis, basis.size() ),
192 size_( basis.size()*dimRange )
194 template <
unsigned int deriv>
195 typename Iterator<deriv>::All evaluate(
const DomainVector &x)
198 fill_.template apply<deriv>( x,Base::template evaluate<deriv>(x), vecContainer_ );
199 std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> >& derivContainer =
200 reinterpret_cast<std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout>
>&>(vecContainer_);
201 return typename Iterator<deriv>::All(derivContainer);
203 template <
unsigned int deriv,
class DVector>
204 typename Iterator<deriv>::All evaluate(
const DVector &x)
207 fill_.template apply<deriv>( x,Base::template evaluate<deriv>(x), vecContainer_ );
208 std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout> >& derivContainer =
209 reinterpret_cast<std::vector<Derivatives<Field,dimension,dimRange,deriv,Fill::layout>
>&>(vecContainer_);
210 return typename Iterator<deriv>::All(derivContainer);
212 unsigned int size()
const
218 VecEvaluator (
const Basis &basis,
const Fill &fill,
unsigned int size )
219 : Base( basis, basis.size() ),
229 const int totalSize = Derivatives<Field,dimension,dimRange,deriv,derivative>::size*size_;
230 vecContainer_.resize(totalSize);
233 VecEvaluator(
const VecEvaluator&);
235 Container vecContainer_;
240 template <
int dimR,DerivativeLayout layout>
247 static const int dimRange = dimR;
248 template <
int deriv,
class Domain,
class Iter,
class Field>
249 void apply(
const Domain &x,
250 Iter iter,std::vector<Field> &vecContainer)
const
252 typedef std::vector<Field> Container;
253 typename Container::iterator vecIter = vecContainer.begin();
254 for ( ; !iter.done(); ++iter)
256 const typename Iter::Block &block = iter->block();
257 for (
int r1=0; r1<dimR; ++r1)
260 apply<Field>(r1,x,block,b,vecIter);
264 template <
class Field,
class Domain,
class Block,
class VecIter>
265 void apply(
int r1,
const Domain &x,
266 const Block &block,
unsigned int &b,
267 VecIter &vecIter)
const
269 unsigned int bStart = b;
270 unsigned int bEnd = b+Block::size;
271 apply<Field>(r1,x,block,bStart,bEnd,vecIter);
274 template <
class Field,
class Domain,
class Block,
class VecIter>
275 void apply(
int r1,
const Domain &x,
const Block &block,
276 unsigned int bStart,
unsigned int bEnd,
277 VecIter &vecIter)
const
279 for (
int r2=0; r2<dimR; ++r2)
281 for (
unsigned int bb=bStart; bb<bEnd; ++bb)
283 *vecIter = (r1==r2 ? block[bb] : Field(0));
290 struct DiagonalFill<dimR,
value>
293 static const int dimRange = dimR;
294 template <
int deriv,
class Domain,
class Iter,
class Field>
295 void apply(
const Domain &x,
296 Iter iter,std::vector<Field> &vecContainer)
const
298 typedef std::vector<Field> Container;
299 typename Container::iterator vecIter = vecContainer.begin();
300 for ( ; !iter.done(); ++iter)
302 const typename Iter::Block &block = iter->block();
303 for (
int r1=0; r1<dimR; ++r1)
306 apply<Field>(std::integral_constant<int,deriv>(),r1,x,block,b,vecIter);
310 template <
class Field,
class Domain,
class Block,
class VecIter,
int deriv>
311 void apply(
const integral_constat<int,deriv>&,
int r1,
const Domain &x,
312 const Block &block,
unsigned int &b,
313 VecIter &vecIter)
const
315 apply<Field>(std::integral_constant<int,deriv-1>(),r1,x,block,b,vecIter);
316 unsigned int bStart = b;
318 apply<Field>(r1,x,block,bStart,bEnd,vecIter);
321 template <
class Field,
class Domain,
class Block,
class VecIter>
322 void apply(
const std::integral_constant<int,0>&,
int r1,
const Domain &x,
323 const Block &block,
unsigned int &b,
324 VecIter &vecIter)
const
326 apply<Field>(r1,x,block,b,b+1,vecIter);
329 template <
class Field,
class Domain,
class Block,
class VecIter>
330 void apply(
int r1,
const Domain &x,
const Block &block,
331 unsigned int bStart,
unsigned int bEnd,
332 VecIter &vecIter)
const
334 for (
int r2=0; r2<dimR; ++r2)
336 for (
unsigned int bb=bStart; bb<bEnd; ++bb)
338 *vecIter = (r1==r2 ? block[bb] : Field(0));
345 template <
class B,
int dimR,DerivativeLayout layout>
346 struct VectorialEvaluator
347 :
public VecEvaluator<B,DiagonalFill<dimR,layout> >
349 typedef DiagonalFill<dimR,layout> Fill;
350 typedef VecEvaluator< B,Fill > Base;
351 VectorialEvaluator(
const B &basis)
352 : Base(basis,fill_,basis.size()*dimR)