basis.hh

Go to the documentation of this file.
00001 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
00002 // vi: set et ts=4 sw=2 sts=2:
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,         // position
00177                                          std::vector<typename Traits::JacobianType>& out) const      // return value
00178         {  
00179           asImp().evaluateJacobian(in,out);
00180         }
00181 
00199     template<typename C>
00200     inline void
00201     evaluateJacobianCoeffs(const typename Traits::DomainType& in,         // position
00202                            const std::vector<C>& coeffs) const      // return value
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
Generated on Sat Apr 24 11:15:33 2010 for dune-localfunctions by  doxygen 1.6.3