7#include <boost/timer/timer.hpp>
8#include <boost/fusion/include/at_c.hpp>
39 template <
class X,
class Xstar,
int yIdx,
int uIdx,
int pIdx>
48 virtual Scalar
operator()(
X const& x, Xstar
const& y)
const {
return sy * prod<yIdx>(x,y) + su * prod<uIdx>(x,y) + sp * prod<pIdx>(x,y); }
51 template <
int i> Scalar prod(
X const& x, Xstar
const& y)
const {
return boost::fusion::at_c<i>(x.data) * boost::fusion::at_c<i>(y.data); }
53 Scalar sy = 1.0, su = 1.0, sp = 1.0;
322 template <
class Operator,
class PrecondAssembler,
class PreconditionerFactory,
class VariableSet>
327 static constexpr int components = Assembler::Grid::dimension;
328 typedef typename Assembler::Functional::Functional
Functional;
330 typedef OptimalControlTraits<Functional,Assembler>
Traits;
331 typedef typename Operator::Domain
Domain;
332 typedef typename Operator::Range
Range;
342 tangentialStepPreconditioner->apply(v,d);
352 std::cout <<
"init P" << std::endl;
358 PrecondAssembler assembler(A->getAssembler().spaces());
359 assembler.assemble(linearization(pf,Bridge::getImpl<VariableSet>(lin.
getOrigin())));
360 std::cout <<
"init nsp" << std::endl;
363 std::cout <<
"done init p" << std::endl;
364 std::unique_ptr<AbstractFunctionSpaceElement> combinedrhs(correction.
clone());
365 std::unique_ptr<AbstractFunctionSpaceElement> derivativerhs(correction.
clone());
366 std::unique_ptr<AbstractFunctionSpaceElement> constraintrhs(correction.
clone());
367 *derivativerhs *= 0.0;
368 *constraintrhs *= 0.0;
369 lin.
evald(*combinedrhs);
370 derivativerhs->axpy(1.0,*combinedrhs,
"primal");
371 constraintrhs->axpy(1.0,*combinedrhs,
"dual");
372 VariableSet& derrhs=Bridge::getImpl<VariableSet>(*derivativerhs);
373 VariableSet& conrhs=Bridge::getImpl<VariableSet>(*constraintrhs);
376 Domain x(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(derrhs.
descriptions));
378 Range y(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(derrhs.
descriptions));
383 VariableSet& adj=Bridge::getImpl<VariableSet>(adjointCorrection);
387 std::cout <<
"adjoint correction: " << x*x << std::endl;
394 VariableSet& cor=Bridge::getImpl<VariableSet>(correction);
400 virtual void computeSimplifiedCorrection(AbstractFunctionSpaceElement& correction,
401 AbstractLinearization
const& lin, AbstractFunctionSpaceElement* residual)
const
404 std::unique_ptr<AbstractFunctionSpaceElement> combinedrhs(correction.clone());
405 std::unique_ptr<AbstractFunctionSpaceElement> constraintrhs(correction.clone());
406 *constraintrhs *= 0.0;
407 lin.evald(*combinedrhs);
408 constraintrhs->axpy(1.0,*combinedrhs,
"dual");
409 if(residual !=
nullptr) *constraintrhs += *residual;
410 VariableSet& conrhs=Bridge::getImpl<VariableSet>(*constraintrhs);
411 std::cout <<
"RHS 2=" << boost::fusion::at_c<2>(conrhs.data).coefficients()*boost::fusion::at_c<2>(conrhs.data).coefficients() << std::endl;
413 Domain x(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(conrhs.descriptions));
415 Range y(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(conrhs.descriptions));
421 VariableSet& cor=Bridge::getImpl<VariableSet>(correction);
427 PreconditionerFactory& prec;
428 std::unique_ptr<Dune::Preconditioner<Domain,Range> > P;
429 std::unique_ptr<Operator> A;
430 std::unique_ptr<NormalStepPreconditioner<PreconditionerFunctional,PrecondAssembler> > normalStepPreconditioner;
431 std::unique_ptr<InexactTangentSpacePreconditioner<PreconditionerFunctional,PrecondAssembler,components> > tangentialStepPreconditioner;
434 template <
class Assembler_,
class PrecondAssembler,
class Domain_,
class Range_,
class VariableSet,
int components=Assembler_::Gr
id::dimension>
441 typedef typename Assembler::Functional::Functional
Functional;
443 typedef OptimalControlTraits<Functional,Assembler>
Traits;
446 typedef IterateType::CG<Domain,Range>
Solver;
449 : pf(pf_), initialRelativeAccuracy(relativeAccuracy_), relativeAccuracy(initialRelativeAccuracy), eps(eps_), maxSteps(maxSteps_), verbosity(verbosity_)
458 normalStepPreconditioner->apply(v,d);
464 relativeAccuracy =
std::min(relativeAccuracy_,initialRelativeAccuracy);
467 virtual void setEps(
double eps_) { eps = eps_; }
474 void setNormalStepParameters()
const
476 normalStepPreconditioner->setParameter(mgSteps, mgSmoothingSteps, chebySteps, 1e-9);
479 void setTangentialStepParameters()
const
481 normalStepPreconditioner->setParameter(mgSteps, mgSmoothingSteps, chebySteps, 1e-9);
485 virtual void computeCorrectionAndAdjointCorrection(AbstractFunctionSpaceElement& correction, AbstractFunctionSpaceElement& adjointCorrection, AbstractLinearization& lin, AbstractFunctionSpaceElement* correctionResidual, AbstractFunctionSpaceElement* adjointResidual)
487 A.reset(
new AssembledGalerkinOperator<Assembler>(
dynamic_cast<BridgeLinearization&
>(lin).getValidAssembler()));
489 PrecondAssembler assembler(A->getAssembler().spaces());
492 std::unique_ptr<AbstractFunctionSpaceElement> combinedrhs(correction.clone());
493 std::unique_ptr<AbstractFunctionSpaceElement> derivativerhs(correction.clone());
494 std::unique_ptr<AbstractFunctionSpaceElement> constraintrhs(correction.clone());
495 *derivativerhs *= 0.0;
496 *constraintrhs *= 0.0;
497 lin.evald(*combinedrhs);
499 derivativerhs->axpy(1.0,*combinedrhs,
"primal");
500 VariableSet& derrhs=Bridge::getImpl<VariableSet>(*derivativerhs);
502 constraintrhs->axpy(1.0,*combinedrhs,
"dual");
503 VariableSet& conrhs=Bridge::getImpl<VariableSet>(*constraintrhs);
506 if(verbosity > 0) std::cout <<
"computing adjoint correction" << std::endl;
507 Domain x(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(derrhs.descriptions));
508 Range y(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(derrhs.descriptions));
511 StrakosTichyEnergyErrorTerminationCriterion<double> terminationCriterion(relativeAccuracy,maxSteps,eps);
512 terminationCriterion.lookahead(10);
513 normalStepPreconditioner.reset(
new NormalStepPreconditioner3<PreconditionerFunctional,PrecondAssembler,components>(assembler,conrhs.descriptions,derrhs.descriptions));
514 setNormalStepParameters();
516 Solver solver(*A, *normalStepPreconditioner, dualPairing, terminationCriterion, verbosity, eps);
518 VariableSet& adj=Bridge::getImpl<VariableSet>(adjointCorrection);
522 if( adjointResidual !=
nullptr )
525 A->applyscaleadd(-1.0,x,y);
526 Bridge::getImpl<VariableSet>(*adjointResidual) = y;
534 typename Traits::VectorP rhs(boost::fusion::at_c<Traits::adjointId>(y.data));
535 typename Traits::VectorY sol(Traits::CreateVectorY::init(derrhs.descriptions));
536 normalStepPreconditioner->applyStatePreconditioner(sol,rhs);
537 boost::fusion::at_c<Traits::stateId>(x1.data) = boost::fusion::at_c<0>(sol.data);
538 A->applyscaleadd(-1.0,x1,y);
540 if(verbosity > 0) std::cout <<
"computing correction" << std::endl;
546 if(correctionResidual !=
nullptr)
549 A->applyscaleadd(-1.0,x,y);
550 Bridge::getImpl<VariableSet>(*correctionResidual) = y;
553 VariableSet& cor=Bridge::getImpl<VariableSet>(correction);
557 setTangentialStepParameters();
561 virtual void computeSimplifiedCorrection(AbstractFunctionSpaceElement& correction,
562 AbstractLinearization
const& lin, AbstractFunctionSpaceElement* correctionResidual)
const
564 setNormalStepParameters();
565 std::unique_ptr<AbstractFunctionSpaceElement> combinedrhs(correction.clone());
566 std::unique_ptr<AbstractFunctionSpaceElement> constraintrhs(correction.clone());
567 *constraintrhs *= 0.0;
568 lin.evald(*combinedrhs);
569 constraintrhs->axpy(1.0,*combinedrhs,
"dual");
571 if(correctionResidual !=
nullptr) constraintrhs->axpy(-1.0,*correctionResidual,
"dual");
572 VariableSet& conrhs=Bridge::getImpl<VariableSet>(*constraintrhs);
574 Domain x(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(conrhs.descriptions));
575 Range y(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(conrhs.descriptions));
581 typename Traits::VectorP rhs(boost::fusion::at_c<Traits::adjointId>(y.data));
582 typename Traits::VectorY sol(Traits::CreateVectorY::init(conrhs.descriptions));
583 normalStepPreconditioner->applyStatePreconditioner(sol,rhs);
584 boost::fusion::at_c<Traits::stateId>(x1.data) = boost::fusion::at_c<0>(sol.data);
585 A->applyscaleadd(-1.0,x1,y);
588 StrakosTichyEnergyErrorTerminationCriterion<double> terminationCriterion(relativeAccuracy,maxSteps,eps);
589 terminationCriterion.lookahead(15);
590 Solver solver(*A, *normalStepPreconditioner, dualPairing, terminationCriterion, verbosity, eps);
595 VariableSet& cor=Bridge::getImpl<VariableSet>(correction);
601 mutable std::unique_ptr<NormalStepPreconditioner3<PreconditionerFunctional,PrecondAssembler,components> > normalStepPreconditioner;
602 std::unique_ptr<AssembledGalerkinOperator<Assembler> > A;
603 DefaultDualPairing<Domain,Range> dualPairing;
604 Scalar initialRelativeAccuracy, relativeAccuracy, eps;
607 size_t mgSteps = 500, mgSmoothingSteps = 25, chebySteps = 50;
608 size_t mgStepsT = 20, mgSmoothingStepsT = 20, chebyStepsT = 50;
611 template <
class Assembler_,
class PrecondAssembler,
class Domain_,
class Range_,
class VariableSet,
int components=Assembler_::Gr
id::dimension>
618 typedef typename Assembler::Functional::Functional
Functional;
620 typedef OptimalControlTraits<Functional,Assembler>
Traits;
625 : directType(directType_), properties(properties_), verbosity(verbosity_)
642 std::unique_ptr<AbstractFunctionSpaceElement> combinedrhs(correction.
initZeroVector());
643 std::unique_ptr<AbstractFunctionSpaceElement> derivativerhs(correction.
initZeroVector());
644 std::unique_ptr<AbstractFunctionSpaceElement> constraintrhs(correction.
initZeroVector());
645 lin.
evald(*combinedrhs);
647 derivativerhs->axpy(1.0,*combinedrhs,
"primal");
648 VariableSet& derrhs=Bridge::getImpl<VariableSet>(*derivativerhs);
650 constraintrhs->axpy(1.0,*combinedrhs,
"dual");
651 VariableSet& conrhs=Bridge::getImpl<VariableSet>(*constraintrhs);
654 if(verbosity > 0) std::cout <<
"PrecondType::DIRECT NORMAL SOLVER: Computing adjoint correction." << std::endl;
655 Domain x(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(derrhs.
descriptions));
656 Range y(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(derrhs.
descriptions));
660 directSolver.apply(y,x);
661 VariableSet& adj=Bridge::getImpl<VariableSet>(adjointCorrection);
665 if( adjointResidual !=
nullptr )
668 A->applyscaleadd(-1.0,x,y);
669 Bridge::getImpl<VariableSet>(*adjointResidual) = y;
675 if(verbosity > 0) std::cout <<
"PrecondType::DIRECT NORMAL SOLVER: Computing correction." << std::endl;
676 directSolver.apply(y,x);
678 VariableSet& cor=Bridge::getImpl<VariableSet>(correction);
682 if( normalStepResidual !=
nullptr )
685 A->applyscaleadd(-1.0,x,y);
686 Bridge::getImpl<VariableSet>(*normalStepResidual) = y;
691 virtual void computeSimplifiedCorrection(AbstractFunctionSpaceElement& correction,
692 AbstractLinearization
const& lin, AbstractFunctionSpaceElement* residual)
const
694 if( verbosity > 0 ) std::cout <<
"PrecondType::DIRECT NORMAL SOLVER: Computing simplified correction." << std::endl;
695 std::unique_ptr<AbstractFunctionSpaceElement> combinedrhs(correction.initZeroVector());
696 std::unique_ptr<AbstractFunctionSpaceElement> constraintrhs(correction.initZeroVector());
697 lin.evald(*combinedrhs);
698 constraintrhs->axpy(1.0,*combinedrhs,
"dual");
700 if(residual!=
nullptr) constraintrhs->axpy(1.0,*residual,
"dual");
701 VariableSet& conrhs=Bridge::getImpl<VariableSet>(*constraintrhs);
703 Domain x(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(conrhs.descriptions));
704 Range y(VariableSet::Descriptions::template CoefficientVectorRepresentation<>::init(conrhs.descriptions));
707 directSolver.apply(y,x);
708 VariableSet& cor=Bridge::getImpl<VariableSet>(correction);
714 std::unique_ptr<AssembledGalerkinOperator<Assembler> > A;
723 template <
class Functional,
class Assembler>
724 class NormalStepPreconditioner :
public Dune::Preconditioner<typename OptimalControlTraits<Functional,Assembler>::Domain, typename OptimalControlTraits<Functional,Assembler>::Range>
726 typedef OptimalControlTraits<Functional,Assembler> Traits;
727 typedef typename Traits::Scalar Scalar;
728 typedef typename Assembler::Grid Grid;
731 : Mu(assembler,onlyLowerTriangle),
732 B(assembler,false), A(assembler,false),
742 virtual void pre(
typename Traits::Domain&,
typename Traits::Range&){}
743 virtual void post(
typename Traits::Domain&){}
745 virtual void apply(
typename Traits::Domain& x,
typename Traits::Range
const& y)
748 typename Traits::VectorY rhsY(at_c<Traits::yIdx>(y.data));
749 typename Traits::VectorP dp(at_c<Traits::pIdx>(y.data));
752 typename Traits::VectorU rhsU(at_c<Traits::uIdx>(y.data));
753 typename Traits::VectorU du(rhsU);
754 B.applyscaleaddTransposed(-1.0,dp,rhsU);
761 typename Traits::VectorP rhsP(at_c<Traits::pIdx>(y.data));
762 typename Traits::VectorY dy(at_c<Traits::yIdx>(y.data));
763 B.applyscaleadd(-1.0,du,rhsP);
766 at_c<Traits::yIdx>(x.data) = at_c<0>(dy.data);
767 at_c<Traits::uIdx>(x.data) = at_c<0>(du.data);
768 at_c<Traits::pIdx>(x.data) = at_c<0>(dp.data);
783 typename Traits::NormUOperator Mu;
784 typename Traits::ControlOperator B;
785 typename Traits::StateOperator A;
787 std::unique_ptr<typename Traits::StatePreconditioner> PA;
793 template <
class Functional,
class Assembler,
int components>
794 class TangentSpacePreconditioner :
public Dune::Preconditioner<typename OptimalControlTraits<Functional,Assembler>::Domain, typename OptimalControlTraits<Functional,Assembler>::Range>
796 typedef typename Assembler::Scalar Scalar;
797 typedef OptimalControlTraits<Functional,Assembler> Traits;
798 typedef typename Assembler::Grid Grid;
799 static constexpr int dim = Functional::dim;
803 : grid(
boost::fusion::at_c<0>(assembler.spaces())->gridManager().grid()),
804 At(assembler,onlyLowerTriangle),
805 Mu(assembler,onlyLowerTriangle), Bt(assembler,onlyLowerTriangle),
806 B(assembler,onlyLowerTriangle), A(assembler,onlyLowerTriangle),
816 virtual void pre(
typename Traits::Domain&,
typename Traits::Range&){}
817 virtual void post(
typename Traits::Domain&){}
819 virtual void apply(
typename Traits::Domain& x,
typename Traits::Range
const& y)
821 std::cout <<
"in preconditioner" << std::endl;
822 std::cout <<
"adjoint equation" << std::endl;
824 std::cout <<
"read rhs" << std::endl;
825 typename Traits::VectorY rhsY(at_c<Traits::yIdx>(y.data));
826 std::cout <<
"init dp" << std::endl;
827 typename Traits::VectorP dp(at_c<Traits::pIdx>(y.data));
828 std::cout <<
"solve" << std::endl;
831 std::cout <<
"control equation" << std::endl;
832 std::cout <<
"read rhs" << std::endl;
833 typename Traits::VectorU rhsU(at_c<Traits::uIdx>(y.data));
834 std::cout <<
"init du" << std::endl;
835 typename Traits::VectorU du(rhsU);
836 std::cout <<
"apply Bt" << std::endl;
837 Bt.applyscaleadd(-1.0,dp,rhsU);
838 std::cout <<
"invert Mu" << std::endl;
842 std::cout <<
"state equation" << std::endl;
843 typename Traits::Range tmpY(y);
844 std::cout <<
"read rhs " << std::endl;
845 typename Traits::VectorP rhsP(at_c<Traits::pIdx>(y.data));
846 std::cout <<
"init dy" << std::endl;
847 typename Traits::VectorY dy(at_c<Traits::yIdx>(y.data));
848 std::cout <<
"apply B" << std::endl;
849 B.applyscaleadd(-1.0,du,rhsP);
850 std::cout <<
"solve" << std::endl;
853 at_c<Traits::yIdx>(x.data) = at_c<0>(dy.data);
854 at_c<Traits::uIdx>(x.data) = at_c<0>(du.data);
855 at_c<Traits::pIdx>(x.data) = at_c<0>(dp.data);
871 typename Traits::AdjointOperator At;
872 typename Traits::NormUOperator Mu;
873 typename Traits::ControlOperatorT Bt;
874 typename Traits::ControlOperator B;
875 typename Traits::StateOperator A;
877 std::unique_ptr<typename Traits::StatePreconditioner> PA;
878 std::unique_ptr<typename Traits::AdjointPreconditioner> PAt;
883 template <
class Functional,
class Assembler,
int components>
884 class TangentSpacePreconditioner2 :
public Dune::Preconditioner<typename OptimalControlTraits<Functional,Assembler>::Domain, typename OptimalControlTraits<Functional,Assembler>::Range>
886 typedef typename Assembler::Scalar Scalar;
887 typedef OptimalControlTraits<Functional,Assembler> Traits;
888 typedef typename Assembler::Grid Grid;
890 typedef typename Functional::AnsatzVars AnsatzVariableSetDesc;
891 typedef typename Functional::TestVars TestVariableSetDesc;
892 static constexpr int dim = Functional::dim;
896 size_t mgSteps = 10,
size_t mgSmoothingSteps = 10,
size_t chebySteps = 10,
bool onlyLowerTriangle=
false)
897 : At(assembler,onlyLowerTriangle),
898 Mu(assembler,onlyLowerTriangle), Bt(assembler,onlyLowerTriangle),
899 B(assembler,onlyLowerTriangle), A(assembler,onlyLowerTriangle),
901 mgA( A,
boost::fusion::at_c<0>(assembler.spaces())->gridManager().grid(), typename
MGPreconditioner::Parameter(mgSteps,mgSmoothingSteps) ),
902 mgAt( At,
boost::fusion::at_c<0>(assembler.spaces())->gridManager().grid(), typename
MGPreconditioner::Parameter(mgSteps,mgSmoothingSteps) ),
903 avar(ansatzVars), tvar(testVars)
910 virtual void pre(
typename Traits::Domain&,
typename Traits::Range&){}
911 virtual void post(
typename Traits::Domain&){}
913 virtual void apply(
typename Traits::Domain& x,
typename Traits::Range
const& y)
916 typename Traits::VectorY rhsY(at_c<Traits::yIdx>(y.data));
917 typename Traits::VectorP dp(at_c<Traits::pIdx>(y.data));
919 typename Traits::AnsatzVariableSetDescription::VariableSet tmpx(avar);
920 typename Traits::TestVariableSetDescription::VariableSet tmpy(tvar);
921 at_c<Traits::yIdx>(tmpy.data).coefficients() = at_c<0>(rhsY.data);
922 mgAt.
apply(at_c<Traits::pIdx>(tmpx.data).coefficients(),at_c<Traits::yIdx>(tmpy.data).coefficients());
923 at_c<0>(dp.data) = at_c<Traits::pIdx>(tmpx.data).coefficients();
925 typename Traits::VectorU rhsU(at_c<Traits::uIdx>(y.data));
926 typename Traits::VectorU du(rhsU);
927 Bt.applyscaleadd(-1.0,dp,rhsU);
930 typename Traits::VectorP rhsP(at_c<Traits::pIdx>(y.data));
931 typename Traits::VectorY dy(at_c<Traits::yIdx>(y.data));
932 B.applyscaleadd(-1.0,du,rhsP);
934 at_c<Traits::pIdx>(tmpy.data).coefficients() = at_c<0>(rhsP.data);
935 mgA.
apply(at_c<Traits::yIdx>(tmpx.data).coefficients(),at_c<Traits::pIdx>(tmpy.data).coefficients());
936 at_c<0>(dy.data) = at_c<Traits::yIdx>(tmpx.data).coefficients();
938 at_c<Traits::yIdx>(x.data) = at_c<0>(dy.data);
939 at_c<Traits::uIdx>(x.data) = at_c<0>(du.data);
940 at_c<Traits::pIdx>(x.data) = at_c<0>(dp.data);
946 typename Traits::AnsatzVariableSetDescription::VariableSet tmpx(avar);
947 typename Traits::TestVariableSetDescription::VariableSet tmpy(tvar);
948 at_c<Traits::pIdx>(tmpy.data).coefficients() = at_c<0>(y.data);
949 mgA.
apply(at_c<Traits::yIdx>(tmpx.data).coefficients(),at_c<Traits::pIdx>(tmpy.data).coefficients());
950 at_c<0>(x.data) = at_c<Traits::yIdx>(tmpx.data).coefficients();
956 typename Traits::AnsatzVariableSetDescription::VariableSet tmpx(avar);
957 typename Traits::TestVariableSetDescription::VariableSet tmpy(tvar);
958 at_c<Traits::yIdx>(tmpy.data).coefficients() = at_c<0>(y.data);
959 mgAt.
apply(at_c<Traits::pIdx>(tmpx.data).coefficients(),at_c<Traits::yIdx>(tmpy.data).coefficients());
960 at_c<0>(x.data) = at_c<Traits::pIdx>(tmpx.data).coefficients();
964 typename Traits::AdjointOperator At;
965 typename Traits::NormUOperator Mu;
966 typename Traits::ControlOperatorT Bt;
967 typename Traits::ControlOperator B;
968 typename Traits::StateOperator A;
971 MGPreconditioner mgA, mgAt;
972 AnsatzVariableSetDesc avar;
973 TestVariableSetDesc tvar;
1077 template <
class Functional,
class Assembler,
int components>
1078 class NormalStepPreconditioner3 :
public Dune::Preconditioner<typename OptimalControlTraits<Functional,Assembler>::Domain, typename OptimalControlTraits<Functional,Assembler>::Range>
1080 typedef typename Assembler::Scalar Scalar;
1081 typedef OptimalControlTraits<Functional,Assembler> Traits;
1082 typedef typename Assembler::Grid Grid;
1084 typedef typename Functional::AnsatzVars AnsatzVariableSetDesc;
1085 typedef typename Functional::TestVars TestVariableSetDesc;
1086 static constexpr int dim = Functional::dim;
1090 size_t mgSteps = 500,
size_t mgSmoothingSteps = 10,
size_t chebySteps = 20,
double relativeAccuracy = 1e-6,
bool onlyLowerTriangle=
false)
1092 Mu(assembler,onlyLowerTriangle), B(assembler,onlyLowerTriangle), Bt(B), A(assembler,onlyLowerTriangle),
1093 cheb(Mu,chebySteps),
1094 mgA( A,
boost::fusion::at_c<0>(assembler.spaces())->gridManager().grid(), typename
MGSolver::Parameter(mgSteps,mgSmoothingSteps,relativeAccuracy) ),
1095 mgAt( A,
boost::fusion::at_c<0>(assembler.spaces())->gridManager().grid(), typename
MGSolver::Parameter(mgSteps,mgSmoothingSteps,relativeAccuracy), true ),
1096 avar(ansatzVars), tvar(testVars)
1103 void setParameter(
size_t mgSteps,
size_t mgSmoothingSteps,
size_t chebySteps,
double relativeAccuracy)
1110 virtual void pre(
typename Traits::Domain&,
typename Traits::Range&){}
1111 virtual void post(
typename Traits::Domain&){}
1113 virtual void apply(
typename Traits::Domain& x,
typename Traits::Range
const& y)
1116 typename Traits::VectorY rhsY(at_c<Traits::yIdx>(y.data));
1117 typename Traits::VectorP dp(at_c<Traits::pIdx>(y.data));
1119 typename Traits::AnsatzVariableSetDescription::VariableSet tmpx(avar);
1120 typename Traits::TestVariableSetDescription::VariableSet tmpy(tvar);
1121 at_c<Traits::yIdx>(tmpy.data).coefficients() = at_c<0>(rhsY.data);
1122 mgAt.
apply(at_c<Traits::pIdx>(tmpx.data).coefficients(),at_c<Traits::yIdx>(tmpy.data).coefficients());
1123 at_c<0>(dp.data) = at_c<Traits::pIdx>(tmpx.data).coefficients();
1125 typename Traits::VectorU rhsU(at_c<Traits::uIdx>(y.data));
1126 typename Traits::VectorU du(rhsU);
1128 cheb.
apply(du,rhsU);
1130 typename Traits::VectorP rhsP(at_c<Traits::pIdx>(y.data));
1131 typename Traits::VectorY dy(at_c<Traits::yIdx>(y.data));
1132 B.applyscaleadd(-1.0,du,rhsP);
1134 at_c<Traits::pIdx>(tmpy.data).coefficients() = at_c<0>(rhsP.data);
1135 mgA.
apply(at_c<Traits::yIdx>(tmpx.data).coefficients(),at_c<Traits::pIdx>(tmpy.data).coefficients());
1136 at_c<0>(dy.data) = at_c<Traits::yIdx>(tmpx.data).coefficients();
1138 at_c<Traits::yIdx>(x.data) = at_c<0>(dy.data);
1139 at_c<Traits::uIdx>(x.data) = at_c<0>(du.data);
1140 at_c<Traits::pIdx>(x.data) = at_c<0>(dp.data);
1146 typename Traits::AnsatzVariableSetDescription::VariableSet tmpx(avar);
1147 typename Traits::TestVariableSetDescription::VariableSet tmpy(tvar);
1148 at_c<Traits::pIdx>(tmpy.data).coefficients() = at_c<0>(y.data);
1149 mgA.
apply(at_c<Traits::yIdx>(tmpx.data).coefficients(),at_c<Traits::pIdx>(tmpy.data).coefficients());
1150 at_c<0>(x.data) = at_c<Traits::yIdx>(tmpx.data).coefficients();
1156 typename Traits::AnsatzVariableSetDescription::VariableSet tmpx(avar);
1157 typename Traits::TestVariableSetDescription::VariableSet tmpy(tvar);
1158 at_c<Traits::yIdx>(tmpy.data).coefficients() = at_c<0>(y.data);
1159 mgAt.
apply(at_c<Traits::pIdx>(tmpx.data).coefficients(),at_c<Traits::yIdx>(tmpy.data).coefficients());
1160 at_c<0>(x.data) = at_c<Traits::pIdx>(tmpx.data).coefficients();
1164 typename Traits::NormUOperator Mu;
1165 typename Traits::ControlOperator B;
1167 typename Traits::StateOperator A;
1171 AnsatzVariableSetDesc avar;
1172 TestVariableSetDesc tvar;
1175 template <
class Functional,
class Assembler,
int components,
bool exactConstra
int>
1176 class InexactTangentSpacePreconditioner :
public Dune::Preconditioner<typename OptimalControlTraits<Functional,Assembler>::Domain, typename OptimalControlTraits<Functional,Assembler>::Range>
1178 typedef typename Assembler::Scalar Scalar;
1179 typedef OptimalControlTraits<Functional,Assembler> Traits;
1180 typedef typename Assembler::Grid Grid;
1181 static constexpr int dim = Functional::dim;
1183 typedef Dune::BCRSMatrix<Dune::FieldMatrix<Scalar,components,components> > BCRSMat;
1184 typedef typename Functional::AnsatzVars AnsatzVariableSetDesc;
1185 typedef typename Functional::TestVars TestVariableSetDesc;
1189 InexactTangentSpacePreconditioner(Assembler
const& assembler, AnsatzVariableSetDesc aDesc, TestVariableSetDesc tdesc,
size_t mgSteps = 10,
size_t mgSmoothingSteps = 10,
size_t chebySteps = 10,
bool onlyLowerTriangle=
false)
1190 : grid(
boost::fusion::at_c<0>(assembler.spaces())->gridManager().grid()),
1191 Mu(assembler,onlyLowerTriangle),
1192 B(assembler,onlyLowerTriangle),
1193 A(assembler,onlyLowerTriangle),
1194 At(assembler,onlyLowerTriangle),
1195 cheb(Mu,chebySteps),
1196 mgA( A, grid, typename
MGPreconditioner::Parameter(mgSteps,mgSmoothingSteps) ),
1197 mgAt( At, grid, typename
MGPreconditioner::Parameter(mgSteps,mgSmoothingSteps) ),
1198 mgAExact(A,grid, typename
MultiGridSolver<Grid,components>::Parameter(500,25,1e-9)),
1199 mgAtExact(At, grid, typename
MultiGridSolver<Grid,components>::Parameter(500,25,1e-9)),
1200 ansatzDescription(aDesc), testDescription(tdesc)
1202 timerA.stop(), timerAt.stop(), timerMu.stop(), timerB.stop(), timerCopy.stop();
1208 virtual void pre(
typename Traits::Domain&,
typename Traits::Range&){}
1209 virtual void post(
typename Traits::Domain&)
1211 std::cout <<
"timer A : " << boost::timer::format(timerA.elapsed()) << std::endl;
1212 std::cout <<
"timer At: " << boost::timer::format(timerAt.elapsed()) << std::endl;
1213 std::cout <<
"timer Mu: " << boost::timer::format(timerMu.elapsed()) << std::endl;
1214 std::cout <<
"timer B : " << boost::timer::format(timerB.elapsed()) << std::endl;
1215 std::cout <<
"timer cp: " << boost::timer::format(timerCopy.elapsed()) << std::endl;
1218 virtual void apply(
typename Traits::Domain& x,
typename Traits::Range
const& y)
1222 std::cout <<
"inexact adjoint equation" << std::endl;
1223 std::cout <<
"read rhs1 " << std::endl;
1224 typename Traits::VectorY rhsY(at_c<Traits::yIdx>(y.data));
1225 std::cout <<
"init dp1" << std::endl;
1226 typename Traits::VectorP dp(at_c<Traits::pIdx>(y.data));
1235 std::cout <<
"solve" << std::endl;
1245 std::cout <<
"control equation" << std::endl;
1246 typename Traits::VectorU rhsU(at_c<Traits::uIdx>(y.data));
1247 typename Traits::VectorU du(rhsU);
1250 B.applyscaleaddTransposed(-1.0,dp,rhsU);
1253 cheb.
apply(du,rhsU);
1256 std::cout <<
"adjoint equation" << std::endl;
1258 typename Traits::Range tmpY(y);
1259 typename Traits::VectorP rhsP(at_c<Traits::pIdx>(y.data));
1262 std::cout <<
"apply B" << std::endl;
1263 B.applyscaleadd(-1.0,du,rhsP);
1266 std::cout <<
"read dp2" << std::endl;
1267 typename Functional::AnsatzVars::VariableSet mgAx(ansatzDescription);
1268 std::cout <<
"read rhs2" << std::endl;
1269 typename Functional::TestVars::VariableSet mgAy(testDescription);
1270 at_c<Traits::pIdx>(tmpY.data) = at_c<0>(rhsP.data);
1271 at_c<Traits::pIdx>(mgAy.data) = at_c<0>(rhsP.data);
1274 std::cout <<
"invert A" << std::endl;
1275 if( exactConstraint ) mgAExact.apply(at_c<Traits::yIdx>(mgAx.data).coefficients(),at_c<Traits::pIdx>(mgAy.data).coefficients());
1276 else mgA.
apply(at_c<Traits::yIdx>(mgAx.data).coefficients(),at_c<Traits::pIdx>(mgAy.data).coefficients());
1279 at_c<Traits::yIdx>(x.data) = at_c<Traits::yIdx>(mgAx.data).coefficients();
1280 at_c<Traits::uIdx>(x.data) = at_c<0>(du.data);
1281 at_c<Traits::pIdx>(x.data) = at_c<0>(dp.data);
1287 std::cout <<
"apply state preconditioner" << std::endl;
1289 typename Functional::AnsatzVars::VariableSet mgAx(ansatzDescription);
1290 typename Functional::TestVars::VariableSet mgAy(testDescription);
1291 at_c<Traits::pIdx>(mgAy.data) = at_c<0>(y.data);
1292 mgA.
apply(at_c<Traits::yIdx>(mgAx.data).coefficients(),at_c<Traits::pIdx>(mgAy.data).coefficients());
1293 at_c<0>(x.data) = at_c<Traits::yIdx>(mgAx.data).coefficients();
1298 std::cout <<
"apply adjoint preconditioner" << std::endl;
1306 typename Traits::NormUOperator Mu;
1307 typename Traits::ControlOperator B;
1308 typename Traits::StateOperator A;
1309 typename Traits::AdjointOperator At;
1311 MGPreconditioner mgA, mgAt;
1313 AnsatzVariableSetDesc ansatzDescription;
1314 TestVariableSetDesc testDescription;
1315 boost::timer::cpu_timer timerA, timerAt, timerMu, timerB, timerCopy;
1318 template <
class Functional,
class Assembler,
int components,
bool exactConstra
int>
1321 typedef typename Assembler::Scalar Scalar;
1322 typedef OptimalControlTraits<Functional,Assembler> Traits;
1323 typedef typename Assembler::Grid Grid;
1324 static constexpr int dim = Functional::dim;
1326 typedef Dune::BCRSMatrix<Dune::FieldMatrix<Scalar,components,components> > BCRSMat;
1327 typedef typename Functional::AnsatzVars AnsatzVariableSetDesc;
1328 typedef typename Functional::TestVars TestVariableSetDesc;
1332 InexactTangentSpacePreconditionerILU(Assembler
const& assembler, AnsatzVariableSetDesc
const& aDesc, TestVariableSetDesc
const& tdesc,
size_t mgSteps = 10,
size_t mgSmoothingSteps = 10,
size_t chebySteps = 10,
bool onlyLowerTriangle=
false)
1333 : grid(
boost::fusion::at_c<0>(assembler.spaces())->gridManager().grid()),
1334 Mu(assembler,onlyLowerTriangle),
1335 B(assembler,onlyLowerTriangle),
1336 A(assembler,onlyLowerTriangle),
1337 At(assembler,onlyLowerTriangle),
1338 cheb(Mu,chebySteps),
1339 mgA( A, grid, typename
MGPreconditioner::Parameter(mgSteps,mgSmoothingSteps) ),
1340 mgAt( At, grid, typename
MGPreconditioner::Parameter(mgSteps,mgSmoothingSteps) ),
1341 mgAExact(A,grid, typename
MultiGridSolver<Grid,components>::Parameter(500,25,1e-9)),
1342 mgAtExact(At, grid, typename
MultiGridSolver<Grid,components>::Parameter(500,25,1e-9)),
1343 ansatzDescription(aDesc), testDescription(tdesc)
1345 timerA.stop(), timerAt.stop(), timerMu.stop(), timerB.stop(), timerCopy.stop();
1351 virtual void pre(
typename Traits::Domain&,
typename Traits::Range&){}
1352 virtual void post(
typename Traits::Domain&)
1354 std::cout <<
"timer A : " << boost::timer::format(timerA.elapsed()) << std::endl;
1355 std::cout <<
"timer At: " << boost::timer::format(timerAt.elapsed()) << std::endl;
1356 std::cout <<
"timer Mu: " << boost::timer::format(timerMu.elapsed()) << std::endl;
1357 std::cout <<
"timer B : " << boost::timer::format(timerB.elapsed()) << std::endl;
1358 std::cout <<
"timer cp: " << boost::timer::format(timerCopy.elapsed()) << std::endl;
1361 virtual void apply(
typename Traits::Domain& x,
typename Traits::Range
const& y)
1365 typename Traits::VectorY rhsY(at_c<Traits::yIdx>(y.data));
1366 typename Traits::VectorP dp(at_c<Traits::pIdx>(y.data));
1367 typename Functional::AnsatzVars::VariableSet mgAx(ansatzDescription);
1368 typename Functional::TestVars::VariableSet mgAy(testDescription);
1369 at_c<Traits::yIdx>(mgAy.data) = at_c<Traits::yIdx>(y.data);
1372 if( exactConstraint ) mgAtExact.apply( at_c<Traits::pIds>(mgAx.data).coefficients(), at_c<Traits::yIdx>(mgAy.data).coefficients() );
1373 else mgAt.
apply(at_c<Traits::pIdx>(mgAx.data).coefficients(), at_c<Traits::yIdx>(mgAy.data).coefficients());
1376 at_c<0>(dp.data) = at_c<Traits::pIdx>(mgAx.data).coefficients();
1379 typename Traits::VectorU rhsU(at_c<Traits::uIdx>(y.data));
1380 typename Traits::VectorU du(rhsU);
1383 B.applyscaleaddTransposed(-1.0,dp,rhsU);
1386 cheb.
apply(du,rhsU);
1390 typename Traits::Range tmpY(y);
1391 typename Traits::VectorP rhsP(at_c<Traits::pIdx>(y.data));
1394 B.applyscaleadd(-1.0,du,rhsP);
1397 at_c<Traits::pIdx>(tmpY.data) = at_c<0>(rhsP.data);
1398 at_c<Traits::pIdx>(mgAy.data) = at_c<0>(rhsP.data);
1401 if( exactConstraint ) mgAExact.apply(at_c<Traits::yIdx>(mgAx.data).coefficients(),at_c<Traits::pIdx>(mgAy.data).coefficients());
1402 else mgA.
apply(at_c<Traits::yIdx>(mgAx.data).coefficients(),at_c<Traits::pIdx>(mgAy.data).coefficients());
1405 at_c<Traits::yIdx>(x.data) = at_c<Traits::yIdx>(mgAx.data).coefficients();
1406 at_c<Traits::uIdx>(x.data) = at_c<0>(du.data);
1407 at_c<Traits::pIdx>(x.data) = at_c<0>(dp.data);
1414 typename Functional::AnsatzVars::VariableSet mgAx(ansatzDescription);
1415 typename Functional::TestVars::VariableSet mgAy(testDescription);
1416 at_c<Traits::pIdx>(mgAy.data) = at_c<0>(y.data);
1417 mgA.
apply(at_c<Traits::yIdx>(mgAx.data).coefficients(),at_c<Traits::pIdx>(mgAy.data).coefficients());
1418 at_c<0>(x.data) = at_c<Traits::yIdx>(mgAx.data).coefficients();
1429 typename Traits::NormUOperator Mu;
1430 typename Traits::ControlOperator B;
1431 typename Traits::StateOperator A;
1432 typename Traits::AdjointOperator At;
1434 MGPreconditioner mgA, mgAt;
1436 AnsatzVariableSetDesc
const& ansatzDescription;
1437 TestVariableSetDesc
const& testDescription;
1438 boost::timer::cpu_timer timerA, timerAt, timerMu, timerB, timerCopy;
1708 template <
class>
class ProjectionOnTangentSpace;
1709 template <
class,
int,
int,
int,
int>
class MGProjectionOnTangentSpace;
1711 template <
class FSE,
class CoeffVector,
int rbegin,
int rend>
1714 static void apply(FSE
const& fse, CoeffVector& v)
1716 boost::fusion::at_c<rbegin>(v.data) = boost::fusion::at_c<rbegin>(fse.data).coefficients();
1721 template <
class FSE,
class CoeffVector,
int rbegin>
1724 static void apply(FSE
const&, CoeffVector&) {}
1727 template <
class FSE,
class CoeffVector,
int rbegin,
int rend>
1730 static void apply(CoeffVector
const& v, FSE& fse)
1732 boost::fusion::at_c<rbegin>(fse.data).coefficients() += boost::fusion::at_c<rbegin>(v.data);
1737 template <
class FSE,
class CoeffVector,
int rbegin>
1740 static void apply(CoeffVector
const&, FSE&) {}
1743 template<
int rbegin,
int rend,
class FSE,
class CoeffVector>
1749 template<
int rbegin,
int rend,
class FSE,
class CoeffVector>
1755 template <
class Assembler,
class Lin,
int rbegin,
int rend,
int cbegin,
int cend>
1758 static_assert(cbegin<=cend,
"incompatible template arguments");
1759 static_assert(rbegin<=rend,
"incompatible template arguments");
1760 typedef typename Assembler::Functional::Functional Functional;
1761 boost::timer::cpu_timer t1;
1763 std::cout <<
"gop init: " << boost::timer::format(t1.elapsed()) << std::endl;
1764 boost::timer::cpu_timer t2;
1765 typename Functional::AnsatzVars::template CoefficientVectorRepresentation<rbegin,rend>::type tmpy
1767 typename Functional::TestVars::template CoefficientVectorRepresentation<cbegin,cend>::type tmpx
1769 std::cout <<
"init vecs: " << boost::timer::format(t2.elapsed()) << std::endl;
1770 boost::timer::cpu_timer t3;
1772 copyFromFunctionSpaceElement<cbegin,cend>(tx,tmpx);
1773 std::cout <<
"copy1: " << boost::timer::format(t3.elapsed()) << std::endl;
1776 boost::timer::cpu_timer t4;
1777 gop.
apply(tmpx,tmpy);
1778 std::cout <<
"gop apply: " << boost::timer::format(t4.elapsed()) << std::endl;
1780 boost::timer::cpu_timer t5;
1782 addToFunctionSpaceElement<rbegin,rend>(tmpy,ty);
1783 std::cout <<
"copy2: " << boost::timer::format(t5.elapsed()) << std::endl;
1788 template<
class Assembler,
class Preconditioner,
class VariableSet,
int components = 1, CGImplementationType cgImpl = CGImplementationType::HYBRID>
1792 typedef typename Preconditioner::Domain
Domain;
1793 typedef typename Preconditioner::Range
Range;
1795 typedef OptimalControlTraits<typename Assembler::Functional::Functional,Assembler>
Traits;
1799 static constexpr int yIdx = Traits::yIdx;
1800 static constexpr int uIdx = Traits::uIdx;
1801 static constexpr int pIdx = Traits::pIdx;
1805 typedef typename Assembler::Functional::Functional
TF;
1815 if(verbose > 0) std::cout <<
"TANGENTIAL SPACE: updating relative accuracy from " << accuracy <<
" to " << accuracy_ << std::endl;
1826 return !encounteredNonConvexity;
1831 return *localtmpvec;
1834 virtual void setEps(
double eps_) { eps = eps_; }
1839 virtual int computeBasis(std::vector<std::shared_ptr<AbstractFunctionSpaceElement> >& correction,
1849 std::cout <<
"assemblers: normal: " << normalAssembler.nrows(0,1) <<
", " << normalAssembler.nrows(1,2) <<
", " << normalAssembler.nrows(2,3) << std::endl;
1850 std::cout <<
"assemblers: tangential: " << tangentialAssembler.nrows(0,1) <<
", " << tangentialAssembler.nrows(1,2) <<
", " << tangentialAssembler.nrows(2,3) << std::endl;
1856 at_c<pIdx>(rhs.data) *= 0.;
1857 VariableSet xv = Bridge::getImpl<VariableSet>(normalStep);
1858 at_c<pIdx>(xv.
data) *= 0.;
1861 M.applyscaleadd(nu0,x,rhs);
1863 at_c<pIdx>(rhs.data) *= 0.;
1894 Solver solver(M, P, dualpairing, *terminationCriterion, verbose, eps);
1895 Dune::InverseOperatorResult res;
1898 solver.apply(x, rhs, res);
1899 encounteredNonConvexity = solver.encounteredNonConvexity();
1910 VariableSet& cor=Bridge::getImpl<VariableSet>(*(correction[0]));
1925 double accuracy, eps;
1927 std::unique_ptr<AbstractFunctionSpaceElement> localtmpvec;
1928 std::unique_ptr<Projection> projection;
1930 bool encounteredNonConvexity =
false;
1931 std::unique_ptr<PCGTerminationCriterion<double> > terminationCriterion;
1937 template <
class Arg>
1941 template <
class Preconditioner>
1949 template <
class Functional,
class Assembler,
int components>
1955 template <
class Assembler>
1958 typedef typename Assembler::Functional::Functional Functional;
1959 typedef OptimalControlTraits<Functional,Assembler> Traits;
1962 : A(assembler,false), B(assembler,false),
1966 template <
class VarSetDesc>
1970 typename Traits::VectorP rhsP(at_c<Traits::pIdx>(x.data));
1972 typename Traits::VectorU du(at_c<Traits::uIdx>(x.data));
1973 typename Traits::VectorY dy(at_c<Traits::yIdx>(x.data));
1974 B.applyscaleadd(-1.0,du,rhsP);
1977 at_c<Traits::yIdx>(x.data) = at_c<0>(dy.data);
1981 typename Traits::StateOperator A;
1982 typename Traits::ControlOperator B;
1984 std::unique_ptr<typename Traits::StatePreconditioner> PA;
1987 template <
class Assembler,
int nComponents,
int stateId,
int controlId,
int adjo
intId>
1990 typedef typename Assembler::Functional::Functional Functional;
1991 typedef OptimalControlTraits<Functional,Assembler> Traits;
1994 : A(assembler,false), B(assembler,false),
1995 mgSolver(A, assembler.getGridManager().grid(), parameter)
1998 template <
class VarSet>
2003 VarSet y(x.descriptions);
2005 typename Traits::VectorP rhsP(Traits::CreateVectorP::init(x.descriptions));
2006 typename Traits::VectorU du(Traits::CreateVectorU::init(x.descriptions));
2007 at_c<0>(du.data) = at_c<Traits::controlId>(x.data).coefficients();
2008 B.applyscaleadd(-1.0,du,rhsP);
2009 at_c<Traits::adjointId>(y.data) = at_c<Traits::adjointId>(x.data);
2010 mgSolver.apply(at_c<stateId>(x.data).coefficients(),at_c<Traits::adjointId>(y.data).coefficients());
2014 typename Traits::StateOperator A;
2015 typename Traits::ControlOperator B;
Abstract Vector for function space algorithms.
virtual std::unique_ptr< AbstractFunctionSpaceElement > clone() const =0
Construction of a vector of the same type.
virtual std::unique_ptr< AbstractFunctionSpaceElement > initZeroVector() const =0
Construction of a vector of the same type.
virtual void evald(AbstractFunctionSpaceElement &g, int rbegin=0, int rend=-1) const =0
Evaluate derivative.
virtual AbstractFunctionSpaceElement const & getOrigin() const =0
Get point of linearization.
Class that models the functionality of a (possibly inexact) linear solver.
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
typename Assembler::TestVariableSetDescription::template CoefficientVector< firstRow, lastRow > Range
Mathematical Vector that supports copy-on-write, implements AbstractFunctionSpaceElement.
regularized preconditioned conjugate gradient method
void setSteps(size_t steps)
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)
virtual void setRelativeAccuracy(double)
Bridge::ConnectedKaskadeLinearization< typename Assembler::Functional::Functional > BridgeLinearization
DirectNormalSolver(PreconditionerFunctional const &pf_, DirectType directType_=DirectType::UMFPACK3264, MatrixProperties properties_=MatrixProperties::GENERAL, int verbosity_=1)
virtual void post(Domain &x)
PrecondAssembler::Functional::Functional PreconditionerFunctional
Assembler::Functional::Functional Functional
virtual void apply(Domain &v, const Range &d)
OptimalControlTraits< Functional, Assembler > Traits
virtual void pre(Domain &x, Range &b)
virtual ~DirectNormalSolver()
Abstract base class for dual pairing of and its dual space .
virtual void apply(typename Traits::Domain &x, typename Traits::Range const &y)
void applyStatePreconditioner(typename Traits::VectorY &x, typename Traits::VectorP const &y)
virtual void post(typename Traits::Domain &)
InexactTangentSpacePreconditioner(Assembler const &assembler, AnsatzVariableSetDesc aDesc, TestVariableSetDesc tdesc, size_t mgSteps=10, size_t mgSmoothingSteps=10, size_t chebySteps=10, bool onlyLowerTriangle=false)
virtual ~InexactTangentSpacePreconditioner()
void applyAdjointPreconditioner(typename Traits::VectorP &x, typename Traits::VectorY const &y)
virtual void pre(typename Traits::Domain &, typename Traits::Range &)
InexactTangentSpacePreconditionerILU(Assembler const &assembler, AnsatzVariableSetDesc const &aDesc, TestVariableSetDesc const &tdesc, size_t mgSteps=10, size_t mgSmoothingSteps=10, size_t chebySteps=10, bool onlyLowerTriangle=false)
virtual void post(typename Traits::Domain &)
void applyAdjointPreconditioner(typename Traits::VectorP &x, typename Traits::VectorY const &y)
virtual void apply(typename Traits::Domain &x, typename Traits::Range const &y)
virtual ~InexactTangentSpacePreconditionerILU()
virtual void pre(typename Traits::Domain &, typename Traits::Range &)
void applyStatePreconditioner(typename Traits::VectorY &x, typename Traits::VectorP const &y)
InverseOperator::Domain Domain
AbstractLinearization & getTangentialLinearization()
AbstractLinearization & getNormalLinearization()
MGProjectionOnTangentSpace(Assembler const &assembler, typename MultiGridSolver< typename Assembler::Grid, nComponents >::Parameter parameter=typename MultiGridSolver< typename Assembler::Grid, nComponents >::Parameter(500, 25, 1e-9))
Operator with matrix-representation and coordinate mappings.
void setParameter(Parameter p)
void apply(CoeffVector &solution, CoeffVector &rightHand)
void applyAdjointPreconditioner(typename Traits::VectorP &x, typename Traits::VectorY const &y)
virtual ~NormalStepPreconditioner3()
virtual void apply(typename Traits::Domain &x, typename Traits::Range const &y)
void setParameter(size_t mgSteps, size_t mgSmoothingSteps, size_t chebySteps, double relativeAccuracy)
virtual void pre(typename Traits::Domain &, typename Traits::Range &)
virtual void post(typename Traits::Domain &)
void applyStatePreconditioner(typename Traits::VectorY &x, typename Traits::VectorP const &y)
NormalStepPreconditioner3(Assembler const &assembler, AnsatzVariableSetDesc const &ansatzVars, TestVariableSetDesc const &testVars, size_t mgSteps=500, size_t mgSmoothingSteps=10, size_t chebySteps=20, double relativeAccuracy=1e-6, bool onlyLowerTriangle=false)
NormalStepPreconditioner(Assembler const &assembler, bool onlyLowerTriangle=false, Scalar tolerance=1e-6)
virtual void post(typename Traits::Domain &)
void applyAdjointPreconditioner(typename Traits::VectorP &x, typename Traits::VectorY const &y)
void applyStatePreconditioner(typename Traits::VectorY &x, typename Traits::VectorP const &y)
~NormalStepPreconditioner()
virtual void pre(typename Traits::Domain &, typename Traits::Range &)
virtual void apply(typename Traits::Domain &x, typename Traits::Range const &y)
virtual ~PPCGAsNormalSolver()
PrecondAssembler::Functional::Functional PreconditionerFunctional
void setMultiGridSmoothingSteps(size_t mgSmoothingSteps_)
virtual void setEps(double eps_)
void setMultiGridSteps(size_t mgSteps_)
virtual void pre(Domain &x, Range &b)
PPCGAsNormalSolver(PreconditionerFunctional const &pf_, double relativeAccuracy_=1e-9, size_t maxSteps_=2000, int verbosity_=1, double eps_=1e-15)
virtual void post(Domain &x)
OptimalControlTraits< Functional, Assembler > Traits
Assembler::Functional::Functional Functional
virtual void apply(Domain &v, const Range &d)
Bridge::ConnectedKaskadeLinearization< typename Assembler::Functional::Functional > BridgeLinearization
IterateType::CG< Domain, Range > Solver
virtual void setRelativeAccuracy(double relativeAccuracy_)
void setChebyshevSteps(size_t chebySteps_)
virtual void pre(Domain &x, Range &b)
static constexpr int components
PrecondAssembler::Functional::Functional PreconditionerFunctional
PreconditionerAsNormalSolver(PreconditionerFunctional const &pf_, PreconditionerFactory &prec_)
Bridge::ConnectedKaskadeLinearization< typename Assembler::Functional::Functional > BridgeLinearization
Operator::Assembler Assembler
virtual void apply(Domain &v, const Range &d)
virtual ~PreconditionerAsNormalSolver()
virtual void post(Domain &x)
Assembler::Functional::Functional Functional
OptimalControlTraits< Functional, Assembler > Traits
MGProjectionOnTangentSpace< NormalStepAssembler, components, Traits::stateId, Traits::controlId, Traits::adjointId > Projection
Assembler::Functional::Functional TF
static constexpr int uIdx
Bridge::ConnectedKaskadeLinearization< typename NormalStepAssembler::Functional::Functional > NormalBridgeLinearization
virtual bool localConvergenceLikely() final
Preconditioner::Range Range
virtual ~ProjectedAPCGSolver()
Preconditioner::Assembler NormalStepAssembler
virtual AbstractFunctionSpaceElement & getCorrectRhs() final
virtual void setRelativeAccuracy(double accuracy_) final
Specify accuracy that should be achieved.
OptimalControlTraits< typename Assembler::Functional::Functional, Assembler > Traits
static constexpr int yIdx
CGBase< Domain, Range, cgImpl > Solver
ProjectedAPCGSolver(Preconditioner &P_, Scalar accuracy_, int verbose_=0, size_t maxSteps_=500, double eps_=1e-12)
virtual void setEps(double eps_)
Bridge::ConnectedKaskadeLinearization< typename Assembler::Functional::Functional > TangentialBridgeLinearization
Assembler::Functional::Functional Functional
void setLookAHead(size_t d)
static constexpr int pIdx
Preconditioner::Domain Domain
void usePreconditionerForNorm()
virtual void setLipschitzConstant(double omega)
virtual int nSolutionVectors() const final
The maximal number of solution vectors, returned by basis.
void apply(VarSetDesc &x)
ProjectionOnTangentSpace(Assembler const &assembler)
virtual ~Scaledl2ScalarProduct()
virtual Scalar operator()(X const &x, Xstar const &y) const
Scaledl2ScalarProduct(Scalar sy_, Scalar su_, Scalar sp_)
Relative energy error termination criterion according to Strakos, Tichy: Error estimation in precondi...
Relative error termination criterion based on the norm induced by the preconditioner,...
void applyAdjointPreconditioner(typename Traits::VectorP &x, typename Traits::VectorY const &y)
virtual void apply(typename Traits::Domain &x, typename Traits::Range const &y)
virtual void post(typename Traits::Domain &)
virtual ~TangentSpacePreconditioner2()
void applyStatePreconditioner(typename Traits::VectorY &x, typename Traits::VectorP const &y)
virtual void pre(typename Traits::Domain &, typename Traits::Range &)
TangentSpacePreconditioner2(Assembler const &assembler, AnsatzVariableSetDesc const &ansatzVars, TestVariableSetDesc const &testVars, size_t mgSteps=10, size_t mgSmoothingSteps=10, size_t chebySteps=10, bool onlyLowerTriangle=false)
virtual void post(typename Traits::Domain &)
virtual void apply(typename Traits::Domain &x, typename Traits::Range const &y)
void applyAdjointPreconditioner(typename Traits::VectorP &x, typename Traits::VectorY const &y)
TangentSpacePreconditioner(Assembler const &assembler, bool onlyLowerTriangle=false)
void applyStatePreconditioner(typename Traits::VectorY &x, typename Traits::VectorP const &y)
virtual ~TangentSpacePreconditioner()
virtual void pre(typename Traits::Domain &, typename Traits::Range &)
virtual void applyscaleadd(Scalar alpha, Domain const &x, Range &b) const
A class for storing a heterogeneous collection of FunctionSpaceElement s.
Descriptions const & descriptions
Descriptions of variable set, of type VariableSetDescription (lots of useful infos)
DirectType
Available direct solvers for linear equation systems.
@ UMFPACK3264
NO LONGER SUPPORTED.
MatrixProperties
Characterizations of sparse matrix properties.
Dune::FieldVector< T, n > min(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise minimum.
InverseLinearOperator< DirectSolver< typename AssembledGalerkinOperator< GOP, firstRow, lastRow, firstCol, lastCol >::Domain, typename AssembledGalerkinOperator< GOP, firstRow, lastRow, firstCol, lastCol >::Range > > directInverseOperator(AssembledGalerkinOperator< GOP, firstRow, lastRow, firstCol, lastCol > const &A, DirectType directType, MatrixProperties properties)
void copyFromFunctionSpaceElement(FSE const &fse, CoeffVector &coeffVector)
void ddxpy_template(Lin &lin, AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x)
void addToFunctionSpaceElement(CoeffVector const &coeffVector, FSE &fse)
Bridge classes that connect low level FE algorithms to higher level algorithms.
static void apply(CoeffVector const &, FSE &)
static void apply(CoeffVector const &v, FSE &fse)
ProjectionOnTangentSpace< Assembler > type
DefaultProjectionPolicy type
static void apply(FSE const &, CoeffVector &)
static void apply(FSE const &fse, CoeffVector &v)
void projectOnConstraint(Arg &) const