4 #ifndef DUNE_LOCALFUNCTIONS_META_POWER_BASIS_HH
5 #define DUNE_LOCALFUNCTIONS_META_POWER_BASIS_HH
10 #include <dune/common/fmatrix.hh>
11 #include <dune/common/fvector.hh>
12 #include <dune/common/static_assert.hh>
23 template<
class Backend, std::
size_t dimR>
25 dune_static_assert(Backend::Traits::dimRange == 1,
"PowerBasis works only "
26 "with scalar backends");
29 const Backend *backend;
33 struct Traits :
public Backend::Traits
38 typedef FieldVector<typename Traits::RangeField, dimR>
Range;
45 typedef FieldMatrix<
typename Traits::RangeField, dimR,
50 Backend::Traits::diffOrder > 0 ? 1 : 0;
60 PowerBasis(
const Backend &backend_) : backend(&backend_) { }
63 std::size_t
size ()
const {
return backend->size()*dimR; }
65 std::size_t
order ()
const{
return backend->order(); }
69 std::vector<typename Traits::Range>& out)
const
71 std::vector<typename Backend::Traits::Range> backendValues;
72 backend->evaluateFunction(in, backendValues);
74 for(std::size_t d = 0; d < dimR; ++d)
75 for(std::size_t i = 0; i < backend->size(); ++i)
76 out[d*backend->size()+i][d] = backendValues[i][0];
81 std::vector<typename Traits::Jacobian>& out)
const
83 std::vector<typename Backend::Traits::Jacobian> backendValues;
84 backend->evaluateJacobian(in, backendValues);
86 for(std::size_t d = 0; d < dimR; ++d)
87 for(std::size_t i = 0; i < backend->size(); ++i)
88 out[d*backend->size()+i][d] = backendValues[i][0];
94 #endif // DUNE_LOCALFUNCTIONS_META_POWER_BASIS_HH