KASKADE 7 development version
semieuler.hh
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the library KASKADE 7 */
4/* https://www.zib.de/research/projects/kaskade7-finite-element-toolbox */
5/* */
6/* Copyright (C) 2002-2021 Zuse Institute Berlin */
7/* */
8/* KASKADE 7 is distributed under the terms of the ZIB Academic License. */
9/* see $KASKADE/academic.txt */
10/* */
11/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12
13#ifndef SEMIEULERINNER_HH
14#define SEMIEULERINNER_HH
15
16#include <cmath>
17
18#include "fem/fixdune.hh"
19#include "fem/variables.hh"
20#include "fem/functional_aux.hh"
21namespace Kaskade
22{
23 namespace SemiEulerDetail
24 {
25 template <class ParabolicEquation, class SemiEuler, bool hasInnerBoundaryCache>
27 {
28 };
29
30 template <class ParabolicEquation, class SemiEuler>
32 {
33 private:
34 using SemiEulerStep = SemiEuler;
35
36 public:
42 class InnerBoundaryCache
43 {
44 using AnsatzVars = typename SemiEulerStep::AnsatzVars;
45 using TestVars = typename SemiEulerStep::TestVars;
46 using AnsatzVariableSet = typename AnsatzVars::VariableSet;
47 using Scalar = typename ParabolicEquation::Scalar;
48
49 public:
50 InnerBoundaryCache(SemiEulerStep const& f_,
51 AnsatzVariableSet const& vars_,
52 AnsatzVariableSet const& varsJ_,
53 AnsatzVariableSet const& du_,
54 int flags)
55 : f(f_)
56 , peibc(f.parabolicEquation(),vars_,flags)
57 , peibcJ(f.parabolicEquation(),varsJ_,flags)
58 , du(du_)
59 {}
60
61
62 template <class FaceIterator>
63 void moveTo(FaceIterator const& face)
64 {
65 peibc.moveTo(face);
66 peibcJ.moveTo(face);
67 }
68
76 template <class Position, class Evaluators>
77 void evaluateAt(Position const& x, Evaluators const& evaluators, Evaluators const& neighbourEvaluators)
78 {
79 peibc.evaluateAt(x, evaluators, neighbourEvaluators);
80 peibcJ.evaluateAt(x, evaluators,neighbourEvaluators);
81 }
82
83
91 template <int row, int dim>
93 {
94 return f.getTau() * peibc.template d1<row>(argT);
95 }
96
109 template <int row, int col, int dim>
111 d2(VariationalArg<Scalar,dim> const& argT, VariationalArg<Scalar,dim> const& argA, bool centerCell) const
112 {
114 AnsatzVars::template components<col>> result(0);
115
116
117 if (ParabolicEquation::template B2<row,col>::present)
118 result = peibcJ.template b2<row,col>(argT, argA, centerCell);
119
120 if (ParabolicEquation::template D2<row,col>::present)
121 result -= f.getTau()*peibcJ.template d2<row,col>(argT, argA, centerCell);
122
123 return result;
124 }
125
126
127 private:
128 SemiEulerStep const& f;
129 typename ParabolicEquation::InnerBoundaryCache peibc;
130 typename ParabolicEquation::InnerBoundaryCache peibcJ;
131 AnsatzVariableSet const& du;
132 };
133
134 template <class Face>
135 bool considerFace(Face const& face) const
136 {
137 return static_cast<SemiEuler const*>(this)->parabolicEquation().considerFace(face);
138 }
139
140 };
141 }
142
143
196 template <class PE>
198 : public SemiEulerDetail::SemiImplicitEulerInnerBoundaryPolicyImpl<PE,SemiImplicitEulerStep<PE>,
199 hasInnerBoundaryCache<PE>>
200 {
203
204 public:
206
211 typedef typename AnsatzVars::Grid Grid;
212 using GridView = typename AnsatzVars::GridView;
213
215
217
218 typedef typename EvolutionEquation::AnsatzVars::template CoefficientVectorRepresentation<0,EvolutionEquation::TestVars::noOfVariables>::type CoefficientVectors;
219
220
221
223 {
224 public:
234 DomainCache(SemiImplicitEulerStep<ParabolicEquation> const& f_, // TODO: implement tauRatio
235 typename AnsatzVars::VariableSet const& vars_,
236 typename AnsatzVars::VariableSet const& varsJ_,
237 typename AnsatzVars::VariableSet const& duVars_,
238 int flags):
239 f(f_), pedc(*f_.eq,vars_,flags), pedcJ(*f_.eq,varsJ_,flags), duVars(duVars_)
240 {}
241
242 void moveTo(typename Grid::template Codim<0>::Entity const& entity) {
243 pedc.moveTo(entity);
244 pedcJ.moveTo(entity);
245 }
246
247 template <class Position, class Evaluators>
248 void evaluateAt(Position const& x, Evaluators const& evaluators)
249 {
250 pedc.evaluateAt(x, evaluators);
251 pedcJ.evaluateAt(x, evaluators);
252 du = evaluateVariables(duVars,evaluators,valueMethod);
253 }
254
255 template<int row, int dim>
257 d1 (VariationalArg<Scalar,dim> const& arg) const
258 {
259 Dune::FieldVector<Scalar, TestVars::template components<row>> result( f.getTau() * pedc.template d1<row>(arg) );
260
261 boost::fusion::for_each(typename AnsatzVars::Variables(),MultiplyDifference<row,dim>(pedc,pedcJ,du,arg,result));
262 return result;
263 }
264
265 template<int row, int col, int dim>
266 Dune::FieldMatrix<Scalar, TestVars::template components<row>, AnsatzVars::template components<col>>
268 {
269 Dune::FieldMatrix<Scalar,TestVars::template components<row>,AnsatzVars::template components<col>> result(0);
270
271
272 if (ParabolicEquation::template B2<row,col>::present)
273 result = pedcJ.template b2<row,col>(arg1, arg2);
274
275 if (ParabolicEquation::template D2<row,col>::present)
276 result -= f.getTau()*pedcJ.template d2<row,col>(arg1, arg2);
277
278 return result;
279 }
280
281 private:
283 typename ParabolicEquation::DomainCache pedc; // for evaluating rhs at u_k
284 typename ParabolicEquation::DomainCache pedcJ; // for evaluating Jacobian at u_0
285 typename AnsatzVars::VariableSet const& duVars;
287
288
289 template <int row, int dim>
290 class MultiplyDifference
291 {
292 public:
293 MultiplyDifference(typename ParabolicEquation::DomainCache pedc_,
294 typename ParabolicEquation::DomainCache pedcJ_,
296 VariationalArg<Scalar,dim> const& arg_,
297 Dune::FieldVector<Scalar, TestVars::template Components<row>::m>& result_)
298 : pedc(pedc_), pedcJ(pedcJ_), du(du_), arg(arg_), result(result_)
299 {}
300
301 template <class VarDescription>
302 void operator()(VarDescription const& vd) const
303 {
304 // compute <(B(u0)-B(uk))*du,arg>
305 int const col = VarDescription::id;
306
307 if (ParabolicEquation::template B2<row,col>::present && !ParabolicEquation::template B2<row,col>::constant)
308 {
309 // @TODO: should work with vector-valued shape functions
311 duArg.value[0] = 1;
312 result += (pedcJ.template b2<row,col>(arg,duArg)-pedc.template b2<row,col>(arg,duArg)) * boost::fusion::at_c<col>(du);
313 }
314 }
315
316 private:
317 typename ParabolicEquation::DomainCache const& pedc;
318 typename ParabolicEquation::DomainCache const& pedcJ;
320 VariationalArg<Scalar,dim> const& arg;
322 };
323
324 };
325
326 // TODO: currently a dependence of the boundary part of B on u is not implemented
328 {
329 public:
330 typedef typename AnsatzVars::GridView::IntersectionIterator FaceIterator;
331
333 typename AnsatzVars::VariableSet const& vars_,
334 typename AnsatzVars::VariableSet const& varsJ_,
335 typename AnsatzVars::VariableSet const& du_,
336 int flags)
337 : f(f_), pedc(*f_.eq,vars_,flags), pedcJ(*f_.eq,varsJ_,flags), du(du_) {}
338
339 void moveTo(FaceIterator const& entity)
340 {
341 pedc.moveTo(entity);
342 pedcJ.moveTo(entity);
343 }
344
345 template <class Evaluators>
347 Evaluators const& evaluators)
348 {
349 pedc.evaluateAt(x, evaluators);
350 pedcJ.evaluateAt(x, evaluators);
351 }
352
353 template<int row, int dim>
355 {
356 return f.getTau() * pedc.template d1<row>(arg);
357 }
358
359 template<int row, int col, int dim>
360 Dune::FieldMatrix<Scalar, TestVars::template components<row>, AnsatzVars::template components<col>>
362 {
363 // to be corrected - include b2
364 if (ParabolicEquation::template D2<row,col>::present)
365 return - f.getTau()*pedcJ.template d2<row,col>(arg1, arg2);
366
367 return 0.0; // never get here
368 }
369
370 private:
374 typename AnsatzVars::VariableSet const& du;
375 };
376
377
378
379 public:
380 template <int row, int col>
381 struct D2: public ParabolicEquation::template D2<row,col>
382 {
383 static bool const present = (ParabolicEquation::template D2<row,col>::present ||
384 ParabolicEquation::template B2<row,col>::present);
385 static bool const symmetric = (!ParabolicEquation::template D2<row,col>::present ||
386 ParabolicEquation::template D2<row,col>::symmetric) &&
387 (!ParabolicEquation::template B2<row,col>::present ||
388 ParabolicEquation::template B2<row,col>::symmetric);
389 // static bool const constant = (!ParabolicEquation::template D2<row,col>::present ||
390 // ParabolicEquation::template D2<row,col>::constant) &&
391 // (!ParabolicEquation::template B2<row,col>::present ||
392 // ParabolicEquation::template B2<row,col>::constant);
393 static bool const lumped = ((ParabolicEquation::template D2<row,col>::lumped ||
394 !ParabolicEquation::template D2<row,col>::present) &&
395 (ParabolicEquation::template B2<row,col>::lumped||
396 !ParabolicEquation::template B2<row,col>::present));
397
398 };
399
400 template <int row>
401 struct D1: public ParabolicEquation::template D1<row>
402 {
403 };
404
413 : eq(eq_)
414 , tau(dt)
415 {}
416
417 template <class Cell>
418 int integrationOrder(Cell const& cell, int shapeFunctionOrder, bool boundary) const
419 {
420 return eq->integrationOrder(cell,shapeFunctionOrder,boundary);
421 }
422
429 {
430 tau = dt;
431 assert(tau >= 0);
432 return *this;
433 }
434
435 Scalar getTau() const { return tau; }
436
437
443 ParabolicEquation const& parabolicEquation() const { return *eq; }
451 private:
453 Scalar tau; // the time step
454 bool onlyJacobian = false; //
455 bool onlyMassMatrix = false; //
456 };
457} // namespace Kaskade
458#endif
void evaluateAt(Position const &x, Evaluators const &evaluators, Evaluators const &neighbourEvaluators)
Prepare the cache for evaluation at given quadrature point.
Definition: semieuler.hh:77
InnerBoundaryCache(SemiEulerStep const &f_, AnsatzVariableSet const &vars_, AnsatzVariableSet const &varsJ_, AnsatzVariableSet const &du_, int flags)
Definition: semieuler.hh:50
Dune::FieldMatrix< Scalar, TestVars::template Components< row >::m, AnsatzVars::template Components< row >::m > d2(VariationalArg< Scalar, dim > const &argT, VariationalArg< Scalar, dim > const &argA, bool centerCell) const
Definition: semieuler.hh:111
Dune::FieldVector< Scalar, TestVars::template Components< row >::m > d1(VariationalArg< Scalar, dim > const &argT) const
Definition: semieuler.hh:92
void evaluateAt(Dune::FieldVector< typename Grid::ctype, Grid::dimension-1 > const &x, Evaluators const &evaluators)
Definition: semieuler.hh:346
AnsatzVars::GridView::IntersectionIterator FaceIterator
Definition: semieuler.hh:330
BoundaryCache(SemiImplicitEulerStep< ParabolicEquation > const &f_, typename AnsatzVars::VariableSet const &vars_, typename AnsatzVars::VariableSet const &varsJ_, typename AnsatzVars::VariableSet const &du_, int flags)
Definition: semieuler.hh:332
Dune::FieldVector< Scalar, TestVars::template components< row > > d1(VariationalArg< Scalar, dim > const &arg) const
Definition: semieuler.hh:354
Dune::FieldMatrix< Scalar, TestVars::template components< row >, AnsatzVars::template components< col > > d2(VariationalArg< Scalar, dim > const &arg1, VariationalArg< Scalar, dim > const &arg2) const
Definition: semieuler.hh:361
void moveTo(FaceIterator const &entity)
Definition: semieuler.hh:339
Dune::FieldVector< Scalar, TestVars::template components< row > > d1(VariationalArg< Scalar, dim > const &arg) const
Definition: semieuler.hh:257
void evaluateAt(Position const &x, Evaluators const &evaluators)
Definition: semieuler.hh:248
DomainCache(SemiImplicitEulerStep< ParabolicEquation > const &f_, typename AnsatzVars::VariableSet const &vars_, typename AnsatzVars::VariableSet const &varsJ_, typename AnsatzVars::VariableSet const &duVars_, int flags)
Constructor.
Definition: semieuler.hh:234
void moveTo(typename Grid::template Codim< 0 >::Entity const &entity)
Definition: semieuler.hh:242
Dune::FieldMatrix< Scalar, TestVars::template components< row >, AnsatzVars::template components< col > > d2(VariationalArg< Scalar, dim > const &arg1, VariationalArg< Scalar, dim > const &arg2) const
Definition: semieuler.hh:267
Linearly implicit Euler method.
Definition: semieuler.hh:200
ParabolicEquation::TestVars TestVars
Definition: semieuler.hh:209
ParabolicEquation::Scalar Scalar
Definition: semieuler.hh:207
Self & setTau(Scalar dt)
Sets the time step size.
Definition: semieuler.hh:428
static ProblemType const type
Definition: semieuler.hh:214
ParabolicEquation::OriginVars OriginVars
Definition: semieuler.hh:210
int integrationOrder(Cell const &cell, int shapeFunctionOrder, bool boundary) const
Definition: semieuler.hh:418
ParabolicEquation & parabolicEquation()
Definition: semieuler.hh:442
typename AnsatzVars::GridView GridView
Definition: semieuler.hh:212
EvolutionEquation::AnsatzVars::template CoefficientVectorRepresentation< 0, EvolutionEquation::TestVars::noOfVariables >::type CoefficientVectors
Definition: semieuler.hh:218
SemiImplicitEulerStep(ParabolicEquation *eq_, Scalar dt)
Constructor.
Definition: semieuler.hh:412
ParabolicEquation::AnsatzVars AnsatzVars
Definition: semieuler.hh:208
ParabolicEquation const & parabolicEquation() const
Definition: semieuler.hh:443
Documentation of the concept of a parabolic parabolic equation.
unspecified Scalar
The scalar type to be used for this variational problem.
unspecified OriginVars
A description of the type of current evaluation state.
unspecified AnsatzVars
A description of the ansatz variables occuring in the weak formulation. This should be an instance of...
int integrationOrder(typename Variables::Grid::template Codim< 0 >::Entity const &cell, int shapeFunctionOrder, bool boundary) const
This file contains various utility functions that augment the basic functionality of Dune.
Utility classes for the definition and use of variational functionals.
typename boost::fusion::result_of::as_vector< typename boost::fusion::result_of::transform< Spaces, GetEvaluatorTypes >::type >::type Evaluators
the heterogeneous sequence type of Evaluators for the given spaces
ProblemType
A type for describing the nature of a PDE problem.
typename GridView::template Codim< 0 >::Entity Cell
The type of cells (entities of codimension 0) in the grid view.
Definition: gridBasics.hh:35
typename GridView::Intersection Face
The type of faces in the grid view.
Definition: gridBasics.hh:42
decltype(evaluateVariables(std::declval< VariableSet >(), std::declval< typename VariableSet::Descriptions::Evaluators >(), std::declval< Method >())) EvaluateVariables
The type of evaluated variables as returned by evaluateVariables.
Definition: variables.hh:1008
constexpr auto valueMethod
Helper method for evaluating whole variable sets.
Definition: variables.hh:1018
auto evaluateVariables(VariableSet const &vars, typename VariableSet::Descriptions::Evaluators const &eval, Method const &method=Method())
A function evaulating all functions in a variable set using the provided method.
Definition: variables.hh:988
Helper class for specifying the number of components of a variable.
Definition: variables.hh:100
A class that stores values, gradients, and Hessians of evaluated shape functions.
ValueType value
The shape function's value, a vector of dimension components
Defining boundary conditions.
This evaluation cache concept defines the interface that is accessed by the assembler.
void evaluateAt(Position const &x, Evaluators const &evaluators)
Variables and their descriptions.