7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
11#include <dune/common/exceptions.hh>
12#include <dune/geometry/referenceelements.hh>
14#include <dune/localfunctions/common/virtualinterface.hh>
15#include <dune/localfunctions/common/virtualwrappers.hh>
17#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube2d.hh>
18#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube3d.hh>
19#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1simplex2d.hh>
20#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2cube2d.hh>
21#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2simplex2d.hh>
33 template<
int dim,
typename D,
typename R, std::
size_t k>
34 struct BDMSimplexLocalInfo
36 static_assert((AlwaysFalse<D>::value),
"The requested type of BDM element is not implemented, sorry!");
39 template<
typename D,
typename R>
40 struct BDMSimplexLocalInfo<2,D,R,1>
42 using FiniteElement = BDM1Simplex2DLocalFiniteElement<D,R>;
43 static const std::size_t Variants = 8;
46 template<
typename D,
typename R>
47 struct BDMSimplexLocalInfo<2,D,R,2>
49 using FiniteElement = BDM2Simplex2DLocalFiniteElement<D,R>;
50 static const std::size_t Variants = 8;
53 template<
int dim,
typename D,
typename R, std::
size_t k>
54 struct BDMCubeLocalInfo
56 static_assert((AlwaysFalse<D>::value),
"The requested type of BDM element is not implemented, sorry!");
59 template<
typename D,
typename R>
60 struct BDMCubeLocalInfo<2,D,R,1>
62 using FiniteElement = BDM1Cube2DLocalFiniteElement<D,R>;
63 static const std::size_t Variants = 16;
66 template<
typename D,
typename R>
67 struct BDMCubeLocalInfo<2,D,R,2>
69 using FiniteElement = BDM2Cube2DLocalFiniteElement<D,R>;
70 static const std::size_t Variants = 16;
73 template<
typename D,
typename R>
74 struct BDMCubeLocalInfo<3,D,R,1>
76 using FiniteElement = BDM1Cube3DLocalFiniteElement<D,R>;
77 static const std::size_t Variants = 64;
80 template<
typename GV,
typename R, std::
size_t k>
81 class BDMLocalFiniteElementMap
83 using D =
typename GV::ctype;
84 constexpr static auto dim = GV::dimension;
85 using CubeFiniteElement =
typename BDMCubeLocalInfo<dim, D, R, k>::FiniteElement;
86 using SimplexFiniteElement =
typename BDMSimplexLocalInfo<dim, D, R, k>::FiniteElement;
90 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
91 using FiniteElement = LocalFiniteElementVirtualInterface<T>;
93 BDMLocalFiniteElementMap(
const GV& gv)
94 : is_(&(gv.indexSet())), orient_(gv.size(0))
99 void update(
const GV& gv)
101 is_ = &(gv.indexSet());
102 orient_.resize(gv.size(0));
104 cubeVariant_.resize(BDMCubeLocalInfo<dim, D, R, k>::Variants);
105 simplexVariant_.resize(BDMSimplexLocalInfo<dim, D, R, k>::Variants);
108 for (
size_t i = 0; i < cubeVariant_.size(); i++)
109 cubeVariant_[i] = std::make_shared<LocalFiniteElementVirtualImp<CubeFiniteElement> >(CubeFiniteElement(i));
111 for (
size_t i = 0; i < simplexVariant_.size(); i++)
112 simplexVariant_[i] = std::make_shared<LocalFiniteElementVirtualImp<SimplexFiniteElement> >(SimplexFiniteElement(i));
116 for(
const auto& cell :
elements(gv))
118 unsigned int myId = is_->index(cell);
123 if (intersection.neighbor() && (is_->index(intersection.outside()) > myId))
124 orient_[myId] |= (1 << intersection.indexInInside());
130 template<
class EntityType>
131 const FiniteElement& find(
const EntityType& e)
const
133 if (e.type().isCube())
134 return *cubeVariant_[orient_[is_->index(e)]];
136 return *simplexVariant_[orient_[is_->index(e)]];
140 std::vector<std::shared_ptr<LocalFiniteElementVirtualImp<CubeFiniteElement> > > cubeVariant_;
141 std::vector<std::shared_ptr<LocalFiniteElementVirtualImp<SimplexFiniteElement> > > simplexVariant_;
142 const typename GV::IndexSet* is_;
143 std::vector<unsigned char> orient_;
161template<
typename GV,
int k>
164template<
typename GV,
int k>
169 static const int dim = GV::dimension;
172 static MCMGLayout dofLayout()
174 return [](GeometryType gt,
size_t gridDim) ->
size_t {
175 if (gt.dim() == gridDim)
177 if (gt.dim() == gridDim-1)
183 using FiniteElementMap =
typename Impl::BDMLocalFiniteElementMap<GV, double, k>;
195 Base(gv, dofLayout()),
200 if (gv.indexSet().types(0).size() > 1)
201 DUNE_THROW(Dune::NotImplemented,
"Brezzi-Douglas-Marini basis is only implemented for grids with a single element type");
225template<
typename GV,
int k>
232 using Element =
typename GV::template Codim<0>::Entity;
234 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
235 typename FiniteElementMap::FiniteElement,
284template<std::
size_t k>
287 return [](
const auto& gridView) {
307template<
typename GV,
int k>
auto brezziDouglasMarini()
Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis.
Definition brezzidouglasmarinibasis.hh:285
auto elements(const SubDomainGridView< HostGridView > &subDomainGridView)
ADL findable access to element range for a SubDomainGridView.
Definition subdomain.hh:487
auto intersections(const SubDomainGridView< HostGridView > &subDomainGridView, const Element &element)
ADL findable access to intersection range for an element of a SubDomainGridView.
Definition subdomain.hh:510
Definition monomialset.hh:19
Definition monomialset.hh:19
DefaultGlobalBasis< BrezziDouglasMariniPreBasis< GV, k > > BrezziDouglasMariniBasis
Basis of a scalar k-th-order BDM finite element space on simplex and cube grids.
Definition brezzidouglasmarinibasis.hh:308
Definition argyrisbasis.hh:926
Definition brezzidouglasmarinibasis.hh:228
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition brezzidouglasmarinibasis.hh:253
typename Impl::BDMLocalFiniteElementMap< GV, double, k > FiniteElementMap
Definition brezzidouglasmarinibasis.hh:233
typename GV::template Codim< 0 >::Entity Element
Definition brezzidouglasmarinibasis.hh:232
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition brezzidouglasmarinibasis.hh:234
const FiniteElementMap * finiteElementMap_
Definition brezzidouglasmarinibasis.hh:270
std::size_t size_type
Definition brezzidouglasmarinibasis.hh:231
FiniteElement finiteElement_
Definition brezzidouglasmarinibasis.hh:268
const Element * element_
Definition brezzidouglasmarinibasis.hh:269
void bind(const Element &e)
Bind to element.
Definition brezzidouglasmarinibasis.hh:259
BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap)
Definition brezzidouglasmarinibasis.hh:238
const Element & element() const
Return current element, throw if unbound.
Definition brezzidouglasmarinibasis.hh:244
Definition brezzidouglasmarinibasis.hh:167
std::size_t size_type
Definition brezzidouglasmarinibasis.hh:189
BrezziDouglasMariniNode< GV, k > Node
Definition brezzidouglasmarinibasis.hh:191
Node makeNode() const
Create tree node.
Definition brezzidouglasmarinibasis.hh:214
GV GridView
The grid view that the FE space is defined on.
Definition brezzidouglasmarinibasis.hh:188
BrezziDouglasMariniPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition brezzidouglasmarinibasis.hh:194
FiniteElementMap finiteElementMap_
Definition brezzidouglasmarinibasis.hh:220
void update(const GridView &gv)
Definition brezzidouglasmarinibasis.hh:205
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:53
void update(const GridView &gv)
Update the stored GridView.
Definition leafprebasismappermixin.hh:101
LeafPreBasisMapperMixin(const GridView &gv, Dune::MCMGLayout layout)
Construct from GridView and local DOF layout.
Definition leafprebasismappermixin.hh:74
void setSize(const size_type size)
Definition nodes.hh:197