2 #ifndef DUNE_PDELAB_VARIABLEMONOMFEM_HH
3 #define DUNE_PDELAB_VARIABLEMONOMFEM_HH
5 #include <dune/geometry/type.hh>
7 #include <dune/localfunctions/common/virtualwrappers.hh>
8 #include <dune/localfunctions/monom.hh>
9 #include <dune/common/array.hh>
10 #include <dune/common/shared_ptr.hh>
17 template<
class D,
class R,
int d,
int p>
18 struct InitVariableMonomLocalFiniteElementMap
21 static void init(C & c, GeometryType gt)
23 typedef Dune::MonomLocalFiniteElement<D,R,d,p> LFE;
24 typedef typename C::value_type ptr;
25 c[
p] = ptr(
new LocalFiniteElementVirtualImp<LFE>(LFE(gt)));
27 InitVariableMonomLocalFiniteElementMap<D,R,d,p-1>::init(c,gt);
30 template<
class D,
class R,
int d>
31 struct InitVariableMonomLocalFiniteElementMap<D,R,d,-1>
34 static void init(C &, GeometryType) {}
40 template<
class M,
class D,
class R,
int d,
int maxP=6>
43 typedef typename FixedOrderLocalBasisTraits<
44 typename MonomLocalFiniteElement<D,R,d,0>::Traits::LocalBasisType::Traits,0>
::Traits T;
46 typedef LocalFiniteElementVirtualInterface<T> FiniteElementType;
52 gt_(Dune::GeometryType::cube,d), mapper_(m), polOrder_(mapper_.
size(), defaultP), defaultP_(defaultP)
54 InitVariableMonomLocalFiniteElementMap<D,R,d,maxP>::init(finiteElements_, gt_);
59 gt_(gt), mapper_(m), polOrder_(mapper_.
size(), defaultP), defaultP_(defaultP)
61 InitVariableMonomLocalFiniteElementMap<D,R,d,maxP>::init(finiteElements_, gt_);
65 template<
class EntityType>
69 DUNE_THROW(
InvalidGeometryType,
"Unsupported geometry type: Support only " << gt_ <<
", but got " << e.type());
76 return *(finiteElements_[
p]);
82 return *(finiteElements_[defaultP_]);
85 template<
class EntityType>
89 unsigned int i = mapper_.map(e);
93 template<
class EntityType>
96 unsigned int i = mapper_.map(e);
97 unsigned int p = polOrder_[i];
107 std::size_t
size(GeometryType gt)
const
109 DUNE_THROW(
VariableElementSize,
"VariableMonomLocalFiniteElementMap can contain elements of variable order.");
114 DUNE_THROW(
VariableElementSize,
"VariableMonomLocalFiniteElementMap can contain elements of variable order.");
118 const Dune::GeometryType gt_;
120 std::vector<unsigned char> polOrder_;
121 unsigned int defaultP_;
122 Dune::array< Dune::shared_ptr<FiniteElementType>, maxP+1 > finiteElements_;
130 #endif //DUNE_PDELAB_VARIABLEMONOMFEM_HH
FiniteElementMap exception concerning the computation of the FiniteElementMap size.
Definition: finiteelementmap.hh:21
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:94
const Traits::FiniteElementType & getFEM(unsigned int p) const
get local basis functions for a given polynomial order
Definition: variablemonomfem.hh:74
std::size_t maxLocalSize() const
Definition: variablemonomfem.hh:112
collect types exported by a finite element map
Definition: finiteelementmap.hh:27
VariableMonomLocalFiniteElementMap(const M &m, unsigned int defaultP)
Definition: variablemonomfem.hh:51
T FiniteElementType
Type of finite element from local functions.
Definition: finiteelementmap.hh:30
Definition: variablemonomfem.hh:41
const Traits::FiniteElementType & getFEM() const
get local basis functions for the default order
Definition: variablemonomfem.hh:80
R p(int i, D x)
Definition: qkdg.hh:62
const E & e
Definition: interpolate.hh:172
bool fixedSize() const
Definition: variablemonomfem.hh:102
const Traits::FiniteElementType & find(const EntityType &e) const
get local basis functions for entity
Definition: variablemonomfem.hh:66
VariableMonomLocalFiniteElementMap(const M &m, Dune::GeometryType gt, unsigned int defaultP)
Definition: variablemonomfem.hh:58
FiniteElementMapTraits< FiniteElementType > Traits
Definition: variablemonomfem.hh:48
void setOrder(const EntityType &e, unsigned int p)
Definition: variablemonomfem.hh:86
std::size_t size(GeometryType gt) const
Definition: variablemonomfem.hh:107