71 static RCP<const LinearOpBase<double> > fwdLinearOp;
72 if (is_null(fwdLinearOp)) {
73 Teuchos::RCP<Epetra_CrsMatrix> epetraCrsMatrix;
74 EpetraExt::readEpetraLinearSystem(
matrixFileName, Epetra_SerialComm(), &epetraCrsMatrix );
75 fwdLinearOp = epetraLinearOp(epetraCrsMatrix);
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;
164 using Teuchos::toString;
166 typedef ScalarTraits<Scalar>
ST;
171 out <<
"\nfwdOp = " << describe(*fwdOp, Teuchos::VERB_MEDIUM) <<
"\n";
172 const RCP<VectorBase<Scalar> > b = createMember(fwdOp->range());
173 V_S(b.ptr(), ST::one());
174 const RCP<VectorBase<Scalar> > x = createMember(fwdOp->domain());
178 out <<
"\nsolveCriteria:\n" << solveCriteria;
184 const int convergenceTestFrequency = 10;
186 const RCP<ParameterList> pl = Teuchos::getParametersFromXmlString(
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;
204 Thyra::BelosLinearOpWithSolveFactory<Scalar> lowsFactory;
205 lowsFactory.setParameterList(pl);
206 lowsFactory.setOStream(rcpFromRef(out));
208 lowsFactory.setVerbLevel(Teuchos::VERB_HIGH);
215 const RCP<LinearOpWithSolveBase<Scalar> > lows = linearOpWithSolve<Scalar>(
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 );
227 const RCP<VectorBase<Scalar> > r = b->clone_v();
228 fwdOp->apply(NOTRANS, *x, r.ptr(), ST::one(), -ST::one());
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;
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;
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 );