3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
7#include <dune/common/exceptions.hh>
8#include <dune/geometry/referenceelements.hh>
10#include <dune/localfunctions/common/virtualinterface.hh>
11#include <dune/localfunctions/common/virtualwrappers.hh>
13#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube2d.hh>
14#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube3d.hh>
15#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1simplex2d.hh>
16#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2cube2d.hh>
17#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2simplex2d.hh>
28 template<
int dim,
typename D,
typename R, std::
size_t k>
29 struct BDMSimplexLocalInfo
31 static_assert((AlwaysFalse<D>::value),
"The requested type of BDM element is not implemented, sorry!");
34 template<
typename D,
typename R>
35 struct BDMSimplexLocalInfo<2,D,R,1>
37 using FiniteElement = BDM1Simplex2DLocalFiniteElement<D,R>;
38 static const std::size_t Variants = 8;
41 template<
typename D,
typename R>
42 struct BDMSimplexLocalInfo<2,D,R,2>
44 using FiniteElement = BDM2Simplex2DLocalFiniteElement<D,R>;
45 static const std::size_t Variants = 8;
48 template<
int dim,
typename D,
typename R, std::
size_t k>
49 struct BDMCubeLocalInfo
51 static_assert((AlwaysFalse<D>::value),
"The requested type of BDM element is not implemented, sorry!");
54 template<
typename D,
typename R>
55 struct BDMCubeLocalInfo<2,D,R,1>
57 using FiniteElement = BDM1Cube2DLocalFiniteElement<D,R>;
58 static const std::size_t Variants = 16;
61 template<
typename D,
typename R>
62 struct BDMCubeLocalInfo<2,D,R,2>
64 using FiniteElement = BDM2Cube2DLocalFiniteElement<D,R>;
65 static const std::size_t Variants = 16;
68 template<
typename D,
typename R>
69 struct BDMCubeLocalInfo<3,D,R,1>
71 using FiniteElement = BDM1Cube3DLocalFiniteElement<D,R>;
72 static const std::size_t Variants = 64;
75 template<
typename GV,
int dim,
typename R, std::
size_t k>
76 class BDMLocalFiniteElementMap
78 using D =
typename GV::ctype;
79 using CubeFiniteElement =
typename BDMCubeLocalInfo<dim, D, R, k>::FiniteElement;
80 using SimplexFiniteElement =
typename BDMSimplexLocalInfo<dim, D, R, k>::FiniteElement;
84 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
85 using FiniteElement = LocalFiniteElementVirtualInterface<T>;
87 BDMLocalFiniteElementMap(
const GV& gv)
88 : is_(&(gv.indexSet())), orient_(gv.size(0))
90 cubeVariant_.resize(BDMCubeLocalInfo<dim, D, R, k>::Variants);
91 simplexVariant_.resize(BDMSimplexLocalInfo<dim, D, R, k>::Variants);
94 for (
size_t i = 0; i < cubeVariant_.size(); i++)
95 cubeVariant_[i] = std::make_unique<LocalFiniteElementVirtualImp<CubeFiniteElement> >(CubeFiniteElement(i));
97 for (
size_t i = 0; i < simplexVariant_.size(); i++)
98 simplexVariant_[i] = std::make_unique<LocalFiniteElementVirtualImp<SimplexFiniteElement> >(SimplexFiniteElement(i));
102 for(
const auto& cell : elements(gv))
104 unsigned int myId = is_->index(cell);
107 for (
const auto& intersection : intersections(gv,cell))
109 if (intersection.neighbor() && (is_->index(intersection.outside()) > myId))
110 orient_[myId] |= (1 << intersection.indexInInside());
116 template<
class EntityType>
117 const FiniteElement& find(
const EntityType& e)
const
119 if (e.type().isCube())
120 return *cubeVariant_[orient_[is_->index(e)]];
122 return *simplexVariant_[orient_[is_->index(e)]];
126 std::vector<std::unique_ptr<LocalFiniteElementVirtualImp<CubeFiniteElement> > > cubeVariant_;
127 std::vector<std::unique_ptr<LocalFiniteElementVirtualImp<SimplexFiniteElement> > > simplexVariant_;
128 const typename GV::IndexSet* is_;
129 std::vector<unsigned char> orient_;
147template<
typename GV,
int k>
148class BrezziDouglasMariniNode;
150template<
typename GV,
int k>
153 static const int dim = GV::dimension;
154 using FiniteElementMap =
typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
175 if (gv.indexSet().types(0).size() > 1)
176 DUNE_THROW(Dune::NotImplemented,
"Brezzi-Douglas-Marini basis is only implemented for grids with a single element type");
213 template<
class SizePrefix>
216 assert(prefix.size() == 0 || prefix.size() == 1);
217 return (prefix.size() == 0) ?
size() : 0;
230 GeometryType elementType = *(
gridView_.indexSet().types(0).begin());
231 size_t numFaces = ReferenceElements<double,dim>::general(elementType).size(1);
240 template<
typename It>
243 const auto& gridIndexSet =
gridView().indexSet();
244 const auto& element = node.
element();
247 if (not(element.type().isCube()) and not(element.type().isSimplex()))
248 DUNE_THROW(Dune::NotImplemented,
"BrezziDouglasMariniBasis only implemented for cube and simplex elements.");
250 for(std::size_t i=0, end=node.
size(); i<end; ++i, ++it)
252 Dune::LocalKey localKey = node.
finiteElement().localCoefficients().localKey(i);
255 size_t subentity = localKey.subEntity();
256 size_t codim = localKey.codim();
259 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
275template<
typename GV,
int k>
279 static const int dim = GV::dimension;
284 using Element =
typename GV::template Codim<0>::Entity;
286 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
287 typename FiniteElementMap::FiniteElement,
327namespace BasisFactory {
336template<std::
size_t k>
339 return [](
const auto& gridView) {
359template<
typename GV,
int k>
auto brezziDouglasMarini()
Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis.
Definition: brezzidouglasmarinibasis.hh:337
Definition: polynomial.hh:10
Definition: brezzidouglasmarinibasis.hh:278
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: brezzidouglasmarinibasis.hh:305
typename GV::template Codim< 0 >::Entity Element
Definition: brezzidouglasmarinibasis.hh:284
const FiniteElementMap * finiteElementMap_
Definition: brezzidouglasmarinibasis.hh:322
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:283
FiniteElement finiteElement_
Definition: brezzidouglasmarinibasis.hh:320
typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition: brezzidouglasmarinibasis.hh:285
const Element * element_
Definition: brezzidouglasmarinibasis.hh:321
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition: brezzidouglasmarinibasis.hh:288
void bind(const Element &e)
Bind to element.
Definition: brezzidouglasmarinibasis.hh:311
BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap)
Definition: brezzidouglasmarinibasis.hh:290
const Element & element() const
Return current element, throw if unbound.
Definition: brezzidouglasmarinibasis.hh:296
Definition: brezzidouglasmarinibasis.hh:152
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:160
std::array< int, 2 > dofsPerCodim_
Definition: brezzidouglasmarinibasis.hh:270
size_type dimension() const
Definition: brezzidouglasmarinibasis.hh:221
static constexpr size_type minMultiIndexSize
Definition: brezzidouglasmarinibasis.hh:165
static constexpr size_type maxMultiIndexSize
Definition: brezzidouglasmarinibasis.hh:164
std::array< size_t, dim+1 > codimOffset_
Definition: brezzidouglasmarinibasis.hh:267
size_type size(const SizePrefix prefix) const
Return number possible values for next position in multi index.
Definition: brezzidouglasmarinibasis.hh:214
Node makeNode() const
Create tree node.
Definition: brezzidouglasmarinibasis.hh:202
GV GridView
The grid view that the FE space is defined on.
Definition: brezzidouglasmarinibasis.hh:159
BrezziDouglasMariniPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: brezzidouglasmarinibasis.hh:169
FiniteElementMap finiteElementMap_
Definition: brezzidouglasmarinibasis.hh:268
void update(const GridView &gv)
Definition: brezzidouglasmarinibasis.hh:194
void initializeIndices()
Definition: brezzidouglasmarinibasis.hh:179
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: brezzidouglasmarinibasis.hh:188
size_type size() const
Definition: brezzidouglasmarinibasis.hh:207
static constexpr size_type multiIndexBufferSize
Definition: brezzidouglasmarinibasis.hh:166
size_type maxNodeSize() const
Definition: brezzidouglasmarinibasis.hh:226
GridView gridView_
Definition: brezzidouglasmarinibasis.hh:266
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: brezzidouglasmarinibasis.hh:241
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
size_type size() const
Definition: nodes.hh:142
void setSize(const size_type size)
Definition: nodes.hh:164