3 #ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH 4 #define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH 7 #include <dune/common/exceptions.hh> 34 template<
typename GV,
int k,
typename TP>
37 template<
typename GV,
int k,
class MI,
class TP>
41 template<
typename GV,
int k,
class MI>
44 static const int dim = GV::dimension;
90 GeometryType triangle;
91 triangle.makeTriangle();
97 GeometryType tetrahedron;
98 tetrahedron.makeSimplex(3);
105 GeometryType hexahedron;
106 hexahedron.makeCube(3);
145 GeometryType triangle, quad;
146 triangle.makeTriangle();
147 quad.makeQuadrilateral();
152 GeometryType tetrahedron, pyramid, prism, hexahedron;
153 tetrahedron.makeTetrahedron();
154 pyramid.makePyramid();
156 hexahedron.makeCube(3);
157 return dofsPerTetrahedron*
gridView_.size(tetrahedron) + dofsPerPyramid*
gridView_.size(pyramid)
161 DUNE_THROW(Dune::NotImplemented,
"No size method for " << dim <<
"d grids available yet!");
167 if (prefix.size() == 0)
194 template<
typename GV,
int k,
class MI,
class TP>
198 static const int dim = GV::dimension;
212 nodeFactory_(&nodeFactory)
236 return node_->finiteElement().size();
242 const auto& gridIndexSet = nodeFactory_->gridView().indexSet();
243 const auto& element = node_->element();
249 return {nodeFactory_->dofsPerEdge*gridIndexSet.subIndex(element,0,0) + i};
253 if (element.type().isTriangle())
255 return {nodeFactory_->dofsPerTriangle*gridIndexSet.subIndex(element,0,0) + i};
257 else if (element.type().isQuadrilateral())
259 return { nodeFactory_->quadrilateralOffset_ + nodeFactory_->dofsPerQuad*gridIndexSet.subIndex(element,0,0) + i};
262 DUNE_THROW(Dune::NotImplemented,
"2d elements have to be triangles or quadrilaterals");
266 if (element.type().isTetrahedron())
268 return {nodeFactory_->dofsPerTetrahedron*gridIndexSet.subIndex(element,0,0) + i};
270 else if (element.type().isPrism())
272 return { nodeFactory_->prismOffset_ + nodeFactory_->dofsPerPrism*gridIndexSet.subIndex(element,0,0) + i};
274 else if (element.type().isHexahedron())
276 return { nodeFactory_->hexahedronOffset_ + nodeFactory_->dofsPerHexahedron*gridIndexSet.subIndex(element,0,0) + i};
278 else if (element.type().isPyramid())
280 return { nodeFactory_->pyramidOffset_ + nodeFactory_->dofsPerPyramid*gridIndexSet.subIndex(element,0,0) + i};
283 DUNE_THROW(Dune::NotImplemented,
"3d elements have to be tetrahedrons, prisms, hexahedrons or pyramids");
286 DUNE_THROW(Dune::NotImplemented,
"No index method for " << dim <<
"d grids available yet!");
308 template<
typename GV,
int k>
317 #endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
size_type maxNodeSize() const
Definition: lagrangedgbasis.hh:178
void initializeIndices()
Definition: lagrangedgbasis.hh:80
GridView gridView_
Definition: lagrangedgbasis.hh:184
Definition: lagrangedgbasis.hh:42
static const int dofsPerPrism
Definition: lagrangedgbasis.hh:58
typename NodeFactory::template Node< TP > Node
Definition: lagrangedgbasis.hh:209
static const int dofsPerTriangle
Definition: lagrangedgbasis.hh:55
std::size_t size_type
Definition: lagrangedgbasis.hh:202
size_t prismOffset_
Definition: lagrangedgbasis.hh:188
Global basis for given node factory.
Definition: defaultglobalbasis.hh:42
Definition: polynomial.hh:7
const NodeFactory * nodeFactory_
Definition: lagrangedgbasis.hh:290
size_t pyramidOffset_
Definition: lagrangedgbasis.hh:187
static const int dofsPerEdge
Definition: lagrangedgbasis.hh:54
void bind(const Node &node)
Bind the view to a grid element.
Definition: lagrangedgbasis.hh:220
IndexSet< TP > indexSet() const
Definition: lagrangedgbasis.hh:132
const Node * node_
Definition: lagrangedgbasis.hh:292
size_type size() const
Size of subtree rooted in this node (element-local)
Definition: lagrangedgbasis.hh:234
size_type size(const SizePrefix prefix) const
Return number possible values for next position in multi index.
Definition: lagrangedgbasis.hh:165
Node< TP > node(const TP &tp) const
Definition: lagrangedgbasis.hh:126
void update(const GridView &gv)
Definition: lagrangedgbasis.hh:120
MI MultiIndex
Type used for global numbering of the basis vectors.
Definition: lagrangedgbasis.hh:70
std::size_t size_type
Definition: lagrangedgbasis.hh:50
static const int dofsPerTetrahedron
Definition: lagrangedgbasis.hh:57
Definition: pqknodalbasis.hh:36
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: lagrangedgbasis.hh:115
size_type dimension() const
Definition: lagrangedgbasis.hh:173
static const int dofsPerHexahedron
Definition: lagrangedgbasis.hh:59
void unbind()
Unbind the view.
Definition: lagrangedgbasis.hh:227
static const int dofsPerQuad
Definition: lagrangedgbasis.hh:56
LagrangeDGNodeIndexSet(const NodeFactory &nodeFactory)
Definition: lagrangedgbasis.hh:211
Imp::PowerNodeFactoryBuilder< k, IndexMergingStrategy, SubFactoryTag > power(SubFactoryTag &&tag, const IndexMergingStrategy &ims)
Create a factory builder that can build a PowerNodeFactory.
Definition: powerbasis.hh:424
Definition: lagrangedgbasis.hh:38
size_type size() const
Definition: lagrangedgbasis.hh:137
MI MultiIndex
Type used for global numbering of the basis vectors.
Definition: lagrangedgbasis.hh:205
MultiIndex index(size_type i) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis...
Definition: lagrangedgbasis.hh:240
static const int dofsPerPyramid
Definition: lagrangedgbasis.hh:60
Dune::ReservedVector< size_type, 2 > SizePrefix
Definition: lagrangedgbasis.hh:72
size_t hexahedronOffset_
Definition: lagrangedgbasis.hh:189
GV GridView
The grid view that the FE space is defined on.
Definition: lagrangedgbasis.hh:49
size_t quadrilateralOffset_
Definition: lagrangedgbasis.hh:186
LagrangeDGNodeFactory(const GridView &gv)
Constructor for a given grid view object.
Definition: lagrangedgbasis.hh:75