46 #include <Xyce_config.h>
54 #include "N_LAS_Vector.h"
57 #include "NOX_Solver_LineSearchBased.H"
59 #include <N_UTL_MachDepParams.h>
70 Parallel::Machine comm,
74 Linear::Vector ** currSolVectorPtrPtr,
84 int checkDeviceConvergence,
85 double smallUpdateTol,
88 Linear::Vector * maskVectorPtr)
90 status_(
NOX::StatusTest::Unconverged),
92 isTransient_(isTransient),
96 requestedMaxNormF_(normF),
97 requestedMachPrecTol_(machPrec),
98 oldTimeStepVectorPtrPtr_(currSolVectorPtrPtr),
102 epsilon_a_(epsilon_a),
103 epsilon_r_(epsilon_r),
105 weightedUpdate_(0.0),
107 requestedConvRate_(convRate),
108 currentConvRate_(1.0),
109 requestedRelativeConvRate_(relConvRate),
110 currentRelativeConvRate_(1.0),
111 normResidualInit_(1.0),
112 maxConvRate_(maxConvRate),
116 stagnationTol_(stagnationTol),
117 maxBadSteps_(maxBadSteps),
119 smallUpdateTol_(smallUpdateTol),
120 checkDeviceConvergence_(checkDeviceConvergence),
122 allDevicesConverged_(false),
123 innerDevicesConverged_(false),
124 maskingFlag_(NLS_MASKED_WRMS_NORMS && maskingFlag ),
125 deviceMaskFlag_( true ),
126 weightMaskVectorPtr_( maskVectorPtr)
142 NOX::StatusTest::StatusType
144 const NOX::Solver::Generic& problem,
145 NOX::StatusTest::CheckType checkType)
147 status_ = NOX::StatusTest::Unconverged;
149 niters_ = problem.getNumIterations();
154 const Linear::Vector& x = (
dynamic_cast<const Vector&
>
155 (problem.getSolutionGroup().getX())).getNativeVectorRef();
156 const Linear::Vector& oldX = (
dynamic_cast<const Vector&
>
157 (problem.getPreviousSolutionGroup().getX())).getNativeVectorRef();
160 NOX::StatusTest::StatusType check =
finiteTest_.checkStatus(problem, checkType);
161 if (check == NOX::StatusTest::Failed)
175 status_ = NOX::StatusTest::Failed;
187 status_ = NOX::StatusTest::Unconverged;
195 maxNormF_ = problem.getSolutionGroup().getF()
196 .norm(NOX::Abstract::Vector::MaxNorm);
198 const Linear::Vector& F = (
dynamic_cast<const Vector&
>
199 (problem.getSolutionGroup().getF())).getNativeVectorRef();
201 std::vector<int> index(1, -1);
202 F.infNormIndex( &index[0] );
208 status_ = NOX::StatusTest::Converged;
230 for (
int i=0; i< x.localLength() ; ++i )
248 int length = x.localLength();
249 for (
int i = 0; i < length; ++i )
256 weights[i] = Util::MachineDependentParams::MachineBig();
268 update.update(1.0, x, -1.0, oldX, 0.0);
271 #ifdef Xyce_SPICE_NORMS
280 const NOX::Solver::LineSearchBased* test = 0;
281 test =
dynamic_cast<const NOX::Solver::LineSearchBased*
>(&problem);
299 if (!(problem.getPreviousSolutionGroup().isNewton()))
301 NOX::Abstract::Group & tmpGrp =
302 (
const_cast<NOX::Abstract::Group&
>(problem.getPreviousSolutionGroup()));
303 Teuchos::ParameterList tmpParams;
304 tmpGrp.computeNewton (tmpParams);
307 const Linear::Vector& dx = (
dynamic_cast<const Vector&
>
308 (problem.getPreviousSolutionGroup().getNewton())).getNativeVectorRef();
314 status_ = NOX::StatusTest::Failed;
323 status_ = NOX::StatusTest::Converged;
339 (problem.getPreviousSolutionGroup().getNormF());
364 status_ = NOX::StatusTest::Converged;
368 status_ = NOX::StatusTest::Failed;
370 status_ = NOX::StatusTest::Converged;
374 status_ = NOX::StatusTest::Failed;
389 status_ = NOX::StatusTest::Failed;
394 status_ = NOX::StatusTest::Unconverged;
409 status_ = NOX::StatusTest::Failed;
418 status_ = NOX::StatusTest::Failed;
438 bool isCounted =
false;
469 status_ = NOX::StatusTest::Converged;
476 status_ = NOX::StatusTest::Failed;
478 status_ = NOX::StatusTest::Converged;
482 status_ = NOX::StatusTest::Failed;
497 for (
int j = 0; j < indent; ++j )
508 for (
int j = 0; j < indent; ++j )
510 stream <<
"8. Devices are Converged: ";
512 stream <<
"true" <<
"\n";
514 stream <<
"false" <<
"\n";
517 for (
int j = 0; j < indent; ++j )
519 stream <<
"1. Inf-Norm F too small" <<
"\n";
521 for (
int j = 0; j < indent; ++j )
523 stream <<
" Machine Precision: " << NOX::Utils::sciformat(
maxNormF_, p)
526 for (
int j = 0; j < indent; ++j )
528 stream <<
" Requested Tolerance: " << NOX::Utils::sciformat(
maxNormF_, p)
531 for (
int j = 0; j < indent; ++j )
533 stream <<
"2. Normal Convergence" <<
"\n";
535 for (
int j = 0; j < indent; ++j )
537 stream <<
" Inf-Norm F: " << NOX::Utils::sciformat(
maxNormF_, p)
540 for (
int j = 0; j < indent; ++j )
542 stream <<
" Weighted Update: " << NOX::Utils::sciformat(
weightedUpdate_, p)
543 <<
" < " << NOX::Utils::sciformat(
tol_, p) <<
"\n";
545 for (
int j = 0; j < indent; ++j )
547 stream <<
"3. Near Convergence" <<
"\n";
549 for (
int j = 0; j < indent; ++j )
551 stream <<
" Max Iters: " <<
niters_
554 for (
int j = 0; j < indent; ++j )
556 stream <<
" Convergence Rate: "
560 for (
int j = 0; j < indent; ++j )
562 stream <<
" Relative Convergence Rate: "
567 for (
int j = 0; j < indent; ++j )
569 stream <<
"4. Small Weighted Update: "
575 for (
int j = 0; j < indent; ++j )
577 stream <<
"5. Maximum Iterations: "
579 <<
" < " << maxIters_ <<
"\n";
581 for (
int j = 0; j < indent; ++j )
583 stream <<
"6. Large Conv Rate: "
585 <<
" < " << NOX::Utils::sciformat(
maxConvRate_, p) <<
"\n";
588 for (
int j = 0; j < indent; ++j )
590 stream <<
"7. Stagnation " <<
"\n";
592 for (
int j = 0; j < indent; ++j )
594 stream <<
" Bad Step Count: "
597 for (
int j = 0; j < indent; ++j )
599 stream <<
" Stagnation Tolerance: "
NOX::StatusTest::StatusType status_
bool innerDevicesConverged_
Pure virtual class to augment a linear system.
Xyce::Loader::NonlinearEquationLoader * loaderPtr_
Xyce::Linear::Vector * weightMaskVectorPtr_
double currentRelativeConvRate_
bool innerDevicesConverged(Parallel::Machine comm)
bool allDevicesConverged_
NOX::StatusTest::FiniteValue finiteTest_
double requestedMaxNormF_
bool allDevicesConverged(Parallel::Machine comm)
Xyce::Linear::Vector ** oldTimeStepVectorPtrPtr_
int checkDeviceConvergence_
Xyce::Nonlinear::ReturnCodes retCodes_
double requestedMachPrecTol_
const double maxConvRate_
const double requestedConvRate_
int getXyceReturnCode() const
Xyce::Linear::Vector * tmpVectorPtr_
int getMaxNormFindex() const
XyceTests(Parallel::Machine comm, bool isTransient, double normF, double machPrec, Xyce::Linear::Vector **currSolVectorPtrPtr, double epsilon_a, double epsilon_r, double tol, int maxIters, double convRate, double relConvRate, double maxConvRate, double stagnationTol, int maxBadSteps, int checkDeviceConvergence, double smallUpdateTol, Xyce::Loader::NonlinearEquationLoader *loader, bool maskingFlag, Xyce::Linear::Vector *maskVectorPtr)
double getMaxNormF() const
Xyce::Linear::Vector * weightsVectorPtr_
Xyce::Linear::Vector * updateVectorPtr_
std::ostream & print(std::ostream &stream, int indent=0) const
const double stagnationTol_
NOX::StatusTest::StatusType checkStatus(const NOX::Solver::Generic &problem, NOX::StatusTest::CheckType checkType)
const double requestedRelativeConvRate_