43#ifndef BELOS_STATUS_TEST_USER_OUTPUT_HPP
44#define BELOS_STATUS_TEST_USER_OUTPUT_HPP
69template <
class ScalarType,
class MV,
class OP>
102 taggedTests_(taggedTests),
104 headerPrinted_(false),
105 stateTest_(printStates),
144 TEUCHOS_TEST_FOR_EXCEPTION(iterTest_ == Teuchos::null,
StatusTestError,
"StatusTestUserOutput::checkStatus(): iteration test pointer is null.");
145 TEUCHOS_TEST_FOR_EXCEPTION(resTestVec_.size() == 0,
StatusTestError,
"StatusTestUserOutput::checkStatus(): residual test pointer is null.");
146 state_ = test_->checkStatus(solver);
155 currNumRHS_ = currIdx_.size();
157 numIterDgts_ = (int)std::floor(std::log10((
double)iterTest_->getMaxIters()))+1;
160 if (((iterTest_->getNumIters() % modTest_ == 0) && (iterTest_->getNumIters()!=lastNumIters_)) || (state_ ==
Passed)) {
161 lastNumIters_ = iterTest_->getNumIters();
162 if ( (state_ & stateTest_) == state_) {
166 else if ( printer_->isVerbosity(
Debug) ) {
200 Teuchos::RCP<StatusTestCombo_t> comboTest = Teuchos::rcp_dynamic_cast<StatusTestCombo_t>(test);
201 TEUCHOS_TEST_FOR_EXCEPTION(comboTest == Teuchos::null,
StatusTestError,
"StatusTestUserOutput::setChild: The parameter \"test\" must be a Belos::StatusTestCombo.");
202 std::vector<Teuchos::RCP<StatusTest<ScalarType,MV,OP> > > tmpVec = comboTest->getStatusTests();
205 int numTests = tmpVec.size();
208 for (
int i=0; i<numTests; ++i) {
211 Teuchos::RCP<StatusTestMaxIters_t> tmpItrTest = Teuchos::rcp_dynamic_cast<StatusTestMaxIters_t>(tmpVec[i]);
212 if (tmpItrTest != Teuchos::null) {
213 iterTest_ = tmpItrTest;
220 Teuchos::RCP<StatusTestResNorm_t> tmpResTest = Teuchos::rcp_dynamic_cast<StatusTestResNorm_t>(tmpVec[i]);
222 if (tmpResTest != Teuchos::null) {
223 resTestVec_.resize( 1 );
224 resTestVec_[0] = tmpResTest;
225 resTestNamesVec_.resize( 1 );
226 resTestNamesVec_[0] =
"IMPLICIT RES";
233 Teuchos::RCP<StatusTestCombo_t> tmpComboTest = Teuchos::rcp_dynamic_cast<StatusTestCombo_t>(tmpVec[i]);
234 TEUCHOS_TEST_FOR_EXCEPTION(tmpComboTest == Teuchos::null,
StatusTestError,
"StatusTestUserOutput(): test must be Belos::StatusTest[MaxIters|ResNorm|Combo].");
235 tmpVec = tmpComboTest->getStatusTests();
236 comboType_ = tmpComboTest->getComboType();
240 typename std::map<std::string,Teuchos::RCP<StatusTest<ScalarType,MV,OP> > >::iterator it;
241 for (
size_t j=0; j<tmpVec.size(); ++j) {
242 tmpResTest = Teuchos::rcp_dynamic_cast<StatusTestResNorm_t>(tmpVec[j]);
244 if(tmpResTest == Teuchos::null)
continue;
247 for(it = taggedTests_->begin(); it != taggedTests_->end(); ++it) {
248 if(tmpVec[j] == it->second) { bFound =
true;
break; }
251 resTestVec_.push_back(tmpResTest);
252 resTestNamesVec_.push_back(
"IMPLICIT RES");
257 for(it = taggedTests_->begin(); it != taggedTests_->end(); ++it) {
258 resTestVec_.push_back(it->second);
259 resTestNamesVec_.push_back(it->first);
270 Teuchos::RCP<StatusTest<ScalarType,MV,OP> >
getChild()
const {
276 void setSolverDesc(
const std::string& solverDesc) { solverDesc_ = solverDesc; }
280 void setPrecondDesc(
const std::string& precondDesc) { precondDesc_ = precondDesc; }
295 headerPrinted_ =
false;
310 void print(std::ostream& os,
int indent = 0)
const {
311 std::string ind(indent,
' ');
312 std::string starLine(55,
'*');
313 std::string starFront(5,
'*');
315 std::ios_base::fmtflags osFlags(os.flags());
317 os.setf(std::ios::scientific, std::ios::floatfield);
321 if (!headerPrinted_) {
322 os << std::endl << ind << starLine << std::endl;
323 os << ind << starFront <<
" Belos Iterative Solver: " << solverDesc_ << std::endl;
324 if (precondDesc_ !=
"")
325 os << ind << starFront <<
" Preconditioner: " << precondDesc_ << std::endl;
326 os << ind << starFront <<
" Maximum Iterations: " << iterTest_->getMaxIters() << std::endl;
327 os << ind << starFront <<
" Block Size: " << blockSize_ << std::endl;
328 os << ind << starFront <<
" Status tests: " << std::endl;
329 test_->print(os,indent + 3);
330 os << ind << starLine << std::endl;
331 os.setf(std::ios_base::right, std::ios_base::adjustfield);
332 std::string indheader( 7 + numIterDgts_,
' ' );
334 for (
int i=0; i<currNumRHS_; ++i) {
335 if ( i > 0 && currIdx_[i]!=-1 ) {
337 os << ind << indheader;
339 os <<
"[" << std::setw(numLSDgts_) << currIdx_[i]+1 <<
"] : ";
340 for (
size_t j=0; j<resTestVec_.size(); ++j) {
341 os << std::setw(15) << resTestNamesVec_[j];
345 headerPrinted_ =
true;
349 os.setf(std::ios_base::right, std::ios_base::adjustfield);
350 std::string ind2( 7 + numIterDgts_,
' ' );
351 os << ind <<
"Iter " << std::setw(numIterDgts_) << iterTest_->getNumIters() <<
", ";
352 for (
int i=0; i<currNumRHS_; ++i) {
353 if ( i > 0 && currIdx_[i]!=-1 ) {
357 os <<
"[" << std::setw(numLSDgts_) << currIdx_[i]+1 <<
"] : ";
358 for (
size_t j=0; j<resTestVec_.size(); ++j) {
361 Teuchos::RCP<StatusTestResNorm_t> tempResTest = Teuchos::rcp_dynamic_cast<StatusTestResNorm_t>(resTestVec_[j]);
362 if(tempResTest != Teuchos::null)
363 os << std::setw(15) << (*tempResTest->getTestValue())[currIdx_[i]];
366 os << std::setw(15) <<
"Passed";
368 os << std::setw(15) <<
"Failed";
369 else os << std::setw(15) <<
"Undefined";
372 os << std::setw(15) <<
"---";
385 Teuchos::RCP<OutputManager<ScalarType> > printer_;
388 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > test_;
391 Teuchos::RCP<std::map<std::string,Teuchos::RCP<StatusTest<ScalarType,MV,OP> > > > taggedTests_;
394 Teuchos::RCP<StatusTestMaxIters<ScalarType,MV,OP> > iterTest_;
397 std::vector<Teuchos::RCP<StatusTest<ScalarType,MV,OP> > > resTestVec_;
400 std::vector<std::string> resTestNamesVec_;
402 std::string solverDesc_;
403 std::string precondDesc_;
404 std::vector<int> currIdx_;
406 mutable bool headerPrinted_;
407 int stateTest_, modTest_;
408 int lastNumIters_, comboType_;
410 int currNumRHS_, currLSNum_;
411 int numLSDgts_, numIterDgts_;
Belos header file which uses auto-configuration information to include necessary C++ headers.
Pure virtual base class which describes the basic interface to the linear solver iteration.
Belos::StatusTest for logically combining several status tests.
Belos::StatusTest class for specifying a maximum number of iterations.
Virtual base class for StatusTest that printing status tests.
Belos::StatusTest abstract class for specifying a residual norm stopping criteria.
Pure virtual base class for defining the status testing capabilities of Belos.
Collection of types and exceptions used within the Belos solvers.
virtual int getBlockSize() const =0
Get the blocksize to be used by the iterative solver in solving this linear problem.
virtual const LinearProblem< ScalarType, MV, OP > & getProblem() const =0
Get a constant reference to the linear problem.
A linear system to solve, and its associated information.
int getLSNumber() const
The number of linear systems that have been set.
const std::vector< int > & getLSIndex() const
(Zero-based) indices of the linear system(s) currently being solved.
Teuchos::RCP< const MV > getRHS() const
A pointer to the right-hand side B.
Traits class which defines basic operations on multivectors.
static int GetNumberVecs(const MV &mv)
Obtain the number of vectors in mv.
Belos's basic output manager for sending information of select verbosity levels to the appropriate ou...
A class for extending the status testing capabilities of Belos via logical combinations.
Exception thrown to signal error in a status test during Belos::StatusTest::checkStatus().
A Belos::StatusTest class for specifying a maximum number of iterations.
A virtual base class for StatusTest that print other status tests.
An abstract class of StatusTest for stopping criteria using residual norms.
A special StatusTest for printing other status tests in a simple format.
void setSolverDesc(const std::string &solverDesc)
Set a short solver description for output clarity.
void setOutputFrequency(int mod)
Set how often the child test is printed.
Teuchos::RCP< StatusTest< ScalarType, MV, OP > > getChild() const
Get child test.
StatusType checkStatus(Iteration< ScalarType, MV, OP > *solver)
StatusTestUserOutput(const Teuchos::RCP< OutputManager< ScalarType > > &printer, Teuchos::RCP< StatusTest< ScalarType, MV, OP > > test, Teuchos::RCP< std::map< std::string, Teuchos::RCP< StatusTest< ScalarType, MV, OP > > > > taggedTests, int mod=1, int printStates=Passed)
Constructor.
void setPrecondDesc(const std::string &precondDesc)
Set a short preconditioner description for output clarity.
void resetNumCalls()
Informs the outputting status test that it should reset the number of calls to zero.
void print(std::ostream &os, int indent=0) const
Output formatted description of stopping test to output stream.
StatusType getStatus() const
Return the result of the most recent checkStatus call, or undefined if it has not been run.
void reset()
Informs the status test that it should reset its internal configuration to the uninitialized state.
void setChild(Teuchos::RCP< StatusTest< ScalarType, MV, OP > > test)
Set child test, which must be a combination of a Belos::StatusTestMaxIters AND a combination of Belos...
void setOutputManager(const Teuchos::RCP< OutputManager< ScalarType > > &printer)
Set the output manager.
virtual ~StatusTestUserOutput()
Destructor.
A pure virtual class for defining the status tests for the Belos iterative solvers.
StatusType
Whether the StatusTest wants iteration to stop.