DUNE-ACFEM (2.5.1)

divergencefunctional.hh
1#ifndef __DUNE_ACFEM_DIVERGENCE_FUNCTIONAL_HH__
2#define __DUNE_ACFEM_DIVERGENCE_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 DivergenceFunctional;
24
25 template<class DiscreteFunctionSpace,
26 class GridFunction,
27 template<class> class QuadratureTraits>
28 class LocalDivergenceFunctional;
29
30 template<class DiscreteFunctionSpace,
31 class GridFunction,
32 template<class> class QuadratureTraits>
33 struct DivergenceFunctionalTraits
34 : public
35 LinearFunctionalTraitsDefault<
36 DivergenceFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits>,
37 LocalDivergenceFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits> >
38 {
39 private:
40 typedef DivergenceFunctionalTraits 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 DivergenceFunctional
53 : public DivergenceFunctionalTraits<DiscreteFunctionSpace, GridFunction, QuadratureTraits>::ExpressionBaseType
54 {
55 typedef DivergenceFunctional ThisType;
56 public:
57 typedef
58 DivergenceFunctionalTraits<DiscreteFunctionSpace, GridFunction, QuadratureTraits>
59 TraitsType;
60 private:
61 typedef typename TraitsType::ExpressionBaseType BaseType;
62 typedef ExpressionStorage<GridFunction> DivergenceFunctionStorage;
63 public:
64 typedef DiscreteFunctionSpace DiscreteFunctionSpaceType;
65 typedef GridFunction DivergenceFunctionType;
66 typedef
67 Fem::Function<typename DivergenceFunctionType::FunctionSpaceType, DivergenceFunctionType>
68 DivergenceFunctionInterfaceType;
69 typedef
70 Fem::DiscreteFunctionSpaceInterface<typename DiscreteFunctionSpaceType::Traits>
71 DiscreteFunctionSpaceInterfaceType;
72
73 static_assert(DivergenceFunctionType::DiscreteFunctionSpaceType::FunctionSpaceType::dimRange
74 ==
75 DivergenceFunctionType::DiscreteFunctionSpaceType::FunctionSpaceType::dimDomain,
76 "must have dimRange == dimDomain for divergence");
77
78 static_assert(DiscreteFunctionSpaceType::FunctionSpaceType::dimRange == 1,
79 "must have dimRange == 1 for test space, div is a scalar quantity");
80
81 DivergenceFunctional(const DiscreteFunctionSpaceInterfaceType& space,
82 const DivergenceFunctionInterfaceType& divFct,
83 unsigned degree = (DiscreteFunctionSpaceType::polynomialOrder
84 +
85 DivergenceFunctionType::DiscreteFunctionSpaceType::polynomialOrder - 1))
86 : BaseType(static_cast<const DiscreteFunctionSpaceType&>(space)),
87 divFct_(static_cast<const DivergenceFunctionType&>(divFct)),
88 degree_(degree > 111 ? (2*space.order() - 1) : degree)
89 {}
90
91 using BaseType::operator();
92 using BaseType::coefficients;
93 using BaseType::space;
94 using BaseType::localFunctional;
95
96 const DivergenceFunctionType& function() const
97 {
98 return divFct_();
99 }
100
101 unsigned quadratureDegree() const
102 {
103 return degree_;
104 }
105
106 std::string name() const
107 {
108 return "(div " + divFct_().name() + ", . )";
109 }
110
111 protected:
112 DivergenceFunctionStorage divFct_;
113 const unsigned degree_;
114 };
115
116 template<class DiscreteFunctionSpace, class GridFunction, template<class> class QuadratureTraits>
117 class LocalDivergenceFunctional
118 : public
119 LocalLinearFunctionalDefault<DiscreteFunctionSpace,
120 DivergenceFunctionalTraits<DiscreteFunctionSpace,
121 GridFunction,
122 QuadratureTraits> >
123 {
124 public:
125 typedef
126 DivergenceFunctionalTraits<DiscreteFunctionSpace, GridFunction, QuadratureTraits>
127 TraitsType;
128 private:
129 typedef LocalDivergenceFunctional ThisType;
130 typedef LocalLinearFunctionalDefault<DiscreteFunctionSpace, TraitsType> BaseType;
131 public:
132 typedef
133 DivergenceFunctional<DiscreteFunctionSpace, GridFunction, QuadratureTraits>
134 FunctionalType;
135 typedef DiscreteFunctionSpace DiscreteFunctionSpaceType;
136 typedef typename DiscreteFunctionSpaceType::EntityType EntityType;
137 typedef typename DiscreteFunctionSpaceType::RangeFieldType FieldType;
138 typedef FieldType RangeType;
139 protected:
140 typedef typename FunctionalType::DivergenceFunctionType DivergenceFunctionType;
141 typedef typename DivergenceFunctionType::LocalFunctionType LocalDivergenceFunctionType;
142 typedef typename DiscreteFunctionSpaceType::GridPartType GridPartType;
143 typedef QuadratureTraits<GridPartType> QuadratureTraitsType;
144 typedef typename QuadratureTraitsType::BulkQuadratureType QuadratureType;
145 typedef typename QuadratureTraitsType::BulkMassQuadratureType MassQuadratureType;
146 typedef typename QuadratureTraitsType::FaceQuadratureType FaceQuadratureType;
147 typedef typename QuadratureTraitsType::FaceMassQuadratureType FaceMassQuadratureType;
148 public:
149 LocalDivergenceFunctional(const FunctionalType& phi)
150 : BaseType(phi),
151 divLocal_(phi.function()),
152 degree_(phi.quadratureDegree())
153 {}
154
155 LocalDivergenceFunctional(const EntityType& entity, const FunctionalType& phi)
156 : BaseType(entity, phi),
157 divLocal_(phi.function()),
158 degree_(phi.quadratureDegree())
159 {}
160
161 public:
162
163 void init(const EntityType& entity)
164 {
165 divLocal_.init(entity);
166 BaseType::init(entity);
167 }
168
169 template<class LocalFunction>
170 void coefficients(const RangeType& c, LocalFunction& coeffs) const
171 {
172 const auto& entity = coeffs.entity();
173 const auto& geometry = entity.geometry();
174
175 // obtain quadrature order
176 // const int quadOrder = divLocal.order() + coeffs.order();
177 const int quadOrder = degree_;
178
179 MassQuadratureType quadrature(entity, quadOrder);
180 const size_t numQuadraturePoints = quadrature.nop();
181 for (size_t pt = 0; pt < numQuadraturePoints; ++pt) {
182
183 const typename MassQuadratureType::CoordinateType &x = quadrature.point(pt);
184 const double weight = quadrature.weight(pt) * geometry.integrationElement(x);
185
186 typename LocalDivergenceFunctionType::JacobianRangeType Df;
187 divLocal_.jacobian(quadrature[pt], Df);
188
189 typename DiscreteFunctionSpaceType::RangeType divf(0);
190 for (int i = 0; i < LocalDivergenceFunctionType::dimDomain; ++i) {
191 divf[0] += Df[i][i];
192 }
193
194 // add to local function
195 divf *= weight * c;
196 coeffs.axpy(quadrature[pt], divf);
197 } // end quad loop
198 }
199
200 template<class LocalFunction>
201 void coefficients(LocalFunction& coeffs) const
202 {
204 }
205
206 using BaseType::operator();
207 using BaseType::functional;
208 using BaseType::entity;
209
210 protected:
211 using BaseType::entity_;
212 LocalDivergenceFunctionType divLocal_;
213 const unsigned degree_;
214 };
215
224 template<class DiscreteFunction, class GridFunction>
225 static inline
226 double
228 Fem::Function<typename GridFunction::FunctionSpaceType, GridFunction>& u,
229 const
230 Fem::DiscreteFunctionInterface<DiscreteFunction>& p)
231 {
232 DivergenceFunctional<typename DiscreteFunction::DiscreteFunctionSpaceType, GridFunction>
233 functional(p.space(), u);
234 return functional(p);
235 }
236
238 template<class DiscreteSpaceTraits, class GridFunction>
239 static inline
240 DivergenceFunctional<typename DiscreteSpaceTraits::DiscreteFunctionSpaceType, GridFunction>
242 Fem::Function<typename GridFunction::FunctionSpaceType, GridFunction>& u,
243 const
244 Fem::DiscreteFunctionSpaceInterface<DiscreteSpaceTraits>& space)
245 {
246 typedef
247 DivergenceFunctional<typename DiscreteSpaceTraits::DiscreteFunctionSpaceType, GridFunction>
248 FunctionalType;
249
250 return FunctionalType(space, u);
251 }
252
254
256
258
259 } // namespace ACFem
260
261} // namespace Dune
262
263#endif // __DUNE_ACFEM_DIVERGENCE_FUNCTIONAL_HH__
264
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
static double divergenceFunctional(const Fem::Function< typename GridFunction::FunctionSpaceType, GridFunction > &u, const Fem::DiscreteFunctionInterface< DiscreteFunction > &p)
Application of divergence functional.
Definition: divergencefunctional.hh:227
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Mar 12, 23:28, 2025)