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