Dune Core Modules (2.9.0)

subspacebasis.hh
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
5
9
10#include <dune/functions/common/type_traits.hh>
11#include <dune/functions/functionspacebases/subspacelocalview.hh>
12#include <dune/functions/functionspacebases/concepts.hh>
13
14
15
16namespace Dune {
17namespace Functions {
18
19
20
21namespace Impl {
22
23 template<class... Inner, class... Outer>
24 auto joinTreePaths(const TypeTree::HybridTreePath<Inner...>& inner, const TypeTree::HybridTreePath<Outer...> outer)
25 {
26 return TypeTree::HybridTreePath<Inner..., Outer...>(std::tuple_cat(inner._data, outer._data));
27 }
28
29 template<class InnerTP, class OuterTP>
30 using JoinTreePath_t = std::decay_t<decltype(joinTreePaths(std::declval<InnerTP>(), std::declval<OuterTP>()))>;
31
32}
33
34
35
36template<class RB, class TP>
37class SubspaceBasis
38{
39public:
40
41 using RootBasis = RB;
42
43 using RootLocalView = typename RootBasis::LocalView;
44
45 using PrefixPath = TP;
46
48 using GridView = typename RootBasis::GridView;
49
51 using MultiIndex = typename RootBasis::MultiIndex;
52
53 using size_type = std::size_t;
54
56 using LocalView = SubspaceLocalView<RootLocalView, PrefixPath>;
57
58 using SizePrefix = typename RootBasis::SizePrefix;
59
60
62 SubspaceBasis(const RootBasis& rootBasis, const PrefixPath& prefixPath) :
63 rootBasis_(&rootBasis),
64 prefixPath_(prefixPath)
65 {}
66
72 template<class RootRootBasis, class InnerTP, class OuterTP>
73 SubspaceBasis(const SubspaceBasis<RootRootBasis, InnerTP>& rootBasis, const OuterTP& prefixPath) :
74 SubspaceBasis(rootBasis.rootBasis(), Impl::joinTreePaths(rootBasis.prefixPath(), prefixPath))
75 {}
76
77
80 const GridView& gridView() const
81 {
82 return rootBasis_->gridView();
83 }
84
88 size_type dimension() const
89 {
90 return rootBasis_->dimension();
91 }
92
94 size_type size() const
95 {
96 return rootBasis_->size();
97 }
98
100 size_type size(const SizePrefix& prefix) const
101 {
102 return rootBasis_->size(prefix);
103 }
104
108 LocalView localView() const
109 {
110 return LocalView(*this, prefixPath_);
111 }
112
113 const RootBasis& rootBasis() const
114 {
115 return *rootBasis_;
116 }
117
118 const PrefixPath& prefixPath() const
119 {
120 return prefixPath_;
121 }
122
123protected:
124 const RootBasis* rootBasis_;
125 PrefixPath prefixPath_;
126};
127
128
129// CTAD guide for a non-SubspaceBasis root basis
130template<class RB, class TP>
131SubspaceBasis(const RB&, const TP) -> SubspaceBasis<RB, TP>;
132
133// CTAD guide for a SubspaceBasis root basis
134template<class RootRootBasis, class InnerTP, class OuterTP>
135SubspaceBasis(const SubspaceBasis<RootRootBasis, InnerTP>& rootBasis, const OuterTP& prefixPath)
136 -> SubspaceBasis<std::decay_t<decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t<InnerTP, OuterTP>>;
137
138
139
150template<class RootBasis, class... PrefixTreeIndices>
151auto subspaceBasis(const RootBasis& rootBasis, const TypeTree::HybridTreePath<PrefixTreeIndices...>& prefixPath)
152{
153 return SubspaceBasis(rootBasis, prefixPath);
154}
155
156template<class RootBasis, class... PrefixTreeIndices>
157auto subspaceBasis(const RootBasis& rootBasis, const PrefixTreeIndices&... prefixTreeIndices)
158{
159 return subspaceBasis(rootBasis, TypeTree::hybridTreePath(prefixTreeIndices...));
160}
161
162
163
164} // end namespace Functions
165} // end namespace Dune
166
167
168
169#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
Infrastructure for concepts.
constexpr HybridTreePath< T... > hybridTreePath(const T &... t)
Constructs a new HybridTreePath from the given indices.
Definition: treepath.hh:180
Dune namespace.
Definition: alignedallocator.hh:13
An stl-compliant random-access container which stores everything on the stack.
Utilities for type computations, constraining overloads, ...
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Dec 21, 23:30, 2024)