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;
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 )
167 using Base::container_;
171 template<
class B,
class Fill >
176 typedef typename Basis::Field
Field;
177 static const int dimension = Basis::dimension;
178 static const int dimRange = Basis::dimRange*Fill::dimRange;
183 template <
unsigned int deriv>
189 VecEvaluator (
const Basis &basis,
const Fill &fill )
190 : Base( basis, basis.size() ),
194 template <
unsigned int deriv>
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_);
203 template <
unsigned int deriv,
class DVector>
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_);
212 unsigned int size()
const 218 VecEvaluator (
const Basis &basis,
const Fill &fill,
unsigned int size )
219 : Base( basis, basis.size() ),
230 vecContainer_.resize(totalSize);
233 VecEvaluator(
const VecEvaluator&);
235 Container vecContainer_;
240 template <
int dimR,DerivativeLayout layout>
244 struct DiagonalFill<dimR,derivative>
248 template <
int deriv,
class Domain,
class Iter,
class Field>
249 void apply(
const Domain &x,
250 Iter iter,std::vector<Field> &vecContainer)
const 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>
294 template <
int deriv,
class Domain,
class Iter,
class Field>
295 void apply(
const Domain &x,
296 Iter iter,std::vector<Field> &vecContainer)
const 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)
void resize()
Definition: basisevaluator.hh:61
Container container_
Definition: basisevaluator.hh:69
Definition: basisevaluator.hh:39
unsigned int order_
Definition: basisevaluator.hh:68
Basis::DomainVector DomainVector
Definition: basisevaluator.hh:132
Definition: basisevaluator.hh:127
Definition: basisevaluator.hh:28
bool done() const
Definition: basisevaluator.hh:104
BaseIterator(Container &container)
Definition: basisevaluator.hh:88
Basis::Field Field
Definition: basisevaluator.hh:31
unsigned int size() const
Definition: basisevaluator.hh:48
Definition: tensor.hh:165
const Deriv * operator->() const
Definition: basisevaluator.hh:99
const Basis & basis_
Definition: basisevaluator.hh:67
Field operator*(const Unity< Field > &u, const Field &f)
Definition: field.hh:48
unsigned int size_
Definition: basisevaluator.hh:68
DerivativeLayout
Definition: tensor.hh:165
static const int dimRange
Definition: basisevaluator.hh:34
Dune::FieldVector< Field, blockSize > Block
Definition: basisevaluator.hh:80
Basis::DomainVector DomainVector
Definition: basisevaluator.hh:32
Iterator< 0 >::Integrate integrate()
Definition: basisevaluator.hh:152
Definition: brezzidouglasmarini1cube2dlocalbasis.hh:15
BaseIterator< Derivatives< Field, dimension, dimRange, deriv, derivative > > All
Definition: basisevaluator.hh:44
Definition: tensor.hh:165
const Deriv & operator*() const
Definition: basisevaluator.hh:93
std::vector< Field > Container
Definition: basisevaluator.hh:36
Deriv Derivatives
Definition: basisevaluator.hh:77
MonomialEvaluator< B > Base
Definition: basisevaluator.hh:136
MonomialEvaluator(const Basis &basis, unsigned int order, unsigned int size)
Definition: basisevaluator.hh:54
B Basis
Definition: basisevaluator.hh:30
std::vector< Field > Container
Definition: basisevaluator.hh:133
Basis::Field Field
Definition: basisevaluator.hh:131
Definition: basisevaluator.hh:42
StandardEvaluator(const Basis &basis, unsigned int size)
Definition: basisevaluator.hh:160
Definition: tensor.hh:168
Deriv::Field Field
Definition: basisevaluator.hh:78
StandardEvaluator(const Basis &basis)
Definition: basisevaluator.hh:142
Container::iterator CIter
Definition: basisevaluator.hh:86
Definition: basisevaluator.hh:139
std::vector< Field > Container
Definition: basisevaluator.hh:85
Iterator< deriv >::All evaluate(const DVector &x)
Definition: basisevaluator.hh:146
static const int dimension
Definition: basisevaluator.hh:33
BaseIterator< Derivatives< Field, dimension, 1, 0, value > > Integrate
Definition: basisevaluator.hh:45
B Basis
Definition: basisevaluator.hh:130