46 #include <Xyce_config.h>
55 #include "N_LAS_Vector.h"
58 #include "NOX_Solver_LineSearchBased.H"
60 #include <N_UTL_MachDepParams.h>
79 Parallel::Machine comm,
83 Linear::Vector ** currSolVectorPtrPtr,
93 int checkDeviceConvergence,
94 double smallUpdateTol,
97 Linear::Vector * maskVectorPtr)
99 status_(
NOX::StatusTest::Unconverged),
101 isTransient_(isTransient),
105 requestedMaxNormF_(normF),
106 requestedMachPrecTol_(machPrec),
107 oldTimeStepVectorPtrPtr_(currSolVectorPtrPtr),
108 weightsVectorPtr_(0),
111 epsilon_a_(epsilon_a),
112 epsilon_r_(epsilon_r),
114 weightedUpdate_(0.0),
116 requestedConvRate_(convRate),
117 currentConvRate_(1.0),
118 requestedRelativeConvRate_(relConvRate),
119 currentRelativeConvRate_(1.0),
120 normResidualInit_(1.0),
121 maxConvRate_(maxConvRate),
125 stagnationTol_(stagnationTol),
126 maxBadSteps_(maxBadSteps),
128 smallUpdateTol_(smallUpdateTol),
129 checkDeviceConvergence_(checkDeviceConvergence),
131 allDevicesConverged_(false),
132 innerDevicesConverged_(false),
133 maskingFlag_(NLS_MASKED_WRMS_NORMS && maskingFlag ),
134 deviceMaskFlag_( true ),
135 weightMaskVectorPtr_( maskVectorPtr)
167 NOX::StatusTest::StatusType
169 const NOX::Solver::Generic& problem,
170 NOX::StatusTest::CheckType checkType)
172 status_ = NOX::StatusTest::Unconverged;
174 niters_ = problem.getNumIterations();
179 const Linear::Vector& x = (
dynamic_cast<const Vector&
>
180 (problem.getSolutionGroup().getX())).getNativeVectorRef();
181 const Linear::Vector& oldX = (
dynamic_cast<const Vector&
>
182 (problem.getPreviousSolutionGroup().getX())).getNativeVectorRef();
185 NOX::StatusTest::StatusType check =
finiteTest_.checkStatus(problem, checkType);
186 if (check == NOX::StatusTest::Failed)
200 status_ = NOX::StatusTest::Failed;
211 if (!linearSolverStatus)
213 status_ = NOX::StatusTest::Failed;
225 status_ = NOX::StatusTest::Unconverged;
233 maxNormF_ = problem.getSolutionGroup().getF()
234 .norm(NOX::Abstract::Vector::MaxNorm);
236 const Linear::Vector& F = (
dynamic_cast<const Vector&
>
237 (problem.getSolutionGroup().getF())).getNativeVectorRef();
239 std::vector<int> index(1, -1);
240 F.infNormIndex( &index[0] );
252 status_ = NOX::StatusTest::Converged;
275 for (
int i=0; i< x.localLength() ; ++i )
291 int length = x.localLength();
292 for (
int i = 0; i < length; ++i )
299 weights[i] = Util::MachineDependentParams::MachineBig();
314 #ifdef Xyce_SPICE_NORMS
323 const NOX::Solver::LineSearchBased* test = 0;
324 test =
dynamic_cast<const NOX::Solver::LineSearchBased*
>(&problem);
332 status_ = NOX::StatusTest::Converged;
348 (problem.getPreviousSolutionGroup().getNormF());
373 status_ = NOX::StatusTest::Converged;
377 status_ = NOX::StatusTest::Failed;
379 status_ = NOX::StatusTest::Converged;
383 status_ = NOX::StatusTest::Failed;
398 status_ = NOX::StatusTest::Failed;
403 status_ = NOX::StatusTest::Unconverged;
415 status_ = NOX::StatusTest::Failed;
424 status_ = NOX::StatusTest::Failed;
444 bool isCounted =
false;
475 status_ = NOX::StatusTest::Converged;
482 status_ = NOX::StatusTest::Failed;
484 status_ = NOX::StatusTest::Converged;
488 status_ = NOX::StatusTest::Failed;
511 for (
int j = 0; j < indent; ++j )
522 for (
int j = 0; j < indent; ++j )
524 stream <<
"8. Devices are Converged: ";
526 stream <<
"true" <<
"\n";
528 stream <<
"false" <<
"\n";
531 for (
int j = 0; j < indent; ++j )
533 stream <<
"1. Inf-Norm F too small" <<
"\n";
535 for (
int j = 0; j < indent; ++j )
537 stream <<
" Machine Precision: " << NOX::Utils::sciformat(
maxNormF_, p)
540 for (
int j = 0; j < indent; ++j )
542 stream <<
" Requested Tolerance: " << NOX::Utils::sciformat(
maxNormF_, p)
545 for (
int j = 0; j < indent; ++j )
547 stream <<
"2. Normal Convergence" <<
"\n";
549 for (
int j = 0; j < indent; ++j )
551 stream <<
" Inf-Norm F: " << NOX::Utils::sciformat(
maxNormF_, p)
554 for (
int j = 0; j < indent; ++j )
556 stream <<
" Weighted Update: " << NOX::Utils::sciformat(
weightedUpdate_, p)
557 <<
" < " << NOX::Utils::sciformat(
tol_, p) <<
"\n";
559 for (
int j = 0; j < indent; ++j )
561 stream <<
"3. Near Convergence" <<
"\n";
563 for (
int j = 0; j < indent; ++j )
565 stream <<
" Max Iters: " <<
niters_
568 for (
int j = 0; j < indent; ++j )
570 stream <<
" Convergence Rate: "
574 for (
int j = 0; j < indent; ++j )
576 stream <<
" Relative Convergence Rate: "
581 for (
int j = 0; j < indent; ++j )
583 stream <<
"4. Small Weighted Update: "
589 for (
int j = 0; j < indent; ++j )
591 stream <<
"5. Maximum Iterations: "
593 <<
" < " << maxIters_ <<
"\n";
595 for (
int j = 0; j < indent; ++j )
597 stream <<
"6. Large Conv Rate: "
599 <<
" < " << NOX::Utils::sciformat(
maxConvRate_, p) <<
"\n";
602 for (
int j = 0; j < indent; ++j )
604 stream <<
"7. Stagnation " <<
"\n";
606 for (
int j = 0; j < indent; ++j )
608 stream <<
" Bad Step Count: "
611 for (
int j = 0; j < indent; ++j )
613 stream <<
" Stagnation Tolerance: "
617 for (
int j = 0; j < indent; ++j )
619 stream <<
"9. Linear solver failed." <<
"\n";
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)
bool linearSolverStatus() const
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_