dune-localfunctions  2.3.1-rc1
localtoglobaladaptors.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_LOCALTOGLOBALADAPTORS_HH
5 #define DUNE_LOCALFUNCTIONS_COMMON_LOCALTOGLOBALADAPTORS_HH
6 
7 #include <cstddef>
8 #include <vector>
9 
10 #include <dune/common/fmatrix.hh>
11 #include <dune/common/fvector.hh>
12 #include <dune/common/static_assert.hh>
13 #include <dune/common/typetraits.hh>
14 
15 #include <dune/geometry/type.hh>
16 
17 namespace Dune {
18 
20 
28  template<class LocalBasisTraits, std::size_t dimDomainGlobal_>
31  static const std::size_t dimDomainLocal = LocalBasisTraits::dimDomain;
32  static const std::size_t dimDomainGlobal = dimDomainGlobal_;
34  typedef FieldVector<DomainField, dimDomainGlobal> DomainGlobal;
35 
37  static const std::size_t dimRange = LocalBasisTraits::dimRange;
39 
40  typedef FieldMatrix<RangeField, dimRange, dimDomainGlobal> Jacobian;
41 
42  static const std::size_t diffOrder = LocalBasisTraits::diffOrder;
43  };
44 
46 
65  template<class LocalBasis, class Geometry>
67  dune_static_assert(LocalBasis::Traits::dimRange == 1,
68  "ScalarLocalToGlobalBasisAdaptor can only wrap a "
69  "scalar local basis.");
70  dune_static_assert((is_same<typename LocalBasis::Traits::DomainFieldType,
71  typename Geometry::ctype>::value),
72  "ScalarLocalToGlobalBasisAdaptor: LocalBasis must use "
73  "the same ctype as Geometry");
74  dune_static_assert
75  ( static_cast<std::size_t>(LocalBasis::Traits::dimDomain) ==
76  static_cast<std::size_t>(Geometry::mydimension),
77  "ScalarLocalToGlobalBasisAdaptor: LocalBasis domain dimension must "
78  "match local dimension of Geometry");
79 
80  const LocalBasis& localBasis;
81  Geometry geometry;
82 
83  public:
84  typedef LocalToGlobalBasisAdaptorTraits<typename LocalBasis::Traits,
85  Geometry::coorddimension> Traits;
86 
88 
97  ScalarLocalToGlobalBasisAdaptor(const LocalBasis& localBasis_,
98  const Geometry& geometry_) :
99  localBasis(localBasis_), geometry(geometry_)
100  { }
101 
102  std::size_t size() const { return localBasis.size(); }
104 
111  std::size_t order() const {
112  if(geometry.affine())
113  // affine linear
114  return localBasis.order();
115  else
116  // assume at most order dim
117  return localBasis.order() + Traits::dimDomainGlobal - 1;
118  }
119 
120  void evaluateFunction(const typename Traits::DomainLocal& in,
121  std::vector<typename Traits::Range>& out) const
122  {
123  localBasis.evaluateFunction(in, out);
124  }
125 
126  void evaluateJacobian(const typename Traits::DomainLocal& in,
127  std::vector<typename Traits::Jacobian>& out) const
128  {
129  std::vector<typename LocalBasis::Traits::JacobianType>
130  localJacobian(size());
131  localBasis.evaluateJacobian(in, localJacobian);
132 
133  const typename Geometry::Jacobian &geoJacobian =
134  geometry.jacobianInverseTransposed(in);
135 
136  out.resize(size());
137  for(std::size_t i = 0; i < size(); ++i)
138  geoJacobian.mv(localJacobian[i][0], out[i][0]);
139  }
140  };
141 
143 
149  template<class LocalInterpolation, class Traits_>
151  const LocalInterpolation& localInterpolation;
152 
153  public:
154  typedef Traits_ Traits;
155 
157 
166  ( const LocalInterpolation& localInterpolation_) :
167  localInterpolation(localInterpolation_)
168  { }
169 
170  template<class Function, class Coeff>
171  void interpolate(const Function& function, std::vector<Coeff>& out) const
172  { localInterpolation.interpolate(function, out); }
173  };
174 
177 
187  template<class LocalFiniteElement, class Geometry>
192  struct Traits {
193  typedef ScalarLocalToGlobalBasisAdaptor<typename LocalFiniteElement::
194  Traits::LocalBasisType, Geometry> Basis;
195  typedef LocalToGlobalInterpolationAdaptor<typename LocalFiniteElement::
196  Traits::LocalInterpolationType, typename Basis::Traits>
198  typedef typename LocalFiniteElement::Traits::LocalCoefficientsType
200  };
201 
202  private:
203  const LocalFiniteElement &localFE;
204  typename Traits::Basis basis_;
205  typename Traits::Interpolation interpolation_;
206 
207  public:
209 
219  ( const LocalFiniteElement& localFE_, const Geometry &geometry) :
220  localFE(localFE_),
221  basis_(localFE.localBasis(), geometry),
222  interpolation_(localFE.localInterpolation())
223  { }
224 
225  const typename Traits::Basis& basis() const { return basis_; }
226  const typename Traits::Interpolation& interpolation() const
227  { return interpolation_; }
228  const typename Traits::Coefficients& coefficients() const
229  { return localFE.localCoefficients(); }
230  GeometryType type() const { return localFE.type(); }
231  };
232 
234 
244  template<class LocalFiniteElement, class Geometry>
246  const LocalFiniteElement& localFE;
247 
248  public:
249  typedef ScalarLocalToGlobalFiniteElementAdaptor<LocalFiniteElement,
250  Geometry> FiniteElement;
251 
253 
262  (const LocalFiniteElement &localFE_) : localFE(localFE_) {}
263 
265 
275  const FiniteElement make(const Geometry& geometry) {
276  return FiniteElement(localFE, geometry);
277  }
278  };
279 
280 } // namespace Dune
281 
282 #endif // DUNE_LOCALFUNCTIONS_COMMON_LOCALTOGLOBALADAPTORS_HH
FieldMatrix< RangeField, dimRange, dimDomainGlobal > Jacobian
Definition: localtoglobaladaptors.hh:40
void interpolate(const Function &function, std::vector< Coeff > &out) const
Definition: localtoglobaladaptors.hh:171
void evaluateJacobian(const typename Traits::DomainLocal &in, std::vector< typename Traits::Jacobian > &out) const
Definition: localtoglobaladaptors.hh:126
number of partial derivatives supported
Definition: localbasis.hh:76
const Traits::Basis & basis() const
Definition: localtoglobaladaptors.hh:225
void evaluateFunction(const typename Traits::DomainLocal &in, std::vector< typename Traits::Range > &out) const
Definition: localtoglobaladaptors.hh:120
ImplementationDefined FiniteElement
Type of the finite element.
Definition: interface.hh:115
const FiniteElement make(const Geometry &geometry)
construct ScalarLocalToGlobalFiniteElementAdaptor
Definition: localtoglobaladaptors.hh:275
RF RangeFieldType
Export type for range field.
Definition: localbasis.hh:54
ScalarLocalToGlobalFiniteElementAdaptor< LocalFiniteElement, Geometry > FiniteElement
Definition: localtoglobaladaptors.hh:250
LocalToGlobalBasisAdaptorTraits< typename LocalBasis::Traits, Geometry::coorddimension > Traits
Definition: localtoglobaladaptors.hh:85
static const std::size_t dimDomainGlobal
Definition: localtoglobaladaptors.hh:32
GeometryType type() const
Definition: localtoglobaladaptors.hh:230
Traits_ Traits
Definition: localtoglobaladaptors.hh:154
ScalarLocalToGlobalBasisAdaptor< typename LocalFiniteElement::Traits::LocalBasisType, Geometry > Basis
Definition: localtoglobaladaptors.hh:194
Convert a simple scalar local basis into a global basis.
Definition: localtoglobaladaptors.hh:66
Convert a local interpolation into a global interpolation.
Definition: localtoglobaladaptors.hh:150
R RangeType
range type
Definition: localbasis.hh:63
ScalarLocalToGlobalFiniteElementAdaptorFactory(const LocalFiniteElement &localFE_)
construct a ScalarLocalToGlobalFiniteElementAdaptorFactory
Definition: localtoglobaladaptors.hh:262
std::size_t order() const
return maximum polynomial order of the base function
Definition: localtoglobaladaptors.hh:111
LocalToGlobalInterpolationAdaptor(const LocalInterpolation &localInterpolation_)
construct a LocalToGlobalInterpolationAdaptor
Definition: localtoglobaladaptors.hh:166
LocalBasisTraits::RangeType Range
Definition: localtoglobaladaptors.hh:38
LocalFiniteElement::Traits::LocalCoefficientsType Coefficients
Definition: localtoglobaladaptors.hh:199
Traits class for local-to-global basis adaptors.
Definition: localtoglobaladaptors.hh:29
LocalToGlobalInterpolationAdaptor< typename LocalFiniteElement::Traits::LocalInterpolationType, typename Basis::Traits > Interpolation
Definition: localtoglobaladaptors.hh:197
FieldVector< DomainField, dimDomainGlobal > DomainGlobal
Definition: localtoglobaladaptors.hh:34
LocalBasisTraits::DomainType DomainLocal
Definition: localtoglobaladaptors.hh:33
dimension of the domain
Definition: localbasis.hh:47
dimension of the range
Definition: localbasis.hh:59
Definition: tensor.hh:165
Definition: localtoglobaladaptors.hh:192
Factory for ScalarLocalToGlobalFiniteElementAdaptor objects.
Definition: localtoglobaladaptors.hh:245
DF DomainFieldType
Export type for domain field.
Definition: localbasis.hh:42
D DomainType
domain type
Definition: localbasis.hh:51
ScalarLocalToGlobalFiniteElementAdaptor(const LocalFiniteElement &localFE_, const Geometry &geometry)
construct a ScalarLocalToGlobalFiniteElementAdaptor
Definition: localtoglobaladaptors.hh:219
static const std::size_t dimDomainLocal
Definition: localtoglobaladaptors.hh:31
const Traits::Interpolation & interpolation() const
Definition: localtoglobaladaptors.hh:226
static const std::size_t dimRange
Definition: localtoglobaladaptors.hh:37
std::size_t size() const
Definition: localtoglobaladaptors.hh:102
ScalarLocalToGlobalBasisAdaptor(const LocalBasis &localBasis_, const Geometry &geometry_)
construct a ScalarLocalToGlobalBasisAdaptor
Definition: localtoglobaladaptors.hh:97
static const std::size_t diffOrder
Definition: localtoglobaladaptors.hh:42
LocalBasisTraits::DomainFieldType DomainField
Definition: localtoglobaladaptors.hh:30
Convert a simple scalar local finite element into a global finite element.
Definition: localtoglobaladaptors.hh:188
const Traits::Coefficients & coefficients() const
Definition: localtoglobaladaptors.hh:228
LocalBasisTraits::RangeFieldType RangeField
Definition: localtoglobaladaptors.hh:36