3#ifndef DUNE_LOCALFUNCTIONS_COMMON_LOCALFINITEELEMENTVARIANT_HH
4#define DUNE_LOCALFUNCTIONS_COMMON_LOCALFINITEELEMENTVARIANT_HH
10#include <dune/common/std/type_traits.hh>
11#include <dune/common/std/variant.hh>
12#include <dune/common/overloadset.hh>
16#include <dune/localfunctions/common/localfiniteelementtraits.hh>
17#include <dune/localfunctions/common/localbasis.hh>
18#include <dune/localfunctions/common/localkey.hh>
30 template<
class Visitor,
class Variant>
31 void visitIf(Visitor&& visitor, Variant&& variant)
33 auto visitorWithFallback =
overload([&](Std::monostate& impl) {}, [&](
const Std::monostate& impl) {}, visitor);
34 Std::visit(visitorWithFallback, variant);
37 template<
class... Implementations>
38 class LocalBasisVariant
41 template<
class I0,
class... II>
45 using FirstImpTraits =
typename FirstType<Implementations...>::type::Traits;
53 typename FirstImpTraits::DomainFieldType,
54 FirstImpTraits::dimDomain,
55 typename FirstImpTraits::DomainType,
56 typename FirstImpTraits::RangeFieldType,
57 FirstImpTraits::dimRange,
58 typename FirstImpTraits::RangeType,
59 typename FirstImpTraits::JacobianType>;
61 template<
class Implementation>
62 LocalBasisVariant(
const Implementation& impl) :
68 LocalBasisVariant() =
default;
69 LocalBasisVariant(
const LocalBasisVariant& other) =
default;
70 LocalBasisVariant(LocalBasisVariant&& other) =
default;
71 LocalBasisVariant& operator=(
const LocalBasisVariant& other) =
default;
72 LocalBasisVariant& operator=(LocalBasisVariant&& other) =
default;
77 unsigned int size()
const
85 unsigned int order()
const
93 inline void evaluateFunction(
94 const typename Traits::DomainType& x,
95 std::vector<typename Traits::RangeType>& out)
const
97 Impl::visitIf([&](
const auto* impl) { impl->evaluateFunction(x, out); }, impl_);
103 inline void evaluateJacobian(
104 const typename Traits::DomainType& x,
105 std::vector<typename Traits::JacobianType>& out)
const
107 Impl::visitIf([&](
const auto* impl) { impl->evaluateJacobian(x, out); }, impl_);
118 const std::array<unsigned int,Traits::dimDomain>& order,
119 const typename Traits::DomainType& x,
120 std::vector<typename Traits::RangeType>& out)
const
122 Impl::visitIf([&](
const auto* impl) { impl->partial(order, x, out); }, impl_);
126 Std::variant<Std::monostate,
const Implementations*...> impl_;
132 template<
class... Implementations>
133 class LocalCoefficientsVariant
137 template<
class Implementation>
138 LocalCoefficientsVariant(
const Implementation& impl) :
143 LocalCoefficientsVariant() =
default;
144 LocalCoefficientsVariant(
const LocalCoefficientsVariant& other) =
default;
145 LocalCoefficientsVariant(LocalCoefficientsVariant&& other) =
default;
146 LocalCoefficientsVariant& operator=(
const LocalCoefficientsVariant& other) =
default;
147 LocalCoefficientsVariant& operator=(LocalCoefficientsVariant&& other) =
default;
152 unsigned int size()
const
165 [&](
const Std::monostate& impl) ->
decltype(
auto) {
return (dummyLocalKey);},
166 [&](
const auto* impl) ->
decltype(
auto) {
return impl->localKey(i); }), impl_);
170 Std::variant<Std::monostate,
const Implementations*...> impl_;
175 template<
class... Implementations>
176 class LocalInterpolationVariant
180 template<
class Implementation>
181 LocalInterpolationVariant(
const Implementation& impl) :
185 LocalInterpolationVariant() =
default;
186 LocalInterpolationVariant(
const LocalInterpolationVariant& other) =
default;
187 LocalInterpolationVariant(LocalInterpolationVariant&& other) =
default;
188 LocalInterpolationVariant& operator=(
const LocalInterpolationVariant& other) =
default;
189 LocalInterpolationVariant& operator=(LocalInterpolationVariant&& other) =
default;
191 template<
typename F,
typename C>
192 void interpolate (
const F& ff, std::vector<C>& out)
const
194 Impl::visitIf([&](
const auto* impl) { impl->interpolate(ff, out); }, impl_);
198 Std::variant<Std::monostate,
const Implementations*...> impl_;
234 template<
class... Implementations>
241 using LocalBasis = Impl::LocalBasisVariant<
typename Implementations::Traits::LocalBasisType...>;
242 using LocalCoefficients = Impl::LocalCoefficientsVariant<
typename Implementations::Traits::LocalCoefficientsType...>;
243 using LocalInterpolation = Impl::LocalInterpolationVariant<
typename Implementations::Traits::LocalInterpolationType...>;
250 localBasis_ = LocalBasis();
251 localCoefficients_ = LocalCoefficients();
252 localInterpolation_ = LocalInterpolation();
255 }, [&](
auto&& impl) {
256 localBasis_ = LocalBasis(impl.localBasis());
257 localCoefficients_ = LocalCoefficients(impl.localCoefficients());
258 localInterpolation_ = LocalInterpolation(impl.localInterpolation());
260 geometryType_ = impl.type();
288 template<
class Implementation,
289 std::enable_if_t<Std::disjunction<std::is_same<std::decay_t<Implementation>, Implementations>...>::value,
int> = 0>
291 impl_(
std::forward<Implementation>(impl))
309 impl_(
std::move(other.impl_))
329 impl_ = std::move(other.impl_);
337 template<
class Implementation,
338 std::enable_if_t<Std::disjunction<std::is_same<std::decay_t<Implementation>, Implementations>...>::value,
int> = 0>
341 impl_ = std::forward<Implementation>(impl);
360 return localCoefficients_;
368 return localInterpolation_;
384 return geometryType_;
408 operator bool ()
const
410 return not(Std::holds_alternative<Std::monostate>(
variant()));
417 LocalBasis localBasis_;
418 LocalCoefficients localCoefficients_;
419 LocalInterpolation localInterpolation_;
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:280
Type erasure class for wrapping LocalFiniteElement classes.
Definition: localfiniteelementvariant.hh:236
typename Dune::LocalFiniteElementTraits< LocalBasis, LocalCoefficients, LocalInterpolation > Traits
Export LocalFiniteElementTraits.
Definition: localfiniteelementvariant.hh:269
const auto & variant() const
Provide access to underlying Std::variant.
Definition: localfiniteelementvariant.hh:398
unsigned int size() const
Number of shape functions.
Definition: localfiniteelementvariant.hh:374
constexpr GeometryType type() const
Number of shape functions.
Definition: localfiniteelementvariant.hh:382
LocalFiniteElementVariant(LocalFiniteElementVariant &&other)
Move constructor.
Definition: localfiniteelementvariant.hh:308
LocalFiniteElementVariant & operator=(Implementation &&impl)
Assignment from implementation.
Definition: localfiniteelementvariant.hh:339
const Traits::LocalBasisType & localBasis() const
Provide access to LocalBasis implementation of this LocalFiniteElement.
Definition: localfiniteelementvariant.hh:350
LocalFiniteElementVariant & operator=(const LocalFiniteElementVariant &other)
Copy assignment.
Definition: localfiniteelementvariant.hh:317
LocalFiniteElementVariant(const LocalFiniteElementVariant &other)
Copy constructor.
Definition: localfiniteelementvariant.hh:299
const Traits::LocalCoefficientsType & localCoefficients() const
Provide access to LocalCoefficients implementation of this LocalFiniteElement.
Definition: localfiniteelementvariant.hh:358
LocalFiniteElementVariant(const Std::monostate &monostate)
Construct empty LocalFiniteElementVariant.
Definition: localfiniteelementvariant.hh:279
LocalFiniteElementVariant(Implementation &&impl)
Construct LocalFiniteElementVariant.
Definition: localfiniteelementvariant.hh:290
LocalFiniteElementVariant & operator=(LocalFiniteElementVariant &&other)
Move assignment.
Definition: localfiniteelementvariant.hh:327
const Traits::LocalInterpolationType & localInterpolation() const
Provide access to LocalInterpolation implementation of this LocalFiniteElement.
Definition: localfiniteelementvariant.hh:366
LocalFiniteElementVariant()=default
Construct empty LocalFiniteElementVariant.
Describe position of one degree of freedom.
Definition: localkey.hh:21
auto overload(F &&... f)
Create an overload set.
Definition: overloadset.hh:109
void interpolate(const F &f, const GFS &gfs, XG &xg)
interpolation from a given grid function
Definition: interpolate.hh:174
Impl::variant_< T... > variant
Incomplete re-implementation of C++17's std::variant.
Definition: variant.hh:464
Dune namespace.
Definition: alignedallocator.hh:14
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:32
traits helper struct
Definition: localfiniteelementtraits.hh:11
Trial default constructible class.
Definition: variant.hh:547
A unique label for each type of element that can occur in a grid.
Utilities for type computations, constraining overloads, ...