7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
10#include <dune/common/exceptions.hh>
12#include <dune/grid/common/capabilities.hh>
14#include <dune/localfunctions/common/localfiniteelementvariant.hh>
15#include <dune/localfunctions/rannacherturek.hh>
16#include <dune/localfunctions/crouzeixraviart.hh>
38class RannacherTurekNode;
41class RannacherTurekPreBasis;
59 static const int dim = GV::dimension;
76 for(
auto type : gv.indexSet().types(0))
77 if (!type.isSimplex() && !type.isCube())
78 DUNE_THROW(Dune::NotImplemented,
"Rannacher-Turek or Crouzeix-Raviart elements are only implemented for grids with simplex or cube elements.");
114 return 2*GV::dimension;
117 template<
typename It>
120 for (
size_type i = 0, end = node.
size() ; i < end ; ++i, ++it)
122 Dune::LocalKey localKey = node.
finiteElement().localCoefficients().localKey(i);
123 const auto& gridIndexSet =
gridView().indexSet();
124 const auto& element = node.
element();
126 *it = {{ (
size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),1)) }};
141 static const int dim = GV::dimension;
142 static const int maxSize = 2*dim;
144 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
146 using CubeFiniteElement = RannacherTurekLocalFiniteElement<typename GV::ctype,double,dim>;
147 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement<typename GV::ctype,double,dim>;
149 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId;
150 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
155 using Element =
typename GV::template Codim<0>::Entity;
157 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
158 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
184 if constexpr (!hasFixedElementType)
198namespace BasisFactory {
205template<
class Dummy=
void>
208 return [](
const auto& gridView) {
auto rannacherTurek()
Create a pre-basis factory that can create a Rannacher-Turek pre-basis.
Definition rannacherturekbasis.hh:206
Definition polynomial.hh:17
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
size_type size() const
Definition nodes.hh:147
void setSize(const size_type size)
Definition nodes.hh:169
Definition rannacherturekbasis.hh:140
std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< CubeFiniteElement, SimplexFiniteElement > > FiniteElement
Definition rannacherturekbasis.hh:158
void bind(const Element &e)
Bind to element.
Definition rannacherturekbasis.hh:181
FiniteElement finiteElement_
Definition rannacherturekbasis.hh:192
std::size_t size_type
Definition rannacherturekbasis.hh:154
typename GV::template Codim< 0 >::Entity Element
Definition rannacherturekbasis.hh:155
RannacherTurekNode()
Definition rannacherturekbasis.hh:160
const Element * element_
Definition rannacherturekbasis.hh:193
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition rannacherturekbasis.hh:175
const Element & element() const
Return current element, throw if unbound.
Definition rannacherturekbasis.hh:166
Pre-basis for a Rannacher-Turek basis.
Definition rannacherturekbasis.hh:58
void initializeIndices()
Initialize the global indices.
Definition rannacherturekbasis.hh:82
std::size_t size_type
Type used for indices and size information.
Definition rannacherturekbasis.hh:67
Node makeNode() const
Create tree node.
Definition rannacherturekbasis.hh:100
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition rannacherturekbasis.hh:92
It indices(const Node &node, It it) const
Definition rannacherturekbasis.hh:118
GV GridView
The grid view that the FE basis is defined on.
Definition rannacherturekbasis.hh:64
size_type dimension() const
Same as size(prefix) with empty prefix.
Definition rannacherturekbasis.hh:106
RannacherTurekPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition rannacherturekbasis.hh:73
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition rannacherturekbasis.hh:86
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition rannacherturekbasis.hh:112
GridView gridView_
Definition rannacherturekbasis.hh:132