|
Belos Package Browser (Single Doxygen Collection)
Development
|
Go to the documentation of this file.
42 #ifndef BELOS_STATUS_TEST_GEN_RESNORM_H
43 #define BELOS_STATUS_TEST_GEN_RESNORM_H
78 template <
class ScalarType,
class MV,
class OP>
201 void print(std::ostream& os,
int indent = 0)
const;
261 std::ostringstream oss;
262 oss <<
"Belos::StatusTestGenResNorm<>: " <<
resFormStr();
277 std::ostringstream oss;
291 oss <<
" (User Scale)";
383 template <
class ScalarType,
class MV,
class OP>
386 : tolerance_(Tolerance),
388 showMaxResNormOnly_(showMaxResNormOnly),
399 firstcallCheckStatus_(true),
400 firstcallDefineResForm_(true),
401 firstcallDefineScaleForm_(true)
407 template <
class ScalarType,
class MV,
class OP>
411 template <
class ScalarType,
class MV,
class OP>
420 firstcallCheckStatus_ =
true;
421 curSoln_ = Teuchos::null;
424 template <
class ScalarType,
class MV,
class OP>
428 "StatusTestGenResNorm::defineResForm(): The residual form has already been defined.");
429 firstcallDefineResForm_ =
false;
431 restype_ = TypeOfResidual;
432 resnormtype_ = TypeOfNorm;
437 template <
class ScalarType,
class MV,
class OP>
442 "StatusTestGenResNorm::defineScaleForm(): The scaling type has already been defined.");
443 firstcallDefineScaleForm_ =
false;
445 scaletype_ = TypeOfScaling;
446 scalenormtype_ = TypeOfNorm;
447 scalevalue_ = ScaleValue;
452 template <
class ScalarType,
class MV,
class OP>
458 if (firstcallCheckStatus_) {
459 StatusType status = firstCallCheckStatusSetup(iSolver);
474 curBlksz_ = (int)curLSIdx_.size();
476 for (
int i=0; i<curBlksz_; ++i) {
477 if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_)
480 curNumRHS_ = validLS;
481 curSoln_ = Teuchos::null;
487 if (status_==
Passed) {
return status_; }
489 if (restype_==Implicit) {
495 std::vector<MagnitudeType> tmp_resvector( curBlksz_ );
497 if ( residMV != Teuchos::null ) {
498 tmp_resvector.resize( MVT::GetNumberVecs( *residMV ) );
499 MVT::MvNorm( *residMV, tmp_resvector, resnormtype_ );
500 typename std::vector<int>::iterator p = curLSIdx_.begin();
501 for (
int i=0; p<curLSIdx_.end(); ++p, ++i) {
504 resvector_[*p] = tmp_resvector[i];
507 typename std::vector<int>::iterator p = curLSIdx_.begin();
508 for (
int i=0; p<curLSIdx_.end(); ++p, ++i) {
511 resvector_[*p] = tmp_resvector[i];
515 else if (restype_==Explicit) {
521 Teuchos::RCP<MV> cur_res = MVT::Clone( *curSoln_, MVT::GetNumberVecs( *curSoln_ ) );
523 std::vector<MagnitudeType> tmp_resvector( MVT::GetNumberVecs( *cur_res ) );
524 MVT::MvNorm( *cur_res, tmp_resvector, resnormtype_ );
525 typename std::vector<int>::iterator p = curLSIdx_.begin();
526 for (
int i=0; p<curLSIdx_.end(); ++p, ++i) {
529 resvector_[*p] = tmp_resvector[i];
536 if ( scalevector_.size() > 0 ) {
537 typename std::vector<int>::iterator p = curLSIdx_.begin();
538 for (; p<curLSIdx_.end(); ++p) {
542 if ( scalevector_[ *p ] != zero ) {
544 testvector_[ *p ] = resvector_[ *p ] / scalevector_[ *p ] / scalevalue_;
546 testvector_[ *p ] = resvector_[ *p ] / scalevalue_;
552 typename std::vector<int>::iterator p = curLSIdx_.begin();
553 for (; p<curLSIdx_.end(); ++p) {
556 testvector_[ *p ] = resvector_[ *p ] / scalevalue_;
562 ind_.resize( curLSIdx_.size() );
563 typename std::vector<int>::iterator p = curLSIdx_.begin();
564 for (; p<curLSIdx_.end(); ++p) {
568 if (testvector_[ *p ] > tolerance_) {
570 }
else if (testvector_[ *p ] <= tolerance_) {
581 int need = (quorum_ == -1) ? curNumRHS_: quorum_;
588 template <
class ScalarType,
class MV,
class OP>
591 for (
int j = 0; j < indent; j ++)
593 printStatus(os, status_);
596 os <<
", tol = " << tolerance_ << std::endl;
599 if(showMaxResNormOnly_ && curBlksz_ > 1) {
601 testvector_.begin()+curLSIdx_[0],testvector_.begin()+curLSIdx_[curBlksz_-1]
603 for (
int j = 0; j < indent + 13; j ++)
605 os <<
"max{residual["<<curLSIdx_[0]<<
"..."<<curLSIdx_[curBlksz_-1]<<
"]} = " << maxRelRes
606 << ( maxRelRes <= tolerance_ ?
" <= " :
" > " ) << tolerance_ << std::endl;
609 for (
int i=0; i<numrhs_; i++ ) {
610 for (
int j = 0; j < indent + 13; j ++)
612 os <<
"residual [ " << i <<
" ] = " << testvector_[ i ];
613 os << ((testvector_[i]<tolerance_) ?
" < " : (testvector_[i]==tolerance_) ?
" == " : (testvector_[i]>tolerance_) ?
" > " :
" " ) << tolerance_ << std::endl;
620 template <
class ScalarType,
class MV,
class OP>
623 os << std::left << std::setw(13) << std::setfill(
'.');
636 os << std::left << std::setfill(
' ');
640 template <
class ScalarType,
class MV,
class OP>
648 if (firstcallCheckStatus_) {
652 firstcallCheckStatus_ =
false;
656 numrhs_ = MVT::GetNumberVecs( *rhs );
657 scalevector_.resize( numrhs_ );
658 MVT::MvNorm( *rhs, scalevector_, scalenormtype_ );
662 numrhs_ = MVT::GetNumberVecs( *init_res );
663 scalevector_.resize( numrhs_ );
664 MVT::MvNorm( *init_res, scalevector_, scalenormtype_ );
668 numrhs_ = MVT::GetNumberVecs( *init_res );
669 scalevector_.resize( numrhs_ );
670 MVT::MvNorm( *init_res, scalevector_, scalenormtype_ );
673 numrhs_ = MVT::GetNumberVecs( *(lp.
getRHS()) );
676 resvector_.resize( numrhs_ );
677 testvector_.resize( numrhs_ );
681 curBlksz_ = (int)curLSIdx_.size();
683 for (i=0; i<curBlksz_; ++i) {
684 if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_)
687 curNumRHS_ = validLS;
690 for (i=0; i<numrhs_; i++) { testvector_[i] = one; }
693 if (scalevalue_ == zero) {
std::vector< int > curLSIdx_
The indices of the current number of right-hand sides being solved for.
bool showMaxResNormOnly_
Determines if the entries for all of the residuals are shown or just the max.
ScaleType
The type of scaling to use on the residual norm value.
std::vector< int > ind_
Vector containing the indices for the vectors that passed the test.
virtual ~StatusTestGenResNorm()
Destructor.
int getLSNumber() const
The number of linear systems that have been set.
Teuchos::RCP< MV > getSolution()
Returns the current solution estimate that was computed for the most recent residual test.
int defineScaleForm(ScaleType TypeOfScaling, NormType TypeOfNorm, MagnitudeType ScaleValue=Teuchos::ScalarTraits< MagnitudeType >::one())
Define form of the scaling, its norm, its optional weighting std::vector, or, alternatively,...
StatusType firstCallCheckStatusSetup(Iteration< ScalarType, MV, OP > *iSolver)
Call to setup initial scaling std::vector.
Class which describes the linear problem to be solved by the iterative solver.
ScaleType scaletype_
Type of scaling to use (Norm of RHS, Norm of Initial Residual, None or User provided)
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.
std::vector< MagnitudeType > resvector_
Residual norm std::vector.
Exception thrown to signal error in a status test during Belos::StatusTest::checkStatus().
int numrhs_
The total number of right-hand sides being solved for.
std::string description() const
Method to return description of the maximum iteration status test
Belos::StatusTest abstract class for specifying a residual norm stopping criteria.
std::vector< MagnitudeType > testvector_
Test std::vector = resvector_ / scalevector_.
void print(std::ostream &os, int indent=0) const
Output formatted description of stopping test to output stream.
void printStatus(std::ostream &os, StatusType type) const
Print message for each status specific to this stopping test.
A linear system to solve, and its associated information.
Teuchos::RCP< const MV > getInitPrecResVec() const
A pointer to the preconditioned initial residual vector.
bool firstcallCheckStatus_
Is this the first time CheckStatus is called?
Teuchos::ScalarTraits< ScalarType > SCT
std::string resFormStr() const
Description of current residual form.
StatusType
Whether the StatusTest wants iteration to stop.
NormType scalenormtype_
Type of norm to use on the scaling (OneNorm, TwoNorm, or InfNorm)
int setQuorum(int quorum)
Sets the 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.
SCT::magnitudeType MagnitudeType
int curBlksz_
The current blocksize of the linear system being solved.
bool getShowMaxResNormOnly()
Returns whether the only maximum residual norm is displayed when the print() method is called.
const std::vector< int > getLSIndex() const
(Zero-based) indices of the linear system(s) currently being solved.
MultiVecTraits< ScalarType, MV > MVT
const std::vector< MagnitudeType > * getResNormValue() const
Returns the residual norm value, , computed in most recent call to CheckStatus.
NormType resnormtype_
Type of norm to use on residual (OneNorm, TwoNorm, or InfNorm).
int setTolerance(MagnitudeType tolerance)
Set the value of the tolerance.
Teuchos::RCP< const MV > getRHS() const
A pointer to the right-hand side B.
An implementation of StatusTestResNorm using a family of residual norms.
bool getLOADetected() const
Returns a boolean indicating a loss of accuracy has been detected in computing the residual.
virtual Teuchos::RCP< const MV > getNativeResiduals(std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > *norms) const =0
Get the residuals native to the solver.
int defineResForm(ResType TypeOfResidual, NormType TypeOfNorm)
Define form of the residual, its norm and optional weighting std::vector.
ResType restype_
Type of residual to use (explicit or implicit)
An abstract class of StatusTest for stopping criteria using residual norms.
int curNumRHS_
The current number of right-hand sides being solved for.
ResType
Select how the residual std::vector is produced.
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.
const std::vector< MagnitudeType > * getScaledNormValue() const
Returns the scaled norm value, .
NormType
The type of vector norm to compute.
void reset()
Resets the internal configuration to the initial state.
MagnitudeType getTolerance() const
Returns the value of the tolerance, , set in the constructor.
Teuchos::RCP< const MV > getInitResVec() const
A pointer to the initial unpreconditioned residual vector.
Declaration of basic traits for the multivector type.
StatusTestGenResNorm(MagnitudeType Tolerance, int quorum=-1, bool showMaxResNormOnly=false)
Constructor.
std::vector< int > convIndices()
Returns the std::vector containing the indices of the residuals that passed the test.
virtual const LinearProblem< ScalarType, MV, OP > & getProblem() const =0
Get a constant reference to the linear problem.
StatusType checkStatus(Iteration< ScalarType, MV, OP > *iSolver)
Check convergence status: Passed, Failed, or Undefined.
MagnitudeType tolerance_
Tolerance used to determine convergence.
MagnitudeType scalevalue_
Scaling value.
Teuchos::RCP< MV > curSoln_
Most recent solution vector used by this status test.
int quorum_
Number of residuals that must pass the convergence test before Passed is returned.
std::vector< MagnitudeType > scalevector_
Scaling std::vector.
Traits class which defines basic operations on multivectors.
bool firstcallDefineScaleForm_
Is this the first time DefineScaleForm is called?
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
const std::vector< MagnitudeType > * getTestValue() const
Returns the test value, , computed in most recent call to CheckStatus.
int getQuorum() const
Returns the number of residuals that must pass the convergence test before Passed is returned.
StatusType status_
Status.
int curLSNum_
The current number of linear systems that have been loaded into the linear problem.
bool firstcallDefineResForm_
Is this the first time DefineResForm is called?
StatusType getStatus() const
Return the result of the most recent CheckStatus call.
int setShowMaxResNormOnly(bool showMaxResNormOnly)
Set whether the only maximum residual norm is displayed when the print() method is called.