version 0.4.7
vtkcontainertypes.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2025 The Ikarus Developers ikarus@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
11#pragma once
12#include <array>
13#include <tuple>
14
15#include <dune/functions/functionspacebases/compositebasis.hh>
16#include <dune/functions/functionspacebases/powerbasis.hh>
17#include <dune/functions/functionspacebases/subspacebasis.hh>
18
19namespace Ikarus::Vtk::Impl {
20
21template <typename Container>
22constexpr auto sizeOfContainer = []() {
23 if constexpr (requires { std::tuple_size<Container>::value; })
24 return std::tuple_size<Container>::value;
25 else
26 return 1ul;
27}();
28
29template <class PreBasis>
30struct ResultContainerPre
31{
32 using type = double;
33};
34
35template <class Basis>
36struct ResultContainer
37{
38 using type = ResultContainerPre<typename Basis::PreBasis>::type;
39};
40
41// specialization for composite basis with where the subspace basis are all either power basis or scalar basis
42template <class IMS, class... SPB>
43struct ResultContainerPre<Dune::Functions::CompositePreBasis<IMS, SPB...>>
44{
45 using SubPreBases = std::tuple<SPB...>;
46 using FirstBasis = std::tuple_element_t<0, SubPreBases>;
47
48 static constexpr size_t size = sizeof...(SPB);
49 using type = std::array<typename ResultContainerPre<FirstBasis>::type, size>;
50};
51
52// Subspace basis can either be from a composite or a power basis
53template <class PreBasis, class PP>
54struct ResultContainerSSB
55{
56 using type = double;
57};
58
59template <class PP, class IMS, class... SPB>
60struct ResultContainerSSB<Dune::Functions::CompositePreBasis<IMS, SPB...>, PP>
61{
62 using SubPreBases = std::tuple<SPB...>;
63 using Basis = std::tuple_element_t<PP{}.template get<0>(), SubPreBases>;
64
65 using type = ResultContainerPre<Basis>::type;
66};
67
68// Specialization for subspace basis
69template <class RB, class PP>
70struct ResultContainer<Dune::Functions::SubspaceBasis<RB, PP>>
71{
72 using RBPre = RB::PreBasis;
73
74 using type = ResultContainerSSB<RBPre, PP>::type;
75};
76
77template <class Basis>
78using ResultContainer_t = typename ResultContainer<Basis>::type;
79
80// specialization for power basis
81template <class IMS, class SPB, std::size_t size>
82struct ResultContainerPre<Dune::Functions::PowerPreBasis<IMS, SPB, size>>
83{
84 using type = std::array<typename ResultContainerPre<SPB>::type, size>;
85};
86
87} // namespace Ikarus::Vtk::Impl
Definition: utils/dirichletvalues.hh:35