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;
137 return dofsPerTriangle*
gridView_.size(Dune::GeometryTypes::triangle) + dofsPerQuad*
gridView_.size(Dune::GeometryTypes::quadrilateral);
141 return dofsPerTetrahedron*
gridView_.size(Dune::GeometryTypes::tetrahedron)
142 + dofsPerPyramid*
gridView_.size(Dune::GeometryTypes::pyramid)
143 + dofsPerPrism*
gridView_.size(Dune::GeometryTypes::prism)
144 + dofsPerHexahedron*
gridView_.size(Dune::GeometryTypes::hexahedron);
147 DUNE_THROW(Dune::NotImplemented,
"No size method for " << dim <<
"d grids available yet!");
153 assert(prefix.size() == 0 || prefix.size() == 1);
154 return (prefix.size() == 0) ?
size() : 0;
179 template<
typename GV,
int k,
class MI,
class TP>
183 static const int dim = GV::dimension;
221 return node_->finiteElement().size();
225 template<
typename It>
228 const auto& gridIndexSet = preBasis_->gridView().indexSet();
229 const auto& element = node_->element();
237 *it = {preBasis_->dofsPerEdge*gridIndexSet.subIndex(element,0,0) + i};
242 if (element.type().isTriangle())
244 *it = {preBasis_->dofsPerTriangle*gridIndexSet.subIndex(element,0,0) + i};
247 else if (element.type().isQuadrilateral())
249 *it = { preBasis_->quadrilateralOffset_ + preBasis_->dofsPerQuad*gridIndexSet.subIndex(element,0,0) + i};
253 DUNE_THROW(Dune::NotImplemented,
"2d elements have to be triangles or quadrilaterals");
257 if (element.type().isTetrahedron())
259 *it = {preBasis_->dofsPerTetrahedron*gridIndexSet.subIndex(element,0,0) + i};
262 else if (element.type().isPrism())
264 *it = { preBasis_->prismOffset_ + preBasis_->dofsPerPrism*gridIndexSet.subIndex(element,0,0) + i};
267 else if (element.type().isHexahedron())
269 *it = { preBasis_->hexahedronOffset_ + preBasis_->dofsPerHexahedron*gridIndexSet.subIndex(element,0,0) + i};
272 else if (element.type().isPyramid())
274 *it = { preBasis_->pyramidOffset_ + preBasis_->dofsPerPyramid*gridIndexSet.subIndex(element,0,0) + i};
278 DUNE_THROW(Dune::NotImplemented,
"3d elements have to be tetrahedrons, prisms, hexahedrons or pyramids");
281 DUNE_THROW(Dune::NotImplemented,
"No index method for " << dim <<
"d grids available yet!");
305 template<
typename GV,
int k>
314 #endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH void initializeIndices()
Definition: lagrangedgbasis.hh:80
It indices(It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis...
Definition: lagrangedgbasis.hh:226
const Node * node_
Definition: lagrangedgbasis.hh:289
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: lagrangedgbasis.hh:107
void unbind()
Unbind the view.
Definition: lagrangedgbasis.hh:212
std::size_t size_type
Definition: lagrangedgbasis.hh:187
typename PreBasis::template Node< TP > Node
Definition: lagrangedgbasis.hh:194
size_t quadrilateralOffset_
Definition: lagrangedgbasis.hh:171
Definition: pqknodalbasis.hh:36
size_t prismOffset_
Definition: lagrangedgbasis.hh:173
MI MultiIndex
Type used for global numbering of the basis vectors.
Definition: lagrangedgbasis.hh:190
Definition: lagrangedgbasis.hh:42
size_type size() const
Definition: lagrangedgbasis.hh:129
Dune::ReservedVector< size_type, 2 > SizePrefix
Definition: lagrangedgbasis.hh:72
static const int dofsPerPyramid
Definition: lagrangedgbasis.hh:60
static const int dofsPerEdge
Definition: lagrangedgbasis.hh:54
size_type maxNodeSize() const
Definition: lagrangedgbasis.hh:163
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:42
const PreBasis * preBasis_
Definition: lagrangedgbasis.hh:287
Definition: lagrangedgbasis.hh:38
size_type size() const
Size of subtree rooted in this node (element-local)
Definition: lagrangedgbasis.hh:219
void update(const GridView &gv)
Definition: lagrangedgbasis.hh:112
GV GridView
The grid view that the FE space is defined on.
Definition: lagrangedgbasis.hh:49
LagrangeDGNodeIndexSet(const PreBasis &preBasis)
Definition: lagrangedgbasis.hh:196
MI MultiIndex
Type used for global numbering of the basis vectors.
Definition: lagrangedgbasis.hh:70
Node< TP > node(const TP &tp) const
Definition: lagrangedgbasis.hh:118
IndexSet< TP > indexSet() const
Definition: lagrangedgbasis.hh:124
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &ims)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:493
static const int dofsPerTriangle
Definition: lagrangedgbasis.hh:55
size_t hexahedronOffset_
Definition: lagrangedgbasis.hh:174
void bind(const Node &node)
Bind the view to a grid element.
Definition: lagrangedgbasis.hh:205
static const int dofsPerQuad
Definition: lagrangedgbasis.hh:56
size_type dimension() const
Definition: lagrangedgbasis.hh:158
size_t pyramidOffset_
Definition: lagrangedgbasis.hh:172
LagrangeDGPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: lagrangedgbasis.hh:75
Definition: polynomial.hh:7
size_type size(const SizePrefix prefix) const
Return number possible values for next position in multi index.
Definition: lagrangedgbasis.hh:151
static const int dofsPerPrism
Definition: lagrangedgbasis.hh:58
std::size_t size_type
Definition: lagrangedgbasis.hh:50
static const int dofsPerTetrahedron
Definition: lagrangedgbasis.hh:57
GridView gridView_
Definition: lagrangedgbasis.hh:169
static const int dofsPerHexahedron
Definition: lagrangedgbasis.hh:59