10#ifndef Thyra_MultiVectorLinearOp_hpp 
   11#define Thyra_MultiVectorLinearOp_hpp 
   13#include "Thyra_RowStatLinearOpBase.hpp" 
   14#include "Thyra_ScaledLinearOpBase.hpp" 
   15#include "Thyra_DefaultMultiVectorProductVectorSpace.hpp" 
   16#include "Thyra_DefaultMultiVectorProductVector.hpp" 
   17#include "Teuchos_ConstNonconstObjectContainer.hpp" 
   18#include "Thyra_VectorStdOps.hpp" 
   19#include "Thyra_MultiVectorStdOps.hpp" 
   20#include "Thyra_AssertOp.hpp" 
   21#include "Teuchos_dyn_cast.hpp" 
   29template <
class Scalar>
 
   31                            virtual public ScaledLinearOpBase<Scalar> {
 
   41      const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
   43      const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
 
   53                  const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
   55                  const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
 
   66    return op_.getNonconstObj();
 
 
   71    return op_.getConstObj();
 
 
   90  RCP<const LinearOpBase<Scalar> > 
clone()
 const 
 
  101    return Thyra::opSupported(*
op_.getConstObj(), M_trans);
 
 
  106                 const Scalar beta)
 const 
  108    using Teuchos::dyn_cast;
 
  109    typedef DefaultMultiVectorProductVector<Scalar> MVPV;
 
  111    const Ordinal numCols = XX.domain()->dim();
 
  113    for (Ordinal col_j = 0; col_j < numCols; ++col_j) {
 
  114      const RCP<const VectorBase<Scalar> > x = XX.col(col_j);
 
  115      const RCP<VectorBase<Scalar> > y       = YY->col(col_j);
 
  117      RCP<const MultiVectorBase<Scalar> > X =
 
  118          dyn_cast<const MVPV>(*x).getMultiVector().assert_not_null();
 
  119      RCP<MultiVectorBase<Scalar> > Y =
 
  120          dyn_cast<MVPV>(*y).getNonconstMultiVector().assert_not_null();
 
  122      Thyra::apply(*
op_.getConstObj(), M_trans, *X, Y.ptr(), alpha, beta);
 
 
  132      const RowStatLinearOpBaseUtils::ERowStat rowStat)
 const 
  134    using Teuchos::rcp_dynamic_cast;
 
  135    return rcp_dynamic_cast<const RowStatLinearOpBase<Scalar> >(
 
  137        ->rowStatIsSupported(rowStat);
 
 
  147    TEUCHOS_ASSERT(this->rowStatIsSupported(rowStat));
 
  153    typedef DefaultMultiVectorProductVector<Scalar> MVPV;
 
  154    using Teuchos::dyn_cast;
 
  155    using Teuchos::rcp_dynamic_cast;
 
  156    RCP<MultiVectorBase<Scalar> > rowStatMultiVec =
 
  157        dyn_cast<MVPV>(*rowStatVec).getNonconstMultiVector().assert_not_null();
 
  158    const Ordinal numCols = rowStatMultiVec->domain()->dim();
 
  160      rcp_dynamic_cast<const RowStatLinearOpBase<Scalar> >(
op_.getConstObj())
 
  161          ->getRowStat(rowStat, rowStatMultiVec->col(0).ptr());
 
  162      for (Ordinal col = 1; col < numCols; ++col) {
 
  163        Thyra::copy(*(rowStatMultiVec->col(0)),
 
  164                    rowStatMultiVec->col(col).ptr());
 
 
  176    using Teuchos::rcp_dynamic_cast;
 
  177    return rcp_dynamic_cast<const ScaledLinearOpBase<Scalar> >(
 
  179        ->supportsScaleLeft();
 
 
  184    using Teuchos::rcp_dynamic_cast;
 
  185    return rcp_dynamic_cast<const ScaledLinearOpBase<Scalar> >(
 
  187        ->supportsScaleRight();
 
 
  192    TEUCHOS_ASSERT(this->supportsScaleLeft());
 
  195    typedef DefaultMultiVectorProductVector<Scalar> MVPV;
 
  196    using Teuchos::dyn_cast;
 
  197    using Teuchos::rcp_dynamic_cast;
 
  198    RCP<const MultiVectorBase<Scalar> > row_scaling_mv =
 
  199        dyn_cast<const MVPV>(row_scaling).getMultiVector().assert_not_null();
 
  200    const Ordinal numCols = row_scaling_mv->domain()->dim();
 
  202      rcp_dynamic_cast<ScaledLinearOpBase<Scalar> >(
op_.getNonconstObj())
 
  203          ->scaleLeft(*(row_scaling_mv->col(0)));
 
 
  211    TEUCHOS_ASSERT(this->supportsScaleRight());
 
  214    typedef DefaultMultiVectorProductVector<Scalar> MVPV;
 
  215    using Teuchos::dyn_cast;
 
  216    using Teuchos::rcp_dynamic_cast;
 
  217    RCP<const MultiVectorBase<Scalar> > col_scaling_mv =
 
  218        dyn_cast<const MVPV>(col_scaling).getMultiVector().assert_not_null();
 
  219    const Ordinal numCols = col_scaling_mv->domain()->dim();
 
  221      rcp_dynamic_cast<ScaledLinearOpBase<Scalar> >(
op_.getNonconstObj())
 
  222          ->scaleRight(*(col_scaling_mv->col(0)));
 
 
  232  typedef Teuchos::ConstNonconstObjectContainer<LinearOpBase<Scalar> > 
CNOP;
 
  246      const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  248      const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  252    TEUCHOS_TEST_FOR_EXCEPT(is_null(op));
 
  253    TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecRange));
 
  254    TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecDomain));
 
  255    TEUCHOS_TEST_FOR_EXCEPT(multiVecRange->numBlocks() !=
 
  256                            multiVecDomain->numBlocks());
 
  257    if (op->range() != Teuchos::null)
 
  258      THYRA_ASSERT_VEC_SPACES(
 
  259          "MultiVectorLinearOp<Scalar>::initialize(op,multiVecRange," 
  261          *op->range(), *multiVecRange->getBlock(0));
 
  262    if (op->domain() != Teuchos::null)
 
  263      THYRA_ASSERT_VEC_SPACES(
 
  264          "MultiVectorLinearOp<Scalar>::initialize(op,multiVecRange," 
  266          *op->domain(), *multiVecDomain->getBlock(0));
 
  270    (void)multiVecDomain;
 
 
 
  279template <
