dune-localfunctions  2.2.1
interfaceswitch.hh
Go to the documentation of this file.
1 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=8 sw=2 sts=2:
3 
4 #ifndef DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
5 #define DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
6 
7 #include <cstddef>
8 #include <vector>
9 
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>
14 
15 namespace Dune {
16 
19 
27  template<class FiniteElement, class Dummy = void>
30  typedef typename FiniteElement::Traits::Basis Basis;
32  typedef typename FiniteElement::Traits::Interpolation Interpolation;
34  typedef typename FiniteElement::Traits::Coefficients Coefficients;
35 
37  static const Basis &basis(const FiniteElement& fe)
38  { return fe.basis(); }
40  static const Interpolation &interpolation(const FiniteElement& fe)
41  { return fe.interpolation(); }
43  static const Coefficients &coefficients(const FiniteElement& fe)
44  { return fe.coefficients(); }
45 
47 
69  typedef shared_ptr<const FiniteElement> Store;
71 
76  static void setStore(Store& store, const FiniteElement& fe)
77  { store.reset(new FiniteElement(fe)); }
78  };
79 
80 #ifndef DOXYGEN
81 
82 
83  template<class FiniteElement>
84  struct FiniteElementInterfaceSwitch<
85  FiniteElement,
86  typename enable_if<AlwaysTrue<typename FiniteElement::Traits::
87  LocalBasisType>::value>::type
88  >
89  {
91  typedef typename FiniteElement::Traits::LocalBasisType Basis;
93  typedef typename FiniteElement::Traits::LocalInterpolationType
96  typedef typename FiniteElement::Traits::LocalCoefficientsType Coefficients;
97 
99  static const Basis &basis(const FiniteElement& fe)
100  { return fe.localBasis(); }
102  static const Interpolation &interpolation(const FiniteElement& fe)
103  { return fe.localInterpolation(); }
105  static const Coefficients &coefficients(const FiniteElement& fe)
106  { return fe.localCoefficients(); }
107 
109  typedef const FiniteElement *Store;
111  static void setStore(Store& store, const FiniteElement& fe)
112  { store = &fe; }
113  };
114 #endif // !DOXYGEN
115 
117 
132  template<class Basis, class Dummy = void>
135  typedef typename Basis::Traits::DomainField DomainField;
137  static const std::size_t dimDomainLocal = Basis::Traits::dimDomainLocal;
139  typedef typename Basis::Traits::DomainLocal DomainLocal;
140 
142  typedef typename Basis::Traits::RangeField RangeField;
144  static const std::size_t dimRange = Basis::Traits::dimRange;
146  typedef typename Basis::Traits::Range Range;
147 
149  static const std::size_t diffOrder = Basis::Traits::diffOrder;
150 
152 
162  template<typename Geometry>
163  static void gradient(const Basis& basis, const Geometry& geometry,
164  const DomainLocal& xl,
165  std::vector<FieldMatrix<RangeField, 1,
166  Geometry::coorddimension> >& grad)
167  {
168  grad.resize(basis.size());
169  basis.evaluateJacobian(xl, grad);
170  }
171  };
172 
173 #ifndef DOXYGEN
174 
175  template<class Basis>
176  struct BasisInterfaceSwitch<
177  Basis, typename enable_if<Basis::Traits::dimDomain>::type
178  >
179  {
181  typedef typename Basis::Traits::DomainFieldType DomainField;
183  static const std::size_t dimDomainLocal = Basis::Traits::dimDomain;
185  typedef typename Basis::Traits::DomainType DomainLocal;
186 
188  typedef typename Basis::Traits::RangeFieldType RangeField;
190  static const std::size_t dimRange = Basis::Traits::dimRange;
192  typedef typename Basis::Traits::RangeType Range;
193 
195  static const std::size_t diffOrder = Basis::Traits::diffOrder;
196 
198  template<typename Geometry>
199  static void gradient(const Basis& basis, const Geometry& geometry,
200  const DomainLocal& xl,
201  std::vector<FieldMatrix<RangeField, 1,
202  Geometry::coorddimension> >& grad)
203  {
204  std::vector<typename Basis::Traits::JacobianType> lgrad(basis.size());
205  basis.evaluateJacobian(xl, lgrad);
206 
207  const typename Geometry::Jacobian& jac =
208  geometry.jacobianInverseTransposed(xl);
209 
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]);
213  }
214  };
215 #endif // !DOXYGEN
216 
217 } // namespace Dune
218 
219 #endif // DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH