6#ifndef DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
7#define DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
13#include <dune/common/fmatrix.hh>
14#include <dune/common/typetraits.hh>
15#include <dune/common/shared_ptr.hh>
29 template<
class FiniteElement,
class Dummy =
void>
32 typedef typename FiniteElement::Traits::Basis
Basis;
40 {
return fe.basis(); }
43 {
return fe.interpolation(); }
46 {
return fe.coefficients(); }
78 typedef std::shared_ptr<const FiniteElement>
Store;
86 { store = std::make_shared<const FiniteElement>(fe); }
89 { store = std::make_shared<const FiniteElement>(std::move(fe)); }
98 template<
class FiniteElement>
99 struct FiniteElementInterfaceSwitch<
101 typename std::enable_if<AlwaysTrue<typename FiniteElement::Traits::
102 LocalBasisType>::value>::type
106 typedef typename FiniteElement::Traits::LocalBasisType
Basis;
108 typedef typename FiniteElement::Traits::LocalInterpolationType
111 typedef typename FiniteElement::Traits::LocalCoefficientsType
Coefficients;
114 static const Basis &
basis(
const FiniteElement& fe)
115 {
return fe.localBasis(); }
118 {
return fe.localInterpolation(); }
121 {
return fe.localCoefficients(); }
124 typedef std::shared_ptr<const FiniteElement>
Store;
127 { store = stackobject_to_shared_ptr<const FiniteElement>(fe); }
130 { store = std::make_shared<const FiniteElement>(std::move(fe)); }
153 template<
class Basis,
class Dummy =
void>
165 static const std::size_t
dimRange = Basis::Traits::dimRange;
167 typedef typename Basis::Traits::Range
Range;
180 template<
typename Geometry>
181 static void gradient(
const Basis& basis,
const Geometry& geometry,
184 Geometry::coorddimension> >& grad)
186 grad.resize(basis.size());
187 basis.evaluateJacobian(xl, grad);
193 template<
class Basis>
194 struct BasisInterfaceSwitch<Basis,
195 typename std::enable_if<
197 std::integral_constant<
199 Basis::Traits::dimDomain
206 typedef typename Basis::Traits::DomainFieldType
DomainField;
208 static const std::size_t
dimDomainLocal = Basis::Traits::dimDomain;
210 typedef typename Basis::Traits::DomainType
DomainLocal;
213 typedef typename Basis::Traits::RangeFieldType
RangeField;
215 static const std::size_t
dimRange = Basis::Traits::dimRange;
217 typedef typename Basis::Traits::RangeType
Range;
220 template<
typename Geometry>
221 static void gradient(
const Basis& basis,
const Geometry& geometry,
224 Geometry::coorddimension> >& grad)
226 std::vector<typename Basis::Traits::JacobianType> lgrad(basis.size());
227 basis.evaluateJacobian(xl, lgrad);
229 const typename Geometry::JacobianInverseTransposed& jac =
230 geometry.jacobianInverseTransposed(xl);
232 grad.resize(basis.size());
233 for(std::size_t i = 0; i < basis.size(); ++i)
234 jac.mv(lgrad[i][0], grad[i][0]);
Definition bdfmcube.hh:18
Switch for uniform treatment of finite element with either the local or the global interface.
Definition interfaceswitch.hh:30
static const Coefficients & coefficients(const FiniteElement &fe)
access coefficients
Definition interfaceswitch.hh:45
static void setStore(Store &store, FiniteElement &&fe)
Store a finite element in the store.
Definition interfaceswitch.hh:88
FiniteElement::Traits::Coefficients Coefficients
export the type of the coefficients
Definition interfaceswitch.hh:36
static void setStore(Store &store, const Store &fe)
Store a finite element in the store.
Definition interfaceswitch.hh:91
static void setStore(Store &store, const FiniteElement &fe)
Store a finite element in the store.
Definition interfaceswitch.hh:85
FiniteElement::Traits::Interpolation Interpolation
export the type of the interpolation
Definition interfaceswitch.hh:34
std::shared_ptr< const FiniteElement > Store
Type for storing finite elements.
Definition interfaceswitch.hh:78
static const Basis & basis(const FiniteElement &fe)
access basis
Definition interfaceswitch.hh:39
FiniteElement::Traits::Basis Basis
export the type of the basis
Definition interfaceswitch.hh:32
static const Interpolation & interpolation(const FiniteElement &fe)
access interpolation
Definition interfaceswitch.hh:42
Switch for uniform treatment of local and global basis classes.
Definition interfaceswitch.hh:154
static const std::size_t dimRange
export dimension of the values
Definition interfaceswitch.hh:165
static const std::size_t dimDomainLocal
export dimension of local coordinates
Definition interfaceswitch.hh:158
Basis::Traits::RangeField RangeField
export field type of the values
Definition interfaceswitch.hh:163
Basis::Traits::Range Range
export vector type of the values
Definition interfaceswitch.hh:167
static void gradient(const Basis &basis, const Geometry &geometry, const DomainLocal &xl, std::vector< FieldMatrix< RangeField, 1, Geometry::coorddimension > > &grad)
Compute global gradient for scalar valued bases.
Definition interfaceswitch.hh:181
Basis::Traits::DomainLocal DomainLocal
export vector type of the local coordinates
Definition interfaceswitch.hh:160
Basis::Traits::DomainField DomainField
export field types of the coordinates
Definition interfaceswitch.hh:156