46 #include <Xyce_config.h>
52 #include <N_UTL_Misc.h>
55 #include "N_LAS_Vector.h"
56 #include "N_LOA_Loader.h"
58 #include "NOX_Solver_LineSearchBased.H"
62 using namespace N_NLS_NOX;
69 N_LAS_Vector** currSolVectorPtrPtr,
79 int checkDeviceConvergence,
80 double smallUpdateTol,
82 std::vector<char> & varTypeVec,
85 #ifdef Xyce_NLS_MASKED_WRMS_NORMS
86 ,
bool nonTrivialDeviceMaskFlag,
87 N_LAS_Vector * maskVectorPtr
90 XyceTests( isTransient, normF, machPrec, currSolVectorPtrPtr, epsilon_a, epsilon_r,
91 tol, maxIters, convRate, relConvRate, maxConvRate, stagnationTol, maxBadSteps,
92 checkDeviceConvergence, smallUpdateTol, loader
93 #ifdef Xyce_NLS_MASKED_WRMS_NORMS
94 , nonTrivialDeviceMaskFlag, maskVectorPtr
97 varTypeVec_( varTypeVec ),
98 voltZeroTol_( voltZeroTol ),
99 currZeroTol_( currZeroTol_ )
109 NOX::StatusTest::StatusType
112 status_ = NOX::StatusTest::Unconverged;
114 niters_ = problem.getNumIterations();
119 const N_LAS_Vector& x = (
dynamic_cast<const N_NLS_NOX::Vector&
>(problem.getSolutionGroup().getX())).getNativeVectorRef();
120 const N_LAS_Vector& oldX = (
dynamic_cast<const N_NLS_NOX::Vector&
>(problem.getPreviousSolutionGroup().getX())).getNativeVectorRef();
123 NOX::StatusTest::StatusType check =
finiteTest_.checkStatus(problem, checkType);
124 if (check == NOX::StatusTest::Failed)
138 status_ = NOX::StatusTest::Failed;
150 status_ = NOX::StatusTest::Unconverged;
185 for (
int i=0; i< x.localLength() ; ++i )
203 int length = x.localLength();
204 for (
int i = 0; i < length; ++i )
207 double localMax =
Xycemax(fabs(x[i]), fabs(oldTimeStepX[i]));
212 weights[i] = N_UTL_MachineDependentParams::MachineBig();
223 weights[i] = N_UTL_MachineDependentParams::MachineBig();
231 #ifdef Xyce_NLS_MASKED_WRMS_NORMS
232 if( deviceMaskFlag_ && ((*weightMaskVectorPtr_)[i] == 0.0) )
234 weights[i] = N_UTL_MachineDependentParams::MachineBig();
247 update.update(1.0, x, -1.0, oldX, 0.0);
250 #ifdef Xyce_SPICE_NORMS
259 const NOX::Solver::LineSearchBased* test = 0;
260 test =
dynamic_cast<const NOX::Solver::LineSearchBased*
>(&problem);
278 if (!(problem.getPreviousSolutionGroup().isNewton()))
280 NOX::Abstract::Group & tmpGrp =
281 (
const_cast<NOX::Abstract::Group&
>(problem.getPreviousSolutionGroup()));
282 Teuchos::ParameterList tmpParams;
283 tmpGrp.computeNewton (tmpParams);
287 (problem.getPreviousSolutionGroup().getNewton())).getNativeVectorRef();
293 status_ = NOX::StatusTest::Failed;
302 status_ = NOX::StatusTest::Converged;
318 (problem.getPreviousSolutionGroup().getNormF());
343 status_ = NOX::StatusTest::Converged;
348 status_ = NOX::StatusTest::Failed;
363 status_ = NOX::StatusTest::Failed;
368 status_ = NOX::StatusTest::Unconverged;
383 status_ = NOX::StatusTest::Failed;
392 status_ = NOX::StatusTest::Failed;
412 bool isCounted =
false;
443 status_ = NOX::StatusTest::Converged;
451 status_ = NOX::StatusTest::Failed;
466 for (
int j = 0; j < indent; ++j )
477 for (
int j = 0; j < indent; ++j )
479 stream <<
"8. Devices are Converged: ";
481 stream <<
"true" <<
"\n";
483 stream <<
"false" <<
"\n";
486 for (
int j = 0; j < indent; ++j )
488 stream <<
"1. Inf-Norm F too small" <<
"\n";
490 for (
int j = 0; j < indent; ++j )
492 stream <<
" Machine Precision: " << NOX::Utils::sciformat(
maxNormF_, p)
495 for (
int j = 0; j < indent; ++j )
497 stream <<
" Requested Tolerance: " << NOX::Utils::sciformat(
maxNormF_, p)
500 for (
int j = 0; j < indent; ++j )
502 stream <<
"2. Normal Convergence" <<
"\n";
504 for (
int j = 0; j < indent; ++j )
506 stream <<
" Inf-Norm F: " << NOX::Utils::sciformat(
maxNormF_, p)
509 for (
int j = 0; j < indent; ++j )
511 stream <<
" Weighted Update: " << NOX::Utils::sciformat(
weightedUpdate_, p)
512 <<
" < " << NOX::Utils::sciformat(
tol_, p) <<
"\n";
514 for (
int j = 0; j < indent; ++j )
516 stream <<
"3. Near Convergence" <<
"\n";
518 for (
int j = 0; j < indent; ++j )
520 stream <<
" Max Iters: " <<
niters_
523 for (
int j = 0; j < indent; ++j )
525 stream <<
" Convergence Rate: "
529 for (
int j = 0; j < indent; ++j )
531 stream <<
" Relative Convergence Rate: "
536 for (
int j = 0; j < indent; ++j )
538 stream <<
"4. Small Weighted Update: "
544 for (
int j = 0; j < indent; ++j )
546 stream <<
"5. Maximum Iterations: "
548 <<
" < " << maxIters_ <<
"\n";
550 for (
int j = 0; j < indent; ++j )
552 stream <<
"6. Large Conv Rate: "
554 <<
" < " << NOX::Utils::sciformat(
maxConvRate_, p) <<
"\n";
557 for (
int j = 0; j < indent; ++j )
559 stream <<
"7. Stagnation " <<
"\n";
561 for (
int j = 0; j < indent; ++j )
563 stream <<
" Bad Step Count: "
566 for (
int j = 0; j < indent; ++j )
568 stream <<
" Stagnation Tolerance: "