9 #ifndef Thyra_MultiVectorLinearOp_hpp
10 #define Thyra_MultiVectorLinearOp_hpp
12 #include "Thyra_RowStatLinearOpBase.hpp"
13 #include "Thyra_ScaledLinearOpBase.hpp"
14 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
15 #include "Thyra_DefaultMultiVectorProductVector.hpp"
16 #include "Teuchos_ConstNonconstObjectContainer.hpp"
17 #include "Thyra_VectorStdOps.hpp"
18 #include "Thyra_MultiVectorStdOps.hpp"
19 #include "Thyra_AssertOp.hpp"
20 #include "Teuchos_dyn_cast.hpp"
28 template <
class Scalar>
89 RCP<const LinearOpBase<Scalar> >
clone()
const
105 const Scalar beta)
const
112 for (
Ordinal col_j = 0; col_j < numCols; ++col_j) {
113 const RCP<const VectorBase<Scalar> > x = XX.
col(col_j);
114 const RCP<VectorBase<Scalar> > y = YY->col(col_j);
116 RCP<const MultiVectorBase<Scalar> > X =
117 dyn_cast<
const MVPV>(*x).getMultiVector().assert_not_null();
118 RCP<MultiVectorBase<Scalar> > Y =
119 dyn_cast<MVPV>(*y).getNonconstMultiVector().assert_not_null();
121 Thyra::apply(*
op_.
getConstObj(), M_trans, *X, Y.ptr(), alpha, beta);
131 const RowStatLinearOpBaseUtils::ERowStat rowStat)
const
133 using Teuchos::rcp_dynamic_cast;
136 ->rowStatIsSupported(rowStat);
154 using Teuchos::rcp_dynamic_cast;
155 RCP<MultiVectorBase<Scalar> > rowStatMultiVec =
156 dyn_cast<MVPV>(*rowStatVec).getNonconstMultiVector().assert_not_null();
157 const Ordinal numCols = rowStatMultiVec->domain()->dim();
160 ->getRowStat(rowStat, rowStatMultiVec->col(0).ptr());
161 for (
Ordinal col = 1; col < numCols; ++col) {
162 Thyra::copy(*(rowStatMultiVec->col(0)),
163 rowStatMultiVec->col(col).ptr());
175 using Teuchos::rcp_dynamic_cast;
178 ->supportsScaleLeft();
183 using Teuchos::rcp_dynamic_cast;
186 ->supportsScaleRight();
196 using Teuchos::rcp_dynamic_cast;
197 RCP<const MultiVectorBase<Scalar> > row_scaling_mv =
198 dyn_cast<
const MVPV>(row_scaling).getMultiVector().assert_not_null();
199 const Ordinal numCols = row_scaling_mv->domain()->dim();
202 ->scaleLeft(*(row_scaling_mv->col(0)));
215 using Teuchos::rcp_dynamic_cast;
216 RCP<const MultiVectorBase<Scalar> > col_scaling_mv =
217 dyn_cast<
const MVPV>(col_scaling).getMultiVector().assert_not_null();
218 const Ordinal numCols = col_scaling_mv->domain()->dim();
221 ->scaleRight(*(col_scaling_mv->col(0)));
255 multiVecDomain->numBlocks());
256 if (op->range() != Teuchos::null)
258 "MultiVectorLinearOp<Scalar>::initialize(op,multiVecRange,"
260 *op->range(), *multiVecRange->getBlock(0));
261 if (op->domain() != Teuchos::null)
263 "MultiVectorLinearOp<Scalar>::initialize(op,multiVecRange,"
265 *op->domain(), *multiVecDomain->getBlock(0));
269 (void)multiVecDomain;
278 template <
class Scalar>
288 template <
class Scalar>
296 RCP<MultiVectorLinearOp<Scalar> > mvop =
298 mvop->nonconstInitialize(op, multiVecRange, multiVecDomain);
306 template <
class Scalar>
310 RCP<MultiVectorLinearOp<Scalar> > mvop =
312 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
313 Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
314 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
315 Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
316 mvop->nonconstInitialize(op, mv_range, mv_domain);
324 template <
class Scalar>
332 RCP<MultiVectorLinearOp<Scalar> > mvop =
334 mvop->initialize(op, multiVecRange, multiVecDomain);
342 template <
class Scalar>
346 RCP<MultiVectorLinearOp<Scalar> > mvop =
348 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
349 Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
350 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
351 Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
352 mvop->initialize(op, mv_range, mv_domain);
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
#define THYRA_ASSERT_VEC_SPACES(FUNC_NAME, VS1, VS2)
static void validateInitialize(const RCP< const LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
bool is_null(const boost::shared_ptr< T > &p)
RCP< MultiVectorLinearOp< Scalar > > multiVectorLinearOp()
Nonmember constructor function.
virtual void scaleRightImpl(const VectorBase< Scalar > &col_scaling)
void nonconstInitialize(const RCP< LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
T_To & dyn_cast(T_From &from)
RCP< LinearOpBase< Scalar > > getNonconstLinearOp()
void getRowStatImpl(const RowStatLinearOpBaseUtils::ERowStat rowStat, const Ptr< VectorBase< Scalar > > &rowStatVec) const
Get some statistics about a supported row.
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &XX, const Ptr< MultiVectorBase< Scalar > > &YY, const Scalar alpha, const Scalar beta) const
Teuchos::ConstNonconstObjectContainer< LinearOpBase< Scalar > > CNOP
RCP< const LinearOpBase< Scalar > > clone() const
RCP< MultiVectorLinearOp< Scalar > > multiVectorLinearOp(const RCP< const LinearOpBase< Scalar > > &op, const int num_blocks)
Nonmember constructor function.
MultiVectorLinearOp()
Construct to uninitialized.
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.
RCP< MultiVectorLinearOp< Scalar > > nonconstMultiVectorLinearOp(const RCP< LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
RCP< const ObjType > getConstObj() const
RCP< const VectorBase< Scalar > > col(Ordinal j) const
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
RCP< const VectorSpaceBase< Scalar > > range() const
bool opSupportedImpl(EOpTransp M_trans) const
virtual void scaleLeftImpl(const VectorBase< Scalar > &row_scaling)
virtual bool supportsScaleLeftImpl() const
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
RCP< const VectorSpaceBase< Scalar > > domain() const
RCP< MultiVectorLinearOp< Scalar > > nonconstMultiVectorLinearOp(const RCP< LinearOpBase< Scalar > > &op, const int num_blocks)
Nonmember constructor function.
#define TEUCHOS_ASSERT(assertion_test)
RCP< ObjType > getNonconstObj() const
bool rowStatIsSupportedImpl(const RowStatLinearOpBaseUtils::ERowStat rowStat) const
Determine if a given row stat is supported.
void initialize(const RCP< const LinearOpBase< Scalar > > &op, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
virtual bool supportsScaleRightImpl() const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
RCP< const LinearOpBase< Scalar > > getLinearOp() const