10 #ifndef BELOS_STATUS_TEST_IMPRESNORM_H
11 #define BELOS_STATUS_TEST_IMPRESNORM_H
71 template <
class ScalarType,
class MV,
class OP>
102 bool showMaxResNormOnly =
false);
194 void print(std::ostream& os,
int indent = 0)
const;
269 std::ostringstream oss;
270 oss <<
"Belos::StatusTestImpResNorm<>: " <<
resFormStr();
285 std::ostringstream oss;
298 oss <<
" (User Scale)";
387 template <
class ScalarType,
class MV,
class OP>
390 : tolerance_(Tolerance),
391 currTolerance_(Tolerance),
393 showMaxResNormOnly_(showMaxResNormOnly),
403 firstcallCheckStatus_(true),
404 firstcallDefineResForm_(true),
405 firstcallDefineScaleForm_(true),
412 template <
class ScalarType,
class MV,
class OP>
416 template <
class ScalarType,
class MV,
class OP>
425 currTolerance_ = tolerance_;
426 firstcallCheckStatus_ =
true;
427 lossDetected_ =
false;
431 template <
class ScalarType,
class MV,
class OP>
435 "StatusTestResNorm::defineResForm(): The residual form has already been defined.");
436 firstcallDefineResForm_ =
false;
438 resnormtype_ = TypeOfNorm;
443 template <
class ScalarType,
class MV,
class OP>
448 "StatusTestResNorm::defineScaleForm(): The scaling type has already been defined.");
449 firstcallDefineScaleForm_ =
false;
451 scaletype_ = TypeOfScaling;
452 scalenormtype_ = TypeOfNorm;
453 scalevalue_ = ScaleValue;
458 template <
class ScalarType,
class MV,
class OP>
469 if (firstcallCheckStatus_) {
470 StatusType status = firstCallCheckStatusSetup (iSolver);
486 curBlksz_ = (int)curLSIdx_.size();
488 for (
int i=0; i<curBlksz_; ++i) {
489 if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_)
492 curNumRHS_ = validLS;
522 std::vector<MagnitudeType> tmp_resvector( curBlksz_ );
524 if (! residMV.is_null ()) {
526 tmp_resvector.resize (MVT::GetNumberVecs (*residMV));
527 MVT::MvNorm (*residMV, tmp_resvector, resnormtype_);
528 typename std::vector<int>::iterator p = curLSIdx_.begin();
529 for (
int i=0; p<curLSIdx_.end(); ++p, ++i) {
532 resvector_[*p] = tmp_resvector[i];
536 typename std::vector<int>::iterator p = curLSIdx_.begin();
537 for (
int i=0; p<curLSIdx_.end(); ++p, ++i) {
540 resvector_[*p] = tmp_resvector[i];
547 if (scalevector_.size () > 0) {
549 typename std::vector<int>::iterator p = curLSIdx_.begin();
550 for (; p<curLSIdx_.end(); ++p) {
554 if ( scalevector_[ *p ] != zero ) {
556 testvector_[ *p ] = resvector_[ *p ] / scalevector_[ *p ] / scalevalue_;
558 testvector_[ *p ] = resvector_[ *p ] / scalevalue_;
564 typename std::vector<int>::iterator p = curLSIdx_.begin();
565 for (; p<curLSIdx_.end(); ++p) {
568 testvector_[ *p ] = resvector_[ *p ] / scalevalue_;
581 ind_.resize( curLSIdx_.size() );
582 std::vector<int> lclInd( curLSIdx_.size() );
583 typename std::vector<int>::iterator p = curLSIdx_.begin();
584 for (
int i=0; p<curLSIdx_.end(); ++p, ++i) {
587 if (testvector_[ *p ] > currTolerance_) {
589 }
else if (testvector_[ *p ] <= currTolerance_) {
602 "StatusTestImpResNorm::checkStatus(): One or more of the current "
603 "implicit residual norms is NaN.");
618 RCP<MV> cur_res = MVT::Clone (*curSoln_, MVT::GetNumberVecs (*curSoln_));
620 tmp_resvector.resize (MVT::GetNumberVecs (*cur_res));
621 std::vector<MagnitudeType> tmp_testvector (have);
622 MVT::MvNorm (*cur_res, tmp_resvector, resnormtype_);
625 if ( scalevector_.size() > 0 ) {
626 for (
int i=0; i<have; ++i) {
628 if ( scalevector_[ ind_[i] ] != zero ) {
630 tmp_testvector[ i ] = tmp_resvector[ lclInd[i] ] / scalevector_[ ind_[i] ] / scalevalue_;
632 tmp_testvector[ i ] = tmp_resvector[ lclInd[i] ] / scalevalue_;
637 for (
int i=0; i<have; ++i) {
638 tmp_testvector[ i ] = tmp_resvector[ lclInd[i] ] / scalevalue_;
649 for (
int i = 0; i < have; ++i) {
659 if (tmp_testvector[i] <= tolerance_) {
660 ind_[have2] = ind_[i];
666 const MagnitudeType diff = STM::magnitude (testvector_[ind_[i]] - tmp_testvector[i]);
667 if (diff > currTolerance_) {
675 lossDetected_ =
true;
676 ind_[have2] = ind_[i];
696 const MagnitudeType onePointFive = as<MagnitudeType>(3) / as<MagnitudeType> (2);
697 const MagnitudeType oneTenth = STM::one () / as<MagnitudeType> (10);
699 currTolerance_ = currTolerance_ - onePointFive * diff;
700 while (currTolerance_ < STM::zero ()) {
701 currTolerance_ += oneTenth * diff;
712 int need = (quorum_ == -1) ? curNumRHS_: quorum_;
719 template <
class ScalarType,
class MV,
class OP>
722 for (
int j = 0; j < indent; j ++)
724 printStatus(os, status_);
727 os <<
", tol = " << tolerance_ << std::endl;
730 if(showMaxResNormOnly_ && curBlksz_ > 1) {
732 testvector_.begin()+curLSIdx_[0],testvector_.begin()+curLSIdx_[curBlksz_-1]
734 for (
int j = 0; j < indent + 13; j ++)
736 os <<
"max{residual["<<curLSIdx_[0]<<
"..."<<curLSIdx_[curBlksz_-1]<<
"]} = " << maxRelRes
737 << ( maxRelRes <= tolerance_ ?
" <= " :
" > " ) << tolerance_ << std::endl;
740 for (
int i=0; i<numrhs_; i++ ) {
741 for (
int j = 0; j < indent + 13; j ++)
743 os <<
"residual [ " << i <<
" ] = " << testvector_[ i ];
744 os << ((testvector_[i]<tolerance_) ?
" < " : (testvector_[i]==tolerance_) ?
" == " : (testvector_[i]>tolerance_) ?
" > " :
" " ) << tolerance_ << std::endl;
751 template <
class ScalarType,
class MV,
class OP>
754 os << std::left << std::setw(13) << std::setfill(
'.');
761 os <<
"Unconverged (LoA)";
770 os << std::left << std::setfill(
' ');
774 template <
class ScalarType,
class MV,
class OP>
783 if (firstcallCheckStatus_) {
787 firstcallCheckStatus_ =
false;
791 numrhs_ = MVT::GetNumberVecs( *rhs );
792 scalevector_.resize( numrhs_ );
793 MVT::MvNorm( *rhs, scalevector_, scalenormtype_ );
797 numrhs_ = MVT::GetNumberVecs( *init_res );
798 scalevector_.resize( numrhs_ );
799 MVT::MvNorm( *init_res, scalevector_, scalenormtype_ );
803 numrhs_ = MVT::GetNumberVecs( *init_res );
804 scalevector_.resize( numrhs_ );
805 MVT::MvNorm( *init_res, scalevector_, scalenormtype_ );
808 numrhs_ = MVT::GetNumberVecs( *(lp.
getRHS()) );
811 resvector_.resize( numrhs_ );
812 testvector_.resize( numrhs_ );
816 curBlksz_ = (int)curLSIdx_.size();
818 for (i=0; i<curBlksz_; ++i) {
819 if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_)
822 curNumRHS_ = validLS;
825 for (i=0; i<numrhs_; i++) { testvector_[i] = one; }
828 if (scalevalue_ == zero) {
virtual Teuchos::RCP< const MV > getNativeResiduals(std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > *norms) const =0
Get the residuals native to the solver.
MagnitudeType scalevalue_
Scaling value.
Teuchos::RCP< MV > getSolution()
Returns the current solution estimate that was computed for the most recent residual test...
MultiVecTraits< ScalarType, MV > MVT
virtual ~StatusTestImpResNorm()
Destructor (virtual for memory safety).
const std::vector< MagnitudeType > * getTestValue() const
Returns the test value, , computed in most recent call to CheckStatus.
ScaleType
The type of scaling to use on the residual norm value.
Exception thrown to signal error in a status test during Belos::StatusTest::checkStatus().
Convergence test using the implicit residual norm(s), with an explicit residual norm(s) check for los...
StatusType checkStatus(Iteration< ScalarType, MV, OP > *iSolver)
Check convergence status: Passed, Failed, or Undefined.
virtual Teuchos::RCP< MV > updateSolution(const Teuchos::RCP< MV > &update=Teuchos::null, bool updateLP=false, ScalarType scale=Teuchos::ScalarTraits< ScalarType >::one())
Compute the new solution to the linear system using the given update vector.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
int quorum_
Number of residuals that must pass the convergence test before Passed is returned.
virtual Teuchos::RCP< MV > getCurrentUpdate() const =0
Get the current update to the linear system.
Declaration of basic traits for the multivector type.
Teuchos::RCP< const MV > getInitPrecResVec() const
A pointer to the preconditioned initial residual vector.
StatusType status_
Status.
An abstract class of StatusTest for stopping criteria using residual norms.
MagnitudeType tolerance_
Current tolerance used to determine convergence and the default tolerance set by user.
Teuchos::RCP< MV > curSoln_
Current solution vector.
NormType resnormtype_
Type of norm to use on residual (OneNorm, TwoNorm, or InfNorm).
int curBlksz_
The current blocksize of the linear system being solved.
Teuchos::RCP< const MV > getRHS() const
A pointer to the right-hand side B.
StatusType
Whether the StatusTest wants iteration to stop.
const std::vector< MagnitudeType > * getResNormValue() const
Returns the residual norm value, , computed in most recent call to CheckStatus.
ScaleType scaletype_
Type of scaling to use (Norm of RHS, Norm of Initial Residual, None or User provided) ...
NormType scalenormtype_
Type of norm to use on the scaling (OneNorm, TwoNorm, or InfNorm)
Traits class which defines basic operations on multivectors.
int getQuorum() const
Returns the number of residuals that must pass the convergence test before Passed is returned...
Teuchos::ScalarTraits< ScalarType >::magnitudeType MagnitudeType
The type of the magnitude (absolute value) of a ScalarType.
int numrhs_
The total number of right-hand sides being solved for.
std::vector< MagnitudeType > scalevector_
Scaling vector.
const std::vector< int > & getLSIndex() const
(Zero-based) indices of the linear system(s) currently being solved.
std::vector< int > ind_
Vector containing the indices for the vectors that passed the test.
bool showMaxResNormOnly_
Determines if the entries for all of the residuals are shown or just the max.
int setShowMaxResNormOnly(bool showMaxResNormOnly)
Set whether the only maximum residual norm is displayed when the print() method is called...
Teuchos::ScalarTraits< ScalarType > STS
const std::vector< MagnitudeType > * getScaledNormValue() const
Returns the scaled norm value, .
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
int getLSNumber() const
The number of linear systems that have been set.
int curLSNum_
The current number of linear systems that have been loaded into the linear problem.
int setQuorum(int quorum)
Sets the number of residuals that must pass the convergence test before Passed is returned...
StatusType firstCallCheckStatusSetup(Iteration< ScalarType, MV, OP > *iSolver)
Call to setup initial scaling vector.
MagnitudeType getCurrTolerance() const
Current convergence tolerance; may be changed to prevent loss of accuracy.
int defineResForm(NormType TypeOfNorm)
Define form of the residual, its norm and optional weighting vector.
virtual const LinearProblem< ScalarType, MV, OP > & getProblem() const =0
Get a constant reference to the linear problem.
Teuchos::RCP< const MV > getInitResVec() const
A pointer to the initial unpreconditioned residual vector.
TypeTo as(const TypeFrom &t)
Belos::StatusTest abstract class for specifying a residual norm stopping criteria.
MagnitudeType currTolerance_
bool getLOADetected() const
Returns a boolean indicating a loss of accuracy has been detected in computing the residual...
bool lossDetected_
Has a loss in accuracy been detected?
NormType
The type of vector norm to compute.
std::vector< MagnitudeType > resvector_
Residual norm vector.
Teuchos::ScalarTraits< MagnitudeType > STM
virtual void computeCurrResVec(MV *R, const MV *X=0, const MV *B=0) const
Compute a residual R for this operator given a solution X, and right-hand side B. ...
StatusType getStatus() const
Return the result of the most recent CheckStatus call.
bool firstcallDefineResForm_
Is this the first time DefineResForm is called?
int curNumRHS_
The current number of right-hand sides being solved for.
MagnitudeType getTolerance() const
"Original" convergence tolerance as set by user.
int defineScaleForm(ScaleType TypeOfScaling, NormType TypeOfNorm, MagnitudeType ScaleValue=Teuchos::ScalarTraits< MagnitudeType >::one())
Define form of the scaling, its norm, its optional weighting vector, or, alternatively, define an explicit value.
StatusTestImpResNorm(MagnitudeType Tolerance, int quorum=-1, bool showMaxResNormOnly=false)
Constructor.
int setTolerance(MagnitudeType tolerance)
Set the value of the tolerance.
std::vector< MagnitudeType > testvector_
Test vector = resvector_ / scalevector_.
std::string description() const
Method to return description of the maximum iteration status test.
std::vector< int > curLSIdx_
The indices of the current number of right-hand sides being solved for.
void printStatus(std::ostream &os, StatusType type) const
Print message for each status specific to this stopping test.
bool firstcallCheckStatus_
Is this the first time CheckStatus is called?
bool firstcallDefineScaleForm_
Is this the first time DefineScaleForm is called?
void reset()
Resets the internal configuration to the initial state.
void print(std::ostream &os, int indent=0) const
Output formatted description of stopping test to output stream.
std::vector< int > convIndices()
Returns the vector containing the indices of the residuals that passed the test.
std::string resFormStr() const
Description of current residual form.
bool getShowMaxResNormOnly()
Returns whether the only maximum residual norm is displayed when the print() method is called...