basis.hh
Go to the documentation of this file.00001
00002
00003 #ifndef DUNE_BASIS_HH
00004 #define DUNE_BASIS_HH
00005
00006 #include <vector>
00007
00008 #include <dune/common/static_assert.hh>
00009
00010 namespace Dune
00011 {
00012
00014
00025 template<typename Imp>
00026 struct BasisTraits {
00027 dune_static_assert(AlwaysFalse<Imp>::value,
00028 "If you get this error you the compiler tried to "
00029 "instantiate the non-specialized version of "
00030 "BasisTraits, which should never happen. Maybe you "
00031 "forgot to provide a specialization for your basis?");
00033 typedef typename Imp::Traits::DomainFieldType DomainFieldType;
00035 static const unsigned dimDomain = Imp::Traits::dimDomain;
00037 typedef typename Imp::Traits::DomainType DomainType;
00038
00040 typedef typename Imp::Traits::RangeFieldType RangeFieldType;
00042 static const unsigned dimRange = Imp::Traits::dimRange;
00044 typedef typename Imp::Traits::RangeType RangeType;
00045
00047
00052 static const unsigned diffOrder = Imp::Traits::diffOrder;
00054
00058 typedef typename Imp::Traits::JacobianType JacobianType;
00059 };
00060
00072 template<typename Imp, typename T = BasisTraits<Imp> >
00073 class C0BasisInterface
00074 {
00075 public:
00077 typedef T Traits;
00078
00080 unsigned int size () const
00081 {
00082 return asImp().size();
00083 }
00084
00094 inline void evaluateFunction(const typename Traits::DomainType& in,
00095 std::vector<typename Traits::RangeType>& out) const
00096 {
00097 asImp().evaluateFunction(in,out);
00098 }
00099
00115 template<typename C>
00116 inline typename Traits::RangeType
00117 evaluateCoeffs(const typename Traits::DomainType& in,
00118 const std::vector<C>& coeffs) const
00119 {
00120 std::vector<typename Traits::RangeType> basevalues;
00121 typename Traits::RangeType out = 0;
00122 asImp().evaluateFunction(in, basevalues);
00123 assert(coeffs.size() == basevalues.size());
00124 for(unsigned i = 0; i < coeffs.size(); ++i)
00125 out.axpy(coeffs[i], basevalues[i]);
00126 return out;
00127 }
00128
00133 unsigned int order () const
00134 {
00135 return asImp().order();
00136 }
00137
00138 private:
00139 Imp& asImp () {return static_cast<Imp &> (*this);}
00140 const Imp& asImp () const {return static_cast<const Imp &>(*this);}
00141 };
00142
00143
00144
00157 template<typename Imp, typename T = BasisTraits<Imp> >
00158 class C1BasisInterface
00159 : public C0BasisInterface<Imp,T>
00160 {
00161 public:
00163 typedef T Traits;
00164
00175 inline void
00176 evaluateJacobian(const typename Traits::DomainType& in,
00177 std::vector<typename Traits::JacobianType>& out) const
00178 {
00179 asImp().evaluateJacobian(in,out);
00180 }
00181
00199 template<typename C>
00200 inline void
00201 evaluateJacobianCoeffs(const typename Traits::DomainType& in,
00202 const std::vector<C>& coeffs) const
00203 {
00204 std::vector<typename Traits::JacobianType> basevalues;
00205 typename Traits::JacobianType out = 0;
00206 asImp().evaluateFunction(in, basevalues);
00207 assert(coeffs.size() == basevalues.size());
00208 for(unsigned i = 0; i < coeffs.size(); ++i)
00209 out.axpy(coeffs[i], basevalues[i]);
00210 return out;
00211 }
00212
00213 private:
00214 Imp& asImp () {return static_cast<Imp &> (*this);}
00215 const Imp& asImp () const {return static_cast<const Imp &>(*this);}
00216 };
00217 }
00218 #endif // DUNE_BASIS_HH