4 #ifndef DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
5 #define DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
10 #include <dune/common/fmatrix.hh>
11 #include <dune/common/shared_ptr.hh>
12 #include <dune/common/static_assert.hh>
13 #include <dune/common/typetraits.hh>
27 template<
class FiniteElement,
class Dummy =
void>
30 typedef typename FiniteElement::Traits::Basis
Basis;
38 {
return fe.basis(); }
41 {
return fe.interpolation(); }
44 {
return fe.coefficients(); }
69 typedef shared_ptr<const FiniteElement>
Store;
77 { store.reset(
new FiniteElement(fe)); }
83 template<
class FiniteElement>
84 struct FiniteElementInterfaceSwitch<
86 typename enable_if<AlwaysTrue<typename FiniteElement::Traits::
91 typedef typename FiniteElement::Traits::LocalBasisType
Basis;
93 typedef typename FiniteElement::Traits::LocalInterpolationType
96 typedef typename FiniteElement::Traits::LocalCoefficientsType
Coefficients;
99 static const Basis &
basis(
const FiniteElement& fe)
100 {
return fe.localBasis(); }
103 {
return fe.localInterpolation(); }
106 {
return fe.localCoefficients(); }
109 typedef const FiniteElement *
Store;
132 template<
class Basis,
class Dummy =
void>
144 static const std::size_t
dimRange = Basis::Traits::dimRange;
146 typedef typename Basis::Traits::Range
Range;
149 static const std::size_t
diffOrder = Basis::Traits::diffOrder;
162 template<
typename Geometry>
163 static void gradient(
const Basis& basis,
const Geometry& geometry,
166 Geometry::coorddimension> >& grad)
168 grad.resize(basis.size());
169 basis.evaluateJacobian(xl, grad);
175 template<
class Basis>
176 struct BasisInterfaceSwitch<
177 Basis, typename enable_if<Basis::Traits::dimDomain>::type
181 typedef typename Basis::Traits::DomainFieldType
DomainField;
183 static const std::size_t
dimDomainLocal = Basis::Traits::dimDomain;
185 typedef typename Basis::Traits::DomainType
DomainLocal;
188 typedef typename Basis::Traits::RangeFieldType
RangeField;
190 static const std::size_t
dimRange = Basis::Traits::dimRange;
192 typedef typename Basis::Traits::RangeType
Range;
195 static const std::size_t
diffOrder = Basis::Traits::diffOrder;
198 template<
typename Geometry>
199 static void gradient(
const Basis& basis,
const Geometry& geometry,
202 Geometry::coorddimension> >& grad)
204 std::vector<typename Basis::Traits::JacobianType> lgrad(basis.size());
205 basis.evaluateJacobian(xl, lgrad);
207 const typename Geometry::Jacobian& jac =
208 geometry.jacobianInverseTransposed(xl);
210 grad.resize(basis.size());
211 for(std::size_t i = 0; i < basis.size(); ++i)
212 jac.mv(lgrad[i][0], grad[i][0]);
219 #endif // DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH