13#ifndef HIEARARCHIC_ERROR_ESTIMATOR_HH
14#define HIEARARCHIC_ERROR_ESTIMATOR_HH
34 namespace HierarchicErrorEstimatorDetail {
45 template <
class Functional>
48 template <
int row,
int col>
49 class D2:
public Functional::template D2<row,col>
51 typedef typename Functional::template D2<row,col>
d2;
54 static bool const present = d2::present && d2::symmetric;
55 static bool const lumped =
true;
59 template <
class Functional>
60 struct LumpSymmetricD2
62 template <
int row,
int col>
63 class D2:
public Functional::template D2<row,col>
66 static constexpr bool lumped = Functional::template D2<row,col>::symmetric;
79 template <
class Functional>
82 template <
int row,
int col>
83 class D2:
public Functional::template D2<row,col> {};
148 template <
class LinearFunctional,
149 class ExtensionAnsatzVariables,
150 class ExtensionTestVariables=ExtensionAnsatzVariables,
151 class D2BlockInfo = HierarchicErrorEstimatorDetail::DefaultD2<LinearFunctional> >
155 typedef typename LinearFunctional::AnsatzVars FEAnsatzVars;
156 typedef typename ExtensionAnsatzVariables::Grid Grid;
157 typedef typename Grid::template Codim<0>::Entity Cell;
161 typedef typename LinearFunctional::Scalar
Scalar;
173 DomainCache(LinearFunctional
const& lf,
FESolution const& ul_,
int flags):
174 ul(ul_), dc(lf.createDomainCache(flags))
177 void moveTo(Cell
const& e) { dc.moveTo(e); }
179 template <
class Position,
class Evaluators>
180 void evaluateAt(Position
const& x,
Evaluators const& evaluators)
182 dc.evaluateAt(x,evaluators);
187 Scalar d0()
const {
return dc.d0(); }
189 template <
int row,
int dim>
195 boost::fusion::for_each(
typename FEAnsatzVars::Variables(),
196 addLowerOrderD2<row,dim>(dc,ulEval,ulGradEval,arg,result));
201 template<
int row,
int col,
int dim>
206 return dc.template d2<row,col>(arg1,arg2);
211 typename LinearFunctional::DomainCache dc;
215 template <
int row,
int dim>
216 struct addLowerOrderD2
218 addLowerOrderD2(
typename LinearFunctional::DomainCache
const& dc_,
223 dc(dc_), ulEval(ulEval_), ulGradEval(ulGradEval_), arg(arg_), result(result_)
226 template <
class VarDescription>
227 void operator()(VarDescription
const& vd)
const {
228 int const col = VarDescription::id;
230 bool const original = row>=col || LinearFunctional::type==
WeakFormulation;
240 if (! ( (original && LinearFunctional::template D2<row,col>::present) ||
241 (mirror && LinearFunctional::template D2<col,row>::present) ) )
245 typedef typename SpaceType<
typename FEAnsatzVars::Spaces,
246 VarDescription::spaceIndex>
::type FEColSpace;
250 for (
int c=0; c<VarDescription::m; ++c) {
251 int off = c*FEColSpace::sfComponents;
255 for (
int i=0; i<FEColSpace::sfComponents; ++i) {
256 uArg.
value[i] = boost::fusion::at_c<col>(ulEval)[off+i];
258 for (
int j=0; j<dim; ++j)
260 uArg.
derivative[i][j] = boost::fusion::at_c<col>(ulGradEval)[off+i][j];
267 if (original && LinearFunctional::template D2<row,col>::present) {
270 d2 = dc.template d2<row,col>(arg,uArg);
272 for (
int i=0; i<TestVars::template Components<row>::m; ++i)
274 result[i] +=
d2[i][c];
279 if (mirror && LinearFunctional::template D2<col,row>::present) {
282 d2 = dc.template d2<col,row>(uArg,arg);
284 for (
int i=0; i<TestVars::template Components<row>::m; ++i)
286 result[i] +=
d2[c][i];
293 typename LinearFunctional::DomainCache
const& dc;
304 typedef typename Grid::LeafIntersectionIterator FaceIterator;
306 BoundaryCache(LinearFunctional
const& lf,
FESolution const& ul_,
int flags):
310 void moveTo(FaceIterator
const& entity) { bc.moveTo(entity); }
312 template <
class Evaluators>
315 bc.evaluateAt(x,evaluators);
319 Scalar d0()
const {
return bc.d0(); }
321 template<
int row,
int dim>
323 d1 (VariationalArg<Scalar,dim>
const& arg)
const
326 boost::fusion::for_each(
typename FEAnsatzVars::Variables(),
327 addLowerOrderD2<row,dim>(bc,ulEval,arg,result));
331 template<
int row,
int col,
int dim>
333 d2 (VariationalArg<Scalar,dim>
const &arg1, VariationalArg<Scalar,dim>
const &arg2)
const
335 return bc.template d2<row,col>(arg1,arg2);
340 typename LinearFunctional::BoundaryCache bc;
343 template <
int row,
int dim>
344 struct addLowerOrderD2
346 addLowerOrderD2(
typename LinearFunctional::BoundaryCache
const& bc_,
348 VariationalArg<Scalar,dim>
const& arg_,
350 bc(bc_), ulEval(ulEval_), arg(arg_), result(result_)
353 template <
class VarDescription>
354 void operator()(VarDescription
const& vd)
const {
355 int const col = VarDescription::id;
357 bool const original = row>=col || LinearFunctional::type==
WeakFormulation;
366 if (! ( (original && LinearFunctional::template D2<row,col>::present) ||
367 (mirror && LinearFunctional::template D2<col,row>::present) ) )
370 typedef typename SpaceType<
typename FEAnsatzVars::Spaces,
371 VarDescription::spaceIndex>
::type FEColSpace;
373 VariationalArg<Scalar,dim> uArg;
375 for (
int c=0; c<VarDescription::m; ++c) {
376 int off = c*FEColSpace::sfComponents;
380 for (
int i=0; i<FEColSpace::sfComponents; ++i)
381 uArg.value[i] = boost::fusion::at_c<col>(ulEval)[off+i];
386 if (original && LinearFunctional::template D2<row,col>::present) {
389 d2 = bc.template d2<row,col>(arg,uArg);
391 for (
int i=0; i<TestVars::template Components<row>::m; ++i)
392 result[i] +=
d2[i][c];
396 if (mirror && LinearFunctional::template D2<col,row>::present) {
399 d2 = bc.template d2<col,row>(uArg,arg);
401 for (
int i=0; i<TestVars::template Components<row>::m; ++i)
402 result[i] +=
d2[c][i];
408 typename LinearFunctional::BoundaryCache
const& bc;
410 VariationalArg<Scalar,dim>
const& arg;
416 struct D1:
public LinearFunctional::template D1<row>
419 template <
int row,
int col>
420 struct D2:
public D2BlockInfo::template D2<row,col> {
422 static bool const present = D2BlockInfo::template D2<row,col>::present && LinearFunctional::template D2<row,col>::present;
442 return DomainCache(lf,ul,flags);
447 return BoundaryCache(lf,ul,flags);
452 return lf.integrationOrder(cell,shapeFunctionOrder,boundary);
463 template <
class ExtensionVariables,
class LinearFunctional>
464 HierarchicErrorEstimator<LinearFunctional,ExtensionVariables>
Defines assembly of hierarchically extended problems for defining DLY style error estimators.
ExtensionAnsatzVariables AnsatzVars
ExtensionTestVariables TestVars
HierarchicErrorEstimator(LinearFunctional const &lf_, FESolution const &ul_)
FEAnsatzVars::VariableSet FESolution
DomainCache createDomainCache(int flags) const
static ProblemType const type
int integrationOrder(Cell const &cell, int shapeFunctionOrder, bool boundary) const
LinearFunctional::Scalar Scalar
BoundaryCache createBoundaryCache(int flags) const
HierarchicErrorEstimator< LinearFunctional, ExtensionVariables > hierarchicErrorEstimator(LinearFunctional const &lf, typename LinearFunctional::AnsatzVars::VariableSet const &u)
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.
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.
constexpr auto derivativeMethod
Helper method for evaluating whole variable sets.
Functional::Scalar d1(Assembler &assembler, Functional const &f, typename Functional::AnsatzVars::VariableSet &x, typename Functional::Scalar tolerance=1e-6, typename Functional::Scalar increment=1e-12, bool toFile=false, std::string const &filename=std::string("d1error"))
Functional::Scalar d2(Assembler &assembler, Functional const &f, typename Functional::AnsatzVars::VariableSet const &x, typename Functional::Scalar increment=1e-12, typename Functional::Scalar tolerance=1e-6, bool toFile=false, std::string const &savefilename=std::string("d2error"))
Helper class for specifying the number of components of a variable.
Extracts the type of FE space with given index from set of spaces.
static int const m
number of component of this variable
A class that stores values, gradients, and Hessians of evaluated shape functions.
Dune::FieldMatrix< Scalar, components, dim > derivative
The shape function's spatial derivative, a components x dim matrix.
ValueType value
The shape function's value, a vector of dimension components
Variables and their descriptions.