12 #ifndef BELOS_STATUS_TEST_COMBO_H
13 #define BELOS_STATUS_TEST_COMBO_H
58 template <
class ScalarType,
class MV,
class OP>
63 #ifndef DOXYGEN_SHOULD_SKIP_THIS
65 typedef std::vector< Teuchos::RCP<StatusTest<ScalarType,MV,OP> > > st_vector;
66 typedef typename st_vector::iterator iterator;
67 typedef typename st_vector::const_iterator const_iterator;
69 #endif // DOXYGEN_SHOULD_SKIP_THIS
150 void print(std::ostream& os,
int indent = 0)
const;
188 template <
class ScalarType,
class MV,
class OP>
195 template <
class ScalarType,
class MV,
class OP>
200 tests_.push_back(test1);
204 template <
class ScalarType,
class MV,
class OP>
210 tests_.push_back(test1);
211 addStatusTest(test2);
215 template <
class ScalarType,
class MV,
class OP>
218 if (isSafe(add_test))
219 tests_.push_back(add_test);
222 const int indent = 2;
223 std::cout <<
"\n*** WARNING! ***\n";
224 std::cout <<
"This combo test currently consists of the following:\n";
225 this->print(std::cout, indent);
226 std::cout <<
"Unable to add the following test:\n";
227 add_test->print(std::cout, indent);
233 template <
class ScalarType,
class MV,
class OP>
237 if (test1.get() ==
this)
242 for (iterator i = tests_.begin(); i != tests_.end(); ++i) {
252 template <
class ScalarType,
class MV,
class OP>
259 else if (type_ == AND)
267 template <
class ScalarType,
class MV,
class OP>
271 for (const_iterator i = tests_.begin(); i != tests_.end(); ++i)
281 template <
class ScalarType,
class MV,
class OP>
288 for (const_iterator i = tests_.begin(); i != tests_.end(); ++i)
297 template <
class ScalarType,
class MV,
class OP>
300 bool isFailed =
false;
302 for (const_iterator i = tests_.begin(); i != tests_.end(); ++i) {
307 if (s==
Failed) isFailed =
true;
316 if ((!isFailed) && (status_ ==
Failed)) {
322 if (isFailed) status_ =
Failed;
327 template <
class ScalarType,
class MV,
class OP>
330 for (const_iterator i = tests_.begin(); i != tests_.end(); ++i) {
350 template <
class ScalarType,
class MV,
class OP>
352 for (
int j = 0; j < indent; j ++)
354 this->printStatus(os, status_);
355 os << ((type_ == OR) ?
"OR" : (type_ == AND) ?
"AND" :
"SEQ");
356 os <<
" Combination";
357 os <<
" -> " << std::endl;
359 for (const_iterator i = tests_.begin(); i != tests_.end(); ++i)
360 (*i)->print(os, indent+2);
ComboType
The test can be either the AND of all the component tests, or the OR of all the component tests...
StatusType checkStatus(Iteration< ScalarType, MV, OP > *iSolver)
Check convergence status of the iterative solver.
Pure virtual base class for defining the status testing capabilities of Belos.
ComboType getComboType() const
Return the type of combination (OR, AND, or SEQ).
void seqOp(Iteration< ScalarType, MV, OP > *iSolver)
Use this for checkStatus when this is a sequential AND type combo. Updates status.
StatusTestCombo< ScalarType, MV, OP > & addStatusTest(const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &add_test)
Add another test to this combination.
A pure virtual class for defining the status tests for the Belos iterative solvers.
virtual ~StatusTestCombo()
Destructor.
StatusType
Whether the StatusTest wants iteration to stop.
void andOp(Iteration< ScalarType, MV, OP > *iSolver)
Use this for checkStatus when this is an AND type combo. Updates status.
void orOp(Iteration< ScalarType, MV, OP > *iSolver)
Use this for checkStatus when this is an OR type combo. Updates status.
void print(std::ostream &os, int indent=0) const
Output formatted description of stopping test to output stream.
StatusTestCombo(ComboType t)
Constructor.
StatusType getStatus() const
Return the result of the most recent checkStatus call.
bool isSafe(const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &test1)
Check whether or not it is safe to add a to the list of tests.
A class for extending the status testing capabilities of Belos via logical combinations.
st_vector getStatusTests()
Return the vector of status tests.
void reset()
Resets all the status tests in this combination to their initial internal state.