19 #ifndef CT_NONLINEARSOLVER_H
20 #define CT_NONLINEARSOLVER_H
34 #define NSOLN_TYPE_PSEUDO_TIME_DEPENDENT 2
36 #define NSOLN_TYPE_TIME_DEPENDENT 1
38 #define NSOLN_TYPE_STEADY_STATE 0
48 #define NSOLN_RETN_SUCCESS 1
50 #define NSOLN_RETN_CONTINUE 0
53 #define NSOLN_RETN_FAIL_STEPTOOSMALL -1
55 #define NSOLN_RETN_FAIL_DAMPSTEP -2
57 #define NSOLN_RETN_MATRIXINVERSIONERROR -3
59 #define NSOLN_RETN_JACOBIANFORMATIONERROR -4
61 #define NSOLN_RETN_RESIDUALFORMATIONERROR -5
63 #define NSOLN_RETN_MAXIMUMITERATIONSEXCEEDED -7
70 #define NSOLN_JAC_NUM 1
72 #define NSOLN_JAC_ANAL 2
172 doublereal
solnErrorNorm(
const doublereal*
const delta_y,
const char* title = 0,
int printLargest = 0,
173 const doublereal dampFactor = 1.0)
const;
190 doublereal
residErrorNorm(
const doublereal*
const resid,
const char* title = 0,
const int printLargest = 0,
191 const doublereal*
const y = 0)
const;
208 int doResidualCalc(
const doublereal time_curr,
const int typeCalc,
const doublereal*
const y_curr,
209 const doublereal*
const ydot_curr,
233 int doNewtonSolve(
const doublereal time_curr,
const doublereal*
const y_curr,
234 const doublereal*
const ydot_curr, doublereal*
const delta_y,
317 void fillDogLegStep(
int leg, doublereal alpha, std::vector<doublereal> & deltaX)
const;
361 doublereal
boundStep(
const doublereal*
const y,
const doublereal*
const step0);
369 const doublereal*
const y_high_bounds);
386 void calc_ydot(
const int order,
const doublereal*
const y_curr, doublereal*
const ydot_curr)
const;
406 doublereal time_curr, doublereal CJ, doublereal*
const y,
407 doublereal*
const ydot,
int num_newt_its);
417 doublereal
filterNewStep(
const doublereal timeCurrent,
const doublereal*
const ybase, doublereal*
const step0);
427 doublereal
filterNewSolution(
const doublereal timeCurrent, doublereal*
const y_current,
428 doublereal*
const ydot_current);
443 doublereal
deltaBoundStep(
const doublereal*
const y,
const doublereal*
const step0);
481 int dampStep(
const doublereal time_curr,
const doublereal*
const y_n_curr,
482 const doublereal*
const ydot_n_curr, doublereal*
const step_1,
483 doublereal*
const y_n_1, doublereal*
const ydot_n_1, doublereal* step_2,
485 int& num_backtracks);
512 int solve_nonlinear_problem(
int SolnType, doublereal*
const y_comm, doublereal*
const ydot_comm, doublereal CJ,
514 int& num_linear_solves,
int& num_backtracks,
int loglevelInput);
525 setPreviousTimeStep(
const std::vector<doublereal>& y_nm1,
const std::vector<doublereal>& ydot_nm1);
553 void setColumnScaling(
bool useColScaling,
const double*
const scaleFactors = 0);
572 doublereal time_curr,
int num_newt_its);
590 const doublereal*
const step_2,
const char*
const stepNorm_2,
591 const char*
const title,
const doublereal*
const y_n_curr,
592 const doublereal*
const y_n_1, doublereal damp,
size_t num_entries);
611 void getResidWts(doublereal*
const residWts)
const;
636 void setAtol(
const doublereal*
const atol);
644 void setRtol(
const doublereal rtol);
679 void setResidualTols(
double residRtol,
double* residAtol,
int residNormHandling = 2);
727 void descentComparison(doublereal time_curr ,doublereal* ydot0, doublereal* ydot1,
int& numTrials);
744 int lambdaToLeg(
const doublereal lambda, doublereal& alpha)
const;
800 int dampDogLeg(
const doublereal time_curr,
const doublereal* y_n_curr,
801 const doublereal* ydot_n_curr, std::vector<doublereal> & step_1,
802 doublereal*
const y_n_1, doublereal*
const ydot_n_1,
803 doublereal& stepNorm_1, doublereal& stepNorm_2,
GeneralMatrix& jac,
int& num_backtracks);
831 int decideStep(
const doublereal time_curr,
int leg, doublereal alpha,
const doublereal*
const y_n_curr,
832 const doublereal*
const ydot_n_curr,
833 const std::vector<doublereal> & step_1,
834 const doublereal*
const y_n_1,
const doublereal*
const ydot_n_1, doublereal trustDeltaOld);
856 doublereal& alphaBest)
const;
static bool s_alwaysAssumeNewtonGood
This toggle turns off the use of the Hessian when it is warranted by the condition number...
int trustRegionInitializationMethod_
Method for handling the trust region initialization.
std::vector< doublereal > m_y_low_bounds
Lower bounds vector for each species.
void computeResidWts()
Compute the Residual Weights.
Dense, Square (not sparse) matrices.
doublereal ResidDecreaseSDExp_
Expected DResid_dS for the steepest descent path - output variable.
void readjustTrustVector()
Readjust the trust region vectors.
int beuler_jac(GeneralMatrix &J, doublereal *const f, doublereal time_curr, doublereal CJ, doublereal *const y, doublereal *const ydot, int num_newt_its)
Function called to evaluate the jacobian matrix and the current residual vector at the current time s...
int m_matrixConditioning
Boolean indicating matrix conditioning.
doublereal Nuu_
Relative distance down the Newton step that the second dogleg starts.
int m_rowScaling
int indicating whether row scaling is turned on (1) or not (0)
int convergenceCheck(int dampCode, doublereal s1)
Check to see if the nonlinear problem has converged.
doublereal solnErrorNorm(const doublereal *const delta_y, const char *title=0, int printLargest=0, const doublereal dampFactor=1.0) const
L2 norm of the delta of the solution vector.
std::vector< doublereal > atolk_
absolute tolerance in the solution unknown
doublereal boundStep(const doublereal *const y, const doublereal *const step0)
Bound the step.
doublereal m_normResidTrial
Norm of the residual for a trial calculation which may or may not be used.
doublereal lambdaStar_
Value of lambdaStar_ which is used to calculate the Cauchy point.
doublereal ResidDecreaseNewtExp_
Expected DResid_dS for the Newton path - output variable.
std::vector< doublereal > m_colScales
Vector of column scaling factors.
doublereal normTrust_Newton_
Norm of the Newton Step wrt trust region.
std::vector< doublereal > userResidAtol_
absolute tolerance in the unscaled solution unknowns
doublereal userResidRtol_
absolute tolerance in the unscaled solution unknowns
doublereal m_normResid_Bound
Norm of the residual after it has been bounded.
virtual void setPreviousTimeStep(const std::vector< doublereal > &y_nm1, const std::vector< doublereal > &ydot_nm1)
Set the values for the previous time step.
int doResidualCalc(const doublereal time_curr, const int typeCalc, const doublereal *const y_curr, const doublereal *const ydot_curr, const ResidEval_Type_Enum evalType=Base_ResidEval) const
Compute the current residual.
int dogLegID_
Current leg.
std::vector< doublereal > m_ydot_nm1
Vector containing the solution derivative at the previous time step.
void setupDoubleDogleg()
Setup the parameters for the double dog leg.
void calcSolnToResNormVector()
Calculate the scaling factor for translating residual norms into solution norms.
void setTrustRegionInitializationMethod(int method, doublereal factor)
Set Trust region initialization strategy.
std::vector< doublereal > deltaX_trust_
Vector of trust region values.
int dampStep(const doublereal time_curr, const doublereal *const y_n_curr, const doublereal *const ydot_n_curr, doublereal *const step_1, doublereal *const y_n_1, doublereal *const ydot_n_1, doublereal *step_2, doublereal &stepNorm_2, GeneralMatrix &jac, bool writetitle, int &num_backtracks)
Find a damping coefficient through a look-ahead mechanism.
int m_print_flag
Determines the level of printing for each time step.
int m_nfe
Counter for the total number of function evaluations.
NonlinearSolver & operator=(const NonlinearSolver &right)
Assignment operator.
doublereal m_normDeltaSoln_CP
Norm of the distance to the cauchy point using the solution norm.
std::vector< doublereal > deltaX_Newton_
Newton Step - This is the newton step determined from the straight Jacobian.
doublereal residErrorNorm(const doublereal *const resid, const char *title=0, const int printLargest=0, const doublereal *const y=0) const
L2 norm of the residual of the equation system.
doublereal NextTrustFactor_
Factor indicating how much trust region has been changed next iteration - output variable.
doublereal filterNewSolution(const doublereal timeCurrent, doublereal *const y_current, doublereal *const ydot_current)
Apply a filter to the solution.
std::vector< doublereal > m_rowScales
Weights for normalizing the values of the residuals.
std::vector< doublereal > m_ewt
Soln error weights.
doublereal m_normResidPoints[15]
Vector of the norm.
ResidEval_Type_Enum
Differentiates the type of residual evaluations according to functionality.
doublereal dogLegAlpha_
Current Alpha param along the leg.
int m_min_newt_its
Minimum number of newton iterations to use.
void setDefaultDeltaBoundsMagnitudes()
Set default deulta bounds amounts.
std::vector< doublereal > Jd_
Jacobian times the steepest descent direction in the normalized coordinates.
doublereal m_normDeltaSoln_Newton
Norm of the solution update created by the iteration in its raw, undamped form, using the solution no...
static bool s_print_NumJac
Turn on or off printing of the Jacobian.
int checkUserResidualTols_
Check the residual tolerances explicitly against user input.
NonlinearSolver(ResidJacEval *func)
Default constructor.
Wrappers for the function evaluators for Nonlinear solvers and Time steppers.
std::vector< doublereal > deltaX_CP_
Steepest descent direction. This is also the distance to the Cauchy Point.
doublereal m_dampBound
Damping factor imposed by hard bounds and by delta bounds.
doublereal trustDelta_
Current value of trust radius.
int m_colScaling
The type of column scaling used in the matrix inversion of the problem.
void createSolnWeights(const doublereal *const y)
Create solution weights for convergence criteria.
std::vector< doublereal > m_deltaStepMaximum
Value of the delta step magnitudes.
int m_numLocalLinearSolves
Number of local linear solves done during the current iteration.
void print_solnDelta_norm_contrib(const doublereal *const step_1, const char *const stepNorm_1, const doublereal *const step_2, const char *const stepNorm_2, const char *const title, const doublereal *const y_n_curr, const doublereal *const y_n_1, doublereal damp, size_t num_entries)
Print solution norm contribution.
int doNewtonSolve(const doublereal time_curr, const doublereal *const y_curr, const doublereal *const ydot_curr, doublereal *const delta_y, GeneralMatrix &jac)
Compute the undamped Newton step.
doublereal calcTrustDistance(std::vector< doublereal > const &deltaX) const
Calculate the trust distance of a step in the solution variables.
void adjustUpStepMinimums()
Adjust the step minimums.
std::vector< doublereal > m_residWts
Vector of residual weights.
doublereal trustRegionLength() const
Calculate the length of the current trust region in terms of the solution error norm.
void calcColumnScales()
Set the column scaling vector at the current time.
bool m_resid_scaled
Boolean indicating whether we should scale the residual.
doublereal ResidDecreaseNewt_
Actual DResid_dS for the newton path - output variable.
void setAtol(const doublereal *const atol)
Set the absolute tolerances for the solution variables.
int dampDogLeg(const doublereal time_curr, const doublereal *y_n_curr, const doublereal *ydot_n_curr, std::vector< doublereal > &step_1, doublereal *const y_n_1, doublereal *const ydot_n_1, doublereal &stepNorm_1, doublereal &stepNorm_2, GeneralMatrix &jac, int &num_backtracks)
Damp using the dog leg approach.
void initializeTrustRegion()
Initialize the size of the trust vector.
int m_nJacEval
Number of Jacobian evaluations.
Dense, Square (not sparse) matrices.
std::vector< doublereal > m_y_n_curr
Vector containing the current solution vector within the nonlinear solver.
doublereal ResidDecreaseSD_
Actual DResid_dS for the steepest descent path - output variable.
void setDeltaBoundsMagnitudes(const doublereal *const deltaBoundsMagnitudes)
Set the delta Bounds magnitudes by hand.
size_t neq_
Local copy of the number of equations.
int doAffineNewtonSolve(const doublereal *const y_curr, const doublereal *const ydot_curr, doublereal *const delta_y, GeneralMatrix &jac)
Compute the newton step, either by direct newton's or by solving a close problem that is represented ...
std::vector< doublereal > m_ydot_trial
Value of the solution time derivative at the new point that is to be considered.
void fillDogLegStep(int leg, doublereal alpha, std::vector< doublereal > &deltaX) const
Fill a dogleg solution step vector.
Class that calculates the solution to a nonlinear system.
doublereal m_dampRes
Additional damping factor due to bounds on the residual and solution norms.
void setResidualTols(double residRtol, double *residAtol, int residNormHandling=2)
Set the relative and absolute tolerances for the Residual norm comparisons, if used.
std::vector< doublereal > m_y_high_bounds
Bounds vector for each species.
doublereal rtol_
value of the relative tolerance to use in solving the equation set
static bool s_print_DogLeg
Turn on extra printing of dogleg information.
doublereal dist_R2_
Distance of the second leg of the dogleg in terms of the solution norm.
doublereal dist_R1_
Distance of the first leg of the dogleg in terms of the solution norm.
void scaleMatrix(GeneralMatrix &jac, doublereal *const y_comm, doublereal *const ydot_comm, doublereal time_curr, int num_newt_its)
Scale the matrix.
bool ResidWtsReevaluated_
Boolean indicating that the residual weights have been reevaluated this iteration - output variable...
doublereal RJd_norm_
Residual dot Jd norm.
void setRowScaling(bool useRowScaling)
Set the rowscaling that are used for the inversion of the matrix.
std::vector< doublereal > m_ydot_n_curr
Vector containing the time derivative of the current solution vector within the nonlinear solver (whe...
void descentComparison(doublereal time_curr, doublereal *ydot0, doublereal *ydot1, int &numTrials)
This is a utility routine that can be used to print out the rates of the initial residual decline...
doublereal filterNewStep(const doublereal timeCurrent, const doublereal *const ybase, doublereal *const step0)
Apply a filtering process to the step.
static bool s_TurnOffTiming
Turn off printing of time.
int m_numTotalLinearSolves
Total number of linear solves taken by the solver object.
int m_manualDeltaStepSet
Boolean indicating whether a manual delta bounds has been input.
Cantera::GeneralMatrix * jacCopyPtr_
Copy of the jacobian that doesn't get overwritten when the inverse is determined. ...
~NonlinearSolver()
Destructor.
std::vector< doublereal > m_resid
Value of the residual for the nonlinear problem.
int m_jacFormMethod
Jacobian formation method.
int solve_nonlinear_problem(int SolnType, doublereal *const y_comm, doublereal *const ydot_comm, doublereal CJ, doublereal time_curr, GeneralMatrix &jac, int &num_newt_its, int &num_linear_solves, int &num_backtracks, int loglevelInput)
Find the solution to F(X) = 0 by damped Newton iteration.
int lambdaToLeg(const doublereal lambda, doublereal &alpha) const
Change the global lambda coordinate into the (leg,alpha) coordinate for the double dogleg...
std::vector< doublereal > m_deltaStepMinimum
Soln Delta bounds magnitudes.
std::vector< doublereal > m_y_n_trial
Vector containing the solution at the new point that is to be considered.
std::vector< doublereal > m_y_nm1
Vector containing the solution at the previous time step.
doublereal m_normResid_full
Norm of the residual at the end of the first leg of the current iteration.
doublereal m_normResid_0
Norm of the residual at the start of each nonlinear iteration.
doublereal time_n
Current system time.
int decideStep(const doublereal time_curr, int leg, doublereal alpha, const doublereal *const y_n_curr, const doublereal *const ydot_n_curr, const std::vector< doublereal > &step_1, const doublereal *const y_n_1, const doublereal *const ydot_n_1, doublereal trustDeltaOld)
Decide whether the current step is acceptable and adjust the trust region size.
int m_numTotalNewtIts
Total number of newton iterations.
int m_order
Order of the time step method = 1.
Cantera::GeneralMatrix * HessianPtr_
Hessian.
doublereal delta_t_n
Delta t for the current step.
int solnType_
Solution type.
void residualComparisonLeg(const doublereal time_curr, const doublereal *const ydot0, int &legBest, doublereal &alphaBest) const
Here we print out the residual at various points along the double dogleg, comparing against the quadr...
doublereal expectedResidLeg(int leg, doublereal alpha) const
Calculated the expected residual along the double dogleg curve.
void setRtol(const doublereal rtol)
Set the relative tolerances for the solution variables.
void setBoundsConstraints(const doublereal *const y_low_bounds, const doublereal *const y_high_bounds)
Set bounds constraints for all variables in the problem.
void calc_ydot(const int order, const doublereal *const y_curr, doublereal *const ydot_curr) const
Internal function to calculate the time derivative of the solution at the new step.
doublereal normTrust_CP_
Norm of the Cauchy Step direction wrt trust region.
doublereal CurrentTrustFactor_
Factor indicating how much trust region has been changed this iteration - output variable.
doublereal JdJd_norm_
Dot product of the Jd_ variable defined above with itself.
void getResidWts(doublereal *const residWts) const
Return the residual weights.
int calcTrustIntersection(doublereal trustVal, doublereal &lambda, doublereal &alpha) const
Given a trust distance, this routine calculates the intersection of the this distance with the double...
doublereal m_conditionNumber
Condition number of the matrix.
std::vector< doublereal > m_wksp_2
Workspace of length neq_.
void setSolverScheme(int doDogLeg, int doAffineSolve)
Parameter to turn on solution solver schemes.
void setMaxNewtIts(const int maxNewtIts)
Set the value of the maximum # of newton iterations.
doublereal norm_deltaX_trust_
Current norm of the vector deltaX_trust_ in terms of the solution norm.
int doAffineSolve_
General toggle for turning on Affine solve with Hessian.
ResidJacEval * m_func
Pointer to the residual and jacobian evaluator for the function.
doublereal deltaBoundStep(const doublereal *const y, const doublereal *const step0)
Return the factor by which the undamped Newton step 'step0' must be multiplied in order to keep the u...
doublereal trustRegionInitializationFactor_
Factor used to set the initial trust region.
doublereal m_normResid_1
Norm of the residual at the end of the first leg of the current iteration.
std::vector< doublereal > m_rowWtScales
Weights for normalizing the values of the residuals.
void setPrintLvl(int printLvl)
Set the print level from the nonlinear solver.
static bool s_doBothSolvesAndCompare
Turn on solving both the Newton and Hessian systems and comparing the results.
doublereal residNorm2Cauchy_
Expected value of the residual norm at the Cauchy point if the quadratic model were valid...
doublereal dist_R0_
Distance of the zeroeth leg of the dogleg in terms of the solution norm.
doublereal atolBase_
Base value of the absolute tolerance.
std::vector< doublereal > m_wksp
Workspace of length neq_.
int maxNewtIts_
Maximum number of newton iterations.
doublereal m_ScaleSolnNormToResNorm
Scale factor for turning residual norms into solution norms.
Base residual calculation for the time-stepping function.
int doDogLeg_
General toggle for turning on dog leg damping.
doublereal dist_Total_
Distance of the sum of all legs of the doglegs in terms of the solution norm.
std::vector< doublereal > & lowBoundsConstraintVector()
Return an editable vector of the low bounds constraints.
std::vector< doublereal > m_step_1
Value of the step to be taken in the solution.
std::vector< doublereal > & highBoundsConstraintVector()
Return an editable vector of the high bounds constraints.
doublereal doCauchyPointSolve(GeneralMatrix &jac)
Calculate the steepest descent direction and the Cauchy Point where the quadratic formulation of the ...
void setColumnScaling(bool useColScaling, const double *const scaleFactors=0)
Set the column scaling that are used for the inversion of the matrix.