dune-localfunctions  2.1.1
meta/power/basis.hh
Go to the documentation of this file.
00001 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
00002 // vi: set et ts=8 sw=2 sts=2:
00003 
00004 #ifndef DUNE_LOCALFUNCTIONS_META_POWER_BASIS_HH
00005 #define DUNE_LOCALFUNCTIONS_META_POWER_BASIS_HH
00006 
00007 #include <cstddef>
00008 #include <vector>
00009 
00010 #include <dune/common/fmatrix.hh>
00011 #include <dune/common/fvector.hh>
00012 #include <dune/common/static_assert.hh>
00013 
00014 namespace Dune {
00015 
00017 
00023   template<class Backend, std::size_t dimR>
00024   class PowerBasis {
00025     dune_static_assert(Backend::Traits::dimRange == 1, "PowerBasis works only "
00026                        "with scalar backends");
00027 
00028     // don't use a reference here so this class stays copyable
00029     const Backend *backend;
00030 
00031   public:
00033     struct Traits : public Backend::Traits
00034     {
00036       static const std::size_t dimRange = dimR;
00038       typedef FieldVector<typename Traits::RangeField, dimR> Range;
00039 
00041 
00045       typedef FieldMatrix<typename Traits::RangeField, dimR,
00046                           Traits::dimDomainGlobal> Jacobian;
00047 
00049       static const std::size_t diffOrder =
00050         Backend::Traits::diffOrder > 0 ? 1 : 0;
00051     };
00052 
00054 
00060     PowerBasis(const Backend &backend_) : backend(&backend_) { }
00061 
00063     std::size_t size () const { return backend->size()*dimR; }
00065     std::size_t order () const{ return backend->order(); }
00066 
00068     void evaluateFunction(const typename Traits::DomainLocal& in,
00069                           std::vector<typename Traits::Range>& out) const
00070     {
00071       std::vector<typename Backend::Traits::Range> backendValues;
00072       backend->evaluateFunction(in, backendValues);
00073       out.assign(size(), typename Traits::Range(0));
00074       for(std::size_t d = 0; d < dimR; ++d)
00075         for(std::size_t i = 0; i < backend->size(); ++i)
00076           out[d*backend->size()+i][d] = backendValues[i][0];
00077     }
00078 
00080     void evaluateJacobian(const typename Traits::DomainLocal& in,
00081                           std::vector<typename Traits::Jacobian>& out) const
00082     {
00083       std::vector<typename Backend::Traits::Jacobian> backendValues;
00084       backend->evaluateJacobian(in, backendValues);
00085       out.assign(size(), typename Traits::Jacobian(0));
00086       for(std::size_t d = 0; d < dimR; ++d)
00087         for(std::size_t i = 0; i < backend->size(); ++i)
00088           out[d*backend->size()+i][d] = backendValues[i][0];
00089     }
00090   };
00091 
00092 } // namespace Dune
00093 
00094 #endif // DUNE_LOCALFUNCTIONS_META_POWER_BASIS_HH