4 #ifndef DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
5 #define DUNE_LOCALFUNCTIONS_COMMON_INTERFACESWITCH_HH
11 #include <dune/common/fmatrix.hh>
12 #include <dune/common/typetraits.hh>
13 #include <dune/common/shared_ptr.hh>
27 template<
class FiniteElement,
class Dummy =
void>
30 typedef typename FiniteElement::Traits::Basis
Basis;
38 {
return fe.basis(); }
41 {
return fe.interpolation(); }
44 {
return fe.coefficients(); }
76 typedef std::shared_ptr<const FiniteElement>
Store;
84 { store = std::make_shared<const FiniteElement>(fe); }
87 { store = std::make_shared<const FiniteElement>(std::move(fe)); }
96 template<
class FiniteElement>
97 struct FiniteElementInterfaceSwitch<
99 typename std::enable_if<AlwaysTrue<typename FiniteElement::Traits::
100 LocalBasisType>::value>::type
104 typedef typename FiniteElement::Traits::LocalBasisType
Basis;
106 typedef typename FiniteElement::Traits::LocalInterpolationType
109 typedef typename FiniteElement::Traits::LocalCoefficientsType
Coefficients;
112 static const Basis &
basis(
const FiniteElement& fe)
113 {
return fe.localBasis(); }
116 {
return fe.localInterpolation(); }
119 {
return fe.localCoefficients(); }
122 typedef std::shared_ptr<const FiniteElement>
Store;
125 { store = stackobject_to_shared_ptr<const FiniteElement>(fe); }
128 { store = std::make_shared<const FiniteElement>(std::move(fe)); }
151 template<
class Basis,
class Dummy =
void>
163 static const std::size_t
dimRange = Basis::Traits::dimRange;
165 typedef typename Basis::Traits::Range
Range;
178 template<
typename Geometry>
179 static void gradient(
const Basis& basis,
const Geometry& geometry,
182 Geometry::coorddimension> >& grad)
184 grad.resize(basis.size());
185 basis.evaluateJacobian(xl, grad);
191 template<
class Basis>
192 struct BasisInterfaceSwitch<Basis,
193 typename std::enable_if<
195 std::integral_constant<
197 Basis::Traits::dimDomain
204 typedef typename Basis::Traits::DomainFieldType
DomainField;
206 static const std::size_t
dimDomainLocal = Basis::Traits::dimDomain;
208 typedef typename Basis::Traits::DomainType
DomainLocal;
211 typedef typename Basis::Traits::RangeFieldType
RangeField;
213 static const std::size_t
dimRange = Basis::Traits::dimRange;
215 typedef typename Basis::Traits::RangeType
Range;
218 template<
typename Geometry>
219 static void gradient(
const Basis& basis,
const Geometry& geometry,
222 Geometry::coorddimension> >& grad)
224 std::vector<typename Basis::Traits::JacobianType> lgrad(basis.size());
225 basis.evaluateJacobian(xl, lgrad);
227 const typename Geometry::JacobianInverseTransposed& jac =
228 geometry.jacobianInverseTransposed(xl);
230 grad.resize(basis.size());
231 for(std::size_t i = 0; i < basis.size(); ++i)
232 jac.mv(lgrad[i][0], grad[i][0]);
Definition: bdfmcube.hh:16
Switch for uniform treatment of finite element with either the local or the global interface.
Definition: interfaceswitch.hh:28
static const Basis & basis(const FiniteElement &fe)
access basis
Definition: interfaceswitch.hh:37
static void setStore(Store &store, FiniteElement &&fe)
Store a finite element in the store.
Definition: interfaceswitch.hh:86
FiniteElement::Traits::Coefficients Coefficients
export the type of the coefficients
Definition: interfaceswitch.hh:34
static void setStore(Store &store, const Store &fe)
Store a finite element in the store.
Definition: interfaceswitch.hh:89
static void setStore(Store &store, const FiniteElement &fe)
Store a finite element in the store.
Definition: interfaceswitch.hh:83
static const Interpolation & interpolation(const FiniteElement &fe)
access interpolation
Definition: interfaceswitch.hh:40
FiniteElement::Traits::Interpolation Interpolation
export the type of the interpolation
Definition: interfaceswitch.hh:32
std::shared_ptr< const FiniteElement > Store
Type for storing finite elements.
Definition: interfaceswitch.hh:76
static const Coefficients & coefficients(const FiniteElement &fe)
access coefficients
Definition: interfaceswitch.hh:43
FiniteElement::Traits::Basis Basis
export the type of the basis
Definition: interfaceswitch.hh:30
Switch for uniform treatment of local and global basis classes.
Definition: interfaceswitch.hh:152
static const std::size_t dimRange
export dimension of the values
Definition: interfaceswitch.hh:163
static const std::size_t dimDomainLocal
export dimension of local coordinates
Definition: interfaceswitch.hh:156
Basis::Traits::RangeField RangeField
export field type of the values
Definition: interfaceswitch.hh:161
Basis::Traits::Range Range
export vector type of the values
Definition: interfaceswitch.hh:165
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:179
Basis::Traits::DomainLocal DomainLocal
export vector type of the local coordinates
Definition: interfaceswitch.hh:158
Basis::Traits::DomainField DomainField
export field types of the coordinates
Definition: interfaceswitch.hh:154