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>
19 #include <dune/typetree/leafnode.hh>
30 template<
int dim,
typename D,
typename R, std::
size_t k>
31 struct BDMSimplexLocalInfo
33 static_assert((AlwaysFalse<D>::value),
"The requested type of BDM element is not implemented, sorry!");
36 template<
typename D,
typename R>
37 struct BDMSimplexLocalInfo<2,D,R,1>
39 using FiniteElement = BDM1Simplex2DLocalFiniteElement<D,R>;
40 static const std::size_t Variants = 8;
43 template<
typename D,
typename R>
44 struct BDMSimplexLocalInfo<2,D,R,2>
46 using FiniteElement = BDM2Simplex2DLocalFiniteElement<D,R>;
47 static const std::size_t Variants = 8;
50 template<
int dim,
typename D,
typename R, std::
size_t k>
51 struct BDMCubeLocalInfo
53 static_assert((AlwaysFalse<D>::value),
"The requested type of BDM element is not implemented, sorry!");
56 template<
typename D,
typename R>
57 struct BDMCubeLocalInfo<2,D,R,1>
59 using FiniteElement = BDM1Cube2DLocalFiniteElement<D,R>;
60 static const std::size_t Variants = 16;
63 template<
typename D,
typename R>
64 struct BDMCubeLocalInfo<2,D,R,2>
66 using FiniteElement = BDM2Cube2DLocalFiniteElement<D,R>;
67 static const std::size_t Variants = 16;
70 template<
typename D,
typename R>
71 struct BDMCubeLocalInfo<3,D,R,1>
73 using FiniteElement = BDM1Cube3DLocalFiniteElement<D,R>;
74 static const std::size_t Variants = 64;
77 template<
typename GV,
int dim,
typename R, std::
size_t k>
78 class BDMLocalFiniteElementMap
80 using D =
typename GV::ctype;
81 using CubeFiniteElement =
typename BDMCubeLocalInfo<dim, D, R, k>::FiniteElement;
82 using SimplexFiniteElement =
typename BDMSimplexLocalInfo<dim, D, R, k>::FiniteElement;
86 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
87 using FiniteElement = LocalFiniteElementVirtualInterface<T>;
89 BDMLocalFiniteElementMap(
const GV& gv)
90 : is_(&(gv.indexSet())), orient_(gv.size(0))
92 cubeVariant_.resize(BDMCubeLocalInfo<dim, D, R, k>::Variants);
93 simplexVariant_.resize(BDMSimplexLocalInfo<dim, D, R, k>::Variants);
96 for (
size_t i = 0; i < cubeVariant_.size(); i++)
97 cubeVariant_[i] = std::make_unique<LocalFiniteElementVirtualImp<CubeFiniteElement> >(CubeFiniteElement(i));
99 for (
size_t i = 0; i < simplexVariant_.size(); i++)
100 simplexVariant_[i] = std::make_unique<LocalFiniteElementVirtualImp<SimplexFiniteElement> >(SimplexFiniteElement(i));
104 for(
const auto& cell : elements(gv))
106 unsigned int myId = is_->index(cell);
109 for (
const auto& intersection : intersections(gv,cell))
111 if (intersection.neighbor() && (is_->index(intersection.outside()) > myId))
112 orient_[myId] |= (1 << intersection.indexInInside());
118 template<
class EntityType>
119 const FiniteElement& find(
const EntityType& e)
const
121 if (e.type().isCube())
122 return *cubeVariant_[orient_[is_->index(e)]];
124 return *simplexVariant_[orient_[is_->index(e)]];
128 std::vector<std::unique_ptr<LocalFiniteElementVirtualImp<CubeFiniteElement> > > cubeVariant_;
129 std::vector<std::unique_ptr<LocalFiniteElementVirtualImp<SimplexFiniteElement> > > simplexVariant_;
130 const typename GV::IndexSet* is_;
131 std::vector<unsigned char> orient_;
150 template<
typename GV,
int k>
151 class BrezziDouglasMariniNode;
153 template<
typename GV,
int k,
class MI>
154 class BrezziDouglasMariniNodeIndexSet;
156 template<
typename GV,
int k,
class MI>
159 static const int dim = GV::dimension;
160 using FiniteElementMap =
typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
162 template<
typename,
int,
class>
187 if (gv.indexSet().types(0).size() > 1)
188 DUNE_THROW(Dune::NotImplemented,
"Brezzi-Douglas-Marini basis is only implemented for grids with a single element type");
238 assert(prefix.size() == 0 || prefix.size() == 1);
239 return (prefix.size() == 0) ?
size() : 0;
252 GeometryType elementType = *(
gridView_.indexSet().types(0).begin());
253 size_t numFaces = ReferenceElements<double,dim>::general(elementType).size(1);
267 template<
typename GV,
int k>
271 static const int dim = GV::dimension;
276 using Element =
typename GV::template Codim<0>::Entity;
318 template<
typename GV,
int k,
class MI>
321 enum {dim = GV::dimension};
367 template<
typename It>
374 if (not(element.type().isCube()) and not(element.type().isSimplex()))
375 DUNE_THROW(Dune::NotImplemented,
"BrezziDouglasMariniBasis only implemented for cube and simplex elements.");
377 for(std::size_t i=0, end=
size(); i<end; ++i, ++it)
382 size_t subentity = localKey.subEntity();
383 size_t codim = localKey.codim();
399 namespace BasisFactory {
403 template<std::
size_t k>
404 class BrezziDouglasMariniPreBasisFactory
407 static const std::size_t requiredMultiIndexSize=1;
409 template<
class MultiIndex,
class Gr
idView>
410 auto makePreBasis(
const GridView& gridView)
const
426 template<std::
size_t k>
429 return Imp::BrezziDouglasMariniPreBasisFactory<k>();
447 template<
typename GV,
int k>
auto brezziDouglasMarini()
Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis.
Definition: brezzidouglasmarinibasis.hh:427
Definition: polynomial.hh:10
Definition: brezzidouglasmarinibasis.hh:270
typename FiniteElementMap::FiniteElement FiniteElement
Definition: brezzidouglasmarinibasis.hh:278
typename GV::template Codim< 0 >::Entity Element
Definition: brezzidouglasmarinibasis.hh:276
const FiniteElementMap * finiteElementMap_
Definition: brezzidouglasmarinibasis.hh:313
const Element & element() const
Return current element, throw if unbound.
Definition: brezzidouglasmarinibasis.hh:287
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:275
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: brezzidouglasmarinibasis.hh:296
typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition: brezzidouglasmarinibasis.hh:277
const Element * element_
Definition: brezzidouglasmarinibasis.hh:312
void bind(const Element &e)
Bind to element.
Definition: brezzidouglasmarinibasis.hh:302
BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap)
Definition: brezzidouglasmarinibasis.hh:280
const FiniteElement * finiteElement_
Definition: brezzidouglasmarinibasis.hh:311
Definition: brezzidouglasmarinibasis.hh:320
const Node * node_
Definition: brezzidouglasmarinibasis.hh:394
size_type size() const
Size of subtree rooted in this node (element-local)
Definition: brezzidouglasmarinibasis.hh:357
void bind(const Node &node)
Bind the view to a grid element.
Definition: brezzidouglasmarinibasis.hh:343
const PreBasis * preBasis_
Definition: brezzidouglasmarinibasis.hh:393
void unbind()
Unbind the view.
Definition: brezzidouglasmarinibasis.hh:350
MI MultiIndex
Type used for global numbering of the basis vectors.
Definition: brezzidouglasmarinibasis.hh:328
It indices(It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: brezzidouglasmarinibasis.hh:368
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:325
BrezziDouglasMariniNodeIndexSet(const PreBasis &preBasis)
Definition: brezzidouglasmarinibasis.hh:334
Definition: brezzidouglasmarinibasis.hh:158
BrezziDouglasMariniPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: brezzidouglasmarinibasis.hh:181
size_type maxNodeSize() const
Definition: brezzidouglasmarinibasis.hh:248
Node makeNode() const
Create tree node.
Definition: brezzidouglasmarinibasis.hh:214
std::array< int, 2 > dofsPerCodim_
Definition: brezzidouglasmarinibasis.hh:262
void update(const GridView &gv)
Definition: brezzidouglasmarinibasis.hh:206
Dune::ReservedVector< size_type, 1 > SizePrefix
Definition: brezzidouglasmarinibasis.hh:178
FiniteElementMap finiteElementMap_
Definition: brezzidouglasmarinibasis.hh:260
size_type size() const
Definition: brezzidouglasmarinibasis.hh:230
IndexSet makeIndexSet() const
Create tree node index set.
Definition: brezzidouglasmarinibasis.hh:225
const GridView gridView_
Definition: brezzidouglasmarinibasis.hh:258
GV GridView
The grid view that the FE space is defined on.
Definition: brezzidouglasmarinibasis.hh:168
void initializeIndices()
Definition: brezzidouglasmarinibasis.hh:191
std::array< size_t, dim+1 > codimOffset_
Definition: brezzidouglasmarinibasis.hh:259
size_type size(const SizePrefix prefix) const
Return number possible values for next position in multi index.
Definition: brezzidouglasmarinibasis.hh:236
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:169
size_type dimension() const
Definition: brezzidouglasmarinibasis.hh:243
MI MultiIndex
Type used for global numbering of the basis vectors.
Definition: brezzidouglasmarinibasis.hh:176
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: brezzidouglasmarinibasis.hh:200
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:47
void setSize(const size_type size)
Definition: nodes.hh:160