dune-localfunctions  2.6-git
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 
43 
62  template<class LocalBasis, class Geometry>
64  static_assert(LocalBasis::Traits::dimRange == 1,
65  "ScalarLocalToGlobalBasisAdaptor can only wrap a "
66  "scalar local basis.");
67  static_assert((std::is_same<typename LocalBasis::Traits::DomainFieldType,
68  typename Geometry::ctype>::value),
69  "ScalarLocalToGlobalBasisAdaptor: LocalBasis must use "
70  "the same ctype as Geometry");
71  static_assert
72  ( static_cast<std::size_t>(LocalBasis::Traits::dimDomain) ==
73  static_cast<std::size_t>(Geometry::mydimension),
74  "ScalarLocalToGlobalBasisAdaptor: LocalBasis domain dimension must "
75  "match local dimension of Geometry");
76 
77  const LocalBasis& localBasis;
78  Geometry geometry;
79 
80  public:
81  typedef LocalToGlobalBasisAdaptorTraits<typename LocalBasis::Traits,
82  Geometry::coorddimension> Traits;
83 
85 
94  ScalarLocalToGlobalBasisAdaptor(const LocalBasis& localBasis_,
95  const Geometry& geometry_) :
96  localBasis(localBasis_), geometry(geometry_)
97  { }
98 
99  std::size_t size() const { return localBasis.size(); }
101 
108  std::size_t order() const {
109  if(geometry.affine())
110  // affine linear
111  return localBasis.order();
112  else
113  // assume at most order dim
114  return localBasis.order() + Traits::dimDomainGlobal - 1;
115  }
116 
117  void evaluateFunction(const typename Traits::DomainLocal& in,
118  std::vector<typename Traits::Range>& out) const
119  {
120  localBasis.evaluateFunction(in, out);
121  }
122 
123  void evaluateJacobian(const typename Traits::DomainLocal& in,
124  std::vector<typename Traits::Jacobian>& out) const
125  {
126  std::vector<typename LocalBasis::Traits::JacobianType>
127  localJacobian(size());
128  localBasis.evaluateJacobian(in, localJacobian);
129 
130  const typename Geometry::JacobianInverseTransposed &geoJacobian =
131  geometry.jacobianInverseTransposed(in);
132 
133  out.resize(size());
134  for(std::size_t i = 0; i < size(); ++i)
135  geoJacobian.mv(localJacobian[i][0], out[i][0]);
136  }
137  };
138 
140 
146  template<class LocalInterpolation, class Traits_>
148  const LocalInterpolation& localInterpolation;
149 
150  public:
151  typedef Traits_ Traits;
152 
154 
163  ( const LocalInterpolation& localInterpolation_) :
164  localInterpolation(localInterpolation_)
165  { }
166 
167  template<class Function, class Coeff>
168  void interpolate(const Function& function, std::vector<Coeff>& out) const
169  { localInterpolation.interpolate(function, out); }
170  };
171 
174 
184  template<class LocalFiniteElement, class Geometry>
189  struct Traits {
190  typedef ScalarLocalToGlobalBasisAdaptor<typename LocalFiniteElement::
191  Traits::LocalBasisType, Geometry> Basis;
192  typedef LocalToGlobalInterpolationAdaptor<typename LocalFiniteElement::
193  Traits::LocalInterpolationType, typename Basis::Traits>
195  typedef typename LocalFiniteElement::Traits::LocalCoefficientsType
197  };
198 
199  private:
200  const LocalFiniteElement &localFE;
201  typename Traits::Basis basis_;
202  typename Traits::Interpolation interpolation_;
203 
204  public:
206 
216  ( const LocalFiniteElement& localFE_, const Geometry &geometry) :
217  localFE(localFE_),
218  basis_(localFE.localBasis(), geometry),
219  interpolation_(localFE.localInterpolation())
220  { }
221 
222  const typename Traits::Basis& basis() const { return basis_; }
223  const typename Traits::Interpolation& interpolation() const
224  { return interpolation_; }
225  const typename Traits::Coefficients& coefficients() const
226  { return localFE.localCoefficients(); }
227  GeometryType type() const { return localFE.type(); }
228  };
229 
231 
241  template<class LocalFiniteElement, class Geometry>
243  const LocalFiniteElement& localFE;
244 
245  public:
246  typedef ScalarLocalToGlobalFiniteElementAdaptor<LocalFiniteElement,
247  Geometry> FiniteElement;
248 
250 
259  (const LocalFiniteElement &localFE_) : localFE(localFE_) {}
260 
262 
272  const FiniteElement make(const Geometry& geometry) {
273  return FiniteElement(localFE, geometry);
274  }
275  };
276 
277 } // namespace Dune
278 
279 #endif // DUNE_LOCALFUNCTIONS_COMMON_LOCALTOGLOBALADAPTORS_HH
Dune::LocalToGlobalBasisAdaptorTraits::Jacobian
FieldMatrix< RangeField, dimRange, dimDomainGlobal > Jacobian
Definition: localtoglobaladaptors.hh:39
Dune::LocalToGlobalBasisAdaptorTraits::Range
LocalBasisTraits::RangeType Range
Definition: localtoglobaladaptors.hh:37
Dune::ScalarLocalToGlobalFiniteElementAdaptor::coefficients
const Traits::Coefficients & coefficients() const
Definition: localtoglobaladaptors.hh:225
Dune::ScalarLocalToGlobalFiniteElementAdaptor
Convert a simple scalar local finite element into a global finite element.
Definition: localtoglobaladaptors.hh:185
Dune::ScalarLocalToGlobalFiniteElementAdaptor::Traits::Interpolation
LocalToGlobalInterpolationAdaptor< typename LocalFiniteElement::Traits::LocalInterpolationType, typename Basis::Traits > Interpolation
Definition: localtoglobaladaptors.hh:194
Dune::ScalarLocalToGlobalFiniteElementAdaptor::Traits::Basis
ScalarLocalToGlobalBasisAdaptor< typename LocalFiniteElement::Traits::LocalBasisType, Geometry > Basis
Definition: localtoglobaladaptors.hh:191
Dune::LocalToGlobalBasisAdaptorTraits::DomainGlobal
FieldVector< DomainField, dimDomainGlobal > DomainGlobal
Definition: localtoglobaladaptors.hh:33
Dune::LocalToGlobalInterpolationAdaptor::interpolate
void interpolate(const Function &function, std::vector< Coeff > &out) const
Definition: localtoglobaladaptors.hh:168
Dune::value
@ value
Definition: tensor.hh:165
Dune::LocalBasisTraits::dimRange
@ dimRange
dimension of the range
Definition: localbasis.hh:51
Dune::ScalarLocalToGlobalBasisAdaptor
Convert a simple scalar local basis into a global basis.
Definition: localtoglobaladaptors.hh:63
Dune::LocalToGlobalBasisAdaptorTraits::dimRange
static const std::size_t dimRange
Definition: localtoglobaladaptors.hh:36
Dune::LocalToGlobalInterpolationAdaptor::LocalToGlobalInterpolationAdaptor
LocalToGlobalInterpolationAdaptor(const LocalInterpolation &localInterpolation_)
construct a LocalToGlobalInterpolationAdaptor
Definition: localtoglobaladaptors.hh:163
Dune::ScalarLocalToGlobalFiniteElementAdaptorFactory
Factory for ScalarLocalToGlobalFiniteElementAdaptor objects.
Definition: localtoglobaladaptors.hh:242
Dune::ScalarLocalToGlobalBasisAdaptor::order
std::size_t order() const
return maximum polynomial order of the base function
Definition: localtoglobaladaptors.hh:108
Dune::ScalarLocalToGlobalFiniteElementAdaptor::interpolation
const Traits::Interpolation & interpolation() const
Definition: localtoglobaladaptors.hh:223
Dune::LocalToGlobalBasisAdaptorTraits::RangeField
LocalBasisTraits::RangeFieldType RangeField
Definition: localtoglobaladaptors.hh:35
Dune::ScalarLocalToGlobalFiniteElementAdaptor::basis
const Traits::Basis & basis() const
Definition: localtoglobaladaptors.hh:222
Dune::LocalBasisTraits::dimDomain
@ dimDomain
dimension of the domain
Definition: localbasis.hh:39
Dune::LocalToGlobalBasisAdaptorTraits
Traits class for local-to-global basis adaptors.
Definition: localtoglobaladaptors.hh:28
Dune::LocalToGlobalInterpolationAdaptor::Traits
Traits_ Traits
Definition: localtoglobaladaptors.hh:151
Dune::ScalarLocalToGlobalFiniteElementAdaptor::type
GeometryType type() const
Definition: localtoglobaladaptors.hh:227
Dune::ScalarLocalToGlobalFiniteElementAdaptor::ScalarLocalToGlobalFiniteElementAdaptor
ScalarLocalToGlobalFiniteElementAdaptor(const LocalFiniteElement &localFE_, const Geometry &geometry)
construct a ScalarLocalToGlobalFiniteElementAdaptor
Definition: localtoglobaladaptors.hh:216
Dune::LocalBasisTraits::DomainType
D DomainType
domain type
Definition: localbasis.hh:43
Dune::LocalBasisTraits::DomainFieldType
DF DomainFieldType
Export type for domain field.
Definition: localbasis.hh:34
Dune::ScalarLocalToGlobalFiniteElementAdaptorFactory::ScalarLocalToGlobalFiniteElementAdaptorFactory
ScalarLocalToGlobalFiniteElementAdaptorFactory(const LocalFiniteElement &localFE_)
construct a ScalarLocalToGlobalFiniteElementAdaptorFactory
Definition: localtoglobaladaptors.hh:259
Dune::ScalarLocalToGlobalBasisAdaptor::size
std::size_t size() const
Definition: localtoglobaladaptors.hh:99
Dune::ScalarLocalToGlobalBasisAdaptor::evaluateJacobian
void evaluateJacobian(const typename Traits::DomainLocal &in, std::vector< typename Traits::Jacobian > &out) const
Definition: localtoglobaladaptors.hh:123
Dune::LocalToGlobalBasisAdaptorTraits::dimDomainLocal
static const std::size_t dimDomainLocal
Definition: localtoglobaladaptors.hh:30
Dune::LocalBasisTraits::RangeFieldType
RF RangeFieldType
Export type for range field.
Definition: localbasis.hh:46
Dune::ScalarLocalToGlobalFiniteElementAdaptor::Traits::Coefficients
LocalFiniteElement::Traits::LocalCoefficientsType Coefficients
Definition: localtoglobaladaptors.hh:196
Dune::LocalToGlobalInterpolationAdaptor
Convert a local interpolation into a global interpolation.
Definition: localtoglobaladaptors.hh:147
Dune::LocalToGlobalBasisAdaptorTraits::dimDomainGlobal
static const std::size_t dimDomainGlobal
Definition: localtoglobaladaptors.hh:31
Dune::ScalarLocalToGlobalFiniteElementAdaptor::Traits
Definition: localtoglobaladaptors.hh:189
Dune::FiniteElementFactoryInterface::FiniteElement
ImplementationDefined FiniteElement
Type of the finite element.
Definition: interface.hh:115
Dune::LocalToGlobalBasisAdaptorTraits::DomainField
LocalBasisTraits::DomainFieldType DomainField
Definition: localtoglobaladaptors.hh:29
Dune::ScalarLocalToGlobalBasisAdaptor::evaluateFunction
void evaluateFunction(const typename Traits::DomainLocal &in, std::vector< typename Traits::Range > &out) const
Definition: localtoglobaladaptors.hh:117
Dune::LocalToGlobalBasisAdaptorTraits::DomainLocal
LocalBasisTraits::DomainType DomainLocal
Definition: localtoglobaladaptors.hh:32
Dune::ScalarLocalToGlobalBasisAdaptor::ScalarLocalToGlobalBasisAdaptor
ScalarLocalToGlobalBasisAdaptor(const LocalBasis &localBasis_, const Geometry &geometry_)
construct a ScalarLocalToGlobalBasisAdaptor
Definition: localtoglobaladaptors.hh:94
Dune::LocalBasisTraits::RangeType
R RangeType
range type
Definition: localbasis.hh:55
Dune::ScalarLocalToGlobalFiniteElementAdaptorFactory::FiniteElement
ScalarLocalToGlobalFiniteElementAdaptor< LocalFiniteElement, Geometry > FiniteElement
Definition: localtoglobaladaptors.hh:247
Dune::ScalarLocalToGlobalFiniteElementAdaptorFactory::make
const FiniteElement make(const Geometry &geometry)
construct ScalarLocalToGlobalFiniteElementAdaptor
Definition: localtoglobaladaptors.hh:272
Dune
Definition: brezzidouglasmarini1cube2dlocalbasis.hh:15
Dune::ScalarLocalToGlobalBasisAdaptor::Traits
LocalToGlobalBasisAdaptorTraits< typename LocalBasis::Traits, Geometry::coorddimension > Traits
Definition: localtoglobaladaptors.hh:82