13#ifndef SEMIEULERINNER_HH
14#define SEMIEULERINNER_HH
23 namespace SemiEulerDetail
25 template <
class ParabolicEquation,
class SemiEuler,
bool hasInnerBoundaryCache>
30 template <
class ParabolicEquation,
class SemiEuler>
34 using SemiEulerStep = SemiEuler;
42 class InnerBoundaryCache
44 using AnsatzVars =
typename SemiEulerStep::AnsatzVars;
45 using TestVars =
typename SemiEulerStep::TestVars;
46 using AnsatzVariableSet =
typename AnsatzVars::VariableSet;
51 AnsatzVariableSet
const& vars_,
52 AnsatzVariableSet
const& varsJ_,
53 AnsatzVariableSet
const& du_,
56 , peibc(f.parabolicEquation(),vars_,flags)
57 , peibcJ(f.parabolicEquation(),varsJ_,flags)
62 template <
class FaceIterator>
63 void moveTo(FaceIterator
const& face)
76 template <
class Position,
class Evaluators>
79 peibc.evaluateAt(x, evaluators, neighbourEvaluators);
80 peibcJ.evaluateAt(x, evaluators,neighbourEvaluators);
91 template <
int row,
int dim>
94 return f.getTau() * peibc.template d1<row>(argT);
109 template <
int row,
int col,
int dim>
114 AnsatzVars::template components<col>> result(0);
117 if (ParabolicEquation::template B2<row,col>::present)
118 result = peibcJ.template b2<row,col>(argT, argA, centerCell);
120 if (ParabolicEquation::template D2<row,col>::present)
121 result -= f.getTau()*peibcJ.template d2<row,col>(argT, argA, centerCell);
128 SemiEulerStep
const& f;
129 typename ParabolicEquation::InnerBoundaryCache peibc;
130 typename ParabolicEquation::InnerBoundaryCache peibcJ;
131 AnsatzVariableSet
const& du;
134 template <
class Face>
137 return static_cast<SemiEuler const*
>(
this)->parabolicEquation().considerFace(face);
199 hasInnerBoundaryCache<PE>>
211 typedef typename AnsatzVars::Grid
Grid;
218 typedef typename EvolutionEquation::AnsatzVars::template CoefficientVectorRepresentation<0,EvolutionEquation::TestVars::noOfVariables>::type
CoefficientVectors;
235 typename AnsatzVars::VariableSet
const& vars_,
236 typename AnsatzVars::VariableSet
const& varsJ_,
237 typename AnsatzVars::VariableSet
const& duVars_,
239 f(f_), pedc(*f_.eq,vars_,flags), pedcJ(*f_.eq,varsJ_,flags), duVars(duVars_)
242 void moveTo(
typename Grid::template Codim<0>::Entity
const& entity) {
247 template <
class Position,
class Evaluators>
255 template<
int row,
int dim>
261 boost::fusion::for_each(
typename AnsatzVars::Variables(),MultiplyDifference<row,dim>(pedc,pedcJ,du,arg,result));
265 template<
int row,
int col,
int dim>
272 if (ParabolicEquation::template B2<row,col>::present)
273 result = pedcJ.template b2<row,col>(arg1, arg2);
276 result -= f.
getTau()*pedcJ.template d2<row,col>(arg1, arg2);
285 typename AnsatzVars::VariableSet
const& duVars;
289 template <
int row,
int dim>
290 class MultiplyDifference
298 : pedc(pedc_), pedcJ(pedcJ_), du(du_), arg(arg_), result(result_)
301 template <
class VarDescription>
302 void operator()(VarDescription
const& vd)
const
305 int const col = VarDescription::id;
307 if (ParabolicEquation::template B2<row,col>::present && !ParabolicEquation::template B2<row,col>::constant)
312 result += (pedcJ.template b2<row,col>(arg,duArg)-pedc.template b2<row,col>(arg,duArg)) * boost::fusion::at_c<col>(du);
320 VariationalArg<Scalar,dim>
const& arg;
330 typedef typename AnsatzVars::GridView::IntersectionIterator
FaceIterator;
333 typename AnsatzVars::VariableSet
const& vars_,
334 typename AnsatzVars::VariableSet
const& varsJ_,
335 typename AnsatzVars::VariableSet
const& du_,
337 : f(f_), pedc(*f_.eq,vars_,flags), pedcJ(*f_.eq,varsJ_,flags), du(du_) {}
345 template <
class Evaluators>
353 template<
int row,
int dim>
356 return f.
getTau() * pedc.template d1<row>(arg);
359 template<
int row,
int col,
int dim>
365 return - f.
getTau()*pedcJ.template d2<row,col>(arg1, arg2);
374 typename AnsatzVars::VariableSet
const& du;
380 template <
int row,
int col>
381 struct D2:
public ParabolicEquation::template
D2<row,col>
384 ParabolicEquation::template B2<row,col>::present);
387 (!ParabolicEquation::template B2<row,col>::present ||
388 ParabolicEquation::template B2<row,col>::symmetric);
395 (ParabolicEquation::template B2<row,col>::lumped||
396 !ParabolicEquation::template B2<row,col>::present));
401 struct D1:
public ParabolicEquation::template
D1<row>
417 template <
class Cell>
454 bool onlyJacobian =
false;
455 bool onlyMassMatrix =
false;
void evaluateAt(Position const &x, Evaluators const &evaluators, Evaluators const &neighbourEvaluators)
Prepare the cache for evaluation at given quadrature point.
InnerBoundaryCache(SemiEulerStep const &f_, AnsatzVariableSet const &vars_, AnsatzVariableSet const &varsJ_, AnsatzVariableSet const &du_, int flags)
void moveTo(FaceIterator const &face)
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
Dune::FieldVector< Scalar, TestVars::template Components< row >::m > d1(VariationalArg< Scalar, dim > const &argT) const
void evaluateAt(Dune::FieldVector< typename Grid::ctype, Grid::dimension-1 > const &x, Evaluators const &evaluators)
AnsatzVars::GridView::IntersectionIterator FaceIterator
BoundaryCache(SemiImplicitEulerStep< ParabolicEquation > const &f_, typename AnsatzVars::VariableSet const &vars_, typename AnsatzVars::VariableSet const &varsJ_, typename AnsatzVars::VariableSet const &du_, int flags)
Dune::FieldVector< Scalar, TestVars::template components< row > > d1(VariationalArg< Scalar, dim > const &arg) const
Dune::FieldMatrix< Scalar, TestVars::template components< row >, AnsatzVars::template components< col > > d2(VariationalArg< Scalar, dim > const &arg1, VariationalArg< Scalar, dim > const &arg2) const
void moveTo(FaceIterator const &entity)
Dune::FieldVector< Scalar, TestVars::template components< row > > d1(VariationalArg< Scalar, dim > const &arg) const
void evaluateAt(Position const &x, Evaluators const &evaluators)
DomainCache(SemiImplicitEulerStep< ParabolicEquation > const &f_, typename AnsatzVars::VariableSet const &vars_, typename AnsatzVars::VariableSet const &varsJ_, typename AnsatzVars::VariableSet const &duVars_, int flags)
Constructor.
void moveTo(typename Grid::template Codim< 0 >::Entity const &entity)
Dune::FieldMatrix< Scalar, TestVars::template components< row >, AnsatzVars::template components< col > > d2(VariationalArg< Scalar, dim > const &arg1, VariationalArg< Scalar, dim > const &arg2) const
Linearly implicit Euler method.
ParabolicEquation::TestVars TestVars
ParabolicEquation::Scalar Scalar
Self & setTau(Scalar dt)
Sets the time step size.
static ProblemType const type
ParabolicEquation::OriginVars OriginVars
int integrationOrder(Cell const &cell, int shapeFunctionOrder, bool boundary) const
ParabolicEquation & parabolicEquation()
typename AnsatzVars::GridView GridView
EvolutionEquation::AnsatzVars::template CoefficientVectorRepresentation< 0, EvolutionEquation::TestVars::noOfVariables >::type CoefficientVectors
SemiImplicitEulerStep(ParabolicEquation *eq_, Scalar dt)
Constructor.
ParabolicEquation::AnsatzVars AnsatzVars
ParabolicEquation const & parabolicEquation() const
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.
typename GridView::Intersection Face
The type of faces in the grid view.
decltype(evaluateVariables(std::declval< VariableSet >(), std::declval< typename VariableSet::Descriptions::Evaluators >(), std::declval< Method >())) EvaluateVariables
The type of evaluated variables as returned by evaluateVariables.
constexpr auto valueMethod
Helper method for evaluating whole variable sets.
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.
Helper class for specifying the number of components of a variable.
bool considerFace(Face const &face) const
static bool const present
static bool const symmetric
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)
void moveTo(Cell const &)
Variables and their descriptions.