42 #ifndef __Belos_InnerSolver_hpp
43 #define __Belos_InnerSolver_hpp
49 #include <Teuchos_ScalarTraits.hpp>
64 template<
class Scalar,
class MV,
class OP>
65 Teuchos::RCP<LinearProblem<Scalar, MV, OP> >
67 const Teuchos::RCP<const MV>& B)
69 using Teuchos::is_null;
70 using Teuchos::nonnull;
77 RCP<const OP> A = problem->getOperator ();
78 RCP<MV> X_orig = problem->getLHS ();
79 TEUCHOS_TEST_FOR_EXCEPTION(is_null (X_orig), std::invalid_argument,
80 "problemWithNewRHS(): The original LinearProblem's "
81 "initial guess / current approximate solution (getLHS())"
82 " is null. We need an initial guess or current approxim"
83 "ate solution in order to know the domain of the (right-"
84 "preconditioned, if applicable) operator. This is "
85 "because Belos::MultiVecTraits does not include the idea"
86 " of the domain and range of an operator, or the space "
87 "to which a vector belongs.");
88 TEUCHOS_TEST_FOR_EXCEPTION(is_null (B), std::invalid_argument,
89 "problemWithNewRHS(): the given new right-hand side B "
91 RCP<MV> X = MVT::CloneCopy (problem->getLHS ());
93 RCP<lp_type> lp (
new lp_type (A, X, B));
94 lp->setLeftPrec (problem->getLeftPrec ());
95 lp->setRightPrec (problem->getRightPrec ());
137 template<
class Scalar,
class MV,
class OP>
154 virtual Teuchos::RCP<const Teuchos::ParameterList>
201 solve (
const Teuchos::RCP<MV>& X,
202 const Teuchos::RCP<const MV>& B,
204 const int maxItersPerRestart,
205 const int maxNumRestarts) = 0;
251 solve (
const Teuchos::RCP<MV>& X,
252 const Teuchos::RCP<const MV>& B) = 0;
264 template<
class Scalar,
class MV,
class OP>
274 using Teuchos::rcpFromRef;
276 TEUCHOS_TEST_FOR_EXCEPTION(trans !=
NOTRANS, std::invalid_argument,
277 "Belos::InnerSolver is not able to solve the "
278 "transposed system.");
279 RCP<const MV> x_ptr = rcpFromRef (x);
280 RCP<MV> y_ptr = rcpFromRef (y);
281 (void) Op.
solve (y_ptr, x_ptr);
293 template<
class Scalar,
class MV,
class OP>
297 (void) Scalar::this_specialization_is_not_defined();
298 (void) MV::this_specialization_is_not_defined();
299 (void) OP::this_specialization_is_not_defined();
322 template<
class Scalar,
class MV,
class OP>
335 static Teuchos::RCP<OP>
339 using Teuchos::rcp_implicit_cast;
343 return rcp_implicit_cast<operator_type> (rcp (
new wrapper_type (solver)));
356 static Teuchos::RCP<inner_solver_type>
360 using Teuchos::rcp_dynamic_cast;
364 RCP<wrapper_type> wrapper = rcp_dynamic_cast<wrapper_type> (op,
true);
365 return wrapper->getInnerSolver();
371 #endif // __Belos_InnerSolver_hpp