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>
42 struct InverseOperatorResult;
43 template <
class,
int>
class FieldVector;
48 namespace ErrorEstimator_Detail
51 template <
class Functional>
52 std::integral_constant<int,Functional::stateId>
getStateIdImpl(
decltype(Functional::stateId)*);
54 template <
class Functional>
55 std::integral_constant<int,Functional::yIdx>
getStateIdImpl(
decltype(Functional::yIdx)*);
57 template <
class Functional>
58 std::integral_constant<int,Functional::controlId>
getControlIdImpl(
decltype(Functional::controlId)*);
60 template <
class Functional>
61 std::integral_constant<int,Functional::uIdx>
getControlIdImpl(
decltype(Functional::uIdx)*);
63 template <
class Functional>
64 std::integral_constant<int,Functional::adjointId>
getAdjointIdImpl(
decltype(Functional::adjointId)*);
66 template <
class Functional>
67 std::integral_constant<int,Functional::pIdx>
getAdjointIdImpl(
decltype(Functional::pIdx)*);
69 template <
class Functional>
70 std::integral_constant<int,Functional::lIdx>
getAdjointIdImpl(
decltype(Functional::lIdx)*);
72 template <
class Functional>
75 typedef decltype(getStateIdImpl<Functional>(
nullptr)) type;
79 template <
class Functional>
82 typedef decltype(getControlIdImpl<Functional>(
nullptr)) type;
86 template <
class Functional>
89 typedef decltype(getAdjointIdImpl<Functional>(
nullptr)) type;
93 template <
template <
class,
class,
class>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription>
99 typedef Functional<VariableSetDescription,VariableSetDescription,VariableSetDescription>
Functional_HH;
100 typedef Functional<VariableSetDescription,ExtensionVariableSetDescription,VariableSetDescription>
Functional_HE;
101 typedef Functional<ExtensionVariableSetDescription,VariableSetDescription,ExtensionVariableSetDescription>
Functional_EH;
102 typedef Functional<ExtensionVariableSetDescription,ExtensionVariableSetDescription,ExtensionVariableSetDescription>
Functional_EE;
104 typedef typename Functional_HH::Scalar
Scalar;
111 static constexpr int stateId = getStateId<Functional_HH>();
112 static constexpr int controlId = getControlId<Functional_HH>();
113 static constexpr int adjointId = getAdjointId<Functional_HH>();
115 static constexpr int dim = VariableSetDescription::Grid::dimension;
174 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<>::type
Vector;
175 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<stateId,stateId+1>::type
VectorY;
176 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<controlId,controlId+1>::type
VectorU;
177 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<adjointId,adjointId+1>::type
VectorP;
178 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<>::type
ExtensionVector;
179 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<stateId,stateId+1>::type
ExtensionVectorY;
180 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<controlId,controlId+1>::type
ExtensionVectorU;
181 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<adjointId,adjointId+1>::type
ExtensionVectorP;
186 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<>
Vector_Initializer;
187 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<stateId,stateId+1>
VectorY_Initializer;
188 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<controlId,controlId+1>
VectorU_Initializer;
189 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<adjointId,adjointId+1>
VectorP_Initializer;
197 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
198 class NormFunctional,
class LinearSolverLA,
class LinearSolverHA,
class LinearSolverLM=LinearSolverLA,
class LinearSolverHM=LinearSolverHA,
202 static constexpr int noOfVariables = ExtensionVariableSetDescription::noOfVariables;
203 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using ErrorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
206 static constexpr int yId = 1, uId = 0, pId = 2;
208 typedef Functional<VariableSetDescription,VariableSetDescription,VariableSetDescription,lumpM>
Functional_HH;
209 typedef Functional<ExtensionVariableSetDescription,VariableSetDescription,ExtensionVariableSetDescription,lumpM>
Functional_EH;
210 typedef Functional<VariableSetDescription,ExtensionVariableSetDescription,VariableSetDescription,lumpM>
Functional_HE;
211 typedef Functional<ExtensionVariableSetDescription,ExtensionVariableSetDescription,ExtensionVariableSetDescription,lumpM>
Functional_EE;
245 typedef typename Functional_HH::Scalar
Scalar;
246 static constexpr int dim = VariableSetDescription::Grid::dimension;
249 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<>
CVL;
250 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<yId,yId+1>
CVLY;
251 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<uId,uId+1>
CVLU;
252 typedef typename VariableSetDescription::template CoefficientVectorRepresentation<pId,pId+1>
CVLP;
257 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<0,1>::type
CoefficientVectorH01;
258 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<0,2>::type
CoefficientVectorH02;
259 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<2,3>
CVH23;
260 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<2,3>::type
CoefficientVectorH23;
261 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<>
CVH;
262 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<yId,yId+1>
CVHY;
263 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<uId,uId+1>
CVHU;
264 typedef typename ExtensionVariableSetDescription::template CoefficientVectorRepresentation<pId,pId+1>
CVHP;
269 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
270 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
276 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
277 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
278 extensionSpace(extensionSpace_), assembler(extensionVariableSetDescription.spaces),
279 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
286 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
288 double ilutTol = 0.01;
290 double minresTol = 1e-3;
292 boost::timer::cpu_timer overallTimer;
293 using boost::fusion::at_c;
294 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
302 typename ExtensionVariableSetDescription::VariableSet tmpRep(extensionVariableSetDescription), errorEstimate_E(extensionVariableSetDescription);
305 All all(*ass_HH,
false);
306 Ahh ahh(*ass_EE,
false);
307 Alh alh(*ass_HE,
false);
308 Ahl ahl(*ass_EH,
false);
310 Matrix mAll = all.template get<Matrix>();
312 Matrix mAhh = ahh.template get<Matrix>();
314 Matrix mAlh = alh.template get<Matrix>();
316 Matrix mAhl = ahl.template get<Matrix>();
319 boost::timer::cpu_timer atimer;
321 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") <<
"s" << std::endl;
323 StateOperator stateOp(assembler,
false);
329 at_c<yId>(tmpRep.data) = at_c<0>(rhs0.data);
331 at_c<0>(xlp.data) = at_c<pId>(dxl.
get().data).coefficients();
332 std::vector<Scalar> tmpRepVec, xlpVec;
333 IstlInterfaceDetail::toVector(rhs0,tmpRepVec);
335 std::cout <<
"initial rhs entries:" << std::endl;
337 for(
size_t i=0; i<tmpRepVec.size(); ++i){
338 if(std::isnan(tmpRepVec[i])) std::cout <<
"nan at " << i << std::endl;
340 Scalar val = tmpRepVec[i];
341 if(val < minRhs) minRhs = val;
342 if(val > maxRhs) maxRhs = val;
345 std::cout <<
"max rhs: " << maxRhs << std::endl;
346 std::cout <<
"min rhs: " << minRhs << std::endl;
347 std::cout <<
"sum: " << rhsSum << std::endl;
349 IstlInterfaceDetail::toVector(xlp,xlpVec);
350 mAhl.
usmv(-1.0,xlpVec,tmpRepVec);
354 std::cout <<
"corrected rhs entries:" << std::endl;
356 for(
size_t i=0; i<tmpRepVec.size(); ++i){
357 if(std::isnan(tmpRepVec[i])) std::cout <<
"nan at " << i << std::endl;
359 Scalar val = tmpRepVec[i];
360 if(val < minRhs) minRhs = val;
361 if(val > maxRhs) maxRhs = val;
364 std::cout <<
"max rhs: " << maxRhs << std::endl;
365 std::cout <<
"min rhs: " << minRhs << std::endl;
366 std::cout <<
"sum: " << rhsSum << std::endl;
368 IstlInterfaceDetail::fromVector(tmpRepVec,rhs0);
369 Dune::InverseOperatorResult res;
370 boost::timer::cpu_timer timer;
371 if(verbose) std::cout <<
"first solve: ";
378 MINRESSolverK<CoefficientVectorH23> minres(mAhhOp, prec, minresTol, 100, 1);
379 minres.apply(sol0,rhs0,res);
382 if(verbose) std::cout << boost::timer::format(timer.elapsed()) << std::endl;
391 at_c<pId>(tmpRep.data) = at_c<0>(sol0.data);
392 at_c<pId>(errorEstimate_E.data) = at_c<0>(sol0.data);
398 for(
int i=0; i<at_c<pId>(errorEstimate_E.data).size(); ++i)
400 for(
int j=0; j<at_c<pId>(errorEstimate_E.data).coefficients()[i].size(); ++j)
402 Scalar val = at_c<pId>(errorEstimate_E.data).coefficients()[i][j];
404 if(val > maxVal) maxVal = val;
405 if(val < minVal) minVal = val;
408 std::cout <<
"p: minimal value: " << minVal << std::endl;
409 std::cout <<
"p: maximal value: " << maxVal << std::endl;
410 std::cout <<
"p: l2-sum: " << sum << std::endl;
417 Bhl bhl(*ass_EH,
false);
418 Blh blh(*ass_HE,
false);
419 Bll bll(*ass_HH,
false);
420 Bhh bhh(*ass_EE,
false);
423 std::vector<Scalar> tmpx, tmpy;
424 IstlInterfaceDetail::toVector(sol0,tmpy);
425 IstlInterfaceDetail::toVector(rhs1L,tmpx);
426 tmpmat.
usmtv(-1.0,tmpy,tmpx);
427 IstlInterfaceDetail::fromVector(tmpx,rhs1L);
430 tmpx.clear(); tmpy.clear();
431 IstlInterfaceDetail::toVector(sol0,tmpy);
432 IstlInterfaceDetail::toVector(rhs1H,tmpx);
433 tmpmat = bhh.template get<MatrixAsTriplet<Scalar> >();
434 tmpmat.
usmtv(-1.0,tmpy,tmpx);
435 IstlInterfaceDetail::fromVector(tmpx,rhs1H);
439 Muuhh muuhh(*ass_EE,
true);
440 Muull muull(*ass_HH,
true);
441 Muulh muulh(*ass_HE,
true);
446 if(verbose) std::cout <<
"second solve: ";
449 if(verbose) std::cout << boost::timer::format(timer.elapsed()) << std::endl;
457 at_c<uId>(errorEstimate_E.data) = at_c<0>(solhu.data);
458 at_c<uId>(errorEstimate_H.
data) = at_c<0>(sollu.data);
466 std::vector<Scalar> tmprhslp, tmprhshp;
467 IstlInterfaceDetail::toVector(rhslp,tmprhslp);
468 IstlInterfaceDetail::toVector(rhshp,tmprhshp);
470 std::cout <<
"initial rhsl entries:" << std::endl;
472 for(
size_t i=0; i<tmprhslp.size(); ++i){
473 if(std::isnan(tmprhslp[i])) std::cout <<
"nan at " << i << std::endl;
476 if(val < minRhs) minRhs = val;
477 if(val > maxRhs) maxRhs = val;
480 std::cout <<
"max rhs: " << maxRhs << std::endl;
481 std::cout <<
"min rhs: " << minRhs << std::endl;
482 std::cout <<
"sum: " << rhsSum << std::endl;
485 std::cout <<
"initial rhsh entries:" << std::endl;
487 for(
size_t i=0; i<tmprhshp.size(); ++i){
488 if(std::isnan(tmprhshp[i])) std::cout <<
"nan at " << i << std::endl;
491 if(val < minRhs) minRhs = val;
492 if(val > maxRhs) maxRhs = val;
495 std::cout <<
"max rhs: " << maxRhs << std::endl;
496 std::cout <<
"min rhs: " << minRhs << std::endl;
497 std::cout <<
"sum: " << rhsSum << std::endl;
502 std::cout <<
"1: rhsl entries:" << std::endl;
504 for(
size_t i=0; i<tmprhslp.size(); ++i){
505 if(std::isnan(tmprhslp[i])) std::cout <<
"nan at " << i << std::endl;
508 if(val < minRhs) minRhs = val;
509 if(val > maxRhs) maxRhs = val;
512 std::cout <<
"max rhs: " << maxRhs << std::endl;
513 std::cout <<
"min rhs: " << minRhs << std::endl;
514 std::cout <<
"sum: " << rhsSum << std::endl;
518 std::cout <<
"2: rhsl entries:" << std::endl;
520 for(
size_t i=0; i<tmprhslp.size(); ++i){
521 if(std::isnan(tmprhslp[i])) std::cout <<
"nan at " << i << std::endl;
524 if(val < minRhs) minRhs = val;
525 if(val > maxRhs) maxRhs = val;
528 std::cout <<
"max rhs: " << maxRhs << std::endl;
529 std::cout <<
"min rhs: " << minRhs << std::endl;
530 std::cout <<
"sum: " << rhsSum << std::endl;
535 std::cout <<
"1: rhsh entries:" << std::endl;
537 for(
size_t i=0; i<tmprhshp.size(); ++i){
538 if(std::isnan(tmprhshp[i])) std::cout <<
"nan at " << i << std::endl;
541 if(val < minRhs) minRhs = val;
542 if(val > maxRhs) maxRhs = val;
545 std::cout <<
"max rhs: " << maxRhs << std::endl;
546 std::cout <<
"min rhs: " << minRhs << std::endl;
547 std::cout <<
"sum: " << rhsSum << std::endl;
551 std::cout <<
"2: rhsh entries:" << std::endl;
553 for(
size_t i=0; i<tmprhshp.size(); ++i){
554 if(std::isnan(tmprhshp[i])) std::cout <<
"nan at " << i << std::endl;
557 if(val < minRhs) minRhs = val;
558 if(val > maxRhs) maxRhs = val;
561 std::cout <<
"max rhs: " << maxRhs << std::endl;
562 std::cout <<
"min rhs: " << minRhs << std::endl;
563 std::cout <<
"sum: " << rhsSum << std::endl;
570 if(verbose) std::cout <<
"third solve: ";
572 if(verbose) std::cout << boost::timer::format(timer.elapsed()) << std::endl;
573 if(verbose)std::cout <<
"first solve for last variable finished." << std::endl;
576 if(verbose) std::cout <<
"fourth solve: ";
581 MINRESSolverK<CoefficientVectorH23> minres2(ahh, prec2, minresTol, 100, 1);
582 minres2.apply(solhy,rhshp,res);
585 if(verbose) std::cout << boost::timer::format(timer.elapsed()) << std::endl;
586 at_c<yId>(errorEstimate_E.data) = at_c<0>(solhy.data);
587 at_c<yId>(errorEstimate_H.
data) = at_c<0>(solly.data);
590 Scalar tmpMax = maxVal, tmpMin = minVal, tmpSum = sum;
595 for(
int i=0; i<at_c<uId>(errorEstimate_E.data).size(); ++i)
597 for(
int j=0; j<at_c<uId>(errorEstimate_E.data).coefficients()[i].size(); ++j)
599 Scalar val = at_c<uId>(errorEstimate_E.data).coefficients()[i][j];
601 if(val > maxVal) maxVal = val;
602 if(val < minVal) minVal = val;
605 std::cout <<
"u: minimal value: " << minVal << std::endl;
606 std::cout <<
"u: maximal value: " << maxVal << std::endl;
607 std::cout <<
"u: l2-sum: " << sum << std::endl;
608 tmpMax =
std::max(tmpMax,maxVal), tmpMin =
std::min(tmpMin,minVal), tmpSum += sum;
613 for(
int i=0; i<at_c<yId>(errorEstimate_E.data).size(); ++i)
615 for(
int j=0; j<at_c<yId>(errorEstimate_E.data).coefficients()[i].size(); ++j)
617 Scalar val = at_c<yId>(errorEstimate_E.data).coefficients()[i][j];
619 if(val > maxVal) maxVal = val;
620 if(val < minVal) minVal = val;
623 std::cout <<
"y: minimal value: " << minVal << std::endl;
624 std::cout <<
"y: maximal value: " << maxVal << std::endl;
625 std::cout <<
"y: l2-sum: " << sum << std::endl;
628 std::cout <<
"minimal value: " <<
std::min(tmpMin,minVal) << std::endl;
629 std::cout <<
"maximal value: " <<
std::max(tmpMax,maxVal) << std::endl;
630 std::cout <<
"l2-sum: " << tmpSum << std::endl;
634 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
635 errorDistribution.clear();
636 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
637 Scalar errLevel(0.0), minRefine(0.2);
640 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
642 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
644 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
647 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
648 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
654 std::string name =
"errorDistribution_";
655 name += std::to_string(step);
656 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
661 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
662 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
663 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));
667 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
672 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,sqrt(totalErrorSquared));
696 return sqrt(fabs(totalErrorSquared));
701 return extensionSpace.gridManager().grid().size(0);
704 template <
typename... Args>
714 void initAssemblers()
716 ass_HH.reset(
new Ass_HH(extensionVariableSetDescription.spaces));
717 ass_HE.reset(
new Ass_HE(extensionVariableSetDescription.spaces));
718 ass_EH.reset(
new Ass_EH(extensionVariableSetDescription.spaces));
719 ass_EE.reset(
new Ass_EE(extensionVariableSetDescription.spaces));
722 void assembleAt(
const Bridge::Vector<VarSet>& xl,
const Bridge::Vector<ExtVarSet>& xe)
724 ass_HH->assemble(linearization(*F_HH,xl.get()));
725 ass_HE->assemble(linearization(*F_HE,xl.get()));
726 ass_EH->assemble(linearization(*F_EH,xe.get()));
727 ass_EE->assemble(linearization(*F_EE,xe.get()));
730 std::unique_ptr<Functional_HH> F_HH;
731 std::unique_ptr<Functional_HE> F_HE;
732 std::unique_ptr<Functional_EH> F_EH;
733 std::unique_ptr<Functional_EE> F_EE;
734 std::unique_ptr<Ass_HH> ass_HH;
735 std::unique_ptr<Ass_HE> ass_HE;
736 std::unique_ptr<Ass_EH> ass_EH;
737 std::unique_ptr<Ass_EE> ass_EE;
740 NormFunctional& normFunctional;
741 VariableSetDescription& variableSetDescription;
742 ExtensionVariableSetDescription& extensionVariableSetDescription;
743 ExtensionSpace& extensionSpace;
747 std::vector<std::pair<double,int> > errorDistribution;
753 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
754 class NormFunctional,
class LinearSolverHA,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration>
757 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
775 static constexpr int dim = VariableSetDescription::Grid::dimension;
777 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
778 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
783 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
784 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
785 extensionSpace(extensionSpace_),
786 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
788 ass_EE.reset(
new Ass_EE(extensionVariableSetDescription.spaces));
789 ass_HE.reset(
new Ass_HE(extensionVariableSetDescription.spaces));
794 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
796 boost::timer::cpu_timer overallTimer;
797 using boost::fusion::at_c;
798 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
801 boost::timer::cpu_timer atimer;
803 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
807 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
809 Blh blh(*ass_HE,
false);
810 Alh alh(*ass_HE,
false);
811 Ahh ahh(*ass_EE,
false);
814 typename Traits::ExtensionVectorY sol0(Traits::ExtensionVectorY_Initializer::init(extensionVariableSetDescription));
815 typename Traits::VectorU sollu(Traits::VectorU_Initializer::init(variableSetDescription));
816 typename Traits::VectorY solly(Traits::VectorY_Initializer::init(variableSetDescription));
817 at_c<0>(solly.data) = at_c<Traits::stateId>(dxl.
get().data).coefficients();
818 at_c<0>(sollu.data) = at_c<Traits::controlId>(dxl.
get().data).coefficients();
821 boost::timer::cpu_timer ctimer;
823 if(verbose) std::cout <<
"ERROR ESTIMATOR: computation time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
824 at_c<Traits::stateId>(errorEstimate_E.data) = at_c<0>(sol0.data);
828 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
829 errorDistribution.clear();
830 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
831 Scalar errLevel(0.0), minRefine(0.2);
834 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
836 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
838 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
841 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
842 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
848 std::string name =
"errorDistribution_";
849 name += std::to_string(step);
850 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
855 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
856 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
857 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));
861 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
866 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,sqrt(totalErrorSquared));
871 return sqrt(fabs(totalErrorSquared));
876 return extensionSpace.gridManager().grid().size(0);
879 template <
typename... Args>
889 ass_HE->assemble(linearization(*F_HE,xl.
get()));
890 ass_EE->assemble(linearization(*F_EE,xe.
get()));
893 std::unique_ptr<Functional_HE> F_HE;
894 std::unique_ptr<Functional_EE> F_EE;
895 std::unique_ptr<Ass_HE> ass_HE;
896 std::unique_ptr<Ass_EE> ass_EE;
897 NormFunctional& normFunctional;
898 VariableSetDescription& variableSetDescription;
899 ExtensionVariableSetDescription& extensionVariableSetDescription;
900 ExtensionSpace& extensionSpace;
903 std::vector<std::pair<double,int> > errorDistribution;
908 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
909 class NormFunctional,
class LinearSolverHA,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration>
912 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
929 static constexpr int dim = VariableSetDescription::Grid::dimension;
931 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
932 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
935 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
936 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
937 extensionSpace(extensionSpace_),
938 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
940 ass_EE.reset(
new Ass_EE(extensionVariableSetDescription.spaces));
941 ass_HE.reset(
new Ass_HE(extensionVariableSetDescription.spaces));
946 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
948 boost::timer::cpu_timer overallTimer;
949 using boost::fusion::at_c;
950 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
953 boost::timer::cpu_timer atimer;
955 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
959 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
962 MLH mlh(*ass_HE,
false);
963 MHH mhh(*ass_EE,
false);
964 BTLH btlh(*ass_HE,
false);
967 typename Traits::VectorU sollu(at_c<Traits::controlId>(dxl.
get().data.coefficients()));
968 typename Traits::VectorP sollp(at_c<Traits::adjointId>(dxl.
get().data.coefficients()));
975 at_c<Traits::control>(errorEstimate_E.data) = at_c<0>(sol.data);
979 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
980 errorDistribution.clear();
981 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
982 Scalar errLevel(0.0), minRefine(0.2);
985 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
987 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
989 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
992 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
993 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
999 std::string name =
"errorDistribution_";
1000 name += std::to_string(step);
1001 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
1006 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
1007 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
1008 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));
1012 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
1017 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,sqrt(totalErrorSquared));
1022 return sqrt(fabs(totalErrorSquared));
1027 return extensionSpace.gridManager().grid().size(0);
1030 template <
typename... Args>
1040 ass_HE->assemble(linearization(*F_HE,xl.
get()));
1041 ass_EE->assemble(linearization(*F_EE,xe.
get()));
1044 std::unique_ptr<Functional_HE> F_HE;
1045 std::unique_ptr<Functional_EE> F_EE;
1046 std::unique_ptr<Ass_HE> ass_HE;
1047 std::unique_ptr<Ass_EE> ass_EE;
1048 NormFunctional& normFunctional;
1049 VariableSetDescription& variableSetDescription;
1050 ExtensionVariableSetDescription& extensionVariableSetDescription;
1051 ExtensionSpace& extensionSpace;
1053 Scalar totalErrorSquared;
1054 std::vector<std::pair<double,int> > errorDistribution;
1059 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
1060 class NormFunctional,
class LinearSolverHA,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration>
1063 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
1076 static constexpr int dim = VariableSetDescription::Grid::dimension;
1078 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
1079 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
1084 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
1085 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
1086 extensionSpace(extensionSpace_),
1087 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
1089 ass_EE.reset(
new Ass_EE(extensionVariableSetDescription.spaces));
1090 ass_HE.reset(
new Ass_HE(extensionVariableSetDescription.spaces));
1095 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
1097 boost::timer::cpu_timer overallTimer;
1098 using boost::fusion::at_c;
1099 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
1102 boost::timer::cpu_timer atimer;
1104 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1108 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
1111 AT_HE at_HE(*ass_HE,
false);
1112 AT_EE at_EE(*ass_EE,
false);
1115 typename Traits::ExtensionVectorP sol0(Traits::ExtensionVectorP_Initializer::init(extensionVariableSetDescription));
1116 typename Traits::VectorP sollp(Traits::VectorP_Initializer::init(variableSetDescription));
1117 typename Traits::VectorY solly(Traits::VectorY_Initializer::init(variableSetDescription));
1118 at_c<0>(solly.data) = at_c<Traits::stateId>(dxl.
get().data).coefficients();
1119 at_c<0>(sollp.data) = at_c<Traits::adjointId>(dxl.
get().data).coefficients();
1122 boost::timer::cpu_timer ctimer;
1124 if(verbose) std::cout <<
"ERROR ESTIMATOR: computation time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1125 at_c<Traits::stateId>(errorEstimate_E.data) = at_c<0>(sol0.data);
1129 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
1130 errorDistribution.clear();
1131 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
1132 Scalar errLevel(0.0), minRefine(0.2);
1135 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
1137 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
1139 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
1142 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
1143 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
1149 std::string name =
"errorDistribution_";
1150 name += std::to_string(step);
1151 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
1156 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
1157 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
1158 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));
1162 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
1167 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,sqrt(totalErrorSquared));
1172 return sqrt(fabs(totalErrorSquared));
1177 return extensionSpace.gridManager().grid().size(0);
1180 template <
typename... Args>
1190 ass_HE->assemble(linearization(*F_HE,xl.
get()));
1191 ass_EE->assemble(linearization(*F_EE,xe.
get()));
1194 std::unique_ptr<typename Traits::Functional_HE> F_HE;
1195 std::unique_ptr<typename Traits::Functional_EE> F_EE;
1196 std::unique_ptr<Ass_HE> ass_HE;
1197 std::unique_ptr<Ass_EE> ass_EE;
1198 NormFunctional& normFunctional;
1199 VariableSetDescription& variableSetDescription;
1200 ExtensionVariableSetDescription& extensionVariableSetDescription;
1201 ExtensionSpace& extensionSpace;
1203 Scalar totalErrorSquared;
1204 std::vector<std::pair<double,int> > errorDistribution;
1209 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
1210 class NormFunctional,
class LinearSolverLA,
class LinearSolverHA,
class LinearSolverLU,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration>
1213 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
1224 static constexpr int dim = VariableSetDescription::Grid::dimension;
1226 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
1227 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
1232 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
1233 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
1234 extensionSpace(extensionSpace_),
1235 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
1245 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
1247 boost::timer::cpu_timer overallTimer;
1248 using boost::fusion::at_c;
1249 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
1252 boost::timer::cpu_timer atimer;
1254 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1261 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
1264 AT_HE at_HE(*ass_HE,
false);
1265 AT_EE at_EE(*ass_EE,
false);
1268 typename Traits::ExtensionVectorP sol0(Traits::ExtensionVectorP_Initializer::init(extensionVariableSetDescription));
1269 typename Traits::VectorP sollp(Traits::VectorP_Initializer::init(variableSetDescription));
1270 typename Traits::VectorY solly(Traits::VectorY_Initializer::init(variableSetDescription));
1271 at_c<0>(solly.data) = at_c<Traits::stateId>(dxl.
get().data).coefficients();
1272 at_c<0>(sollp.data) = at_c<Traits::adjointId>(dxl.
get().data).coefficients();
1275 boost::timer::cpu_timer ctimer;
1277 if(verbose) std::cout <<
"ERROR ESTIMATOR: computation time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1279 std::cout <<
"ERR4 sol0 " << (sol0*sol0) << std::endl;
1284 typename Traits::VectorU rhsU(Traits::VectorU_Initializer::init(variableSetDescription));
1286 std::cout <<
"ERR4 rhsU0 " << (rhsU*rhsU) << std::endl;
1288 std::cout <<
"ERR4 rhsU1 " << (rhsU*rhsU) << std::endl;
1291 typename Traits::VectorU solU(Traits::VectorU_Initializer::init(variableSetDescription));
1292 std::cout <<
"ERR4 solU0 " << (solU*solU) << std::endl;
1295 std::cout <<
"ERR4 solU " << (solU*solU) << std::endl;
1297 typename Traits::VectorP rhsP(Traits::VectorP_Initializer::init(variableSetDescription));
1301 typename Traits::VectorY solY(Traits::VectorY_Initializer::init(variableSetDescription));
1303 std::cout <<
"ERR4 solY " << (solY*solY) << std::endl;
1304 at_c<Traits::stateId>(errorEstimate_H.
data) = at_c<0>(solY.data);
1305 at_c<Traits::controlId>(errorEstimate_H.
data) = at_c<0>(solU.data);
1308 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
1309 errorDistribution.clear();
1310 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
1311 Scalar errLevel(0.0), minRefine(0.2);
1314 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
1316 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
1318 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
1321 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
1322 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
1328 std::string name =
"errorDistribution_";
1329 name += std::to_string(step);
1330 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
1335 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
1336 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
1337 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));
1341 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
1346 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,sqrt(totalErrorSquared));
1351 return sqrt(fabs(totalErrorSquared));
1356 return extensionSpace.gridManager().grid().size(0);
1359 template <
typename... Args>
1371 ass_HH->assemble(linearization(*F_HH,xl.
get()));
1372 ass_HE->assemble(linearization(*F_HE,xl.
get()));
1373 ass_EH->assemble(linearization(*F_EH,xe.
get()));
1374 ass_EE->assemble(linearization(*F_EE,xe.
get()));
1377 std::unique_ptr<typename Traits::Functional_HH> F_HH;
1378 std::unique_ptr<typename Traits::Functional_HE> F_HE;
1379 std::unique_ptr<typename Traits::Functional_EH> F_EH;
1380 std::unique_ptr<typename Traits::Functional_EE> F_EE;
1381 std::unique_ptr<typename Traits::Assembler_HH> ass_HH;
1382 std::unique_ptr<typename Traits::Assembler_HE> ass_HE;
1383 std::unique_ptr<typename Traits::Assembler_EH> ass_EH;
1384 std::unique_ptr<typename Traits::Assembler_EE> ass_EE;
1385 NormFunctional& normFunctional;
1386 VariableSetDescription& variableSetDescription;
1387 ExtensionVariableSetDescription& extensionVariableSetDescription;
1388 ExtensionSpace& extensionSpace;
1390 Scalar totalErrorSquared;
1391 std::vector<std::pair<double,int> > errorDistribution;
1395 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
1396 class NormFunctional,
class LinearSolverLA,
class LinearSolverHA,
class LinearSolverHU,
class LinearSolverLU,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration,
bool lump=
false>
1399 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,lump>;
1410 static constexpr int dim = VariableSetDescription::Grid::dimension;
1412 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
1413 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
1418 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
1419 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
1420 extensionSpace(extensionSpace_),
1421 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
1431 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
1433 boost::timer::cpu_timer overallTimer;
1434 using boost::fusion::at_c;
1435 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
1438 boost::timer::cpu_timer atimer;
1440 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1448 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
1451 AT_HE at_HE(*ass_HE,
false);
1452 AT_EE at_EE(*ass_EE,
false);
1455 typename Traits::ExtensionVectorP sol0(Traits::ExtensionVectorP_Initializer::init(extensionVariableSetDescription));
1456 typename Traits::VectorP sollp(Traits::VectorP_Initializer::init(variableSetDescription));
1457 typename Traits::VectorY solly(Traits::VectorY_Initializer::init(variableSetDescription));
1458 at_c<0>(solly.data) = at_c<Traits::stateId>(dxl.
get().data).coefficients();
1459 at_c<0>(sollp.data) = at_c<Traits::adjointId>(dxl.
get().data).coefficients();
1462 boost::timer::cpu_timer ctimer;
1465 if(verbose) std::cout <<
"ERROR ESTIMATOR: computation time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1467 std::cout <<
"|solPH|^2=" << (sol0*sol0) << std::endl;
1473 typename Traits::VectorU rhsUL(ass_HH->template rhs<Traits::controlId,Traits::controlId+1>());
1477 std::cout <<
"|rhsUH|^2=" << (rhsUH*rhsUH) << std::endl;
1478 std::cout <<
"|rhsUL|^2=" << (rhsUL*rhsUL) << std::endl;
1481 bt_EH.applyscaleadd(-1.0,sol0,rhsUL);
1483 std::cout <<
"|rhsUH|^2=" << (rhsUH*rhsUH) << std::endl;
1484 std::cout <<
"|rhsUL|^2=" << (rhsUL*rhsUL) << std::endl;
1488 typename Traits::VectorU solUL(Traits::VectorU_Initializer::init(variableSetDescription));
1489 typename Traits::ExtensionVectorU solUH(Traits::ExtensionVectorU_Initializer::init(extensionVariableSetDescription));
1490 std::cout <<
"computing u_h" << std::endl;
1492 std::cout <<
"|solUH|^2=" << (solUH*solUH) << std::endl;
1494 std::cout <<
"|rhsUL|^2=" << (rhsUL*rhsUL) << std::endl;
1495 std::cout <<
"computing u_l" << std::endl;
1497 std::cout <<
"|solUH|^2=" << (solUH*solUH) << std::endl;
1498 std::cout <<
"|solUL|^2=" << (solUL*solUL) << std::endl;
1501 typename Traits::VectorP rhsPL(ass_HH->template rhs<Traits::adjointId,Traits::adjointId+1>());
1518 typename Traits::VectorY solYL(Traits::VectorY_Initializer::init(variableSetDescription));
1519 typename Traits::ExtensionVectorY solYH(Traits::ExtensionVectorY_Initializer::init(extensionVariableSetDescription));
1524 std::cout <<
"|solYH|^2=" << (solYH*solYH) << std::endl;
1525 std::cout <<
"|solYL|^2=" << (solYL*solYL) << std::endl;
1526 at_c<Traits::stateId>(errorEstimate_H.
data) = at_c<0>(solYL.data);
1527 at_c<Traits::controlId>(errorEstimate_H.
data) = at_c<0>(solUL.data);
1528 at_c<Traits::stateId>(errorEstimate_E.data) = at_c<0>(solYH.data);
1529 at_c<Traits::controlId>(errorEstimate_E.data) = at_c<0>(solUH.data);
1532 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
1533 errorDistribution.clear();
1534 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
1535 Scalar errLevel(0.0), minRefine(0.2);
1538 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
1540 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
1542 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
1545 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
1546 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
1552 std::string name =
"errorDistribution_";
1553 name += std::to_string(step);
1554 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
1559 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
1560 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
1561 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));
1565 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
1570 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,squaredFraction*totalErrorSquared);
1575 return sqrt(fabs(totalErrorSquared));
1580 return extensionSpace.gridManager().grid().size(0);
1583 template <
typename... Args>
1595 ass_HH->assemble(linearization(*F_HH,xl.
get()));
1596 ass_HE->assemble(linearization(*F_HE,xl.
get()));
1597 ass_EH->assemble(linearization(*F_EH,xe.
get()));
1598 ass_EE->assemble(linearization(*F_EE,xe.
get()));
1601 std::unique_ptr<typename Traits::Functional_HH> F_HH;
1602 std::unique_ptr<typename Traits::Functional_HE> F_HE;
1603 std::unique_ptr<typename Traits::Functional_EH> F_EH;
1604 std::unique_ptr<typename Traits::Functional_EE> F_EE;
1605 std::unique_ptr<typename Traits::Assembler_HH> ass_HH;
1606 std::unique_ptr<typename Traits::Assembler_HE> ass_HE;
1607 std::unique_ptr<typename Traits::Assembler_EH> ass_EH;
1608 std::unique_ptr<typename Traits::Assembler_EE> ass_EE;
1609 NormFunctional& normFunctional;
1610 VariableSetDescription& variableSetDescription;
1611 ExtensionVariableSetDescription& extensionVariableSetDescription;
1612 ExtensionSpace& extensionSpace;
1614 Scalar totalErrorSquared;
1615 std::vector<std::pair<double,int> > errorDistribution;
1620 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
1621 class NormFunctional,
class LinearSolverHA,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration>
1624 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
1641 static constexpr int dim = VariableSetDescription::Grid::dimension;
1643 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
1644 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
1649 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
1650 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
1651 extensionSpace(extensionSpace_),
1652 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
1654 ass_EE.reset(
new Ass_EE(extensionVariableSetDescription.spaces));
1655 ass_HE.reset(
new Ass_HE(variableSetDescription.
spaces));
1660 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
1662 boost::timer::cpu_timer overallTimer;
1663 using boost::fusion::at_c;
1664 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
1667 boost::timer::cpu_timer atimer;
1669 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1673 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
1675 A_HE alh(*ass_HE,
false);
1676 A_EE ahh(*ass_EE,
false);
1679 typename Traits::ExtensionVector sol_H(Traits::ExtensionVector_Initializer::init(extensionVariableSetDescription));
1680 typename Traits::Vector sol_L(Traits::Vector_Initializer::init(variableSetDescription));
1683 boost::timer::cpu_timer ctimer;
1685 if(verbose) std::cout <<
"ERROR ESTIMATOR: computation time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1686 errorEstimate_E = sol_H;
1690 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
1691 errorDistribution.clear();
1692 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
1693 Scalar errLevel(0.0), minRefine(0.2);
1696 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
1698 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
1700 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
1703 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
1704 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
1710 std::string name =
"errorDistribution_";
1711 name += std::to_string(step);
1712 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
1717 CellIterator cend = extensionVariableSetDescription.gridView.template end<0>();
1718 for (
CellIterator ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
1719 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));
1723 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
1728 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,sqrt(totalErrorSquared));
1733 return sqrt(fabs(totalErrorSquared));
1738 return extensionSpace.gridManager().grid().size(0);
1741 template <
typename... Args>
1751 ass_HE->assemble(linearization(*F_HE,xl.
get()));
1752 ass_EE->assemble(linearization(*F_EE,xe.
get()));
1755 std::unique_ptr<Functional_HE> F_HE;
1756 std::unique_ptr<Functional_EE> F_EE;
1757 std::unique_ptr<Ass_HE> ass_HE;
1758 std::unique_ptr<Ass_EE> ass_EE;
1759 NormFunctional& normFunctional;
1760 VariableSetDescription& variableSetDescription;
1761 ExtensionVariableSetDescription& extensionVariableSetDescription;
1762 ExtensionSpace& extensionSpace;
1764 Scalar totalErrorSquared;
1765 std::vector<std::pair<double,int> > errorDistribution;
1771 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
1772 class NormFunctional,
class LinearSystemSolver_H,
class LinearSystemSolver_L,
class LinearSolverA_H,
class LinearSolverA_L,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration>
1775 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using EstimatorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
1776 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using LumpedFunctional = Functional<AnsatzVars,TestVars,OriginVars,true>;
1817 static constexpr int dim = VariableSetDescription::Grid::dimension;
1819 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Iterator
CellIterator;
1820 typedef typename ExtensionVariableSetDescription::GridView::template Codim<0>::Entity
Cell;
1825 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
1826 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
1827 extensionSpace(extensionSpace_),
1828 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
1830 ass_EE.reset(
new Ass_EE(extensionVariableSetDescription.spaces));
1831 ass_HE.reset(
new Ass_HE(variableSetDescription.
spaces));
1832 ass_EH.reset(
new Ass_EH(extensionVariableSetDescription.spaces));
1833 ass_HH.reset(
new Ass_HH(variableSetDescription.
spaces));
1838 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
1840 boost::timer::cpu_timer overallTimer;
1841 using boost::fusion::at_c;
1842 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
1845 boost::timer::cpu_timer atimer;
1847 if(verbose) std::cout <<
"ERROR ESTIMATOR: assembly time: " << boost::timer::format(atimer.elapsed(), 2,
"%t") << std::endl;
1851 H_EE h_EE(*ass_EE,
false);
1852 H_EH h_EH(*ass_EH,
false);
1853 H_HH h_HH(*ass_HH,
false);
1854 H_HE h_HE(*ass_HE,
false);
1858 typename Traits::ExtensionVector sol_h(Traits::ExtensionVector_Initializer::init(extensionVariableSetDescription));
1862 typename Traits::Vector rhs_l(Traits::Vector_Initializer::init(variableSetDescription)),
1863 sol_l(Traits::Vector_Initializer::init(variableSetDescription));
1869 B_HH bll(*ass_HH,
false);
1870 B_HE blh(*ass_HE,
false);
1871 B_EH bhl(*ass_EH,
false);
1872 B_EE bhh(*ass_EE,
false);
1873 A_HH all(*ass_HH,
false);
1874 A_HE alh(*ass_HE,
false);
1875 A_EE ahh(*ass_EE,
false);
1877 typename Traits::VectorP rhsP_l(Traits::VectorP_Initializer::init(variableSetDescription));
1878 typename Traits::ExtensionVectorP rhsP_h(Traits::ExtensionVectorP_Initializer::init(extensionVariableSetDescription));
1880 typename Traits::VectorU wu_l(Traits::VectorU_Initializer::init(variableSetDescription));
1881 typename Traits::ExtensionVectorU wu_h(Traits::ExtensionVectorU_Initializer::init(extensionVariableSetDescription));
1883 at_c<0>(wu_l.data) = at_c<Traits::controlId>(sol_l.data);
1884 at_c<0>(wu_h.data) = at_c<Traits::controlId>(sol_h.data);
1890 typename Traits::VectorY wy_l(Traits::VectorY_Initializer::init(variableSetDescription));
1891 typename Traits::ExtensionVectorY wy_h(Traits::ExtensionVectorY_Initializer::init(extensionVariableSetDescription));
1898 typename Traits::VectorY rhsY_l(Traits::VectorY_Initializer::init(variableSetDescription));
1899 typename Traits::ExtensionVectorY rhsY_h(Traits::ExtensionVectorY_Initializer::init(extensionVariableSetDescription));
1901 typename Traits::VectorP wp_l(Traits::VectorP_Initializer::init(variableSetDescription));
1902 typename Traits::ExtensionVectorP wp_h(Traits::ExtensionVectorP_Initializer::init(extensionVariableSetDescription));
1904 Hyy_HH hyyll(*ass_HH,
false);
1905 Hyy_EH hyyhl(*ass_EH,
false);
1906 Hyy_HE hyylh(*ass_HE,
false);
1907 Hyy_EE hyyhh(*ass_EE,
false);
1909 AT_HH atll(*ass_HH,
false);
1910 AT_HE atlh(*ass_HE,
false);
1911 AT_EE athh(*ass_EE,
false);
1923 typename Traits::ExtensionVector weights(Traits::ExtensionVector_Initializer::init(extensionVariableSetDescription));
1924 at_c<Traits::controlId>(weights.data) = at_c<0>(wu_h.data);
1925 at_c<Traits::stateId>(weights.data) = at_c<0>(wy_h.data);
1926 at_c<Traits::adjointId>(weights.data) = at_c<0>(wp_h.data);
1928 typename Traits::ExtensionVector errorIndicator(Traits::ExtensionVector_Initializer::init(extensionVariableSetDescription));
1929 typename Traits::Vector tmp(Traits::Vector_Initializer::init(variableSetDescription)),
1930 tmp2(Traits::Vector_Initializer::init(variableSetDescription));
1932 h_EE.
apply(weights,errorIndicator);
1933 h_EH.
apply(weights,tmp);
1937 typename ExtensionVariableSetDescription::VariableSet errorEstimate_E(extensionVariableSetDescription);
1939 errorEstimate_E = errorIndicator;
1943 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
1944 errorDistribution.clear();
1945 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
1946 Scalar errLevel(0.0), minRefine(0.2);
1949 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
1951 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
1953 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
1956 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
1957 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
1959 std::cout <<
"nError: " << distError.dim() << std::endl;
1964 std::string name =
"errorDistribution_";
1965 name += std::to_string(step);
1966 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
1973 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));
1977 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
1982 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,sqrt(totalErrorSquared));
1987 return sqrt(fabs(totalErrorSquared));
1992 return extensionSpace.gridManager().grid().size(0);
1995 template <
typename... Args>
2007 ass_HE->assemble(linearization(*F_HE,xl.
get()));
2008 ass_EH->assemble(linearization(*F_EH,xe.
get()));
2009 ass_EE->assemble(linearization(*F_EE,xe.
get()));
2010 ass_HH->assemble(linearization(*F_HH,xl.
get()));
2013 std::unique_ptr<Functional_HE> F_HE;
2014 std::unique_ptr<Functional_EH> F_EH;
2015 std::unique_ptr<Functional_EE> F_EE;
2016 std::unique_ptr<Functional_HH> F_HH;
2017 std::unique_ptr<Ass_HE> ass_HE;
2018 std::unique_ptr<Ass_EH> ass_EH;
2019 std::unique_ptr<Ass_EE> ass_EE;
2020 std::unique_ptr<Ass_HH> ass_HH;
2021 NormFunctional& normFunctional;
2022 VariableSetDescription& variableSetDescription;
2023 ExtensionVariableSetDescription& extensionVariableSetDescription;
2024 ExtensionSpace& extensionSpace;
2026 Scalar totalErrorSquared;
2027 std::vector<std::pair<double,int> > errorDistribution;
2033 template <
template <
class,
class,
class,
bool>
class Functional,
class VariableSetDescription,
class ExtensionVariableSetDescription,
class ExtensionSpace,
2034 class NormFunctional,
class LinearSolverLA,
class LinearSolverHA,
class LinearSolverLM=LinearSolverLA,
class LinearSolverHM=LinearSolverHA,
2035 bool lumpM=
false,
template <
class>
class RefinementStrategy = Adaptivity::ErrorEquilibration>
2038 static constexpr int noOfVariables = ExtensionVariableSetDescription::noOfVariables;
2039 template <
class AnsatzVars,
class TestVars,
class OriginVars>
using ErrorFunctional = Functional<AnsatzVars,TestVars,OriginVars,false>;
2048 typedef Functional<VariableSetDescription,VariableSetDescription,VariableSetDescription,lumpM>
Functional_HH;
2049 typedef Functional<ExtensionVariableSetDescription,VariableSetDescription,ExtensionVariableSetDescription,lumpM>
Functional_EH;
2050 typedef Functional<VariableSetDescription,ExtensionVariableSetDescription,VariableSetDescription,lumpM>
Functional_HE;
2051 typedef Functional<ExtensionVariableSetDescription,ExtensionVariableSetDescription,ExtensionVariableSetDescription,lumpM>
Functional_EE;
2081 ExtensionSpace& extensionSpace_,
Scalar fraction=0.7,
bool verbose_=
false,
bool fast_ =
false)
2082 : RefinementStrategy<typename
VariableSetDescription::Grid>(extensionSpace_.gridManager(),fraction,verbose), normFunctional(normFunctional_), variableSetDescription(variableSetDescription_), extensionVariableSetDescription(extensionVariableSetDescription_),
2083 extensionSpace(extensionSpace_), assembler(extensionVariableSetDescription.spaces),
2084 squaredFraction(fraction*fraction), verbose(verbose_), fast(fast_)
2091 void operator()(AbstractVector
const& x_, AbstractVector
const& dx_,
int step, AbstractVector
const&)
2093 boost::timer::cpu_timer overallTimer;
2094 using boost::fusion::at_c;
2095 if(verbose) std::cout <<
"ERROR ESTIMATOR: Start." << std::endl;
2103 typename ExtensionVariableSetDescription::VariableSet tmpRep(extensionVariableSetDescription), errorEstimate_E(extensionVariableSetDescription);
2106 AT_EE atee(*ass_EE,
false);
2107 AT_HE athe(*ass_HE,
false);
2109 typename Traits::ExtensionVectorP dpe(Traits::ExtensionVectorP_Initializer::init(extensionVariableSetDescription));
2111 typename Traits::VectorP dph(Traits::VectorP_Initializer::init(variableSetDescription));
2112 at_c<0>(dph.data) = at_c<adjointId>(dxl.
get().data).coefficients();
2119 at_c<adjointId>(errorEstimate_E.data) = at_c<0>(dpe.data);
2124 M_HH mhh(*ass_HH,
false);
2125 M_EE mee(*ass_EE,
false);
2127 BT_EH bteh(*ass_EH,
false);
2128 BT_EE btee(*ass_EE,
false);
2130 typename Traits::VectorU ruh(ass_HH->template rhs<controlId,controlId+1>()),
2131 duh(Traits::VectorU_Initializer::init(variableSetDescription));
2133 due(Traits::ExtensionVectorU_Initializer::init(extensionVariableSetDescription));
2143 at_c<controlId>(errorEstimate_E.data) = at_c<0>(due.data);
2144 at_c<controlId>(errorEstimate_H.
data) = at_c<0>(duh.data);
2148 B_HH bhh(*ass_HH,
false);
2149 B_EH beh(*ass_EH,
false);
2150 B_HE bhe(*ass_HE,
false);
2151 B_EE bee(*ass_EE,
false);
2153 A_HH ahh(*ass_HH,
false);
2154 A_EE aee(*ass_EE,
false);
2155 A_EH aeh(*ass_EH,
false);
2157 typename Traits::VectorP rph(ass_HH->template rhs<adjointId,adjointId+1>());
2167 typename Traits::VectorY dyh(Traits::VectorY_Initializer::init(variableSetDescription));
2168 typename Traits::ExtensionVectorY dye(Traits::ExtensionVectorY_Initializer::init(extensionVariableSetDescription));
2174 at_c<stateId>(errorEstimate_E.data) = at_c<0>(dye.data);
2175 at_c<stateId>(errorEstimate_H.
data) = at_c<0>(dyh.data);
2178 auto const& is = extensionSpace.gridManager().grid().leafIndexSet();
2179 errorDistribution.clear();
2180 errorDistribution.resize(is.size(0),std::make_pair(0.0,0));
2181 Scalar errLevel(0.0), minRefine(0.2);
2184 typedef ErrorDistribution3<NormFunctional,ExtensionVariableSetDescription> EnergyError;
2186 EnergyError energyError(normFunctional,xl.
get(),errorEstimate_H,errorEstimate_E);
2188 EnergyErrorAssembler eeAssembler(extensionSpace.gridManager(), energyError.getSpaces());
2191 typename EnergyError::ErrorVector distError( eeAssembler.rhs() );
2192 typename EnergyError::AnsatzVars::VariableSet mde( energyError.getVariableSetDescription() );
2198 std::string name =
"errorDistribution_";
2199 name += std::to_string(step);
2200 writeVTKFile(mde.descriptions.gridView,mde.descriptions,mde,name);
2205 auto cend = extensionVariableSetDescription.gridView.template end<0>();
2206 for (
auto ci=extensionVariableSetDescription.gridView.template begin<0>(); ci!=cend; ++ci)
2207 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));
2211 if(verbose) std::cout <<
"overall error estimation time: " << boost::timer::format(overallTimer.elapsed()) << std::endl;
2216 if(totalErrorSquared > 0) this->
refineGrid_impl(errorDistribution,sqrt(totalErrorSquared));
2240 return sqrt(fabs(totalErrorSquared));
2245 return extensionSpace.gridManager().grid().size(0);
2248 template <
typename... Args>
2258 void initAssemblers()
2260 ass_HH.reset(
new Ass_HH(extensionVariableSetDescription.spaces));
2261 ass_HE.reset(
new Ass_HE(extensionVariableSetDescription.spaces));
2262 ass_EH.reset(
new Ass_EH(extensionVariableSetDescription.spaces));
2263 ass_EE.reset(
new Ass_EE(extensionVariableSetDescription.spaces));
2266 void assembleAt(
const Bridge::Vector<typename VariableSetDescription::VariableSet>& xh,
const Bridge::Vector<typename ExtensionVariableSetDescription::VariableSet>& xe)
2268 ass_HH->assemble(linearization(*F_HH,xh.get()));
2269 ass_HE->assemble(linearization(*F_HE,xh.get()));
2270 ass_EH->assemble(linearization(*F_EH,xe.get()));
2271 ass_EE->assemble(linearization(*F_EE,xe.get()));
2274 std::unique_ptr<Functional_HH> F_HH;
2275 std::unique_ptr<Functional_HE> F_HE;
2276 std::unique_ptr<Functional_EH> F_EH;
2277 std::unique_ptr<Functional_EE> F_EE;
2278 std::unique_ptr<Ass_HH> ass_HH;
2279 std::unique_ptr<Ass_HE> ass_HE;
2280 std::unique_ptr<Ass_EH> ass_EH;
2281 std::unique_ptr<Ass_EE> ass_EE;
2284 NormFunctional& normFunctional;
2285 VariableSetDescription& variableSetDescription;
2286 ExtensionVariableSetDescription& extensionVariableSetDescription;
2287 ExtensionSpace& extensionSpace;
2290 Scalar totalErrorSquared;
2291 std::vector<std::pair<double,int> > errorDistribution;
void refineGrid_impl(Err const &err, ErrorRepresentation &errorDistribution, Scalar tol)
void initFunctionals(const Args &... args)
Traits::Assembler_EE Ass_EE
size_t gridSize() const final
Traits::Assembler_HE Ass_HE
double estimatedAbsoluteError() const final
virtual ~AdjointEquationHBErrorEstimator()
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
AdjointEquationHBErrorEstimator(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
double estimatedAbsoluteError() const final
size_t gridSize() const final
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
AdjointEquationLinearPropagationHBErrorEstimator(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
virtual ~AdjointEquationLinearPropagationHBErrorEstimator()
void initFunctionals(const Args &... args)
double estimatedAbsoluteError() const final
virtual ~AnotherHBErrorEstimator()
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
size_t gridSize() const final
void initFunctionals(const Args &... args)
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
AnotherHBErrorEstimator(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
An adaptor presenting a Dune::LinearOperator <domain_type,range_type> interface to a contiguous sub-b...
virtual void apply(Domain const &x, Range &b) const
compute
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.
Defines assembly of hierarchically extended problems for defining DLY style error estimators.
AssembledGalerkinOperator< Ass_EE, uId, uId+1, uId, uId+1 > Muuhh
CVLU::type CoefficientVectorLU
AssembledGalerkinOperator< Ass_HE, pId, pId+1, yId, yId+1 > Alh
AssembledGalerkinOperator< Ass_HE, uId, uId+1, pId, pId+1 > BTlh
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< 2, 3 > CVH23
size_t gridSize() const final
Functional< ExtensionVariableSetDescription, ExtensionVariableSetDescription, ExtensionVariableSetDescription, lumpM > Functional_EE
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
AssembledGalerkinOperator< Ass_HE, uId, uId+1, uId, uId+1 > Muulh
Functional< VariableSetDescription, VariableSetDescription, VariableSetDescription, lumpM > Functional_HH
Functional< ExtensionVariableSetDescription, VariableSetDescription, ExtensionVariableSetDescription, lumpM > Functional_EH
AssembledGalerkinOperator< Ass_EE, yId, yId+1, yId, yId+1 > Myyhh
CVLY::type CoefficientVectorLY
AssembledGalerkinOperator< Ass_EH, uId, uId+1, uId, uId+1 > Muuhl
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
VariableSetDescription::template CoefficientVectorRepresentation CVL
VariableSetDescription::template CoefficientVectorRepresentation< uId, uId+1 > CVLU
HierarchicalBasisErrorEstimator2(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< uId, uId+1 > CVHU
AssembledGalerkinOperator< Ass_EE, uId, uId+1, pId, pId+1 > BThh
VariationalFunctionalAssembler< LinearizationAt< Functional_EE > > Ass_EE
VariableSetDescription::template CoefficientVectorRepresentation< pId, pId+1 > CVLP
VariationalFunctionalAssembler< LinearizationAt< Functional_HH > > Ass_HH
void initFunctionals(const Args &... args)
VariableSet< VariableSetDescription > VarSet
CVHU::type CoefficientVectorHU
AssembledGalerkinOperator< Ass_HE, pId, pId+1, uId, uId+1 > Blh
ExtensionVariableSetDescription::template CoefficientVectorRepresentation CVH
VariationalFunctionalAssembler< LinearizationAt< Functional_HE > > Ass_HE
CVHY::type CoefficientVectorHY
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< pId, pId+1 > CVHP
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
Functional< VariableSetDescription, ExtensionVariableSetDescription, VariableSetDescription, lumpM > Functional_HE
VariationalFunctionalAssembler< ErrorEstimator > Assembler
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< 0, 1 >::type CoefficientVectorH01
CVHP::type CoefficientVectorHP
VariationalFunctionalAssembler< LinearizationAt< Functional_EH > > Ass_EH
AssembledGalerkinOperator< Ass_EH, pId, pId+1, yId, yId+1 > Ahl
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< 2, 3 >::type CoefficientVectorH23
AssembledGalerkinOperator< Ass_EE, pId, pId+1, uId, uId+1 > Bhh
AssembledGalerkinOperator< Ass_HH, pId, pId+1, yId, yId+1 > All
VariableSetDescription::template CoefficientVectorRepresentation< yId, yId+1 > CVLY
AssembledGalerkinOperator< Ass_EE, pId, pId+1, yId, yId+1 > Ahh
AssembledGalerkinOperator< Ass_HH, pId, pId+1, uId, uId+1 > Bll
double estimatedAbsoluteError() const final
CVLP::type CoefficientVectorLP
AssembledGalerkinOperator< Ass_EH, pId, pId+1, uId, uId+1 > Bhl
CVH::type CoefficientVectorH
HierarchicErrorEstimator< LinearizationAt< Functional_HH >, ExtensionVariableSetDescription, ExtensionVariableSetDescription > ErrorEstimator
VariableSet< ExtensionVariableSetDescription > ExtVarSet
AssembledGalerkinOperator< Ass_EH, uId, uId+1, pId, pId+1 > BThl
MatrixAsTriplet< Scalar > Matrix
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< yId, yId+1 > CVHY
virtual ~HierarchicalBasisErrorEstimator2()
AssembledGalerkinOperator< Ass_HH, uId, uId+1, uId, uId+1 > Muull
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< 0, 2 >::type CoefficientVectorH02
AssembledGalerkinOperator< Ass_HH, uId, uId+1, pId, pId+1 > BTll
CVL::type CoefficientVectorL
Functional_HH::Scalar Scalar
size_t gridSize() const final
VariationalFunctionalAssembler< LinearizationAt< Functional_HH > > Ass_HH
Functional< ExtensionVariableSetDescription, ExtensionVariableSetDescription, ExtensionVariableSetDescription, lumpM > Functional_EE
void initFunctionals(const Args &... args)
VariationalFunctionalAssembler< ErrorEstimator > Assembler
double estimatedAbsoluteError() const final
Functional< ExtensionVariableSetDescription, VariableSetDescription, ExtensionVariableSetDescription, lumpM > Functional_EH
HierarchicErrorEstimator< LinearizationAt< Functional_HH >, ExtensionVariableSetDescription, ExtensionVariableSetDescription > ErrorEstimator
VariationalFunctionalAssembler< LinearizationAt< Functional_EH > > Ass_EH
HierarchicalBasisErrorEstimator3(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
virtual ~HierarchicalBasisErrorEstimator3()
Functional< VariableSetDescription, ExtensionVariableSetDescription, VariableSetDescription, lumpM > Functional_HE
VariationalFunctionalAssembler< LinearizationAt< Functional_HE > > Ass_HE
Functional< VariableSetDescription, VariableSetDescription, VariableSetDescription, lumpM > Functional_HH
VariationalFunctionalAssembler< LinearizationAt< Functional_EE > > Ass_EE
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
Dune::LinearOperator interface for inverse operators.
virtual void apply(domain_type &x, range_type const &b)
Proxy class for the linearization of a nonlinear functional.
Traits::Assembler_HE Ass_HE
Traits::Functional_HE Functional_HE
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
void initFunctionals(const Args &... args)
FullTraits::Assembler_HH Ass_HH
FullTraits::Functional_HH Functional_HH
MartinsErrorEstimator(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
Traits::Functional_EH Functional_EH
Traits::Assembler_EE Ass_EE
Traits::Functional_EE Functional_EE
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
Traits::Assembler_EH Ass_EH
FullTraits::Operator_HH H_HH
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
FullTraits::Lyy_HH Hyy_HH
virtual ~MartinsErrorEstimator()
size_t gridSize() const final
double estimatedAbsoluteError() const final
MatrixAsTriplet & transpose()
Transposition.
void usmtv(Scalar const alpha, X const &x, Y &y) const
Matrix-vector multiplication.
void usmv(Scalar const alpha, X const &x, Y &y) const
scaled matrix-vector multiplication
Operator with matrix-representation and coordinate mappings.
size_t gridSize() const final
Traits::Functional_HE Functional_HE
void initFunctionals(const Args &... args)
Traits::Functional_EE Functional_EE
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
Traits::Assembler_HE Ass_HE
double estimatedAbsoluteError() const final
Traits::Assembler_EE Ass_EE
virtual ~StateEquationHBErrorEstimator()
StateEquationHBErrorEstimator(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
Traits::Functional_HH Functional_HH
double estimatedAbsoluteError() const final
Traits::Assembler_EE Ass_EE
size_t gridSize() const final
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
Traits::Functional_HH Functional_HH
virtual ~StupidHBErrorEstimator()
Traits::Assembler_HE Ass_HE
void initFunctionals(const Args &... args)
Traits::Functional_HE Functional_HE
StupidHBErrorEstimator(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
Traits::Functional_EE Functional_EE
A class that stores information about a set of variables.
GridView const & gridView
The grid view on which the variables live.
Spaces spaces
A heterogeneous sequence of pointers to (const) spaces involved.
A class for storing a heterogeneous collection of FunctionSpaceElement s.
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Entity Cell
Traits::Assembler_HE Ass_HE
Traits::Assembler_EE Ass_EE
void operator()(AbstractVector const &x_, AbstractVector const &dx_, int step, AbstractVector const &)
Traits::Functional_HE Functional_HE
void initFunctionals(const Args &... args)
Traits::Functional_EE Functional_EE
double estimatedAbsoluteError() const final
VariationalEquationHBErrorEstimator(NormFunctional &normFunctional_, VariableSetDescription &variableSetDescription_, ExtensionVariableSetDescription &extensionVariableSetDescription_, ExtensionSpace &extensionSpace_, Scalar fraction=0.7, bool verbose_=false, bool fast_=false)
ExtensionVariableSetDescription::GridView::template Codim< 0 >::Iterator CellIterator
virtual ~VariationalEquationHBErrorEstimator()
size_t gridSize() const final
A class for assembling Galerkin representation matrices and right hand sides for variational function...
void assemble(F const &f, unsigned int flags=Assembler::EVERYTHING, int nThreads=0, bool verbose=false)
Assembly without block filter or cell filter.
Error estimation via hierachic FEM.
@ UMFPACK3264
NO LONGER SUPPORTED.
Dune::FieldVector< T, n > max(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise maximum.
Dune::FieldVector< T, n > min(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise minimum.
constexpr int getStateId()
constexpr int getControlId()
std::integral_constant< int, Functional::controlId > getControlIdImpl(decltype(Functional::controlId) *)
constexpr int getAdjointId()
std::integral_constant< int, Functional::stateId > getStateIdImpl(decltype(Functional::stateId) *)
std::integral_constant< int, Functional::adjointId > getAdjointIdImpl(decltype(Functional::adjointId) *)
double add(const double &x1, const std::pair< double, int > &x2)
Bridge classes that connect low level FE algorithms to higher level algorithms.
AssembledGalerkinOperator< Assembler_EE, controlId, controlId+1, stateId, stateId+1 > Luy_EE
AssembledGalerkinOperator< Assembler_HE, controlId, controlId+1, stateId, stateId+1 > Luy_HE
AssembledGalerkinOperator< Assembler_EE, adjointId, adjointId+1, stateId, stateId+1 > A_EE
VariableSetDescription::template CoefficientVectorRepresentation< stateId, stateId+1 > VectorY_Initializer
VariationalFunctionalAssembler< LinearizationAt< Functional_HH > > Assembler_HH
AssembledGalerkinOperator< Assembler_HE, stateId, stateId+1, stateId, stateId+1 > Lyy_HE
AssembledGalerkinOperator< Assembler_EH, controlId, controlId+1, stateId, stateId+1 > Luy_EH
AssembledGalerkinOperator< Assembler_HE, stateId, stateId+1, controlId, controlId+1 > Lyu_HE
Functional< VariableSetDescription, ExtensionVariableSetDescription, VariableSetDescription > Functional_HE
AssembledGalerkinOperator< Assembler_EE, stateId, stateId+1, adjointId, adjointId+1 > AT_EE
AssembledGalerkinOperator< Assembler_EE, controlId, controlId+1, adjointId, adjointId+1 > BT_EE
static constexpr int adjointId
AssembledGalerkinOperator< Assembler_HH, stateId, stateId+1, stateId, stateId+1 > Lyy_HH
AssembledGalerkinOperator< Assembler_EE > Operator_EE
Functional< VariableSetDescription, VariableSetDescription, VariableSetDescription > Functional_HH
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< stateId, stateId+1 > ExtensionVectorY_Initializer
AssembledGalerkinOperator< Assembler_HH > Operator_HH
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< adjointId, adjointId+1 >::type ExtensionVectorP
VariableSetDescription::template CoefficientVectorRepresentation< adjointId, adjointId+1 >::type VectorP
AssembledGalerkinOperator< Assembler_EH, stateId, stateId+1, controlId, controlId+1 > Lyu_EH
AssembledGalerkinOperator< Assembler_EH, stateId, stateId+1, adjointId, adjointId+1 > AT_EH
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< controlId, controlId+1 > ExtensionVectorU_Initializer
VariableSetDescription::template CoefficientVectorRepresentation< controlId, controlId+1 >::type VectorU
AssembledGalerkinOperator< Assembler_HE, controlId, controlId+1, controlId, controlId+1 > Luu_HE
Functional_HH::Scalar Scalar
AssembledGalerkinOperator< Assembler_EE, controlId, controlId+1, controlId, controlId+1 > Luu_EE
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< controlId, controlId+1 >::type ExtensionVectorU
ExtensionVariableSetDescription::template CoefficientVectorRepresentation ExtensionVector_Initializer
AssembledGalerkinOperator< Assembler_EH, controlId, controlId+1, adjointId, adjointId+1 > BT_EH
AssembledGalerkinOperator< Assembler_HH, stateId, stateId+1, adjointId, adjointId+1 > AT_HH
AssembledGalerkinOperator< Assembler_EE, stateId, stateId+1, stateId, stateId+1 > Lyy_EE
AssembledGalerkinOperator< Assembler_HE, adjointId, adjointId+1, stateId, stateId+1 > A_HE
AssembledGalerkinOperator< Assembler_EH, stateId, stateId+1, stateId, stateId+1 > Lyy_EH
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< stateId, stateId+1 >::type ExtensionVectorY
VariableSet< VariableSetDescription > VarSet
VariableSetDescription::template CoefficientVectorRepresentation< stateId, stateId+1 >::type VectorY
AssembledGalerkinOperator< Assembler_HE, adjointId, adjointId+1, controlId, controlId+1 > B_HE
AssembledGalerkinOperator< Assembler_EH, adjointId, adjointId+1, controlId, controlId+1 > B_EH
VariableSetDescription::template CoefficientVectorRepresentation< adjointId, adjointId+1 > VectorP_Initializer
ExtensionVariableSetDescription::template CoefficientVectorRepresentation< adjointId, adjointId+1 > ExtensionVectorP_Initializer
AssembledGalerkinOperator< Assembler_EH, adjointId, adjointId+1, stateId, stateId+1 > A_EH
AssembledGalerkinOperator< Assembler_HH, adjointId, adjointId+1, stateId, stateId+1 > A_HH
AssembledGalerkinOperator< Assembler_EE, adjointId, adjointId+1, controlId, controlId+1 > B_EE
VariationalFunctionalAssembler< LinearizationAt< Functional_HE > > Assembler_HE
AssembledGalerkinOperator< Assembler_HH, controlId, controlId+1, adjointId, adjointId+1 > BT_HH
AssembledGalerkinOperator< Assembler_HH, controlId, controlId+1, stateId, stateId+1 > Luy_HH
ExtensionVariableSetDescription::template CoefficientVectorRepresentation ::type ExtensionVector
VariationalFunctionalAssembler< LinearizationAt< Functional_EH > > Assembler_EH
VariableSetDescription::template CoefficientVectorRepresentation ::type Vector
AssembledGalerkinOperator< Assembler_HH, adjointId, adjointId+1, controlId, controlId+1 > B_HH
Functional< ExtensionVariableSetDescription, VariableSetDescription, ExtensionVariableSetDescription > Functional_EH
VariableSet< ExtensionVariableSetDescription > ExtensionVarSet
VariableSetDescription::template CoefficientVectorRepresentation< controlId, controlId+1 > VectorU_Initializer
AssembledGalerkinOperator< Assembler_EH > Operator_EH
AssembledGalerkinOperator< Assembler_HE > Operator_HE
AssembledGalerkinOperator< Assembler_EE, stateId, stateId+1, controlId, controlId+1 > Lyu_EE
VariableSetDescription::template CoefficientVectorRepresentation Vector_Initializer
AssembledGalerkinOperator< Assembler_HH, controlId, controlId+1, controlId, controlId+1 > Luu_HH
AssembledGalerkinOperator< Assembler_HE, stateId, stateId+1, adjointId, adjointId+1 > AT_HE
AssembledGalerkinOperator< Assembler_HE, controlId, controlId+1, adjointId, adjointId+1 > BT_HE
Functional< ExtensionVariableSetDescription, ExtensionVariableSetDescription, ExtensionVariableSetDescription > Functional_EE
AssembledGalerkinOperator< Assembler_HH, stateId, stateId+1, controlId, controlId+1 > Lyu_HH
static constexpr int controlId
static constexpr int stateId
VariationalFunctionalAssembler< LinearizationAt< Functional_EE > > Assembler_EE
AssembledGalerkinOperator< Assembler_EH, controlId, controlId+1, controlId, controlId+1 > Luu_EH
Variables and their descriptions.