49 #include <Xyce_config.h>
55 #include "LOCA_Continuation_ExtendedGroup.H"
56 #include "LOCA_Stepper.H"
57 #include "NOX_Solver_Generic.H"
58 #include "LOCA_Utils.H"
59 #include "LOCA_MultiContinuation_AbstractStrategy.H"
60 #include "LOCA_MultiContinuation_ExtendedVector.H"
61 #include "LOCA_NewStepper.H"
63 namespace N_NLS_LOCA {
77 NOX::Abstract::Group::ReturnType
80 maxStepSize = params.getParameter(
"Max Step Size", 1.0e+12);
81 minStepSize = params.getParameter(
"Min Step Size", 1.0e-12);
82 startStepSize = params.getParameter(
"Initial Step Size", 1.0);
83 failedFactor = params.getParameter(
"Failed Step Reduction Factor", 0.5);
84 successFactor = params.getParameter(
"Successful Step Increase Factor", 1.26);
87 agrValue = params.getParameter(
"Aggressiveness", 0.0);
89 return NOX::Abstract::Group::Ok;
92 NOX::Abstract::Group::ReturnType
94 LOCA::Continuation::ExtendedGroup& curGroup,
95 const LOCA::Continuation::ExtendedVector& predictor,
96 const NOX::Solver::Generic& solver,
97 const LOCA::Abstract::Iterator::StepStatus& stepStatus,
98 const LOCA::Stepper& stepper,
103 double dpds = predictor.getParam();
116 if (stepStatus == LOCA::Abstract::Iterator::Unsuccessful) {
121 double ds_ratio = curGroup.getStepSizeScaleFactor();
127 const NOX::Parameter::List& p = LOCA::Utils::getSublist(
"Stepper");
128 double maxNonlinearSteps
129 =
static_cast<double>(p.getParameter(
"Max Nonlinear Iterations", 15));
132 double numNonlinearSteps =
133 static_cast<double>(solver.getNumIterations());
139 double factor = (maxNonlinearSteps - numNonlinearSteps)
140 / (maxNonlinearSteps);
142 stepSize *= (1.0 +
agrValue * factor * factor);
144 stepSize *= ds_ratio;
149 NOX::Abstract::Group::ReturnType res =
clipStepSize(stepSize);
154 NOX::Abstract::Group::ReturnType
156 LOCA::MultiContinuation::AbstractStrategy& curGroup,
157 const LOCA::MultiContinuation::ExtendedVector& predictor,
158 const NOX::Solver::Generic& solver,
159 const LOCA::Abstract::Iterator::StepStatus& stepStatus,
160 const LOCA::NewStepper& stepper,
165 double dpds = predictor.getScalar(0);
178 if (stepStatus == LOCA::Abstract::Iterator::Unsuccessful) {
183 double ds_ratio = curGroup.getStepSizeScaleFactor();
189 const NOX::Parameter::List& p = LOCA::Utils::getSublist(
"Stepper");
190 double maxNonlinearSteps
191 =
static_cast<double>(p.getParameter(
"Max Nonlinear Iterations", 15));
194 double numNonlinearSteps =
195 static_cast<double>(solver.getNumIterations());
201 double factor = (maxNonlinearSteps - numNonlinearSteps)
202 / (maxNonlinearSteps);
204 stepSize *= (1.0 +
agrValue * factor * factor);
206 stepSize *= ds_ratio;
211 NOX::Abstract::Group::ReturnType res =
clipStepSize(stepSize);
217 NOX::Abstract::Group::ReturnType
220 NOX::Abstract::Group::ReturnType res = NOX::Abstract::Group::Ok;
223 double signStep = 1.0;
233 res = NOX::Abstract::Group::Failed;
235 if (LOCA::Utils::doPrint(LOCA::Utils::Error)) {
236 cout <<
"\n\tStep size reached minimum step size bound"