dune-localfunctions  2.3.1
interfaceswitch.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 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  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  template<class Basis>
176  struct BasisInterfaceSwitch<Basis,
177  typename enable_if<
178  AlwaysTrue<
179  integral_constant<
180  std::size_t,
181  Basis::Traits::dimDomain
182  >
183  >::value
184  >::type
185  >
186  {
188  typedef typename Basis::Traits::DomainFieldType DomainField;
190  static const std::size_t dimDomainLocal = Basis::Traits::dimDomain;
192  typedef typename Basis::Traits::DomainType DomainLocal;
193 
195  typedef typename Basis::Traits::RangeFieldType RangeField;
197  static const std::size_t dimRange = Basis::Traits::dimRange;
199  typedef typename Basis::Traits::RangeType Range;
200 
202  static const std::size_t diffOrder = Basis::Traits::diffOrder;
203 
205  template<typename Geometry>
206  static void gradient(const Basis& basis, const Geometry& geometry,
207  const DomainLocal& xl,
208  std::vector<FieldMatrix<RangeField, 1,
209  Geometry::coorddimension> >& grad)
210  {
211  std::vector<typename Basis::Traits::JacobianType> lgrad(basis.size());
212  basis.evaluateJacobian(xl, lgrad);
213 
214  const typename Geometry::Jacobian& jac =
215  geometry.jacobianInverseTransposed(xl);
216 
217  grad.resize(basis.size());
218  for(std::size_t i = 0; i < basis.size(); ++i)
219  jac.mv(lgrad[i][0], grad[i][0]);
220  }
221  };
222 #endif // !DOXYGEN
223 
224 } // namespace Dune
225 
226 #endif // DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
static const std::size_t dimDomainLocal
export dimension of local coordinates
Definition: interfaceswitch.hh:137
static const Interpolation & interpolation(const FiniteElement &fe)
access interpolation
Definition: interfaceswitch.hh:40
FiniteElement::Traits::Basis Basis
export the type of the basis
Definition: interfaceswitch.hh:30
static const std::size_t dimRange
export dimension of the values
Definition: interfaceswitch.hh:144
Basis::Traits::RangeField RangeField
export field type of the values
Definition: interfaceswitch.hh:142
static const Coefficients & coefficients(const FiniteElement &fe)
access coefficients
Definition: interfaceswitch.hh:43
Basis::Traits::DomainField DomainField
export field types of the coordinates
Definition: interfaceswitch.hh:135
shared_ptr< const FiniteElement > Store
Type for storing finite elements.
Definition: interfaceswitch.hh:69
static const std::size_t diffOrder
export number of supported differentiations
Definition: interfaceswitch.hh:149
static void setStore(Store &store, const FiniteElement &fe)
Store a finite element in the store.
Definition: interfaceswitch.hh:76
FiniteElement::Traits::Interpolation Interpolation
export the type of the interpolation
Definition: interfaceswitch.hh:32
FiniteElement::Traits::Coefficients Coefficients
export the type of the coefficients
Definition: interfaceswitch.hh:34
Switch for uniform treatment of local and global basis classes.
Definition: interfaceswitch.hh:133
static void gradient(const Basis &basis, const Geometry &geometry, const DomainLocal &xl, std::vector< FieldMatrix< RangeField, 1, Geometry::coorddimension > > &grad)
Compute global gradient for scalar valued bases.
Definition: interfaceswitch.hh:163
static const Basis & basis(const FiniteElement &fe)
access basis
Definition: interfaceswitch.hh:37
Basis::Traits::DomainLocal DomainLocal
export vector type of the local coordinates
Definition: interfaceswitch.hh:139
Definition: tensor.hh:165
Basis::Traits::Range Range
export vector type of the values
Definition: interfaceswitch.hh:146
Switch for uniform treatment of finite element with either the local or the global interface...
Definition: interfaceswitch.hh:28