25 template<
class Scalar,
class MV,
class OP>
46 std::string test_type =
"???";
49 if(Teuchos::isParameterType<std::string>(p,
"Test Type")) {
50 test_type = Teuchos::get<std::string>(p,
"Test Type");
52 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Belos::StatusTestFactory::buildStatusTests: The \"Test Type\" parameter is required! Please add it to the definition of the status test to specify the type of status test.");
55 if (test_type ==
"Combo")
56 status_test = this->buildComboTest(p);
57 else if (test_type ==
"MaxIters")
58 status_test = this->buildMaxItersTest(p);
59 else if (test_type ==
"ResidualNorm")
60 status_test = this->buildResidualNormTest(p);
61 else if (test_type ==
"PartialResidualNorm")
62 status_test = this->buildPartialResidualNormTest(p);
64 std::ostringstream msg;
65 msg <<
"Error - the test type \"" << test_type <<
"\" is invalid!";
70 if ( Teuchos::isParameterType<std::string>(p,
"Tag") ) {
71 (*tagged_tests_)[Teuchos::getParameter<std::string>(p,
"Tag")] = status_test;
83 else TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"StatusTestFactory:stringToComboType: The \"Combo Type\" must be \"AND\", \"OR\" or \"SEQ\".");
97 std::string combo_type_string = Teuchos::get<std::string>(p,
"Combo Type");
98 int number_of_tests = Teuchos::get<int>(p,
"Number of Tests");
104 for (
int i=0; i<number_of_tests; ++i) {
105 std::ostringstream subtest_name;
106 subtest_name <<
"Test " << i;
117 int max_iters = Teuchos::get<int>(p,
"Maximum Iterations");
123 typedef StatusTestGenResNorm<Scalar,MV,OP> res_norm_test;
125 int quorum = p.
get<
int>(
"Deflation Quorum", -1);
126 bool showMaxResNormOnly = p.
get<
bool>(
"Show Maximum Residual Norm Only",
false);
128 std::string residual_type_string = p.
get<std::string>(
"Residual Type",
"Explicit");
129 std::string residual_norm_string = p.
get<std::string>(
"Residual Norm",
"TwoNorm");
131 std::string scaling_type_string = p.
get<std::string>(
"Scaling Type",
"Norm of Initial Residual");
132 std::string scaling_norm_string = p.
get<std::string>(
"Scaling Norm",
"TwoNorm");
134 typename res_norm_test::ResType residual_type;
135 if (residual_type_string ==
"Explicit") residual_type = res_norm_test::Explicit;
136 else if(residual_type_string ==
"Implicit") residual_type = res_norm_test::Implicit;
137 else TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Belos::StatusTestFactory::buildResidualNormTest: The \"Residual Type\" must be \"Explicit\" or \"Implicit\".");
139 NormType residual_norm = this->stringToNormType(residual_norm_string);
140 ScaleType scaling_type = this->stringToScaleType(scaling_type_string);
141 NormType scaling_norm = this->stringToNormType(scaling_norm_string);
144 status_test->defineResForm(residual_type, residual_norm);
145 status_test->defineScaleForm(scaling_type, scaling_norm);
150 typedef StatusTestGenResSubNorm<Scalar,MV,OP> res_partialnorm_test;
152 int quorum = p.
get<
int>(
"Deflation Quorum", -1);
153 int subIdx = p.
get<
int>(
"Block index",-1);
154 bool showMaxResNormOnly = p.
get<
bool>(
"Show Maximum Residual Norm Only",
false);
156 TEUCHOS_TEST_FOR_EXCEPTION(subIdx < 0, std::logic_error,
"Belos::StatusTestFactory::buildPartialResidualNormTest: The \"Block Index\" must not be smaller than 0.");
158 std::string residual_norm_string = p.
get<std::string>(
"Residual Norm",
"TwoNorm");
160 std::string scaling_type_string = p.
get<std::string>(
"Scaling Type",
"Norm of Initial Residual");
161 std::string scaling_norm_string = p.
get<std::string>(
"Scaling Norm",
"TwoNorm");
163 NormType residual_norm = this->stringToNormType(residual_norm_string);
164 ScaleType scaling_type = this->stringToScaleType(scaling_type_string);
165 NormType scaling_norm = this->stringToNormType(scaling_norm_string);
168 status_test->defineResForm(residual_norm);
169 status_test->defineScaleForm(scaling_type, scaling_norm);
173 static NormType stringToNormType (
const std::string& normType) {
174 const char* validNames[] = {
179 const int numValidNames = 3;
180 const NormType correspondingOutputs[] = {
185 for (
int k = 0; k < numValidNames; ++k)
187 if (normType == validNames[k])
188 return correspondingOutputs[k];
191 "Invalid norm type \"" << normType
195 static ScaleType stringToScaleType (
const std::string& scaleType) {
196 const char* validNames[] = {
197 "Norm of Initial Residual",
198 "Norm of Preconditioned Initial Residual",
200 "Norm of Right-Hand Side",
201 "Norm of Full Initial Residual",
202 "Norm of Full Preconditioned Initial Residual",
203 "Norm of Full Scaled Initial Residual",
204 "Norm of Full Scaled Preconditioned Initial Residual",
207 const int numValidNames = 9;
208 const ScaleType correspondingOutputs[] = {
219 for (
int k = 0; k < numValidNames; ++k)
221 if (scaleType == validNames[k])
222 return correspondingOutputs[k];
225 "Invalid residual scaling type \"" << scaleType
ComboType
The test can be either the AND of all the component tests, or the OR of all the component tests...
Teuchos::RCP< std::map< std::string, Teuchos::RCP< base_test > > > getTaggedTests() const
StatusTestFactory()
Constructor.
StatusTestMaxIters< Scalar, MV, OP > max_iter_test
ScaleType
The type of scaling to use on the residual norm value.
T & get(const std::string &name, T def_value)
StatusTest< Scalar, MV, OP > base_test
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::ScalarTraits< Scalar >::magnitudeType magnitude_type
Teuchos::RCP< base_test > buildStatusTests(Teuchos::ParameterList &p) const
returns a StatusTest set from a parameter list
static StatusTestCombo< Scalar, MV, OP >::ComboType stringToComboType(const std::string &comboString)
StatusTestCombo< ScalarType, MV, OP > & addStatusTest(const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &add_test)
Add another test to this combination.
Belos::StatusTest class for specifying a maximum number of iterations.
A pure virtual class for defining the status tests for the Belos iterative solvers.
Belos::StatusTest for logically combining several status tests.
A Belos::StatusTest class for specifying a maximum number of iterations.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual ~StatusTestFactory()
Destructor.
NormType
The type of vector norm to compute.
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Belos::StatusTest for specifying an implicit residual norm stopping criteria that checks for loss of ...
A class for extending the status testing capabilities of Belos via logical combinations.
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
StatusTestCombo< Scalar, MV, OP > combo_test
Factory to build a set of status tests from a parameter list.
Belos::StatusTestResSubNorm for specifying general residual norm of sub-residual vectors stopping cri...