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_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