dune-localfunctions
2.1.1
|
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