DUNE-ACFEM (2.5.1)

l2innerproductfunctional.hh
1#ifndef __DUNE_ACFEM_L2_INNER_PRODUCT_FUNCTIONAL_HH__
2#define __DUNE_ACFEM_L2_INNER_PRODUCT_FUNCTIONAL_HH__
3
4#include "functionalexpressionbase.hh"
5#include "../../common/quadrature.hh"
6#include "../../functions/gridfunctionexpression.hh"
7
8namespace Dune {
9
10 namespace ACFem {
11
20 template<class DiscreteFunctionSpace,
21 class GridFunction,
22 template<class> class QuadratureTraits = DefaultQuadratureTraits>
23 class L2InnerProductFunctional;
24
25 template<class DiscreteFunctionSpace,
26 class GridFunction,
27 template<class> class QuadratureTraits>
28 class LocalL2InnerProductFunctional;
29
30 template<class DiscreteFunctionSpace,
31 class GridFunction,
32 template<class> class QuadratureTraits>
33 struct L2InnerProductFunctionalTraits
34 : public
35 LinearFunctionalTraitsDefault<
36 L2InnerProductFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits>,
37 LocalL2InnerProductFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits> >
38 {
39 private:
40 typedef L2InnerProductFunctionalTraits ThisType;
41 public:
42 // if GridFunction inherits from ZeroExpression, then we are zero, too
43 typedef typename
45 ZeroFunctionalExpression<DiscreteFunctionSpace, ThisType>,
46 DiscreteLinearFunctionalExpression<DiscreteFunctionSpace, ThisType>
47 >::type
48 ExpressionBaseType;
49 };
50
51 template<class DiscreteFunctionSpace, class GridFunction, template<class> class QuadratureTraits>
52 class L2InnerProductFunctional
53 : public L2InnerProductFunctionalTraits<DiscreteFunctionSpace, GridFunction, QuadratureTraits>::ExpressionBaseType
54 {
55 typedef L2InnerProductFunctional ThisType;
56 public:
57 typedef
58 L2InnerProductFunctionalTraits<DiscreteFunctionSpace, GridFunction, QuadratureTraits>
59 TraitsType;
60 private:
61 typedef typename TraitsType::ExpressionBaseType BaseType;
62 typedef ExpressionStorage<GridFunction> L2FunctionStorage;
63 public:
64 typedef DiscreteFunctionSpace DiscreteFunctionSpaceType;
65 typedef GridFunction L2FunctionType;
66 typedef
67 Fem::Function<typename L2FunctionType::FunctionSpaceType, L2FunctionType>
68 L2FunctionInterfaceType;
69
70 L2InnerProductFunctional(const DiscreteFunctionSpaceType& space,
71 const L2FunctionInterfaceType& L2Fct,
72 unsigned degree = 2*DiscreteFunctionSpaceType::polynomialOrder)
73 : BaseType(space),
74 L2Fct_(static_cast<const L2FunctionType&>(L2Fct)),
75 degree_(degree)
76 {}
77
78 using BaseType::operator();
79 using BaseType::coefficients;
80 using BaseType::space;
81 using BaseType::localFunctional;
82
83 const L2FunctionType& function() const
84 {
85 return L2Fct_();
86 }
87
88 unsigned quadratureDegree() const
89 {
90 return degree_;
91 }
92
93 std::string name() const
94 {
95 return "(" + L2Fct_().name() + ", . )";
96 }
97
98 protected:
99 L2FunctionStorage L2Fct_;
100 const unsigned degree_;
101 };
102
103 template<class DiscreteFunctionSpace, class GridFunction, template<class> class QuadratureTraits>
104 class LocalL2InnerProductFunctional
105 : public LocalLinearFunctionalDefault<DiscreteFunctionSpace,
106 L2InnerProductFunctionalTraits<DiscreteFunctionSpace,
107 GridFunction,
108 QuadratureTraits> >
109 {
110 public:
111 typedef
112 L2InnerProductFunctionalTraits<DiscreteFunctionSpace,
113 GridFunction,
114 QuadratureTraits>
115 TraitsType;
116 private:
117 typedef LocalL2InnerProductFunctional ThisType;
118 typedef LocalLinearFunctionalDefault<DiscreteFunctionSpace, TraitsType> BaseType;
119 public:
120 typedef
121 L2InnerProductFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits>
122 FunctionalType;
123 typedef DiscreteFunctionSpace DiscreteFunctionSpaceType;
124 typedef typename DiscreteFunctionSpaceType::EntityType EntityType;
125 typedef typename DiscreteFunctionSpaceType::RangeFieldType FieldType;
126 typedef FieldType RangeType;
127 protected:
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;
136
137 public:
138 LocalL2InnerProductFunctional(const FunctionalType& phi)
139 : BaseType(phi),
140 l2Local_(phi.function()),
141 degree_(phi.quadratureDegree())
142 {}
143
144 LocalL2InnerProductFunctional(const EntityType& entity, const FunctionalType& phi)
145 : BaseType(entity, phi),
146 l2Local_(phi.function()),
147 degree_(phi.quadratureDegree())
148 {}
149
150 public:
151
152 void init(const EntityType& entity)
153 {
154 l2Local_.init(entity);
155 BaseType::init(entity);
156 }
157
158 template<class LocalFunction>
159 void coefficients(const RangeType& c, LocalFunction& coeffs) const
160 {
161 const auto& entity = coeffs.entity();
162 const auto& geometry = entity.geometry();
163
164 // obtain quadrature order
165 // const int quadOrder = l2Local.order() + coeffs.order();
166 const int quadOrder = degree_;
167
168 MassQuadratureType quadrature(entity, quadOrder);
169 const size_t numQuadraturePoints = quadrature.nop();
170 for (size_t pt = 0; pt < numQuadraturePoints; ++pt) {
171
172 const typename MassQuadratureType::CoordinateType &x = quadrature.point(pt);
173 const double weight = quadrature.weight(pt) * geometry.integrationElement(x);
174
175 typename LocalL2FunctionType::RangeType f;
176 l2Local_.evaluate(quadrature[pt], f);
177
178 // add to local function
179 f *= weight * c;
180 coeffs.axpy(quadrature[pt], f);
181 } // end quad loop
182 }
183
184 template<class LocalFunction>
185 void coefficients(LocalFunction& coeffs) const
186 {
188 }
189
190 using BaseType::operator();
191 using BaseType::functional;
192 using BaseType::entity;
193
194 protected:
195 using BaseType::entity_;
196 LocalL2FunctionType l2Local_;
197 const unsigned degree_;
198 };
199
204 template<class DiscreteFunction, class GridFunction>
205 static inline
206 double
207 l2InnerProductFunctional(const
208 Fem::Function<typename GridFunction::FunctionSpaceType, GridFunction>& u,
209 const
210 Fem::DiscreteFunctionInterface<DiscreteFunction> &p)
211 {
212 L2InnerProductFunctional<typename DiscreteFunction::DiscreteFunctionSpaceType, GridFunction>
213 functional(p.space(), u);
214 return functional(p);
215 }
216
218 template<class DiscreteSpaceTraits, class GridFunction>
219 static inline
220 L2InnerProductFunctional<typename DiscreteSpaceTraits::DiscreteFunctionSpaceType, GridFunction>
221 l2InnerProductFunctional(const
222 Fem::Function<typename GridFunction::FunctionSpaceType, GridFunction>& u,
223 const
224 Fem::DiscreteFunctionSpaceInterface<DiscreteSpaceTraits>& space)
225 {
226 typedef
227 L2InnerProductFunctional<typename DiscreteSpaceTraits::DiscreteFunctionSpaceType, GridFunction>
228 FunctionalType;
229
230 return FunctionalType(space, u);
231 }
232
234
236
238
239 } // namespace ACFem
240
241} // namespace Dune
242
243#endif // __DUNE_ACFEM_L2_INNER_PRODUCT_FUNCTIONAL_HH__
244
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
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Mar 12, 23:28, 2025)