42#ifndef BELOS_OPERATOR_HPP
43#define BELOS_OPERATOR_HPP
52#ifdef HAVE_BELOS_EXPERIMENTAL
79 template <
class ScalarType>
161 template<
class ScalarType>
172 Op.
Apply (x, y, trans);
183#ifdef HAVE_BELOS_EXPERIMENTAL
198 template<
class Scalar>
199 class OperatorInnerSolver :
public Operator<Scalar> {
201 typedef Scalar scalar_type;
202 typedef MultiVec<Scalar> multivector_type;
203 typedef Operator<Scalar> operator_type;
204 typedef InnerSolver<scalar_type, multivector_type, operator_type> inner_solver_type;
209 OperatorInnerSolver (
const Teuchos::RCP<inner_solver_type>& solver) :
213 virtual ~OperatorInnerSolver() {}
236 Teuchos::RCP<inner_solver_type> getInnerSolver()
const {
250 Apply (
const multivector_type& X,
252 ETrans mode = NOTRANS)
const
254 using Teuchos::rcpFromRef;
256 TEUCHOS_TEST_FOR_EXCEPTION(mode != NOTRANS, std::invalid_argument,
257 "Belos::OperatorInnerSolver only supports applying the"
258 " operator itself, not its transpose or conjugate "
260 solver_->solve (rcpFromRef (Y), rcpFromRef (X));
267 virtual bool HasApplyTranspose()
const {
273 OperatorInnerSolver ();
276 Teuchos::RCP<inner_solver_type> solver_;
290 template <
class Scalar>
291 class InnerSolverTraits<Scalar, MultiVec<Scalar>, Operator<Scalar> > {
296 typedef InnerSolver<scalar_type, multivector_type, operator_type>
inner_solver_type;
303 static Teuchos::RCP<operator_type>
307 using Teuchos::rcp_implicit_cast;
308 return rcp_implicit_cast<operator_type> (rcp (
new wrapper_type (solver)));
320 static Teuchos::RCP<inner_solver_type>
324 using Teuchos::rcp_dynamic_cast;
325 RCP<wrapper_type> wrapper = rcp_dynamic_cast<wrapper_type> (op,
true);
326 return wrapper->getInnerSolver();
Belos header file which uses auto-configuration information to include necessary C++ headers.
Interface for multivectors used by Belos' linear solvers.
Class which defines basic traits for the operator type.
InnerSolver< scalar_type, multivector_type, operator_type > inner_solver_type
static Teuchos::RCP< inner_solver_type > getInnerSolver(const Teuchos::RCP< operator_type > &op)
Return the given wrapper's inner solver object.
UndefinedWrapperType< Scalar, MV, OP > wrapper_type
static Teuchos::RCP< OP > makeInnerSolverOperator(const Teuchos::RCP< InnerSolver< Scalar, MV, OP > > &solver)
Wrap the given inner solver in a wrapper_type.
Interface for multivectors used by Belos' linear solvers.
static bool HasApplyTranspose(const Operator< ScalarType > &Op)
Specialization of HasApplyTranspose() for Operator objects.
static void Apply(const Operator< ScalarType > &Op, const MultiVec< ScalarType > &x, MultiVec< ScalarType > &y, ETrans trans=NOTRANS)
Specialization of Apply() for Operator and MultiVec objects.
Class which defines basic traits for the operator type.
Alternative run-time polymorphic interface for operators.
Operator()
Default constructor (does nothing).
virtual bool HasApplyTranspose() const
Whether this operator implements applying the transpose.
virtual ~Operator()
Virtual destructor, for memory safety of derived classes.
virtual void Apply(const MultiVec< ScalarType > &x, MultiVec< ScalarType > &y, ETrans trans=NOTRANS) const =0
Apply the operator to x, putting the result in y.
ETrans
Whether to apply the (conjugate) transpose of an operator.