dune-functions  2.6-dev
defaultlocalindexset.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 #ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALINDEXSET_HH
4 #define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALINDEXSET_HH
5 
6 #include <dune/common/std/type_traits.hh>
7 #include <dune/common/hybridutilities.hh>
9 
10 
11 namespace Dune {
12 namespace Functions {
13 
14 
15 
16 template<class LV, class NIS>
18 {
19 
20 public:
21  using LocalView = LV;
22  using NodeIndexSet = NIS;
23 
25  using MultiIndex = typename NodeIndexSet::MultiIndex;
26  using size_type = std::size_t;
27 
28 private:
29 
30  template<typename NodeIndexSet>
31  using hasIndices = decltype(std::declval<NodeIndexSet>().indices(std::declval<std::vector<MultiIndex>>().begin()));
32 
33 public:
34 
35  DefaultLocalIndexSet(const NodeIndexSet& nodeIndexSet) :
36  nodeIndexSet_(nodeIndexSet)
37  {}
38 
40  nodeIndexSet_(nodeIndexSet)
41  {}
42 
45  void bind(const LocalView& localView)
46  {
48  nodeIndexSet_.bind(localView_->tree());
49  indices_.resize(size());
50  Hybrid::ifElse(
51  Std::is_detected<hasIndices,NodeIndexSet>{},
52  [&](auto id) {
53  id(nodeIndexSet_).indices(indices_.begin());
54  },
55  [&](auto id) {
56  for (size_type i = 0 ; i < this->size() ; ++i)
57  indices_[i] = id(nodeIndexSet_).index(i);
58  });
59  }
60 
63  template<class TreePath>
64  void bind(const SubspaceLocalView<LocalView, TreePath>& subspaceLocalView)
65  {
66  bind(subspaceLocalView.rootLocalView());
67  }
68 
71  void unbind()
72  {
73  localView_ = nullptr;
74  nodeIndexSet_.unbind();
75  }
76 
79  size_type size() const
80  {
81  return nodeIndexSet_.size();
82  }
83 
86  {
87  return indices_[i];
88  }
89 
92  const LocalView& localView() const
93  {
94  return *localView_;
95  }
96 
97 protected:
98 
100 
102  std::vector<MultiIndex> indices_;
103 };
104 
105 
106 
107 } // end namespace Functions
108 } // end namespace Dune
109 
110 
111 
112 #endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALINDEXSET_HH
size_type size() const
Size of subtree rooted in this node (element-local)
Definition: defaultlocalindexset.hh:79
NIS NodeIndexSet
Definition: defaultlocalindexset.hh:22
const LocalView * localView_
Definition: defaultlocalindexset.hh:99
NodeIndexSet nodeIndexSet_
Definition: defaultlocalindexset.hh:101
void bind(const LocalView &localView)
Bind the index set to a LocalView.
Definition: defaultlocalindexset.hh:45
const LocalView & localView() const
Return the local view that we are attached to.
Definition: defaultlocalindexset.hh:92
std::vector< MultiIndex > indices_
Definition: defaultlocalindexset.hh:102
DefaultLocalIndexSet(NodeIndexSet &&nodeIndexSet)
Definition: defaultlocalindexset.hh:39
void bind(const SubspaceLocalView< LocalView, TreePath > &subspaceLocalView)
Bind the index set to a SubspaceLocalView.
Definition: defaultlocalindexset.hh:64
typename NodeIndexSet::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition: defaultlocalindexset.hh:25
void unbind()
Unbind the view.
Definition: defaultlocalindexset.hh:71
LV LocalView
Definition: defaultlocalindexset.hh:21
The restriction of a finite element basis to a single element.
Definition: subspacelocalview.hh:29
Definition: defaultlocalindexset.hh:17
Definition: polynomial.hh:7
MultiIndex index(size_type i) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis...
Definition: defaultlocalindexset.hh:85
const RootLocalView & rootLocalView() const
Definition: subspacelocalview.hh:125
DefaultLocalIndexSet(const NodeIndexSet &nodeIndexSet)
Definition: defaultlocalindexset.hh:35
std::size_t size_type
Definition: defaultlocalindexset.hh:26