dune-localfunctions  2.1.1
interfaceswitch.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_COMMON_INTERFACESWITCH_HH
00005 #define DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
00006 
00007 #include <cstddef>
00008 #include <vector>
00009 
00010 #include <dune/common/fmatrix.hh>
00011 #include <dune/common/shared_ptr.hh>
00012 #include <dune/common/static_assert.hh>
00013 #include <dune/common/typetraits.hh>
00014 
00015 namespace Dune {
00016 
00019 
00027   template<class FiniteElement, class Dummy = void>
00028   struct FiniteElementInterfaceSwitch {
00030     typedef typename FiniteElement::Traits::Basis Basis;
00032     typedef typename FiniteElement::Traits::Interpolation Interpolation;
00034     typedef typename FiniteElement::Traits::Coefficients Coefficients;
00035 
00037     static const Basis &basis(const FiniteElement& fe)
00038     { return fe.basis(); }
00040     static const Interpolation &interpolation(const FiniteElement& fe)
00041     { return fe.interpolation(); }
00043     static const Coefficients &coefficients(const FiniteElement& fe)
00044     { return fe.coefficients(); }
00045 
00047 
00069     typedef shared_ptr<const FiniteElement> Store;
00071 
00076     static void setStore(Store& store, const FiniteElement& fe)
00077     { store.reset(new FiniteElement(fe)); }
00078   };
00079 
00080 #ifndef DOXYGEN
00081 
00082 
00083   template<class FiniteElement>
00084   struct FiniteElementInterfaceSwitch<
00085     FiniteElement,
00086     typename enable_if<AlwaysTrue<typename FiniteElement::Traits::
00087                                   LocalBasisType>::value>::type
00088     >
00089   {
00091     typedef typename FiniteElement::Traits::LocalBasisType Basis;
00093     typedef typename FiniteElement::Traits::LocalInterpolationType
00094       Interpolation;
00096     typedef typename FiniteElement::Traits::LocalCoefficientsType Coefficients;
00097 
00099     static const Basis &basis(const FiniteElement& fe)
00100     { return fe.localBasis(); }
00102     static const Interpolation &interpolation(const FiniteElement& fe)
00103     { return fe.localInterpolation(); }
00105     static const Coefficients &coefficients(const FiniteElement& fe)
00106     { return fe.localCoefficients(); }
00107 
00109     typedef const FiniteElement *Store;
00111     static void setStore(Store& store, const FiniteElement& fe)
00112     { store = &fe; }
00113   };
00114 #endif // !DOXYGEN
00115 
00117 
00132   template<class Basis, class Dummy = void>
00133   struct BasisInterfaceSwitch {
00135     typedef typename Basis::Traits::DomainField DomainField;
00137     static const std::size_t dimDomainLocal = Basis::Traits::dimDomainLocal;
00139     typedef typename Basis::Traits::DomainLocal DomainLocal;
00140 
00142     typedef typename Basis::Traits::RangeField RangeField;
00144     static const std::size_t dimRange = Basis::Traits::dimRange;
00146     typedef typename Basis::Traits::Range Range;
00147 
00149     static const std::size_t diffOrder = Basis::Traits::diffOrder;
00150 
00152 
00162     template<typename Geometry>
00163     static void gradient(const Basis& basis, const Geometry& geometry,
00164                          const DomainLocal& xl,
00165                          std::vector<FieldMatrix<RangeField, 1,
00166                                           Geometry::coorddimension> >& grad)
00167     {
00168       grad.resize(basis.size());
00169       basis.evaluateJacobian(xl, grad);
00170     }
00171   };
00172 
00173 #ifndef DOXYGEN
00174 
00175   template<class Basis>
00176   struct BasisInterfaceSwitch<
00177     Basis, typename enable_if<Basis::Traits::dimDomain>::type
00178     >
00179   {
00181     typedef typename Basis::Traits::DomainFieldType DomainField;
00183     static const std::size_t dimDomainLocal = Basis::Traits::dimDomain;
00185     typedef typename Basis::Traits::DomainType DomainLocal;
00186 
00188     typedef typename Basis::Traits::RangeFieldType RangeField;
00190     static const std::size_t dimRange = Basis::Traits::dimRange;
00192     typedef typename Basis::Traits::RangeType Range;
00193 
00195     static const std::size_t diffOrder = Basis::Traits::diffOrder;
00196 
00198     template<typename Geometry>
00199     static void gradient(const Basis& basis, const Geometry& geometry,
00200                          const DomainLocal& xl,
00201                          std::vector<FieldMatrix<RangeField, 1,
00202                                            Geometry::coorddimension> >& grad)
00203     {
00204       std::vector<typename Basis::Traits::JacobianType> lgrad(basis.size());
00205       basis.evaluateJacobian(xl, lgrad);
00206 
00207       const typename Geometry::Jacobian& jac =
00208         geometry.jacobianInverseTransposed(xl);
00209 
00210       grad.resize(basis.size());
00211       for(std::size_t i = 0; i < basis.size(); ++i)
00212         jac.mv(lgrad[i][0], grad[i][0]);
00213     }
00214   };
00215 #endif // !DOXYGEN
00216 
00217 } // namespace Dune
00218 
00219 #endif // DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH