1#ifndef COMPOSITE_STEP_HH
2#define COMPOSITE_STEP_HH
45 : sp(s), norm(n), pars(p), linSolver(linSolver_)
51 newton.reset(
new Newton(linSolver,sp,norm,pars));
61 trialIterate = iterate;
62 trialIterate.
axpy(damping,correction);
70 scorrection += correction;
71 newton->reportOnIteration(
report);
72 newton->oneStep(fPtr, linPtr, scorrection);
74 scorrection -= correction;
78 std::unique_ptr<Newton> newton;
83 typename Newton::Parameters& pars;
84 AbstractLinearSolver& linSolver;
93 : sp(s), norm(n), linSolver(linSolver_)
111 trialIterate = iterate;
113 trialIterate+=correction;
114 sp.getTrialIterate(trialIterate,correction, iterate,damping);
120 int performArmijoLoop();
122bool evaluateTrialIterate(
128 std::unique_ptr<AbstractFunctionSpaceElement> iterate,correction, trialIterate, scorrection, gradient;
132 std::unique_ptr<AbstractLinearization> simplifiedLinearization;
134 AbstractLinearSolver& linSolver;
136 double dampingFactor, functionalAtIterate, armijopar;
143template<
class UpdatePolicy>
151 assert(UpdatePolicy::linPtr);
152 assert(UpdatePolicy::linearSolver);
153 std::vector<double> sorig, sp;
154 for(
int i=0; i<
rhsstart; ++i) sp.push_back(0.0);
157 UpdatePolicy::linPtr->getScalePars(sorig);
158 UpdatePolicy::linPtr->scaleRHS(sp);
159 UpdatePolicy::linearSolver->solve(correction, *UpdatePolicy::linPtr);
160 UpdatePolicy::linPtr->scaleRHS(sorig);
167 assert(UpdatePolicy::linPtr);
168 assert(UpdatePolicy::linearSolver);
170 std::vector<double> sorig, sp;
171 for(
int i=0; i<
rhsstart; ++i) sp.push_back(0.0);
174 linRHS.getScalePars(sorig);
176 UpdatePolicy::linearSolver->resolve(correction, linRHS, *UpdatePolicy::linPtr);
177 linRHS.scaleRHS(sorig);
183template <
class Newton>
188 : sp(s), norm(n), pars(p), linSolver(linSolver_)
196 newton.reset(
new Newton(linSolver,sp,norm,pars));
206 trialIterate = iterate;
207 trialIterate.
axpy(damping,correction);
214 assert(newton.get());
216 newton->reportOnIteration(
report);
217 newton->oneStep(fPtr, linPtr, correction);
221 std::unique_ptr<Newton> newton;
226 typename Newton::Parameters& pars;
227 AbstractLinearSolver& linSolver;
241 normalStep(normalStep_), tangentialStep(tangentialStep_), norm(n), p(p_) {}
270 iterate.
swap(trialIterate);
276 return NewtonsMethod::RegularityTestPassed;
290 std::unique_ptr<AbstractFunctionSpaceElement> iterate, trialIterate, correction, scorrection, trialIterate2;
292 std::unique_ptr<AbstractLinearization> newtonLinearization;
Abstract Vector for function space algorithms.
AbstractFunctionSpaceElement & axpy(double alpha, AbstractFunctionSpaceElement const &l, int component)
*this += alpha*l
virtual std::unique_ptr< AbstractFunctionSpaceElement > clone() const =0
Construction of a vector of the same type.
virtual int nComponents() const =0
void swap(AbstractFunctionSpaceElement &v)
Shallow swap.
Representation of a nonlinear functional.
virtual AbstractFunctionSpaceElement const & getOrigin() const =0
Get point of linearization.
Base class for algorithms. Provides a unified interface and some simple wrapper routines,...
virtual NewtonsMethod::RegularityTest regularityTest(double scalingFactor)
void terminationMessage(int flag)
virtual NewtonsMethod::Convergence convergenceTest(AbstractFunctionSpaceElement const &correction, AbstractFunctionSpaceElement const &iterate)
Return true, if convergence is detected, false otherwise.
void resetParameters()
Reset all algorithmic parameters to their default values.
virtual void setDesiredRelativeAccuracy(double ra)
set the desired accuracy
void setDesiredAccuracy(double da)
set the desired accuracy
virtual IterationParameters const & getParameters()
virtual void updateIterate(AbstractFunctionSpaceElement &iterate, AbstractFunctionSpaceElement &trialIterate, AbstractLinearization const &lin)
virtual NewtonsMethod::AcceptanceTest evaluateTrialIterate(AbstractFunctionSpaceElement const &trialIterate, AbstractFunctionSpaceElement const &correction, AbstractLinearization const &lin)
void solve(AbstractFunctional *f, AbstractFunctionSpaceElement &x)
Solve the system f=0 with starting value x. On (successful) exit, the solution is x,...
CompositeStep(NormalStep &normalStep_, TangentialStep &tangentialStep_, AbstractNorm &n, IterationParameters &p_)
Create Newton's Method, providing a solver, a norm and algorithmic parameters.
Base class for algorithmic parameters.
virtual void reset()
Reset all quantities in this class.
virtual void getTrialIterate(AbstractFunctionSpaceElement &trialIterate, AbstractFunctionSpaceElement const &correction, AbstractFunctionSpaceElement const &iterate, double damping)=0
virtual void setLinearization(AbstractFunctional *f, AbstractLinearization *lin)=0
virtual void getSearchDirection(AbstractFunctionSpaceElement &correction)=0
virtual void getTrialIterate(AbstractFunctionSpaceElement &trialIterate, AbstractFunctionSpaceElement const &correction, AbstractFunctionSpaceElement const &iterate, double damping)
virtual void getSearchDirection(AbstractFunctionSpaceElement &correction)
void setLinearization(AbstractFunctional *f, AbstractLinearization *lin)
NormalStepNewton(StepPolicy &s, AbstractNorm &n, typename Newton::Parameters &p, AbstractLinearSolver &linSolver_)
virtual void getSimplifiedSearchDirection(AbstractFunctionSpaceElement &correction, AbstractLinearization &linRHS)
StepPolicyProjectedRHS(int rhsstart_, int rhsend_)
virtual void getSearchDirection(AbstractFunctionSpaceElement &correction)
virtual void getTrialIterate(AbstractFunctionSpaceElement &trialIterate, AbstractFunctionSpaceElement const &correction, AbstractFunctionSpaceElement const &iterate, double damping)
TangentialStepArmijo(StepPolicy &s, AbstractNorm &n, AbstractLinearSolver &linSolver_)
void getSearchDirection(AbstractFunctionSpaceElement &scorrection, AbstractFunctionSpaceElement const &correction)
void setLinearization(AbstractFunctional *f, AbstractLinearization *lin)
virtual void getTrialIterate(AbstractFunctionSpaceElement &trialIterate, AbstractFunctionSpaceElement const &correction, AbstractFunctionSpaceElement const &iterate, double damping)=0
virtual void setLinearization(AbstractFunctional *f, AbstractLinearization *lin)=0
virtual ~TangentialStep()
virtual void getSearchDirection(AbstractFunctionSpaceElement &scorrection, AbstractFunctionSpaceElement const &correction)=0
void getSearchDirection(AbstractFunctionSpaceElement &scorrection, AbstractFunctionSpaceElement const &correction)
virtual void getTrialIterate(AbstractFunctionSpaceElement &trialIterate, AbstractFunctionSpaceElement const &correction, AbstractFunctionSpaceElement const &iterate, double damping)
void setLinearization(AbstractFunctional *f, AbstractLinearization *lin)
TangentialStepNewton(StepPolicy &s, AbstractNorm &n, typename Newton::Parameters &p, AbstractLinearSolver &linSolver_)