13#ifndef ALGORITHM_3_ERROR_ESTIMATOR_EE
14#define ALGORITHM_3_ERROR_ESTIMATOR_EE
21#include <boost/timer/timer.hpp>
22#include <boost/fusion/include/at_c.hpp>
38 struct InverseOperatorResult;
39 template <
class,
int>
class FieldVector;
46 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
50 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
51 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using LumpedFunctional = Functional<AnsatzVars,TestVars,OriginVars,lump>;
64 static constexpr int dim = VariableSetDescription::Grid::dimension;
66 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
67 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
73 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false)
74 :
Base(extensionSpace_,fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
75 squaredFraction(fraction*fraction), verbose(verbose_)
87 boost::timer::cpu_timer overallTimer;
88 using boost::fusion::at_c;
89 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
93 boost::timer::cpu_timer atimer;
95 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed()) << std::endl;
110 typename Traits::VectorY dy(at_c<Traits::stateId>(dxl.
get().data).coefficients()), solYH = dy; solYH *= 0;
112 typename Traits::ExtensionVectorY solYE(Traits::ExtensionVectorY_Initializer::init(extensionVariableSetDescription));
118 jacobi.
apply(solYE,rhsPE);
128 typename Traits::VectorY rhsYH(ass_HH->template rhs<Traits::stateId,Traits::stateId+1>());
138 typename Traits::ExtensionVectorP solPE(Traits::ExtensionVectorP_Initializer::init(extensionVariableSetDescription));
139 typename Traits::VectorP solPH(Traits::VectorP_Initializer::init(variableSetDescription));
141 jacobi.
apply(solPE,rhsYE);
144 boost::timer::cpu_timer mgTimer;
147 at_c<0>(rhsYH.data));
148 std::cout <<
"mg: " << boost::timer::format(mgTimer.elapsed()) << std::endl;
160 typename Traits::VectorU rhsUH(ass_HH->template rhs<Traits::controlId,Traits::controlId+1>());
173 typename Traits::VectorU solUH(Traits::VectorU_Initializer::init(variableSetDescription));
174 typename Traits::ExtensionVectorU solUE(Traits::ExtensionVectorU_Initializer::init(extensionVariableSetDescription));
178 boost::timer::cpu_timer chebTimer;
181 cheb.
apply(solUH,rhsUH);
182 std::cout <<
"cheb: " << boost::timer::format(chebTimer.elapsed()) << std::endl;
184 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
187 at_c<Traits::stateId>(errorEstimate_H.
data) = at_c<0>(solYH.data);
188 at_c<Traits::controlId>(errorEstimate_H.
data) = at_c<0>(solUH.data);
189 at_c<Traits::stateId>(errorEstimate_E.data) = at_c<0>(solYE.data);
190 at_c<Traits::controlId>(errorEstimate_E.data) = at_c<0>(solUE.data);
198 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
199 errorDistribution.clear();
200 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
202 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
207 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.
getSpaces());
221 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
222 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
223 errorDistribution[is.index(*ci)] = std::make_pair( fabs(boost::fusion::at_c<0>(mde->data).value(*ci,
Dune::FieldVector<Scalar,dim>(0.3))) , is.index(*ci));
227 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
230 template <
typename... Args>
237 template <
typename... Args>
246 referenceSolution = &ref;
247 referenceOperator = &Aref;
248 referenceCoeffVec = &refcv;
253 if(referenceSolution ==
nullptr)
return;
254 ReferenceSolution tmp(*referenceSolution);
257 return boost::fusion::at_c<0>(x.data).value(cell.geometry().global(xLocal));
262 return boost::fusion::at_c<1>(x.data).value(cell.geometry().global(xLocal));
265 tmp -= *referenceSolution;
267 boost::fusion::at_c<0>(referenceCoeffVec->data) = boost::fusion::at_c<0>(tmp.data).coefficients();
268 boost::fusion::at_c<1>(referenceCoeffVec->data) = boost::fusion::at_c<1>(tmp.data).coefficients();
271 auto tmp2 = *referenceCoeffVec;
272 referenceOperator->apply(*referenceCoeffVec,tmp2);
273 std::cout <<
"REAL ERROR: " << (*referenceCoeffVec)*tmp2 << std::endl;
279 ass_HH->assemble(linearization(*F_HH,xl.
get()));
280 ass_HE->assemble(linearization(*F_HE,xl.
get()));
281 ass_EH->assemble(linearization(*F_EH,xe.
get()));
282 ass_EE->assemble(linearization(*F_EE,xe.
get()));
285 std::unique_ptr<typename Traits::Functional_HH> F_HH;
286 std::unique_ptr<typename Traits::Functional_HE> F_HE;
287 std::unique_ptr<typename Traits::Functional_EH> F_EH;
288 std::unique_ptr<typename LumpedTraits::Functional_EE> F_EE;
289 std::unique_ptr<typename Traits::Assembler_HH> ass_HH;
291 std::unique_ptr<typename Traits::Assembler_HE> ass_HE;
292 std::unique_ptr<typename Traits::Assembler_EH> ass_EH;
293 std::unique_ptr<typename LumpedTraits::Assembler_EE> ass_EE;
294 NormFunctional& normFunctional;
295 VariableSetDescription& variableSetDescription;
296 ExtensionVariableSetDescription& extensionVariableSetDescription;
299 size_t chebySteps = 30, mgSteps = 25, mgSmoothingSteps = 20;
300 Scalar relativeAccuracy = 1e-3;
301 ReferenceSolution
const* referenceSolution =
nullptr;
302 ReferenceOperator
const* referenceOperator =
nullptr;
307 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
308 class NormFunctional,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration,
bool lump=
false,
int components=1>
311 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
312 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using LumpedFunctional = Functional<AnsatzVars,TestVars,OriginVars,lump>;
325 static constexpr int dim = VariableSetDescription::Grid::dimension;
327 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
328 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
334 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false)
335 :
Base(extensionSpace_,fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
336 squaredFraction(fraction*fraction), verbose(verbose_)
348 boost::timer::cpu_timer overallTimer;
349 using boost::fusion::at_c;
350 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
353 boost::timer::cpu_timer atimer;
355 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed()) << std::endl;
370 typename Traits::VectorY dy(at_c<Traits::stateId>(dxl.
get().data).coefficients()), solYH = dy; solYH *= 0;
372 typename Traits::ExtensionVectorY solYE(Traits::ExtensionVectorY_Initializer::init(extensionVariableSetDescription));
378 jacobi.
apply(solYE,rhsPE);
396 typename Traits::VectorY rhsYH(ass_HH->template rhs<Traits::stateId,Traits::stateId+1>());
408 typename Traits::ExtensionVectorP solPE(Traits::ExtensionVectorP_Initializer::init(extensionVariableSetDescription));
409 typename Traits::VectorP solPH(Traits::VectorP_Initializer::init(variableSetDescription));
411 jacobi.
apply(solPE,rhsYE);
414 boost::timer::cpu_timer mgTimer;
417 at_c<0>(rhsYH.data));
418 std::cout <<
"mg: " << boost::timer::format(mgTimer.elapsed()) << std::endl;
431 typename Traits::VectorU rhsUH(ass_HH->template rhs<Traits::controlId,Traits::controlId+1>());
449 typename Traits::VectorU solUH(Traits::VectorU_Initializer::init(variableSetDescription));
450 typename Traits::ExtensionVectorU solUE(Traits::ExtensionVectorU_Initializer::init(extensionVariableSetDescription));
454 boost::timer::cpu_timer chebTimer;
457 cheb.
apply(solUH,rhsUH);
458 std::cout <<
"cheb: " << boost::timer::format(chebTimer.elapsed()) << std::endl;
460 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
463 at_c<Traits::stateId>(errorEstimate_H.
data) = at_c<0>(solYH.data);
464 at_c<Traits::controlId>(errorEstimate_H.
data) = at_c<0>(solUH.data);
465 at_c<Traits::stateId>(errorEstimate_E.data) = at_c<0>(solYE.data);
466 at_c<Traits::controlId>(errorEstimate_E.data) = at_c<0>(solUE.data);
474 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
475 errorDistribution.clear();
476 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
478 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
483 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.
getSpaces());
497 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
498 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
499 errorDistribution[is.index(*ci)] = std::make_pair( fabs(boost::fusion::at_c<0>(mde->data).value(*ci,
Dune::FieldVector<Scalar,dim>(0.3))) , is.index(*ci));
503 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
506 template <
typename... Args>
513 template <
typename... Args>
523 ass_HH->assemble(linearization(*F_HH,xl.
get()));
524 ass_HE->assemble(linearization(*F_HE,xl.
get()));
525 ass_EH->assemble(linearization(*F_EH,xe.
get()));
526 ass_EE->assemble(linearization(*F_EE,xe.
get()));
529 std::unique_ptr<typename Traits::Functional_HH> F_HH;
530 std::unique_ptr<typename Traits::Functional_HE> F_HE;
531 std::unique_ptr<typename Traits::Functional_EH> F_EH;
532 std::unique_ptr<typename LumpedTraits::Functional_EE> F_EE;
533 std::unique_ptr<typename Traits::Assembler_HH> ass_HH;
535 std::unique_ptr<typename Traits::Assembler_HE> ass_HE;
536 std::unique_ptr<typename Traits::Assembler_EH> ass_EH;
537 std::unique_ptr<typename LumpedTraits::Assembler_EE> ass_EE;
538 NormFunctional& normFunctional;
539 VariableSetDescription& variableSetDescription;
540 ExtensionVariableSetDescription& extensionVariableSetDescription;
543 size_t chebySteps = 30, mgSteps = 25, mgSmoothingSteps = 20;
544 Scalar relativeAccuracy = 1e-3;
Abstract Vector for function space algorithms.
An adaptor presenting a Dune::LinearOperator <domain_type,range_type> interface to a contiguous sub-b...
virtual void applyscaleadd(Scalar alpha, Domain const &x, Range &b) const
Compute .
Mathematical Vector that supports copy-on-write, implements AbstractFunctionSpaceElement.
Implementation const & get() const
Access to the data.
Preconditioner based on the Chebyshev semi-iteration. In order to provide a linear preconditioner the...
void initForMassMatrix_TetrahedralQ1Elements()
Init spectral bounds for the mass matrix arising from tetrahedral discretization of the domain and li...
virtual void apply(Domain &x, Range const &y)
AnsatzVars::template CoefficientVectorRepresentation< 0, 1 >::type ErrorVector
AnsatzSpaces const & getSpaces() const
AnsatzVars const & getVariableSetDescription() const
void considerStateVariable(bool consider)
void considerAdjointVariable(bool consider)
void considerControlVariable(bool consider)
std::unique_ptr< ErrorRepresentation > mde
ExtensionSpace & extensionSpace
std::vector< std::pair< double, int > > errorDistribution
void apply(Domain &solution, Range const &rhs)
void apply(CoeffVector &solution, CoeffVector &rightHand)
virtual void applyscaleadd(Scalar alpha, Domain const &x, Range &b) const
A class that stores information about a set of variables.
Kaskade::VariableSet< VariableSetDescription< Spaces, VariableDescriptions > > VariableSet
Type that contains a set of variable values with some functionality, such as simple vector arithmetic...
Spaces spaces
A heterogeneous sequence of pointers to (const) spaces involved.
SpaceType< Spaces, 0 >::type::Grid Grid
Grid type.
A class for storing a heterogeneous collection of FunctionSpaceElement s.
A class for assembling Galerkin representation matrices and right hand sides for variational function...
EnergyError::AnsatzVars::VariableSet ErrorRepresentation
VariableSetDescription::Grid Grid
void initFunctionals(const Args &... args)
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
virtual ~YetAnotherHBErrorEstimator_Elasticity()
void initExtensionFunctionals(const Args &... args)
YetAnotherHBErrorEstimator_Elasticity(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false)
void operator()(AbstractLinearization const &lin, AbstractFunctionSpaceElement const &x_, AbstractFunctionSpaceElement const &dx_, int step, AbstractFunctionSpaceElement const &)
ErrorDistribution< NormFunctional, ExtensionVariableSetDescription > EnergyError
EnergyError::AnsatzVars::VariableSet ErrorRepresentation
void initFunctionals(const Args &... args)
void setReference(ReferenceOperator const &Aref, ReferenceSolution const &ref, typename Traits::Vector &refcv)
YetAnotherHBErrorEstimator(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false)
ErrorDistribution< NormFunctional, ExtensionVariableSetDescription > EnergyError
void initExtensionFunctionals(const Args &... args)
void computeError(typename Traits::VarSet const &x)
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
VariableSetDescription::Grid Grid
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
void operator()(AbstractLinearization const &lin, AbstractFunctionSpaceElement const &x_, AbstractFunctionSpaceElement const &dx_, int step, AbstractFunctionSpaceElement const &)
virtual ~YetAnotherHBErrorEstimator()
Error estimation via hierachic FEM.
double add(const double &x1, const std::pair< double, int > &x2)
Bridge classes that connect low level FE algorithms to higher level algorithms.
Functional< ExtensionVariableSetDescription, VariableSetDescription, ExtensionVariableSetDescription > Functional_EH
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< stateId, stateId+1 >::type ExtensionVectorY
Functional< ExtensionVariableSetDescription, ExtensionVariableSetDescription, ExtensionVariableSetDescription > Functional_EE
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< adjointId, adjointId+1 >::type ExtensionVectorP
Functional< VariableSetDescription, VariableSetDescription, VariableSetDescription > Functional_HH
VariableSetDescription::template CoefficientVectorRepresentation< controlId, controlId+1 >::type VectorU
Functional< VariableSetDescription, ExtensionVariableSetDescription, VariableSetDescription > Functional_HE
Functional_HH::Scalar Scalar
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< controlId, controlId+1 >::type ExtensionVectorU
VariableSetDescription::template CoefficientVectorRepresentation< stateId, stateId+1 >::type VectorY
VariableSetDescription::template CoefficientVectorRepresentation< adjointId, adjointId+1 >::type VectorP
VariableSetDescription::template CoefficientVectorRepresentation ::type Vector
Variables and their descriptions.