42#ifndef THYRA_LINEAR_OP_DECL_HPP
43#define THYRA_LINEAR_OP_DECL_HPP
45#include "Thyra_OperatorVectorTypes.hpp"
46#include "Teuchos_Describable.hpp"
47#include "Teuchos_ExpandScalarTypeMacros.hpp"
48#include "Teuchos_PromotionTraits.hpp"
190template<
class Scalar>
352template<
class Scalar>
361template<
class Scalar>
370template<
class Scalar>
378template<
class Scalar>
387template<
class Scalar>
393 const Scalar alpha =
static_cast<Scalar
>(1.0),
394 const Scalar beta =
static_cast<Scalar
>(0.0)
410 const double alpha = 1.0,
411 const double beta = 0.0
423template<
class Scalar>
427 return ( is_null(M.
range()) || is_null(M.
domain()) );
431template<
class Scalar>
432bool Thyra::isPartiallyInitialized(
const LinearOpBase<Scalar> &M )
436 ( !is_null(M.range()) && !is_null(M.domain()) )
439 !opSupported(M,NOTRANS) && !opSupported(M,CONJ)
440 && !opSupported(M,TRANS) && !opSupported(M,CONJTRANS)
446template<
class Scalar>
447bool Thyra::isFullyInitialized(
const LinearOpBase<Scalar> &M )
454 opSupported(M,NOTRANS) || opSupported(M,CONJ)
455 || opSupported(M,TRANS) || opSupported(M,CONJTRANS)
461template<
class Scalar>
463bool Thyra::opSupported(
const LinearOpBase<Scalar> &M, EOpTransp M_trans )
465 return M.opSupported(M_trans);
471 const LinearOpBase<double> &M,
472 const EOpTransp M_trans,
473 const MultiVectorBase<double> &X,
474 const Ptr<MultiVectorBase<double> > &Y,
479 apply<double>(M, M_trans, X, Y, alpha, beta);
Base class for all linear operators.
bool isPartiallyInitialized(const LinearOpBase< Scalar > &M)
Determines if a linear operator is in the "Partially Initialized" state or not.
virtual bool opSupportedImpl(EOpTransp M_trans) const =0
Override in subclass.
virtual void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const =0
Override in subclass.
bool isFullyUninitialized(const LinearOpBase< Scalar > &M)
Determines if a linear operator is in the "Fully Uninitialized" state or not.
void apply(const LinearOpBase< Scalar > &M, const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha=static_cast< Scalar >(1.0), const Scalar beta=static_cast< Scalar >(0.0))
Non-member function call for M.apply(...).
virtual RCP< const VectorSpaceBase< Scalar > > range() const =0
Return a smart pointer for the range space for this operator.
void apply(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
Apply the linear operator to a multi-vector : Y = alpha*op(M)*X + beta*Y.
bool isFullyInitialized(const LinearOpBase< Scalar > &M)
Determines if a linear operator is in the "Fully Initialized" state or not.
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
bool opSupported(EOpTransp M_trans) const
Return if the M_trans operation of apply() is supported or not.
void apply(const LinearOpBase< double > &M, const EOpTransp M_trans, const MultiVectorBase< double > &X, const Ptr< MultiVectorBase< double > > &Y, const double alpha=1.0, const double beta=0.0)
Calls apply<double>(...).
bool opSupported(const LinearOpBase< Scalar > &M, EOpTransp M_trans)
Determines if an operation is supported for a single scalar type.
virtual RCP< const LinearOpBase< Scalar > > clone() const
Clone the linear operator object (if supported).
Interface for a collection of column vectors called a multi-vector.
bool is_null(const std::shared_ptr< T > &p)
EOpTransp
Enumeration for determining how a linear operator is applied. `*.