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.