dune-localfunctions 2.8.0
Loading...
Searching...
No Matches
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
16namespace 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
Definition: bdfmcube.hh:16
D DomainType
domain type
Definition: common/localbasis.hh:43
@ dimDomain
dimension of the domain
Definition: common/localbasis.hh:39
RF RangeFieldType
Export type for range field.
Definition: common/localbasis.hh:46
@ dimRange
dimension of the range
Definition: common/localbasis.hh:51
DF DomainFieldType
Export type for domain field.
Definition: common/localbasis.hh:34
R RangeType
range type
Definition: common/localbasis.hh:55
Traits class for local-to-global basis adaptors.
Definition: localtoglobaladaptors.hh:28
LocalBasisTraits::RangeFieldType RangeField
Definition: localtoglobaladaptors.hh:35
LocalBasisTraits::DomainFieldType DomainField
Definition: localtoglobaladaptors.hh:29
FieldMatrix< RangeField, dimRange, dimDomainGlobal > Jacobian
Definition: localtoglobaladaptors.hh:39
static const std::size_t dimDomainLocal
Definition: localtoglobaladaptors.hh:30
LocalBasisTraits::RangeType Range
Definition: localtoglobaladaptors.hh:37
static const std::size_t dimDomainGlobal
Definition: localtoglobaladaptors.hh:31
static const std::size_t dimRange
Definition: localtoglobaladaptors.hh:36
FieldVector< DomainField, dimDomainGlobal > DomainGlobal
Definition: localtoglobaladaptors.hh:33
LocalBasisTraits::DomainType DomainLocal
Definition: localtoglobaladaptors.hh:32
Convert a simple scalar local basis into a global basis.
Definition: localtoglobaladaptors.hh:63
void evaluateJacobian(const typename Traits::DomainLocal &in, std::vector< typename Traits::Jacobian > &out) const
Definition: localtoglobaladaptors.hh:123
std::size_t order() const
return maximum polynomial order of the base function
Definition: localtoglobaladaptors.hh:108
LocalToGlobalBasisAdaptorTraits< typename LocalBasis::Traits, Geometry::coorddimension > Traits
Definition: localtoglobaladaptors.hh:82
ScalarLocalToGlobalBasisAdaptor(const LocalBasis &localBasis_, const Geometry &geometry_)
construct a ScalarLocalToGlobalBasisAdaptor
Definition: localtoglobaladaptors.hh:94
void evaluateFunction(const typename Traits::DomainLocal &in, std::vector< typename Traits::Range > &out) const
Definition: localtoglobaladaptors.hh:117
std::size_t size() const
Definition: localtoglobaladaptors.hh:99
Convert a local interpolation into a global interpolation.
Definition: localtoglobaladaptors.hh:147
LocalToGlobalInterpolationAdaptor(const LocalInterpolation &localInterpolation_)
construct a LocalToGlobalInterpolationAdaptor
Definition: localtoglobaladaptors.hh:163
void interpolate(const Function &function, std::vector< Coeff > &out) const
Definition: localtoglobaladaptors.hh:168
Traits_ Traits
Definition: localtoglobaladaptors.hh:151
Convert a simple scalar local finite element into a global finite element.
Definition: localtoglobaladaptors.hh:185
GeometryType type() const
Definition: localtoglobaladaptors.hh:227
const Traits::Coefficients & coefficients() const
Definition: localtoglobaladaptors.hh:225
const Traits::Interpolation & interpolation() const
Definition: localtoglobaladaptors.hh:223
const Traits::Basis & basis() const
Definition: localtoglobaladaptors.hh:222
ScalarLocalToGlobalFiniteElementAdaptor(const LocalFiniteElement &localFE_, const Geometry &geometry)
construct a ScalarLocalToGlobalFiniteElementAdaptor
Definition: localtoglobaladaptors.hh:216
Definition: localtoglobaladaptors.hh:189
LocalToGlobalInterpolationAdaptor< typename LocalFiniteElement::Traits::LocalInterpolationType, typename Basis::Traits > Interpolation
Definition: localtoglobaladaptors.hh:194
LocalFiniteElement::Traits::LocalCoefficientsType Coefficients
Definition: localtoglobaladaptors.hh:196
ScalarLocalToGlobalBasisAdaptor< typename LocalFiniteElement::Traits::LocalBasisType, Geometry > Basis
Definition: localtoglobaladaptors.hh:191
Factory for ScalarLocalToGlobalFiniteElementAdaptor objects.
Definition: localtoglobaladaptors.hh:242
const FiniteElement make(const Geometry &geometry)
construct ScalarLocalToGlobalFiniteElementAdaptor
Definition: localtoglobaladaptors.hh:272
ScalarLocalToGlobalFiniteElementAdaptor< LocalFiniteElement, Geometry > FiniteElement
Definition: localtoglobaladaptors.hh:247
ScalarLocalToGlobalFiniteElementAdaptorFactory(const LocalFiniteElement &localFE_)
construct a ScalarLocalToGlobalFiniteElementAdaptorFactory
Definition: localtoglobaladaptors.hh:259