1#ifndef __DUNE_ACFEM_L2_INNER_PRODUCT_FUNCTIONAL_HH__
2#define __DUNE_ACFEM_L2_INNER_PRODUCT_FUNCTIONAL_HH__
4#include "functionalexpressionbase.hh"
5#include "../../common/quadrature.hh"
6#include "../../functions/gridfunctionexpression.hh"
20 template<
class DiscreteFunctionSpace,
22 template<
class>
class QuadratureTraits = DefaultQuadratureTraits>
23 class L2InnerProductFunctional;
25 template<
class DiscreteFunctionSpace,
27 template<
class>
class QuadratureTraits>
28 class LocalL2InnerProductFunctional;
30 template<
class DiscreteFunctionSpace,
32 template<
class>
class QuadratureTraits>
33 struct L2InnerProductFunctionalTraits
35 LinearFunctionalTraitsDefault<
36 L2InnerProductFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits>,
37 LocalL2InnerProductFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits> >
40 typedef L2InnerProductFunctionalTraits ThisType;
45 ZeroFunctionalExpression<DiscreteFunctionSpace, ThisType>,
46 DiscreteLinearFunctionalExpression<DiscreteFunctionSpace, ThisType>
51 template<
class DiscreteFunctionSpace,
class Gr
idFunction,
template<
class>
class QuadratureTraits>
52 class L2InnerProductFunctional
53 :
public L2InnerProductFunctionalTraits<DiscreteFunctionSpace, GridFunction, QuadratureTraits>::ExpressionBaseType
55 typedef L2InnerProductFunctional ThisType;
58 L2InnerProductFunctionalTraits<DiscreteFunctionSpace, GridFunction, QuadratureTraits>
61 typedef typename TraitsType::ExpressionBaseType BaseType;
62 typedef ExpressionStorage<GridFunction> L2FunctionStorage;
64 typedef DiscreteFunctionSpace DiscreteFunctionSpaceType;
65 typedef GridFunction L2FunctionType;
67 Fem::Function<typename L2FunctionType::FunctionSpaceType, L2FunctionType>
68 L2FunctionInterfaceType;
70 L2InnerProductFunctional(
const DiscreteFunctionSpaceType& space,
71 const L2FunctionInterfaceType& L2Fct,
72 unsigned degree = 2*DiscreteFunctionSpaceType::polynomialOrder)
74 L2Fct_(static_cast<const L2FunctionType&>(L2Fct)),
78 using BaseType::operator();
79 using BaseType::coefficients;
80 using BaseType::space;
81 using BaseType::localFunctional;
83 const L2FunctionType& function()
const
88 unsigned quadratureDegree()
const
93 std::string name()
const
95 return "(" + L2Fct_().name() +
", . )";
99 L2FunctionStorage L2Fct_;
100 const unsigned degree_;
103 template<
class DiscreteFunctionSpace,
class Gr
idFunction,
template<
class>
class QuadratureTraits>
104 class LocalL2InnerProductFunctional
105 :
public LocalLinearFunctionalDefault<DiscreteFunctionSpace,
106 L2InnerProductFunctionalTraits<DiscreteFunctionSpace,
112 L2InnerProductFunctionalTraits<DiscreteFunctionSpace,
117 typedef LocalL2InnerProductFunctional ThisType;
118 typedef LocalLinearFunctionalDefault<DiscreteFunctionSpace, TraitsType> BaseType;
121 L2InnerProductFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits>
123 typedef DiscreteFunctionSpace DiscreteFunctionSpaceType;
124 typedef typename DiscreteFunctionSpaceType::EntityType EntityType;
125 typedef typename DiscreteFunctionSpaceType::RangeFieldType FieldType;
126 typedef FieldType RangeType;
128 typedef typename FunctionalType::L2FunctionType L2FunctionType;
129 typedef typename L2FunctionType::LocalFunctionType LocalL2FunctionType;
130 typedef typename DiscreteFunctionSpaceType::GridPartType GridPartType;
131 typedef QuadratureTraits<GridPartType> QuadratureTraitsType;
132 typedef typename QuadratureTraitsType::BulkQuadratureType QuadratureType;
133 typedef typename QuadratureTraitsType::BulkMassQuadratureType MassQuadratureType;
134 typedef typename QuadratureTraitsType::FaceQuadratureType FaceQuadratureType;
135 typedef typename QuadratureTraitsType::FaceMassQuadratureType FaceMassQuadratureType;
138 LocalL2InnerProductFunctional(
const FunctionalType& phi)
140 l2Local_(phi.function()),
141 degree_(phi.quadratureDegree())
144 LocalL2InnerProductFunctional(
const EntityType& entity,
const FunctionalType& phi)
145 : BaseType(entity, phi),
146 l2Local_(phi.function()),
147 degree_(phi.quadratureDegree())
152 void init(
const EntityType& entity)
154 l2Local_.init(entity);
158 template<
class LocalFunction>
159 void coefficients(
const RangeType& c, LocalFunction& coeffs)
const
161 const auto& entity = coeffs.entity();
162 const auto& geometry = entity.geometry();
166 const int quadOrder = degree_;
168 MassQuadratureType quadrature(entity, quadOrder);
169 const size_t numQuadraturePoints = quadrature.nop();
170 for (
size_t pt = 0; pt < numQuadraturePoints; ++pt) {
172 const typename MassQuadratureType::CoordinateType &x = quadrature.point(pt);
173 const double weight = quadrature.weight(pt) * geometry.integrationElement(x);
175 typename LocalL2FunctionType::RangeType f;
176 l2Local_.evaluate(quadrature[pt], f);
180 coeffs.axpy(quadrature[pt], f);
184 template<
class LocalFunction>
190 using BaseType::operator();
191 using BaseType::functional;
192 using BaseType::entity;
195 using BaseType::entity_;
196 LocalL2FunctionType l2Local_;
197 const unsigned degree_;
204 template<
class DiscreteFunction,
class Gr
idFunction>
207 l2InnerProductFunctional(
const
208 Fem::Function<typename GridFunction::FunctionSpaceType, GridFunction>& u,
210 Fem::DiscreteFunctionInterface<DiscreteFunction> &p)
212 L2InnerProductFunctional<typename DiscreteFunction::DiscreteFunctionSpaceType, GridFunction>
213 functional(p.space(), u);
214 return functional(p);
218 template<
class DiscreteSpaceTraits,
class Gr
idFunction>
220 L2InnerProductFunctional<typename DiscreteSpaceTraits::DiscreteFunctionSpaceType, GridFunction>
221 l2InnerProductFunctional(
const
222 Fem::Function<typename GridFunction::FunctionSpaceType, GridFunction>& u,
224 Fem::DiscreteFunctionSpaceInterface<DiscreteSpaceTraits>& space)
227 L2InnerProductFunctional<typename DiscreteSpaceTraits::DiscreteFunctionSpaceType, GridFunction>
230 return FunctionalType(space, u);
void coefficients(const RangeType &c, LocalFunction &coeffs) const
Definition: linearfunctional.hh:443
void coefficients(LocalFunction &coeffs) const
Compute the basis representation, which means: do the assembling stuff.
Definition: linearfunctional.hh:436
void init(const EntityType &entity)
Bind to an entity.
Definition: linearfunctional.hh:403
constexpr bool isZero(Expression &&)
Specialize to evaluate to true for zero expressions.
Definition: expressionoperations.hh:469