dune-functions  2.8.0
rannacherturekbasis.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_RANNACHERTUREKBASIS_HH
4 #define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
5 
6 #include <dune/common/exceptions.hh>
7 
8 #include <dune/grid/common/capabilities.hh>
9 
10 #include <dune/localfunctions/common/localfiniteelementvariant.hh>
11 #include <dune/localfunctions/rannacherturek.hh>
12 #include <dune/localfunctions/crouzeixraviart.hh>
13 
17 
18 
19 namespace Dune {
20 namespace Functions {
21 
22 // *****************************************************************************
23 // This is the reusable part of the basis. It contains
24 //
25 // RannacherTurekPreBasis
26 // RannacherTurekNode
27 //
28 // The pre-basis allows to create the others and is the owner of possible shared
29 // state. These components do _not_ depend on the global basis and local view
30 // and can be used without a global basis.
31 // *****************************************************************************
32 
33 template<typename GV>
34 class RannacherTurekNode;
35 
36 template<typename GV, class MI>
37 class RannacherTurekPreBasis;
38 
52 template<typename GV, class MI>
54 {
55  static const int dim = GV::dimension;
56 
57 public:
58 
60  using GridView = GV;
61 
63  using size_type = std::size_t;
64 
67 
69  using IndexSet = Impl::DefaultNodeIndexSet<RannacherTurekPreBasis>;
70 
72  using MultiIndex = MI;
73 
75  using SizePrefix = Dune::ReservedVector<size_type, 1>;
76 
79  gridView_(gv)
80  {
81  for(auto type : gv.indexSet().types(0))
82  if (!type.isSimplex() && !type.isCube())
83  DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart elements are only implemented for grids with simplex or cube elements.");
84  }
85 
88  {}
89 
91  const GridView& gridView() const
92  {
93  return gridView_;
94  }
95 
97  void update (const GridView& gv)
98  {
99  gridView_ = gv;
100  }
101 
105  Node makeNode() const
106  {
107  return Node{};
108  }
109 
117  [[deprecated("Warning: The IndexSet typedef and the makeIndexSet method are deprecated. "\
118  "As a replacement use the indices() method of the PreBasis directly.")]]
120  {
121  return IndexSet{*this};
122  }
123 
125  size_type size() const
126  {
127  return (size_type)(gridView_.size(1));
128  }
129 
131  size_type size(const SizePrefix prefix) const
132  {
133  assert(prefix.size() == 0 || prefix.size() == 1);
134  return (prefix.size() == 0) ? size() : 0;
135  }
136 
139  {
140  return size();
141  }
142 
145  {
146  return 2*GV::dimension;
147  }
148 
149  template<typename It>
150  It indices(const Node& node, It it) const
151  {
152  for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
153  {
154  Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
155  const auto& gridIndexSet = gridView().indexSet();
156  const auto& element = node.element();
157 
158  *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),1)) }};
159  }
160  return it;
161  }
162 
163 protected:
165 };
166 
167 
168 
169 template<typename GV>
171  public LeafBasisNode
172 {
173  static const int dim = GV::dimension;
174  static const int maxSize = 2*dim;
175 
176  constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
177 
178  using CubeFiniteElement = RannacherTurekLocalFiniteElement<typename GV::ctype,double,dim>;
179  using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement<typename GV::ctype,double,dim>;
180 
181  constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
182  constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
183 
184 public:
185 
186  using size_type = std::size_t;
187  using Element = typename GV::template Codim<0>::Entity;
188  using FiniteElement = std::conditional_t<hasFixedElementType,
189  std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
190  LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
191 
193  finiteElement_(),
194  element_(nullptr)
195  {}
196 
198  const Element& element() const
199  {
200  return *element_;
201  }
202 
208  {
209  return finiteElement_;
210  }
211 
213  void bind(const Element& e)
214  {
215  element_ = &e;
216  if constexpr (!hasFixedElementType)
217  finiteElement_ = e.type().isCube() ? static_cast<FiniteElement>(CubeFiniteElement())
218  : static_cast<FiniteElement>(SimplexFiniteElement()) ;
219  this->setSize(finiteElement_.size());
220  }
221 
222 protected:
223 
226 };
227 
228 
229 
230 namespace BasisFactory {
231 
232 namespace Imp {
233 
234 template<class Dummy=void>
235 class RannacherTurekPreBasisFactory
236 {
237 public:
238  static const std::size_t requiredMultiIndexSize = 1;
239 
240  template<class MultiIndex, class GridView>
241  auto makePreBasis(const GridView& gridView) const
242  {
244  }
245 
246 };
247 
248 } // end namespace BasisFactory::Imp
249 
250 
251 
257 template<class Dummy=void>
259 {
260  return Imp::RannacherTurekPreBasisFactory<void>();
261 }
262 
263 } // end namespace BasisFactory
264 
265 
266 
267 
279 template<typename GV>
281 
282 } // end namespace Functions
283 } // end namespace Dune
284 
285 #endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
auto rannacherTurek()
Create a pre-basis factory that can create a Rannacher-Turek pre-basis.
Definition: rannacherturekbasis.hh:258
Definition: polynomial.hh:10
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:47
size_type size() const
Definition: nodes.hh:140
std::size_t size_type
Definition: nodes.hh:127
void setSize(const size_type size)
Definition: nodes.hh:162
Definition: nodes.hh:184
Definition: rannacherturekbasis.hh:172
std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< CubeFiniteElement, SimplexFiniteElement > > FiniteElement
Definition: rannacherturekbasis.hh:190
void bind(const Element &e)
Bind to element.
Definition: rannacherturekbasis.hh:213
FiniteElement finiteElement_
Definition: rannacherturekbasis.hh:224
const Element & element() const
Return current element, throw if unbound.
Definition: rannacherturekbasis.hh:198
typename GV::template Codim< 0 >::Entity Element
Definition: rannacherturekbasis.hh:187
RannacherTurekNode()
Definition: rannacherturekbasis.hh:192
const Element * element_
Definition: rannacherturekbasis.hh:225
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: rannacherturekbasis.hh:207
Pre-basis for a Rannacher-Turek basis.
Definition: rannacherturekbasis.hh:54
Impl::DefaultNodeIndexSet< RannacherTurekPreBasis > IndexSet
Type of created tree node index set.
Definition: rannacherturekbasis.hh:69
Dune::ReservedVector< size_type, 1 > SizePrefix
Type used for prefixes handed to the size() method.
Definition: rannacherturekbasis.hh:75
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: rannacherturekbasis.hh:144
It indices(const Node &node, It it) const
Definition: rannacherturekbasis.hh:150
IndexSet makeIndexSet() const
Create tree node index set.
Definition: rannacherturekbasis.hh:119
std::size_t size_type
Type used for indices and size information.
Definition: rannacherturekbasis.hh:63
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: rannacherturekbasis.hh:91
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: rannacherturekbasis.hh:138
GV GridView
The grid view that the FE basis is defined on.
Definition: rannacherturekbasis.hh:60
size_type size() const
Same as size(prefix) with empty prefix.
Definition: rannacherturekbasis.hh:125
MI MultiIndex
Type used for global numbering of the basis vectors.
Definition: rannacherturekbasis.hh:72
size_type size(const SizePrefix prefix) const
Return number of possible values for next position in multi index.
Definition: rannacherturekbasis.hh:131
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: rannacherturekbasis.hh:97
Node makeNode() const
Create tree node.
Definition: rannacherturekbasis.hh:105
GridView gridView_
Definition: rannacherturekbasis.hh:164
void initializeIndices()
Initialize the global indices.
Definition: rannacherturekbasis.hh:87
RannacherTurekPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: rannacherturekbasis.hh:78