dune-localfunctions 2.12-git
Loading...
Searching...
No Matches
localfiniteelementvariant.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#ifndef DUNE_LOCALFUNCTIONS_COMMON_LOCALFINITEELEMENTVARIANT_HH
6#define DUNE_LOCALFUNCTIONS_COMMON_LOCALFINITEELEMENTVARIANT_HH
7
8#include <cstddef>
9#include <type_traits>
10#include <variant>
11
16
17#include <dune/geometry/type.hh>
18
22
23
24namespace Dune {
25
26namespace Impl {
27
28 // Helper for visiting a variant containing monostate.
29 // Since a generic lambda will in most cases not compile
30 // for monostate, we add special empty overloads for monostate.
31 // Hence visitIf will simply do nothing in the case of a
32 // monostate value.
33 template<class Visitor, class Variant>
34 void visitIf(Visitor&& visitor, Variant&& variant)
35 {
36 auto visitorWithFallback = overload([&](std::monostate&) {}, [&](const std::monostate&) {}, visitor);
37 std::visit(visitorWithFallback, variant);
38 }
39
40 template<class... Implementations>
41 class LocalBasisVariant
42 {
43
44 template<class I0, class... II>
45 struct FirstType
46 { using type = I0; };
47
48 using FirstImpTraits = typename FirstType<Implementations...>::type::Traits;
49
50 public:
51
52 // We do not simply copy Implementation::LocalBasisTraits because this
53 // may be implementation specific. To stay clean, we simply put all its
54 // data into the default LocalBasisTraits.
55 using Traits = typename Dune::LocalBasisTraits<
56 typename FirstImpTraits::DomainFieldType,
57 FirstImpTraits::dimDomain,
58 typename FirstImpTraits::DomainType,
59 typename FirstImpTraits::RangeFieldType,
60 FirstImpTraits::dimRange,
61 typename FirstImpTraits::RangeType,
62 typename FirstImpTraits::JacobianType>;
63
64 template<class Implementation>
65 LocalBasisVariant(const Implementation& impl) :
66 impl_(&impl),
67 size_(impl.size()),
68 order_(impl.order())
69 {}
70
71 LocalBasisVariant() = default;
72 LocalBasisVariant(const LocalBasisVariant& other) = default;
73 LocalBasisVariant(LocalBasisVariant&& other) = default;
74 LocalBasisVariant& operator=(const LocalBasisVariant& other) = default;
75 LocalBasisVariant& operator=(LocalBasisVariant&& other) = default;
76
80 unsigned int size() const
81 {
82 return size_;
83 }
84
88 unsigned int order() const
89 {
90 return order_;
91 }
92
96 inline void evaluateFunction(
97 const typename Traits::DomainType& x,
99 {
100 Impl::visitIf([&](const auto* impl) { impl->evaluateFunction(x, out); }, impl_);
101 }
102
106 inline void evaluateJacobian(
107 const typename Traits::DomainType& x,
109 {
110 Impl::visitIf([&](const auto* impl) { impl->evaluateJacobian(x, out); }, impl_);
111 }
112
120 void partial(
122 const typename Traits::DomainType& x,
124 {
125 Impl::visitIf([&](const auto* impl) { impl->partial(order, x, out); }, impl_);
126 }
127
128 private:
129 Dune::UniqueTypes_t<std::variant, std::monostate, const Implementations*...> impl_;
130 std::size_t size_;
131 std::size_t order_;
132 };
133
134
135 template<class... Implementations>
136 class LocalCoefficientsVariant
137 {
138 public:
139
140 template<class Implementation>
141 LocalCoefficientsVariant(const Implementation& impl) :
142 impl_(&impl),
143 size_(impl.size())
144 {}
145
146 LocalCoefficientsVariant() = default;
147 LocalCoefficientsVariant(const LocalCoefficientsVariant& other) = default;
148 LocalCoefficientsVariant(LocalCoefficientsVariant&& other) = default;
149 LocalCoefficientsVariant& operator=(const LocalCoefficientsVariant& other) = default;
150 LocalCoefficientsVariant& operator=(LocalCoefficientsVariant&& other) = default;
151
155 unsigned int size() const
156 {
157 return size_;
158 }
159
160 const Dune::LocalKey& localKey (std::size_t i) const
161 {
162 // We can't use visitIf since we have to return something
163 // even for a monostate value. Since the return type is
164 // an l-value reference, we use a default constructed
165 // dummy LocalKey value.
166 static const Dune::LocalKey dummyLocalKey;
167 return std::visit(overload(
168 [&](const std::monostate&) -> decltype(auto) { return (dummyLocalKey);},
169 [&](const auto* impl) -> decltype(auto) { return impl->localKey(i); }), impl_);
170 }
171
172 private:
173 Dune::UniqueTypes_t<std::variant, std::monostate, const Implementations*...> impl_;
174 std::size_t size_;
175 };
176
177
178 template<class... Implementations>
179 class LocalInterpolationVariant
180 {
181 public:
182
183 template<class Implementation>
184 LocalInterpolationVariant(const Implementation& impl) :
185 impl_(&impl)
186 {}
187
188 LocalInterpolationVariant() = default;
189 LocalInterpolationVariant(const LocalInterpolationVariant& other) = default;
190 LocalInterpolationVariant(LocalInterpolationVariant&& other) = default;
191 LocalInterpolationVariant& operator=(const LocalInterpolationVariant& other) = default;
192 LocalInterpolationVariant& operator=(LocalInterpolationVariant&& other) = default;
193
194 template<typename F, typename C>
195 void interpolate (const F& ff, std::vector<C>& out) const
196 {
197 Impl::visitIf([&](const auto* impl) { impl->interpolate(ff, out); }, impl_);
198 }
199
200 private:
201 Dune::UniqueTypes_t<std::variant, std::monostate, const Implementations*...> impl_;
202 };
203
204} // namespace Impl
205
206
236 template<class... Implementations>
238 {
239
240 // In each LocalFooVariant we store a std::variant<std::monostate, const FooImpl*...>, i.e. a std::variant
241 // with the pointer to the Foo implementation unless LocalFiniteElementVariant stores a monostate. In this
242 // case each LocalFooVariant also stores a monostate (and not a monostate*).
243 using LocalBasis = Impl::LocalBasisVariant<typename Implementations::Traits::LocalBasisType...>;
244 using LocalCoefficients = Impl::LocalCoefficientsVariant<typename Implementations::Traits::LocalCoefficientsType...>;
245 using LocalInterpolation = Impl::LocalInterpolationVariant<typename Implementations::Traits::LocalInterpolationType...>;
246
247 // Update members after changing impl_
248 void updateMembers()
249 {
251 [&](std::monostate&) {
252 localBasis_ = LocalBasis();
253 localCoefficients_ = LocalCoefficients();
254 localInterpolation_ = LocalInterpolation();
255 size_ = 0;
256 geometryType_ = GeometryType{};
257 }, [&](auto&& impl) {
258 localBasis_ = LocalBasis(impl.localBasis());
259 localCoefficients_ = LocalCoefficients(impl.localCoefficients());
260 localInterpolation_ = LocalInterpolation(impl.localInterpolation());
261 size_ = impl.size();
262 geometryType_ = impl.type();
263 }), impl_);
264 }
265
266 public:
267
272
277
283
290 template<class Implementation,
292 LocalFiniteElementVariant(Implementation&& impl) :
293 impl_(std::forward<Implementation>(impl))
294 {
295 updateMembers();
296 }
297
302 impl_(other.impl_)
303 {
304 updateMembers();
305 }
306
311 impl_(std::move(other.impl_))
312 {
313 updateMembers();
314 }
315
320 {
321 impl_ = other.impl_;
322 updateMembers();
323 return *this;
324 }
325
330 {
331 impl_ = std::move(other.impl_);
332 updateMembers();
333 return *this;
334 }
335
339 template<class Implementation,
341 LocalFiniteElementVariant& operator=(Implementation&& impl)
342 {
343 impl_ = std::forward<Implementation>(impl);
344 updateMembers();
345 return *this;
346 }
347
348
352 const typename Traits::LocalBasisType& localBasis() const
353 {
354 return localBasis_;
355 }
356
360 const typename Traits::LocalCoefficientsType& localCoefficients() const
361 {
362 return localCoefficients_;
363 }
364
368 const typename Traits::LocalInterpolationType& localInterpolation() const
369 {
370 return localInterpolation_;
371 }
372
376 unsigned int size() const
377 {
378 return size_;
379 }
380
384 constexpr GeometryType type() const
385 {
386 return geometryType_;
387 }
388
400 const auto& variant() const
401 {
402 return impl_;
403 }
404
410 operator bool () const
411 {
413 }
414
415 private:
416 Dune::UniqueTypes_t<std::variant, std::monostate, Implementations...> impl_;
417 std::size_t size_;
418 GeometryType geometryType_;
419 LocalBasis localBasis_;
420 LocalCoefficients localCoefficients_;
421 LocalInterpolation localInterpolation_;
422 };
423
424} // end namespace Dune
425
426#endif // DUNE_LOCALFUNCTIONS_COMMON_LOCALFINITEELEMENTVARIANT_HH
SLList< T, A > & operator=(const SLList< T, A > &other)
auto overload(F &&... f)
typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type UniqueTypes_t
STL namespace.
Type traits for LocalBasisVirtualInterface.
Definition common/localbasis.hh:35
traits helper struct
Definition localfiniteelementtraits.hh:13
Type erasure class for wrapping LocalFiniteElement classes.
Definition localfiniteelementvariant.hh:238
typename Dune::LocalFiniteElementTraits< LocalBasis, LocalCoefficients, LocalInterpolation > Traits
Export LocalFiniteElementTraits.
Definition localfiniteelementvariant.hh:271
const auto & variant() const
Provide access to underlying std::variant.
Definition localfiniteelementvariant.hh:400
unsigned int size() const
Number of shape functions.
Definition localfiniteelementvariant.hh:376
constexpr GeometryType type() const
Number of shape functions.
Definition localfiniteelementvariant.hh:384
LocalFiniteElementVariant(LocalFiniteElementVariant &&other)
Move constructor.
Definition localfiniteelementvariant.hh:310
LocalFiniteElementVariant & operator=(Implementation &&impl)
Assignment from implementation.
Definition localfiniteelementvariant.hh:341
const Traits::LocalBasisType & localBasis() const
Provide access to LocalBasis implementation of this LocalFiniteElement.
Definition localfiniteelementvariant.hh:352
LocalFiniteElementVariant & operator=(const LocalFiniteElementVariant &other)
Copy assignment.
Definition localfiniteelementvariant.hh:319
LocalFiniteElementVariant(const std::monostate &monostate)
Construct empty LocalFiniteElementVariant.
Definition localfiniteelementvariant.hh:281
LocalFiniteElementVariant(const LocalFiniteElementVariant &other)
Copy constructor.
Definition localfiniteelementvariant.hh:301
const Traits::LocalCoefficientsType & localCoefficients() const
Provide access to LocalCoefficients implementation of this LocalFiniteElement.
Definition localfiniteelementvariant.hh:360
LocalFiniteElementVariant(Implementation &&impl)
Construct LocalFiniteElementVariant.
Definition localfiniteelementvariant.hh:292
LocalFiniteElementVariant & operator=(LocalFiniteElementVariant &&other)
Move assignment.
Definition localfiniteelementvariant.hh:329
const Traits::LocalInterpolationType & localInterpolation() const
Provide access to LocalInterpolation implementation of this LocalFiniteElement.
Definition localfiniteelementvariant.hh:368
LocalFiniteElementVariant()=default
Construct empty LocalFiniteElementVariant.
Describe position of one degree of freedom.
Definition localkey.hh:24
T make_shared(T... args)
T visit(T... args)