12#ifndef DUMUX_DISCRETIZATION_PQ2_HIERARCHICAL_LOCAL_FINITE_ELEMENT_HH
13#define DUMUX_DISCRETIZATION_PQ2_HIERARCHICAL_LOCAL_FINITE_ELEMENT_HH
18#include <dune/common/fvector.hh>
19#include <dune/common/fmatrix.hh>
21#include <dune/geometry/type.hh>
22#include <dune/geometry/referenceelements.hh>
24#include <dune/localfunctions/common/localbasis.hh>
25#include <dune/localfunctions/common/localfiniteelementtraits.hh>
26#include <dune/localfunctions/common/localkey.hh>
28#include <dune/localfunctions/lagrange/lagrangesimplex.hh>
29#include <dune/localfunctions/lagrange/lagrangecube.hh>
33template<
class D,
class R,
unsigned int dim, Dune::GeometryType::Id typeId>
36 using PQ1FE = std::conditional_t<
37 Dune::GeometryType{ typeId } == Dune::GeometryTypes::cube(dim),
38 Dune::LagrangeCubeLocalFiniteElement<D, R, dim, 1>,
39 Dune::LagrangeSimplexLocalFiniteElement<D, R, dim, 1>
41 using PQ2FE = std::conditional_t<
42 Dune::GeometryType{ typeId } == Dune::GeometryTypes::cube(dim),
43 Dune::LagrangeCubeLocalFiniteElement<D, R, dim, 2>,
44 Dune::LagrangeSimplexLocalFiniteElement<D, R, dim, 2>
48 using Traits = Dune::LocalBasisTraits<
49 D, dim, Dune::FieldVector<D, dim>,
50 R, 1, Dune::FieldVector<R, 1>,
51 Dune::FieldMatrix<R, 1, dim>
56 const auto refElement = Dune::referenceElement<D, dim>(
type());
57 numVertices_ = refElement.size(dim);
60 static constexpr unsigned int size()
61 {
return PQ2FE{}.size(); }
64 std::vector<typename Traits::RangeType>& out)
const
69 std::vector<typename Traits::RangeType> pq1Values, pq2Values;
70 pq1FE_.localBasis().evaluateFunction(x, pq1Values);
71 pq2FE_.localBasis().evaluateFunction(x, pq2Values);
74 const auto& pq2Coeff = pq2FE_.localCoefficients();
75 for (std::size_t i = 0; i <
size(); ++i)
77 const auto& key = pq2Coeff.localKey(i);
78 if (key.codim() == dim)
79 out[i] = pq1Values[key.subEntity()];
81 out[i] = pq2Values[i];
86 std::vector<typename Traits::JacobianType>& out)
const
90 std::vector<typename Traits::JacobianType> pq1Jac, pq2Jac;
91 pq1FE_.localBasis().evaluateJacobian(x, pq1Jac);
92 pq2FE_.localBasis().evaluateJacobian(x, pq2Jac);
95 const auto& pq2Coeff = pq2FE_.localCoefficients();
96 for (std::size_t i = 0; i <
size(); ++i)
98 const auto& key = pq2Coeff.localKey(i);
99 if (key.codim() == dim)
100 out[i] = pq1Jac[key.subEntity()];
107 const typename Traits::DomainType& in,
108 std::vector<typename Traits::RangeType>& out)
const
111 std::vector<typename Traits::RangeType> pq1Partial, pq2Partial;
112 pq1FE_.localBasis().partial(
order, in, pq1Partial);
113 pq2FE_.localBasis().partial(
order, in, pq2Partial);
115 const auto& pq2Coeff = pq2FE_.localCoefficients();
116 for (std::size_t i = 0; i <
size(); ++i)
118 const auto& key = pq2Coeff.localKey(i);
119 if (key.codim() == dim)
120 out[i] = pq1Partial[key.subEntity()];
122 out[i] = pq2Partial[i];
126 static constexpr unsigned int order()
129 static constexpr Dune::GeometryType
type()
130 {
return { typeId }; }
135 std::size_t numVertices_;
138template<
int dim, Dune::GeometryType::Id typeId>
141 using PQ2FE = std::conditional_t<
142 Dune::GeometryType{ typeId } == Dune::GeometryTypes::cube(dim),
143 Dune::LagrangeCubeLocalFiniteElement<double, double, dim, 2>,
144 Dune::LagrangeSimplexLocalFiniteElement<double, double, dim, 2>
149 : p2Coeff_(PQ2FE{}.localCoefficients())
152 static constexpr std::size_t
size()
153 {
return PQ2FE{}.size(); }
155 const Dune::LocalKey&
localKey(std::size_t i)
const
156 {
return p2Coeff_.localKey(i); }
158 static constexpr Dune::GeometryType
type()
159 {
return { typeId }; }
162 typename PQ2FE::Traits::LocalCoefficientsType p2Coeff_;
165template<
class LocalBasis>
169 template<
typename F,
typename C>
172 DUNE_THROW(Dune::NotImplemented,
"Local interpolation not implemented for PQ2 basis.");
191template<
class D,
class R,
int dim, Dune::GeometryType::Id typeId>
198 static constexpr Dune::GeometryType gt = Dune::GeometryType{ typeId };
200 gt == Dune::GeometryTypes::cube(dim) || gt == Dune::GeometryTypes::simplex(dim),
201 "Only implemented for cubes and simplices"
205 using Traits = Dune::LocalFiniteElementTraits<Basis, Coefficients, Interpolation>;
211 {
return coefficients_; }
214 {
return interpolation_; }
216 static constexpr std::size_t
size()
219 static constexpr Dune::GeometryType
type()
220 {
return Traits::LocalBasisType::type(); }
224 Coefficients coefficients_;
225 Interpolation interpolation_;
Definition: pq2hierarchicallocalfiniteelement.hh:35
void evaluateFunction(const typename Traits::DomainType &x, std::vector< typename Traits::RangeType > &out) const
Definition: pq2hierarchicallocalfiniteelement.hh:63
Dune::LocalBasisTraits< D, dim, Dune::FieldVector< D, dim >, R, 1, Dune::FieldVector< R, 1 >, Dune::FieldMatrix< R, 1, dim > > Traits
Definition: pq2hierarchicallocalfiniteelement.hh:52
static constexpr unsigned int order()
Definition: pq2hierarchicallocalfiniteelement.hh:126
static constexpr Dune::GeometryType type()
Definition: pq2hierarchicallocalfiniteelement.hh:129
static constexpr unsigned int size()
Definition: pq2hierarchicallocalfiniteelement.hh:60
void partial(const std::array< unsigned int, dim > &order, const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Definition: pq2hierarchicallocalfiniteelement.hh:106
void evaluateJacobian(const typename Traits::DomainType &x, std::vector< typename Traits::JacobianType > &out) const
Definition: pq2hierarchicallocalfiniteelement.hh:85
PQ2HierarchicalLocalBasis()
Definition: pq2hierarchicallocalfiniteelement.hh:54
Definition: pq2hierarchicallocalfiniteelement.hh:140
static constexpr std::size_t size()
Definition: pq2hierarchicallocalfiniteelement.hh:152
static constexpr Dune::GeometryType type()
Definition: pq2hierarchicallocalfiniteelement.hh:158
const Dune::LocalKey & localKey(std::size_t i) const
Definition: pq2hierarchicallocalfiniteelement.hh:155
PQ2HierarchicalLocalCoefficients()
Definition: pq2hierarchicallocalfiniteelement.hh:148
Definition: pq2hierarchicallocalfiniteelement.hh:167
void interpolate(const F &f, std::vector< C > &out) const
Definition: pq2hierarchicallocalfiniteelement.hh:170
Hierarchical P2/Q2 finite element.
Definition: pq2hierarchicallocalfiniteelement.hh:193
static constexpr Dune::GeometryType type()
Definition: pq2hierarchicallocalfiniteelement.hh:219
const Traits::LocalCoefficientsType & localCoefficients() const
Definition: pq2hierarchicallocalfiniteelement.hh:210
static constexpr std::size_t size()
Definition: pq2hierarchicallocalfiniteelement.hh:216
const Traits::LocalBasisType & localBasis() const
Definition: pq2hierarchicallocalfiniteelement.hh:207
Dune::LocalFiniteElementTraits< Basis, Coefficients, Interpolation > Traits
Definition: pq2hierarchicallocalfiniteelement.hh:205
const Traits::LocalInterpolationType & localInterpolation() const
Definition: pq2hierarchicallocalfiniteelement.hh:213
Definition: cvfelocalresidual.hh:30