dune-localfunctions 2.10
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// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5
6#ifndef DUNE_LOCALFUNCTIONS_COMMON_LOCALTOGLOBALADAPTORS_HH
7#define DUNE_LOCALFUNCTIONS_COMMON_LOCALTOGLOBALADAPTORS_HH
8
9#include <cstddef>
10#include <vector>
11
12#include <dune/common/fmatrix.hh>
13#include <dune/common/fvector.hh>
14#include <dune/common/typetraits.hh>
15
16#include <dune/geometry/type.hh>
17
18namespace Dune {
19
21
29 template<class LocalBasisTraits, std::size_t dimDomainGlobal_>
32 static const std::size_t dimDomainLocal = LocalBasisTraits::dimDomain;
33 static const std::size_t dimDomainGlobal = dimDomainGlobal_;
35 typedef FieldVector<DomainField, dimDomainGlobal> DomainGlobal;
36
38 static const std::size_t dimRange = LocalBasisTraits::dimRange;
40
41 typedef FieldMatrix<RangeField, dimRange, dimDomainGlobal> Jacobian;
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((std::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
Definition bdfmcube.hh:18
D DomainType
domain type
Definition common/localbasis.hh:43
RF RangeFieldType
Export type for range field.
Definition common/localbasis.hh:46
static constexpr int dimRange
dimension of the range
Definition common/localbasis.hh:49
DF DomainFieldType
Export type for domain field.
Definition common/localbasis.hh:37
static constexpr int dimDomain
dimension of the domain
Definition common/localbasis.hh:40
R RangeType
range type
Definition common/localbasis.hh:52
Traits class for local-to-global basis adaptors.
Definition localtoglobaladaptors.hh:30
LocalBasisTraits::RangeFieldType RangeField
Definition localtoglobaladaptors.hh:37
LocalBasisTraits::DomainFieldType DomainField
Definition localtoglobaladaptors.hh:31
FieldMatrix< RangeField, dimRange, dimDomainGlobal > Jacobian
Definition localtoglobaladaptors.hh:41
static const std::size_t dimDomainLocal
Definition localtoglobaladaptors.hh:32
LocalBasisTraits::RangeType Range
Definition localtoglobaladaptors.hh:39
static const std::size_t dimDomainGlobal
Definition localtoglobaladaptors.hh:33
static const std::size_t dimRange
Definition localtoglobaladaptors.hh:38
FieldVector< DomainField, dimDomainGlobal > DomainGlobal
Definition localtoglobaladaptors.hh:35
LocalBasisTraits::DomainType DomainLocal
Definition localtoglobaladaptors.hh:34
Convert a simple scalar local basis into a global basis.
Definition localtoglobaladaptors.hh:65
void evaluateJacobian(const typename Traits::DomainLocal &in, std::vector< typename Traits::Jacobian > &out) const
Definition localtoglobaladaptors.hh:125
std::size_t order() const
return maximum polynomial order of the base function
Definition localtoglobaladaptors.hh:110
LocalToGlobalBasisAdaptorTraits< typename LocalBasis::Traits, Geometry::coorddimension > Traits
Definition localtoglobaladaptors.hh:84
ScalarLocalToGlobalBasisAdaptor(const LocalBasis &localBasis_, const Geometry &geometry_)
construct a ScalarLocalToGlobalBasisAdaptor
Definition localtoglobaladaptors.hh:96
void evaluateFunction(const typename Traits::DomainLocal &in, std::vector< typename Traits::Range > &out) const
Definition localtoglobaladaptors.hh:119
std::size_t size() const
Definition localtoglobaladaptors.hh:101
Convert a local interpolation into a global interpolation.
Definition localtoglobaladaptors.hh:149
LocalToGlobalInterpolationAdaptor(const LocalInterpolation &localInterpolation_)
construct a LocalToGlobalInterpolationAdaptor
Definition localtoglobaladaptors.hh:165
void interpolate(const Function &function, std::vector< Coeff > &out) const
Definition localtoglobaladaptors.hh:170
Traits_ Traits
Definition localtoglobaladaptors.hh:153
Convert a simple scalar local finite element into a global finite element.
Definition localtoglobaladaptors.hh:187
GeometryType type() const
Definition localtoglobaladaptors.hh:229
const Traits::Coefficients & coefficients() const
Definition localtoglobaladaptors.hh:227
const Traits::Interpolation & interpolation() const
Definition localtoglobaladaptors.hh:225
const Traits::Basis & basis() const
Definition localtoglobaladaptors.hh:224
ScalarLocalToGlobalFiniteElementAdaptor(const LocalFiniteElement &localFE_, const Geometry &geometry)
construct a ScalarLocalToGlobalFiniteElementAdaptor
Definition localtoglobaladaptors.hh:218
Definition localtoglobaladaptors.hh:191
LocalToGlobalInterpolationAdaptor< typename LocalFiniteElement::Traits::LocalInterpolationType, typename Basis::Traits > Interpolation
Definition localtoglobaladaptors.hh:196
LocalFiniteElement::Traits::LocalCoefficientsType Coefficients
Definition localtoglobaladaptors.hh:198
ScalarLocalToGlobalBasisAdaptor< typename LocalFiniteElement::Traits::LocalBasisType, Geometry > Basis
Definition localtoglobaladaptors.hh:193
Factory for ScalarLocalToGlobalFiniteElementAdaptor objects.
Definition localtoglobaladaptors.hh:244
const FiniteElement make(const Geometry &geometry)
construct ScalarLocalToGlobalFiniteElementAdaptor
Definition localtoglobaladaptors.hh:274
ScalarLocalToGlobalFiniteElementAdaptor< LocalFiniteElement, Geometry > FiniteElement
Definition localtoglobaladaptors.hh:249
ScalarLocalToGlobalFiniteElementAdaptorFactory(const LocalFiniteElement &localFE_)
construct a ScalarLocalToGlobalFiniteElementAdaptorFactory
Definition localtoglobaladaptors.hh:261