2 #ifndef DUNE_PDELAB_VARIABLEMONOMFEM_HH 3 #define DUNE_PDELAB_VARIABLEMONOMFEM_HH 7 #include <dune/geometry/type.hh> 9 #include <dune/localfunctions/common/virtualwrappers.hh> 10 #include <dune/localfunctions/monomial.hh> 11 #include <dune/common/array.hh> 18 template<
class D,
class R,
int d,
int p>
19 struct InitVariableMonomLocalFiniteElementMap
22 static void init(C & c, GeometryType gt)
24 typedef Dune::MonomialLocalFiniteElement<D,R,d,p> LFE;
25 typedef typename C::value_type ptr;
26 c[
p] = ptr(
new LocalFiniteElementVirtualImp<LFE>(LFE(gt)));
28 InitVariableMonomLocalFiniteElementMap<D,R,d,p-1>::init(c,gt);
31 template<
class D,
class R,
int d>
32 struct InitVariableMonomLocalFiniteElementMap<D,R,d,-1>
35 static void init(C &, GeometryType) {}
41 template<
class M,
class D,
class R,
int d,
int maxP=6>
44 typedef typename FixedOrderLocalBasisTraits<
45 typename MonomialLocalFiniteElement<D,R,d,0>::Traits::LocalBasisType::Traits,0>
::Traits T;
47 typedef LocalFiniteElementVirtualInterface<T> FiniteElementType;
53 gt_(
Dune::GeometryType::cube,d), mapper_(m), polOrder_(mapper_.size(), defaultP), defaultP_(defaultP)
55 InitVariableMonomLocalFiniteElementMap<D,R,d,maxP>::init(finiteElements_, gt_);
60 gt_(gt), mapper_(m), polOrder_(mapper_.size(), defaultP), defaultP_(defaultP)
62 InitVariableMonomLocalFiniteElementMap<D,R,d,maxP>::init(finiteElements_, gt_);
66 template<
class EntityType>
70 DUNE_THROW(
InvalidGeometryType,
"Unsupported geometry type: Support only " << gt_ <<
", but got " << e.type());
71 return getFEM(getOrder(e));
77 return *(finiteElements_[
p]);
83 return *(finiteElements_[defaultP_]);
86 template<
class EntityType>
90 unsigned int i = mapper_.index(e);
94 template<
class EntityType>
97 unsigned int i = mapper_.index(e);
98 unsigned int p = polOrder_[i];
113 std::size_t
size(GeometryType gt)
const 115 DUNE_THROW(
VariableElementSize,
"VariableMonomLocalFiniteElementMap can contain elements of variable order.");
120 DUNE_THROW(
VariableElementSize,
"VariableMonomLocalFiniteElementMap can contain elements of variable order.");
124 const Dune::GeometryType gt_;
126 std::vector<unsigned char> polOrder_;
127 unsigned int defaultP_;
128 Dune::array< std::shared_ptr<FiniteElementType>, maxP+1 > finiteElements_;
136 #endif //DUNE_PDELAB_VARIABLEMONOMFEM_HH void setOrder(const EntityType &e, unsigned int p)
Definition: variablemonomfem.hh:87
std::size_t maxLocalSize() const
Definition: variablemonomfem.hh:118
const Traits::FiniteElementType & find(const EntityType &e) const
get local basis functions for entity
Definition: variablemonomfem.hh:67
bool fixedSize() const
Definition: variablemonomfem.hh:103
const Traits::FiniteElementType & getFEM() const
get local basis functions for the default order
Definition: variablemonomfem.hh:81
bool hasDOFs(int codim) const
Definition: variablemonomfem.hh:108
VariableMonomLocalFiniteElementMap(const M &m, Dune::GeometryType gt, unsigned int defaultP)
Definition: variablemonomfem.hh:59
Definition: variablemonomfem.hh:42
Definition: adaptivity.hh:27
VariableMonomLocalFiniteElementMap(const M &m, unsigned int defaultP)
Definition: variablemonomfem.hh:52
FiniteElementMap exception raised when trying to obtain a finite element for an unsupported GeometryT...
Definition: finiteelementmap.hh:23
const Traits::FiniteElementType & getFEM(unsigned int p) const
get local basis functions for a given polynomial order
Definition: variablemonomfem.hh:75
std::size_t size(GeometryType gt) const
Definition: variablemonomfem.hh:113
const Entity & e
Definition: localfunctionspace.hh:111
FiniteElementMap exception concerning the computation of the FiniteElementMap size.
Definition: finiteelementmap.hh:21
unsigned int getOrder(const EntityType &e) const
Definition: variablemonomfem.hh:95
collect types exported by a finite element map
Definition: finiteelementmap.hh:27
const P & p
Definition: constraints.hh:147
FiniteElementMapTraits< FiniteElementType > Traits
Definition: variablemonomfem.hh:49
T FiniteElementType
Type of finite element from local functions.
Definition: finiteelementmap.hh:30