7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
11#include <dune/common/exceptions.hh>
13#include <dune/localfunctions/lagrange/cache.hh>
19#include <dune/grid/common/capabilities.hh>
35template<
typename GV,
int k,
typename R=
double>
38template<
typename GV,
int k,
typename R=
double>
62template<
typename GV,
int k,
typename R>
66 static const int dim = GV::dimension;
67 static const bool useDynamicOrder = (k<0);
89 if (!useDynamicOrder &&
order!=std::numeric_limits<unsigned int>::max())
90 DUNE_THROW(RangeError,
"Template argument k has to be -1 when supplying a run-time order!");
92 for (
int i=0; i<=dim; i++)
172 DUNE_THROW(Dune::NotImplemented,
"No size method for " << dim <<
"d grids available yet!");
180 return power(
order()+1, (
unsigned int)GV::dimension);
183 template<
typename It>
188 Dune::LocalKey localKey = node.
finiteElement().localCoefficients().localKey(i);
189 const auto& gridIndexSet =
gridView().indexSet();
190 const auto& element = node.
element();
193 auto dofDim = dim - localKey.codim();
200 if (k==1 || dofDim==0) {
201 *it = {{ (
size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),dim)) }};
211 + localKey.index() }};
216 const auto refElement
217 = Dune::referenceElement<double,dim>(element.type());
221 auto v0 = (
size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),0,dim),dim);
222 auto v1 = (
size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),1,dim),dim);
223 bool flip = (v0 > v1);
226 +
dofsPerCube(1)*((
size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
229 +
dofsPerCube(1)*((
size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
230 + localKey.index() }};
239 if (element.type().isTriangle())
244 else if (element.type().isQuadrilateral())
250 DUNE_THROW(Dune::NotImplemented,
"2d elements have to be triangles or quadrilaterals");
253 const auto refElement
254 = Dune::referenceElement<double,dim>(element.type());
257 DUNE_THROW(Dune::NotImplemented,
"LagrangeBasis for 3D grids is only implemented if k<=3");
259 if (
order()==3 and !refElement.type(localKey.subEntity(), localKey.codim()).isTriangle())
260 DUNE_THROW(Dune::NotImplemented,
"LagrangeBasis for 3D grids with k==3 is only implemented if the grid is a simplex grid");
271 if (element.type().isTetrahedron())
276 else if (element.type().isHexahedron())
281 else if (element.type().isPrism())
286 else if (element.type().isPyramid())
292 DUNE_THROW(Dune::NotImplemented,
"3d elements have to be tetrahedra, hexahedra, prisms, or pyramids");
294 DUNE_THROW(Dune::NotImplemented,
"Grids of dimension larger than 3 are no supported");
296 DUNE_THROW(Dune::NotImplemented,
"Grid contains elements not supported for the LagrangeBasis");
304 return (useDynamicOrder) ?
order_ : k;
338 return order() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std::size_t(
order()-1),simplexDim);
344 return order() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(
order()-1, cubeDim);
376template<
typename GV,
int k,
typename R>
380 static constexpr int dim = GV::dimension;
381 static constexpr bool useDynamicOrder = (k<0);
384 static constexpr GeometryType::Id geometryTypeId()
386 if constexpr(Dune::Capabilities::hasSingleGeometryType<typename GV::Grid>::v)
387 return GeometryType(Dune::Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId, GV::dimension);
389 return GeometryType::Id(~0u);
393 using FiniteElementCache = std::conditional_t<(useDynamicOrder),
394 DynamicLagrangeLocalFiniteElementCache<typename GV::ctype,R,dim>,
395 StaticLagrangeLocalFiniteElementCache<geometryTypeId(),
typename GV::ctype,R,dim,std::max(k,0)>
399 static auto makeFiniteElementCache(
unsigned int order)
401 if constexpr (useDynamicOrder)
402 return FiniteElementCache{
order};
404 return FiniteElementCache{};
410 using Element =
typename GV::template Codim<0>::Entity;
476template<std::
size_t k,
typename R=
double>
479 return [](
const auto& gridView) {
491template<
typename R=
double>
494 return [=](
const auto& gridView) {
495 return LagrangePreBasis<std::decay_t<
decltype(gridView)>, -1, R>(gridView, order);
531template<
typename GV,
int k=-1,
typename R=
double>
auto lagrange()
Create a pre-basis factory that can create a Lagrange pre-basis.
Definition lagrangebasis.hh:477
DefaultGlobalBasis< LagrangePreBasis< GV, k, R > > LagrangeBasis
Nodal basis of a scalar k-th-order Lagrangean finite element space.
Definition lagrangebasis.hh:532
Definition monomialset.hh:19
Definition monomialset.hh:19
Definition argyrisbasis.hh:926
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:53
Definition lagrangebasis.hh:379
LagrangeNode(unsigned int order)
Constructor with a run-time order.
Definition lagrangebasis.hh:419
unsigned int order() const
Definition lagrangebasis.hh:451
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition lagrangebasis.hh:436
const Element * element_
Definition lagrangebasis.hh:461
const Element & element() const
Return current element, throw if unbound.
Definition lagrangebasis.hh:427
FiniteElementCache cache_
Definition lagrangebasis.hh:459
typename FiniteElementCache::FiniteElementType FiniteElement
Definition lagrangebasis.hh:411
void bind(const Element &e)
Bind to element.
Definition lagrangebasis.hh:442
typename GV::template Codim< 0 >::Entity Element
Definition lagrangebasis.hh:410
const FiniteElement * finiteElement_
Definition lagrangebasis.hh:460
unsigned int order_
Definition lagrangebasis.hh:457
std::size_t size_type
Definition lagrangebasis.hh:409
LagrangeNode()
Constructor without order (uses the compile-time value).
Definition lagrangebasis.hh:414
A pre-basis for a PQ-lagrange bases with given order.
Definition lagrangebasis.hh:65
size_type dofsPerPrism() const
Definition lagrangebasis.hh:325
size_type computeDofsPerCube(std::size_t cubeDim) const
Number of degrees of freedom assigned to a cube (without the ones assigned to its faces!...
Definition lagrangebasis.hh:342
size_type computeDofsPerSimplex(std::size_t simplexDim) const
Number of degrees of freedom assigned to a simplex (without the ones assigned to its faces!...
Definition lagrangebasis.hh:336
size_type computeDofsPerPrism() const
Definition lagrangebasis.hh:347
unsigned int order_
Definition lagrangebasis.hh:311
size_type edgeOffset_
Definition lagrangebasis.hh:364
LagrangeNode< GV, k, R > Node
Template mapping root tree path to type of created tree node.
Definition lagrangebasis.hh:78
std::array< size_type, dim+1 > dofsPerSimplex_
Definition lagrangebasis.hh:358
It indices(const Node &node, It it) const
Definition lagrangebasis.hh:184
size_type vertexOffset_
Definition lagrangebasis.hh:363
size_type dofsPerSimplex(std::size_t simplexDim) const
Number of degrees of freedom assigned to a simplex (without the ones assigned to its faces!...
Definition lagrangebasis.hh:314
std::size_t size_type
Type used for indices and size information.
Definition lagrangebasis.hh:75
size_type pyramidOffset_
Definition lagrangebasis.hh:368
size_type prismOffset_
Definition lagrangebasis.hh:369
size_type tetrahedronOffset_
Definition lagrangebasis.hh:367
void initializeIndices()
Initialize the global indices.
Definition lagrangebasis.hh:102
size_type computeDofsPerPyramid() const
Definition lagrangebasis.hh:352
LagrangePreBasis(const GridView &gv, unsigned int order)
Constructor for a given grid view object and run-time order.
Definition lagrangebasis.hh:86
size_type dofsPerPyramid_
Definition lagrangebasis.hh:361
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition lagrangebasis.hh:146
LagrangePreBasis(const GridView &gv)
Constructor for a given grid view object with compile-time order.
Definition lagrangebasis.hh:81
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition lagrangebasis.hh:132
GV GridView
The grid view that the FE basis is defined on.
Definition lagrangebasis.hh:72
size_type quadrilateralOffset_
Definition lagrangebasis.hh:366
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition lagrangebasis.hh:126
GridView gridView_
Definition lagrangebasis.hh:308
Node makeNode() const
Create tree node.
Definition lagrangebasis.hh:140
unsigned int order() const
Definition lagrangebasis.hh:302
std::array< size_type, dim+1 > dofsPerCube_
Definition lagrangebasis.hh:359
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition lagrangebasis.hh:176
size_type dofsPerPrism_
Definition lagrangebasis.hh:360
size_type dofsPerCube(std::size_t cubeDim) const
Number of degrees of freedom assigned to a cube (without the ones assigned to its faces!...
Definition lagrangebasis.hh:320
size_type triangleOffset_
Definition lagrangebasis.hh:365
size_type hexahedronOffset_
Definition lagrangebasis.hh:370
size_type dofsPerPyramid() const
Definition lagrangebasis.hh:330
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
void setSize(const size_type size)
Definition nodes.hh:197