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());
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];
108 std::size_t
size(GeometryType gt)
const
110 DUNE_THROW(
VariableElementSize,
"VariableMonomLocalFiniteElementMap can contain elements of variable order.");
115 DUNE_THROW(
VariableElementSize,
"VariableMonomLocalFiniteElementMap can contain elements of variable order.");
119 const Dune::GeometryType gt_;
121 std::vector<unsigned char> polOrder_;
122 unsigned int defaultP_;
123 Dune::array< std::shared_ptr<FiniteElementType>, maxP+1 > finiteElements_;
131 #endif //DUNE_PDELAB_VARIABLEMONOMFEM_HH
Definition: variablemonomfem.hh:42
FiniteElementMapTraits< FiniteElementType > Traits
Definition: variablemonomfem.hh:49
FiniteElementMap exception raised when trying to obtain a finite element for an unsupported GeometryT...
Definition: finiteelementmap.hh:23
unsigned int getOrder(const EntityType &e) const
Definition: variablemonomfem.hh:95
std::size_t size(GeometryType gt) const
Definition: variablemonomfem.hh:108
const E & e
Definition: interpolate.hh:172
FiniteElementMap exception concerning the computation of the FiniteElementMap size.
Definition: finiteelementmap.hh:21
bool fixedSize() const
Definition: variablemonomfem.hh:103
T FiniteElementType
Type of finite element from local functions.
Definition: finiteelementmap.hh:30
const Traits::FiniteElementType & getFEM(unsigned int p) const
get local basis functions for a given polynomial order
Definition: variablemonomfem.hh:75
VariableMonomLocalFiniteElementMap(const M &m, unsigned int defaultP)
Definition: variablemonomfem.hh:52
Definition: adaptivity.hh:27
collect types exported by a finite element map
Definition: finiteelementmap.hh:27
std::size_t maxLocalSize() const
Definition: variablemonomfem.hh:113
const P & p
Definition: constraints.hh:146
VariableMonomLocalFiniteElementMap(const M &m, Dune::GeometryType gt, unsigned int defaultP)
Definition: variablemonomfem.hh:59
const Traits::FiniteElementType & getFEM() const
get local basis functions for the default order
Definition: variablemonomfem.hh:81
void setOrder(const EntityType &e, unsigned int p)
Definition: variablemonomfem.hh:87
const Traits::FiniteElementType & find(const EntityType &e) const
get local basis functions for entity
Definition: variablemonomfem.hh:67