class Scalar>
 
  289template <
class Scalar>
 
  292    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  294    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  297  RCP<MultiVectorLinearOp<Scalar> > mvop =
 
  299  mvop->nonconstInitialize(op, multiVecRange, multiVecDomain);
 
 
  307template <
class Scalar>
 
  311  RCP<MultiVectorLinearOp<Scalar> > mvop =
 
  313  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
 
  314      Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
 
  315  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
 
  316      Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
 
  317  mvop->nonconstInitialize(op, mv_range, mv_domain);
 
 
  325template <
class Scalar>
 
  328    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  330    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  333  RCP<MultiVectorLinearOp<Scalar> > mvop =
 
  335  mvop->initialize(op, multiVecRange, multiVecDomain);
 
 
  343template <
class Scalar>
 
  347  RCP<MultiVectorLinearOp<Scalar> > mvop =
 
  349  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
 
  350      Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
 
  351  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
 
  352      Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
 
  353  mvop->initialize(op, mv_range, mv_domain);
 
 
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
 
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
 
virtual void scaleRightImpl(const VectorBase< Scalar > &col_scaling)
 
void initialize(const RCP< const LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
 
MultiVectorLinearOp()
Construct to uninitialized.
 
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &XX, const Ptr< MultiVectorBase< Scalar > > &YY, const Scalar alpha, const Scalar beta) const
 
bool rowStatIsSupportedImpl(const RowStatLinearOpBaseUtils::ERowStat rowStat) const
Determine if a given row stat is supported.
 
RCP< MultiVectorLinearOp< Scalar > > multiVectorLinearOp(const RCP< const LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
 
void getRowStatImpl(const RowStatLinearOpBaseUtils::ERowStat rowStat, const Ptr< VectorBase< Scalar > > &rowStatVec) const
Get some statistics about a supported row.
 
static void validateInitialize(const RCP< const LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
 
bool opSupportedImpl(EOpTransp M_trans) const
 
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
 
RCP< MultiVectorLinearOp< Scalar > > multiVectorLinearOp()
Nonmember constructor function.
 
RCP< LinearOpBase< Scalar > > getNonconstLinearOp()
 
RCP< const LinearOpBase< Scalar > > getLinearOp() const
 
Teuchos::ConstNonconstObjectContainer< LinearOpBase< Scalar > > CNOP
 
RCP< const VectorSpaceBase< Scalar > > domain() const
 
RCP< MultiVectorLinearOp< Scalar > > nonconstMultiVectorLinearOp(const RCP< LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
 
virtual bool supportsScaleLeftImpl() const
 
void nonconstInitialize(const RCP< LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
 
RCP< MultiVectorLinearOp< Scalar > > nonconstMultiVectorLinearOp(const RCP< LinearOpBase< Scalar > > &op, const int num_blocks)
Nonmember constructor function.
 
virtual void scaleLeftImpl(const VectorBase< Scalar > &row_scaling)
 
RCP< const VectorSpaceBase< Scalar > > range() const
 
RCP< const LinearOpBase< Scalar > > clone() const
 
virtual bool supportsScaleRightImpl() const
 
RCP< MultiVectorLinearOp< Scalar > > multiVectorLinearOp(const RCP< const LinearOpBase< Scalar > > &op, const int num_blocks)
Nonmember constructor function.