5#ifndef DUNE_LOCALFUNCTIONS_COMMON_LOCALFINITEELEMENTVARIANT_HH
6#define DUNE_LOCALFUNCTIONS_COMMON_LOCALFINITEELEMENTVARIANT_HH
13#include <dune/common/std/type_traits.hh>
14#include <dune/common/overloadset.hh>
18#include <dune/localfunctions/common/localfiniteelementtraits.hh>
19#include <dune/localfunctions/common/localbasis.hh>
20#include <dune/localfunctions/common/localkey.hh>
32 template<
class Visitor,
class Variant>
33 void visitIf(Visitor&& visitor, Variant&& variant)
35 auto visitorWithFallback =
overload([&](std::monostate&) {}, [&](
const std::monostate&) {}, visitor);
36 std::visit(visitorWithFallback, variant);
39 template<
class... Implementations>
40 class LocalBasisVariant
43 template<
class I0,
class... II>
47 using FirstImpTraits =
typename FirstType<Implementations...>::type::Traits;
55 typename FirstImpTraits::DomainFieldType,
56 FirstImpTraits::dimDomain,
57 typename FirstImpTraits::DomainType,
58 typename FirstImpTraits::RangeFieldType,
59 FirstImpTraits::dimRange,
60 typename FirstImpTraits::RangeType,
61 typename FirstImpTraits::JacobianType>;
63 template<
class Implementation>
64 LocalBasisVariant(
const Implementation& impl) :
70 LocalBasisVariant() =
default;
71 LocalBasisVariant(
const LocalBasisVariant& other) =
default;
72 LocalBasisVariant(LocalBasisVariant&& other) =
default;
73 LocalBasisVariant& operator=(
const LocalBasisVariant& other) =
default;
74 LocalBasisVariant& operator=(LocalBasisVariant&& other) =
default;
79 unsigned int size()
const
87 unsigned int order()
const
95 inline void evaluateFunction(
96 const typename Traits::DomainType& x,
97 std::vector<typename Traits::RangeType>& out)
const
99 Impl::visitIf([&](
const auto* impl) { impl->evaluateFunction(x, out); }, impl_);
105 inline void evaluateJacobian(
106 const typename Traits::DomainType& x,
107 std::vector<typename Traits::JacobianType>& out)
const
109 Impl::visitIf([&](
const auto* impl) { impl->evaluateJacobian(x, out); }, impl_);
120 const std::array<unsigned int,Traits::dimDomain>& order,
121 const typename Traits::DomainType& x,
122 std::vector<typename Traits::RangeType>& out)
const
124 Impl::visitIf([&](
const auto* impl) { impl->partial(order, x, out); }, impl_);
128 std::variant<std::monostate,
const Implementations*...> impl_;
134 template<
class... Implementations>
135 class LocalCoefficientsVariant
139 template<
class Implementation>
140 LocalCoefficientsVariant(
const Implementation& impl) :
145 LocalCoefficientsVariant() =
default;
146 LocalCoefficientsVariant(
const LocalCoefficientsVariant& other) =
default;
147 LocalCoefficientsVariant(LocalCoefficientsVariant&& other) =
default;
148 LocalCoefficientsVariant& operator=(
const LocalCoefficientsVariant& other) =
default;
149 LocalCoefficientsVariant& operator=(LocalCoefficientsVariant&& other) =
default;
154 unsigned int size()
const
167 [&](
const std::monostate&) ->
decltype(
auto) {
return (dummyLocalKey);},
168 [&](
const auto* impl) ->
decltype(
auto) {
return impl->localKey(i); }), impl_);
172 std::variant<std::monostate,
const Implementations*...> impl_;
177 template<
class... Implementations>
178 class LocalInterpolationVariant
182 template<
class Implementation>
183 LocalInterpolationVariant(
const Implementation& impl) :
187 LocalInterpolationVariant() =
default;
188 LocalInterpolationVariant(
const LocalInterpolationVariant& other) =
default;
189 LocalInterpolationVariant(LocalInterpolationVariant&& other) =
default;
190 LocalInterpolationVariant& operator=(
const LocalInterpolationVariant& other) =
default;
191 LocalInterpolationVariant& operator=(LocalInterpolationVariant&& other) =
default;
193 template<
typename F,
typename C>
194 void interpolate (
const F& ff, std::vector<C>& out)
const
196 Impl::visitIf([&](
const auto* impl) { impl->interpolate(ff, out); }, impl_);
200 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...>;
249 [&](std::monostate&) {
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()));
414 std::variant<std::monostate, Implementations...> impl_;
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:126
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 std::monostate &monostate)
Construct empty LocalFiniteElementVariant.
Definition: localfiniteelementvariant.hh:279
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(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:23
auto overload(F &&... f)
Create an overload set.
Definition: overloadset.hh:61
Dune namespace.
Definition: alignedallocator.hh:13
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:34
traits helper struct
Definition: localfiniteelementtraits.hh:13
A unique label for each type of element that can occur in a grid.
Utilities for type computations, constraining overloads, ...