44 #include "Thyra_BelosLinearOpWithSolveFactory.hpp"
45 #include "Thyra_LinearOpWithSolveFactoryHelpers.hpp"
46 #include "Thyra_MultiVectorStdOps.hpp"
47 #include "Thyra_VectorBase.hpp"
48 #include "Thyra_VectorStdOps.hpp"
50 #include "EpetraExt_readEpetraLinearSystem.h"
51 #include "Epetra_SerialComm.h"
66 const std::string matrixFileName =
"nos1.mtx";
69 RCP<const LinearOpBase<double> > getFwdLinearOp()
71 static RCP<const LinearOpBase<double> > fwdLinearOp;
74 EpetraExt::readEpetraLinearSystem( matrixFileName, Epetra_SerialComm(), &epetraCrsMatrix );
75 fwdLinearOp = epetraLinearOp(epetraCrsMatrix);
82 template<
class Scalar>
92 {
return norm_inf(v); }
107 template<
class Scalar>
108 RCP<MockNormInfReductionFunctional<Scalar> >
117 template<
class Scalar>
129 return std::max(norm_inf(v), ScalarTraits<ScalarMag>::eps());
145 template<
class Scalar>
146 RCP<MockMaxNormInfEpsReductionFunctional<Scalar> >
153 template<
class Scalar>
154 void runGeneralSolveCriteriaBelosStatusTestCase(
155 const SolveCriteria<Scalar> &solveCriteria,
156 const Ptr<
RCP<
const VectorBase<Scalar> > > &x_out,
157 const Ptr<
RCP<
const VectorBase<Scalar> > > &r_out,
163 using Teuchos::describe;
using Teuchos::optInArg;
using Teuchos::rcpFromRef;
166 typedef ScalarTraits<Scalar>
ST;
173 V_S(b.
ptr(), ST::one());
178 out <<
"\nsolveCriteria:\n" << solveCriteria;
184 const int convergenceTestFrequency = 10;
187 "<ParameterList name=\"Belos\">"
188 " <Parameter name=\"Solver Type\" type=\"string\" value=\"Pseudo Block GMRES\"/>"
189 " <Parameter name=\"Convergence Test Frequency\" type=\"int\" value=\""+
toString(convergenceTestFrequency)+
"\"/>"
190 " <ParameterList name=\"Solver Types\">"
191 " <ParameterList name=\"Pseudo Block GMRES\">"
192 " <Parameter name=\"Block Size\" type=\"int\" value=\"1\"/>"
193 " <Parameter name=\"Convergence Tolerance\" type=\"double\" value=\"1e-13\"/>"
194 " <Parameter name=\"Output Frequency\" type=\"int\" value=\""+
toString(convergenceTestFrequency)+
"\"/>"
195 " <Parameter name=\"Show Maximum Residual Norm Only\" type=\"bool\" value=\"1\"/>"
196 " <Parameter name=\"Maximum Iterations\" type=\"int\" value=\"400\"/>"
197 " <Parameter name=\"Verbosity\" type=\"int\" value=\"1\"/>"
202 out <<
"\n\npl:\n" << *pl;
206 lowsFactory.setOStream(rcpFromRef(out));
218 V_S(x.ptr(), ST::zero());
219 SolveStatus<Scalar> solveStatus = solve<Scalar>(*lows,
NOTRANS, *b, x.
ptr(),
220 optInArg(solveCriteria));
221 out <<
"\nsolveStatus:\n" << solveStatus;
223 TEST_COMPARE( solveStatus.achievedTol, <=, solveCriteria.requestedTol );
228 fwdOp->apply(NOTRANS, *x, r.
ptr(), ST::one(), -ST::one());
242 TEUCHOS_UNIT_TEST( GeneralSolveCriteriaBelosStatusTest, norm_inf_r_over_norm_inf_r0 )
245 using Teuchos::outArg;
247 typedef double Scalar;
248 typedef ScalarTraits<Scalar>
ST;
249 typedef ST::magnitudeType ScalarMag;
251 SolveCriteria<Scalar> solveCriteria;
252 solveCriteria.solveMeasureType.numerator = SOLVE_MEASURE_NORM_RESIDUAL;
253 solveCriteria.numeratorReductionFunc = createMockNormReductionFunctional<Scalar>();
254 solveCriteria.solveMeasureType.denominator = SOLVE_MEASURE_NORM_SOLUTION;
255 solveCriteria.denominatorReductionFunc = createMockMaxNormInfEpsReductionFunctional<Scalar>();
256 solveCriteria.requestedTol = 0.9;
258 RCP<const VectorBase<Scalar> > x, r;
259 runGeneralSolveCriteriaBelosStatusTestCase(solveCriteria, outArg(x), outArg(r),
262 out <<
"\nChecking convergence ...\n\n";
264 const ScalarMag r_nrm_inf = norm_inf(*r);
265 const ScalarMag x_nrm_inf = norm_inf(*x);
267 out <<
"||r||inf = " << r_nrm_inf <<
"\n";
268 out <<
"||x||inf = " << x_nrm_inf <<
"\n";
270 TEST_COMPARE( r_nrm_inf / x_nrm_inf, <=, solveCriteria.requestedTol );
278 using Teuchos::outArg;
280 typedef double Scalar;
281 typedef ScalarTraits<Scalar>
ST;
282 typedef ST::magnitudeType ScalarMag;
284 SolveCriteria<Scalar> solveCriteria;
285 solveCriteria.solveMeasureType.numerator = SOLVE_MEASURE_NORM_RESIDUAL;
286 solveCriteria.numeratorReductionFunc = createMockNormReductionFunctional<Scalar>();
287 solveCriteria.solveMeasureType.denominator = SOLVE_MEASURE_ONE;
288 solveCriteria.requestedTol = 0.9;
290 RCP<const VectorBase<Scalar> > x, r;
291 runGeneralSolveCriteriaBelosStatusTestCase(solveCriteria, outArg(x), outArg(r),
294 out <<
"\nChecking convergence ...\n\n";
296 const ScalarMag r_nrm_inf = norm_inf(*r);
297 const ScalarMag x_nrm_inf = norm_inf(*x);
299 out <<
"||r||inf = " << r_nrm_inf <<
"\n";
300 out <<
"||x||inf = " << x_nrm_inf <<
"\n";
302 TEST_COMPARE( r_nrm_inf, <=, solveCriteria.requestedTol );
virtual bool isCompatibleImpl(const VectorBase< Scalar > &v) const
const std::string toString(const EAdjointEpetraOp adjointEpetraOp)
bool is_null(const boost::shared_ptr< T > &p)
RCP< MockNormInfReductionFunctional< Scalar > > createMockNormReductionFunctional()
Non-member constructor.
virtual bool isCompatibleImpl(const VectorBase< Scalar > &v) const
TEUCHOS_UNIT_TEST(EpetraOperatorWrapper, basic)
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
Mock max(NormInf, eps) ReductionFunctional subclass used for unit testing.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
std::string toString(const HashSet< Key > &h)
Mock NormInf ReductionFunctional subclass used for unit testing.
LinearOpWithSolveFactoryBase subclass implemented in terms of Belos.
virtual ScalarTraits< Scalar >::magnitudeType reduceImpl(const VectorBase< Scalar > &v) const
basic_FancyOStream< char > FancyOStream
RCP< MockMaxNormInfEpsReductionFunctional< Scalar > > createMockMaxNormInfEpsReductionFunctional()
Non-member constructor.
virtual ScalarTraits< Scalar >::magnitudeType reduceImpl(const VectorBase< Scalar > &v) const
#define TEST_COMPARE(v1, comp, v2)