10#ifndef THYRA_DEFAULT_BLOCKED_LINEAR_OP_DEF_HPP
11#define THYRA_DEFAULT_BLOCKED_LINEAR_OP_DEF_HPP
14#include "Thyra_DefaultBlockedLinearOp_decl.hpp"
15#include "Thyra_DefaultProductVectorSpace.hpp"
16#include "Thyra_DefaultProductVector.hpp"
17#include "Thyra_DefaultProductMultiVector.hpp"
18#include "Thyra_MultiVectorStdOps.hpp"
19#include "Thyra_VectorStdOps.hpp"
20#include "Thyra_AssertOp.hpp"
21#include "Thyra_ScaledAdjointLinearOpBase.hpp"
32 :numRowBlocks_(0), numColBlocks_(0), blockFillIsActive_(false)
42 assertBlockFillIsActive(
false);
50 const int numRowBlocks,
const int numColBlocks
53 assertBlockFillIsActive(
false);
55 resetStorage(numRowBlocks,numColBlocks);
65 using Teuchos::rcp_dynamic_cast;
66 assertBlockFillIsActive(
false);
68 productRange_ = new_productRange.assert_not_null();
69 productDomain_ = new_productDomain.assert_not_null();
70 defaultProductRange_ =
71 rcp_dynamic_cast<const DefaultProductVectorSpace<Scalar> >(productRange_);
72 defaultProductDomain_ =
73 rcp_dynamic_cast<const DefaultProductVectorSpace<Scalar> >(productDomain_);
75 resetStorage(productRange_->numBlocks(), productDomain_->numBlocks());
82 return blockFillIsActive_;
88 const int i,
const int j
91 assertBlockFillIsActive(
true);
92 assertBlockRowCol(i,j);
99 const int i,
const int j
103 setBlockImpl(i, j, block);
107template<
class Scalar>
109 const int i,
const int j
113 setBlockImpl(i, j, block);
117template<
class Scalar>
123 assertBlockFillIsActive(
true);
130 if (nonnull(productRange_)) {
131 numRowBlocks_ = productRange_->numBlocks();
132 numColBlocks_ = productDomain_->numBlocks();
135 numRowBlocks_ = rangeBlocks_.size();
136 numColBlocks_ = domainBlocks_.size();
145 if (is_null(productRange_)) {
146 for (
int i = 0; i < numRowBlocks_; ++i) {
148 !rangeBlocks_[i].get(), std::logic_error
149 ,
"DefaultBlockedLinearOp<Scalar>::endBlockFill():"
150 " Error, no linear operator block for the i="<<i<<
" block row was added"
151 " and we can not complete the block fill!"
154 for(
int j = 0; j < numColBlocks_; ++j) {
156 !domainBlocks_[j].get(), std::logic_error
157 ,
"DefaultBlockedLinearOp<Scalar>::endBlockFill():"
158 " Error, no linear operator block for the j="
159 <<j<<
" block column was added"
160 " and we can not complete the block fill!"
167 if (Ops_stack_.size()) {
168 Ops_.resize(numRowBlocks_*numColBlocks_);
169 for (
int k = 0; k < as<int>(Ops_stack_.size()); ++k ) {
170 const BlockEntry<Scalar> &block_i_j = Ops_stack_[k];
171 Ops_[numRowBlocks_*block_i_j.j + block_i_j.i] = block_i_j.block;
173 Ops_stack_.resize(0);
177 if (is_null(productRange_)) {
181 productRange_ = defaultProductRange_;
182 productDomain_ = defaultProductDomain_;
185 rangeBlocks_.resize(0);
186 domainBlocks_.resize(0);
188 blockFillIsActive_ =
false;
193template<
class Scalar>
196 productRange_ = Teuchos::null;
197 productDomain_ = Teuchos::null;
201 Ops_stack_.resize(0);
202 rangeBlocks_.resize(0);
203 domainBlocks_.resize(0);
204 blockFillIsActive_ =
false;
211template<
class Scalar>
215 return productRange_;
219template<
class Scalar>
223 return productDomain_;
227template<
class Scalar>
229 const int i,
const int j
232 assertBlockFillIsActive(
false);
233 assertBlockRowCol(i,j);
234 return !is_null(Ops_[numRowBlocks_ * j + i]);
238template<
class Scalar>
240 const int i,
const int j
244 return Ops_[numRowBlocks_*j+i].isConst();
248template<
class Scalar>
253 return Ops_[numRowBlocks_*j+i].getNonconstObj();
257template<
class Scalar>
262 return Ops_[numRowBlocks_*j+i];
269template<
class Scalar>
273 return productRange_;
277template<
class Scalar>
281 return productDomain_;
285template<
class Scalar>
289 return Teuchos::null;
296template<
class Scalar>
299 assertBlockFillIsActive(
false);
300 std::ostringstream oss;
303 <<
"numRowBlocks="<<numRowBlocks_
304 <<
",numColBlocks="<<numColBlocks_
310template<
class Scalar>
316 using Teuchos::rcpFromRef;
319 assertBlockFillIsActive(
false);
333 <<
"rangeDim=" << this->
range()->dim()
334 <<
",domainDim=" << this->
domain()->dim()
335 <<
",numRowBlocks=" << numRowBlocks_
336 <<
",numColBlocks=" << numColBlocks_
340 <<
"Constituent LinearOpBase objects for M = [ Op[0,0] ..."
341 <<
" ; ... ; ... Op[numRowBlocks-1,numColBlocks-1] ]:\n";
343 for(
int i = 0; i < numRowBlocks_; ++i ) {
344 for(
int j = 0; j < numColBlocks_; ++j ) {
345 *out <<
"Op["<<i<<
","<<j<<
"] = ";
349 *out << Teuchos::describe(*
getBlock(i,j),verbLevel);
368template<
class Scalar>
371 bool supported =
true;
372 for(
int i = 0; i < numRowBlocks_; ++i ) {
373 for(
int j = 0; j < numColBlocks_; ++j ) {
384template<
class Scalar>
386 const EOpTransp M_trans,
394 using Teuchos::rcpFromRef;
402 "DefaultBlockedLinearOp<Scalar>::apply(...)", *
this, M_trans, X_in, &*Y_inout
409 opNumRowBlocks = ( !struct_transp ? numRowBlocks_ : numColBlocks_ ),
410 opNumColBlocks = ( !struct_transp ? numColBlocks_ : numRowBlocks_ );
424 ? defaultProductRange_ : defaultProductDomain_ ),
426 ? defaultProductDomain_ : defaultProductRange_ );
430 defaultProductDomain_op, rcpFromRef(X_in));
433 defaultProductRange_op, rcpFromPtr(Y_inout));
435 for(
int i = 0; i < opNumRowBlocks; ++i ) {
436 MultiVectorPtr Y_i = Y->getNonconstMultiVectorBlock(i);
437 for(
int j = 0; j < opNumColBlocks; ++j ) {
441 X_j = X->getMultiVectorBlock(j);
444 Thyra::apply(*Op_i_j, M_trans,* X_j, Y_i.ptr(), alpha, beta);
446 scale(beta, Y_i.ptr());
450 Thyra::apply(*Op_i_j, M_trans, *X_j, Y_i.ptr(), alpha, ST::one());
458template<
class Scalar>
461 const RowStatLinearOpBaseUtils::ERowStat row_stat)
const
463 using Teuchos::rcpFromRef;
464 using Teuchos::rcp_dynamic_cast;
473 RowStatLinearOpBaseUtils::ERowStat
474 subblk_stat = RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,
475 subblk_trans_stat = RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM;
477 case RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM:
478 case RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM:
479 subblk_stat = RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM;
480 subblk_trans_stat = RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM;
482 case RowStatLinearOpBaseUtils::ROW_STAT_INV_COL_SUM:
483 case RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM:
484 subblk_stat = RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM;
485 subblk_trans_stat = RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM;
493 for(
int i = 0; i < numRowBlocks_; ++i ) {
494 for(
int j = 0; j < numColBlocks_; ++j ) {
495 ConstLinearOpPtr Op_i_j =
getBlock(i,j);
497 if (nonnull(Op_i_j)) {
499 ConstLinearOp * Orig_i_j = 0;
507 RowStatLinearOpBaseUtils::ERowStat stat = subblk_stat;
508 if(transp==
NOTRANS || transp==CONJ)
510 else if(transp==TRANS || transp==CONJTRANS)
511 stat = subblk_trans_stat;
513 if(!row_stat_op.rowStatIsSupported(stat))
523template<
class Scalar>
526 const RowStatLinearOpBaseUtils::ERowStat row_stat,
529 using Teuchos::rcpFromRef;
530 using Teuchos::rcpFromPtr;
531 using Teuchos::rcp_dynamic_cast;
541 RowStatLinearOpBaseUtils::ERowStat
542 subblk_stat = RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,
543 subblk_trans_stat = RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM;
545 case RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM:
546 case RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM:
547 subblk_stat = RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM;
548 subblk_trans_stat = RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM;
550 case RowStatLinearOpBaseUtils::ROW_STAT_INV_COL_SUM:
551 case RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM:
552 subblk_stat = RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM;
553 subblk_trans_stat = RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM;
560 Y = rcp_dynamic_cast<ProductVectorBase<Scalar> >(rcpFromPtr(rowStatVec));
564 for(
int i = 0; i < numRowBlocks_; ++i ) {
565 VectorPtr blk_vec = Y->getNonconstVectorBlock(i);
568 for(
int j = 0; j < numColBlocks_; ++j ) {
569 ConstLinearOpPtr Op_i_j =
getBlock(i,j);
572 if (nonnull(Op_i_j)) {
578 ConstLinearOp * Orig_i_j = 0;
586 if(transp==
NOTRANS || transp==CONJ)
587 row_stat_op.getRowStat(subblk_stat,tmp_vec.ptr());
588 else if(transp==TRANS || transp==CONJTRANS)
589 row_stat_op.getRowStat(subblk_trans_stat,tmp_vec.ptr());
594 Vp_V(blk_vec.ptr(),*tmp_vec);
601 case RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM:
602 case RowStatLinearOpBaseUtils::ROW_STAT_INV_COL_SUM:
604 case RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM:
605 case RowStatLinearOpBaseUtils::ROW_STAT_COL_SUM:
614template<
class Scalar>
618 using Teuchos::rcp_dynamic_cast;
624 bool supported =
true;
625 for(
int i = 0; i < numRowBlocks_; ++i ) {
626 for(
int j = 0; j < numColBlocks_; ++j ) {
631 if (nonnull(Op_i_j)) {
633 LinearOp * Orig_i_j = 0;
639 if(transp==
NOTRANS || transp==CONJ)
640 supported &= scaled_op.supportsScaleLeft();
641 else if(transp==TRANS || transp==CONJTRANS)
642 supported &= scaled_op.supportsScaleRight();
650template<
class Scalar>
654 using Teuchos::rcp_dynamic_cast;
660 bool supported =
true;
661 for(
int i = 0; i < numRowBlocks_; ++i ) {
662 for(
int j = 0; j < numColBlocks_; ++j ) {
665 if (nonnull(Op_i_j)) {
667 LinearOp * Orig_i_j = 0;
674 if(transp==
NOTRANS || transp==CONJ)
675 supported &= scaled_op.supportsScaleRight();
676 else if(transp==TRANS || transp==CONJTRANS)
677 supported &= scaled_op.supportsScaleLeft();
685template<
class Scalar>
691 using Teuchos::rcp_dynamic_cast;
697 Y = dyn_cast<const ProductVectorBase<Scalar> >(row_scaling);
701 for(
int i = 0; i < numRowBlocks_; ++i ) {
704 for(
int j = 0; j < numColBlocks_; ++j ) {
707 if (nonnull(Op_i_j)) {
709 LinearOpPtr Orig_i_j;
714 = rcp_dynamic_cast<ScaledAdjointLinearOpBase<Scalar> >(Op_i_j);
716 transp = saOp->overallTransp();
717 Orig_i_j = saOp->getNonconstOrigOp();
723 RCP<ScaledOp> scaled_op = rcp_dynamic_cast<ScaledOp>(Orig_i_j);
729 if(transp==
NOTRANS || transp==CONJ)
730 scaled_op->scaleLeft(*blk_vec);
731 else if(transp==TRANS || transp==CONJTRANS)
732 scaled_op->scaleRight(*blk_vec);
738template<
class Scalar>
744 using Teuchos::rcp_dynamic_cast;
750 Y = dyn_cast<const ProductVectorBase<Scalar> >(col_scaling);
754 for(
int j = 0; j < numColBlocks_; ++j ) {
757 for(
int i = 0; i < numRowBlocks_; ++i ) {
760 if (nonnull(Op_i_j)) {
762 LinearOpPtr Orig_i_j;
767 = rcp_dynamic_cast<ScaledAdjointLinearOpBase<Scalar> >(Op_i_j);
769 transp = saOp->overallTransp();
770 Orig_i_j = saOp->getNonconstOrigOp();
776 RCP<ScaledOp> scaled_op = rcp_dynamic_cast<ScaledOp>(Orig_i_j);
782 if(transp==
NOTRANS || transp==CONJ)
783 scaled_op->scaleRight(*blk_vec);
784 else if(transp==TRANS || transp==CONJTRANS)
785 scaled_op->scaleLeft(*blk_vec);
794template<
class Scalar>
795void DefaultBlockedLinearOp<Scalar>::resetStorage(
796 const int numRowBlocks,
const int numColBlocks
799 numRowBlocks_ = numRowBlocks;
800 numColBlocks_ = numColBlocks;
801 Ops_.resize(numRowBlocks_*numColBlocks_);
802 if (is_null(productRange_)) {
803 rangeBlocks_.resize(numRowBlocks);
804 domainBlocks_.resize(numColBlocks);
806 blockFillIsActive_ =
true;
810template<
class Scalar>
811void DefaultBlockedLinearOp<Scalar>::assertBlockFillIsActive(
823template<
class Scalar>
824void DefaultBlockedLinearOp<Scalar>::assertBlockRowCol(
825 const int i,
const int j
830 !( 0 <= i ), std::logic_error
831 ,
"Error, i="<<i<<
" is invalid!"
834 !( 0 <= j ), std::logic_error
835 ,
"Error, j="<<j<<
" is invalid!"
841 !( 0 <= i && i < numRowBlocks_ ), std::logic_error
842 ,
"Error, i="<<i<<
" does not fall in the range [0,"<<numRowBlocks_-1<<
"]!"
845 !( 0 <= j && j < numColBlocks_ ), std::logic_error
846 ,
"Error, j="<<j<<
" does not fall in the range [0,"<<numColBlocks_-1<<
"]!"
856template<
class Scalar>
857void DefaultBlockedLinearOp<Scalar>::setBlockSpaces(
862 assertBlockFillIsActive(
true);
863 assertBlockRowCol(i,j);
867 if( i < numRowBlocks_ && j < numColBlocks_ ) {
872 ? productRange_->getBlock(i)
877 ? productDomain_->getBlock(j)
880 if(rangeBlock.get()) {
882 "DefaultBlockedLinearOp<Scalar>::setBlockSpaces(i,j,block):\n\n"
883 "Adding block: " + block.description(),
884 *rangeBlock,(
"(*productRange->getBlock("+
toString(i)+
"))"),
888 if(domainBlock.get()) {
890 "DefaultBlockedLinearOp<Scalar>::setBlockSpaces(i,j,block):\n\n"
891 "Adding block: " + block.description(),
892 *domainBlock,(
"(*productDomain->getBlock("+
toString(j)+
"))"),
901 for(
int k = numRowBlocks_; k <= i; ++k )
902 rangeBlocks_.push_back(Teuchos::null);
903 for(
int k = numColBlocks_; k <= j; ++k )
904 domainBlocks_.push_back(Teuchos::null);
907 if(!productRange_.get()) {
908 if(!rangeBlocks_[i].get())
909 rangeBlocks_[i] = block.range().assert_not_null();
910 if(!domainBlocks_[j].get()) {
911 domainBlocks_[j] = block.domain().assert_not_null();
918 numRowBlocks_ = rangeBlocks_.size();
919 numColBlocks_ = domainBlocks_.size();
925template<
class Scalar>
926template<
class LinearOpType>
927void DefaultBlockedLinearOp<Scalar>::setBlockImpl(
928 const int i,
const int j,
932 setBlockSpaces(i, j, *block);
936 Ops_[numRowBlocks_*j+i] = block;
941 bool foundBlock =
false;
942 for(
unsigned int k = 0; k < Ops_stack_.size(); ++k ) {
943 BlockEntry<Scalar> &block_i_j = Ops_stack_[k];
944 if( block_i_j.i == i && block_i_j.j == j ) {
945 block_i_j.block = block;
951 Ops_stack_.push_back(BlockEntry<Scalar>(i,j,block));
956template<
class Scalar>
957void DefaultBlockedLinearOp<Scalar>::adjustBlockSpaces()
976 for (
int i = 0; i < numRowBlocks_; ++i) {
977 for (
int j = 0; j < numColBlocks_; ++j) {
979 op_i_j = Ops_[numRowBlocks_*j+i];
984 rangeBlocks_[i] = range_i_j;
991 for (
int j = 0; j < numColBlocks_; ++j) {
992 for (
int i = 0; i < numRowBlocks_; ++i) {
994 op_i_j = Ops_[numRowBlocks_*j+i];
998 domain_i_j = op_i_j->domain();
1000 domainBlocks_[j] = domain_i_j;
1012template<
class Scalar>
1016 return Teuchos::rcp(
new DefaultBlockedLinearOp<Scalar>());
1020template<
class Scalar>
1023 const RCP<
const LinearOpBase<Scalar> > &A00,
1024 const std::string &label
1027 RCP<PhysicallyBlockedLinearOpBase<Scalar> >
1028 M = defaultBlockedLinearOp<Scalar>();
1029 M->beginBlockFill(1,1);
1030 M->setBlock(0, 0, A00);
1033 M->setObjectLabel(label);
1038template<
class Scalar>
1041 const RCP<
const LinearOpBase<Scalar> > &A00,
1042 const RCP<
const LinearOpBase<Scalar> > &A01,
1043 const std::string &label
1046 RCP<PhysicallyBlockedLinearOpBase<Scalar> >
1047 M = defaultBlockedLinearOp<Scalar>();
1048 M->beginBlockFill(1,2);
1049 if(A00.get()) M->setBlock(0,0,A00);
1050 if(A01.get()) M->setBlock(0,1,A01);
1053 M->setObjectLabel(label);
1058template<
class Scalar>
1061 const RCP<
const LinearOpBase<Scalar> > &A00,
1062 const RCP<
const LinearOpBase<Scalar> > &A10,
1063 const std::string &label
1066 RCP<PhysicallyBlockedLinearOpBase<Scalar> >
1067 M = defaultBlockedLinearOp<Scalar>();
1068 M->beginBlockFill(2,1);
1069 if(A00.get()) M->setBlock(0,0,A00);
1070 if(A10.get()) M->setBlock(1,0,A10);
1073 M->setObjectLabel(label);
1078template<
class Scalar>
1081 const RCP<
const LinearOpBase<Scalar> > &A00,
1082 const RCP<
const LinearOpBase<Scalar> > &A01,
1083 const RCP<
const LinearOpBase<Scalar> > &A10,
1084 const RCP<
const LinearOpBase<Scalar> > &A11,
1085 const std::string &label
1088 RCP<PhysicallyBlockedLinearOpBase<Scalar> >
1089 M = defaultBlockedLinearOp<Scalar>();
1090 M->beginBlockFill(2,2);
1091 if(A00.get()) M->setBlock(0,0,A00);
1092 if(A01.get()) M->setBlock(0,1,A01);
1093 if(A10.get()) M->setBlock(1,0,A10);
1094 if(A11.get()) M->setBlock(1,1,A11);
1097 M->setObjectLabel(label);
1102template<
class Scalar>
1105 const RCP<LinearOpBase<Scalar> > &A00,
1106 const std::string &label
1109 RCP<PhysicallyBlockedLinearOpBase<Scalar> >
1110 M = defaultBlockedLinearOp<Scalar>();
1111 M->beginBlockFill(1, 1);
1112 M->setNonconstBlock(0, 0, A00);
1115 M->setObjectLabel(label);
1120template<
class Scalar>
1123 const RCP<LinearOpBase<Scalar> > &A00,
1124 const RCP<LinearOpBase<Scalar> > &A01,
1125 const std::string &label
1128 RCP<PhysicallyBlockedLinearOpBase<Scalar> >
1129 M = defaultBlockedLinearOp<Scalar>();
1130 M->beginBlockFill(1,2);
1131 if(A00.get()) M->setNonconstBlock(0,0,A00);
1132 if(A01.get()) M->setNonconstBlock(0,1,A01);
1135 M->setObjectLabel(label);
1140template<
class Scalar>
1143 const RCP<LinearOpBase<Scalar> > &A00,
1144 const RCP<LinearOpBase<Scalar> > &A10,
1145 const std::string &label
1148 RCP<PhysicallyBlockedLinearOpBase<Scalar> >
1149 M = defaultBlockedLinearOp<Scalar>();
1150 M->beginBlockFill(2,1);
1151 if(A00.get()) M->setNonconstBlock(0,0,A00);
1152 if(A10.get()) M->setNonconstBlock(1,0,A10);
1155 M->setObjectLabel(label);
1160template<
class Scalar>
1163 const RCP<LinearOpBase<Scalar> > &A00,
1164 const RCP<LinearOpBase<Scalar> > &A01,
1165 const RCP<LinearOpBase<Scalar> > &A10,
1166 const RCP<LinearOpBase<Scalar> > &A11,
1167 const std::string &label
1170 RCP<PhysicallyBlockedLinearOpBase<Scalar> >
1171 M = defaultBlockedLinearOp<Scalar>();
1172 M->beginBlockFill(2,2);
1173 if(A00.get()) M->setNonconstBlock(0,0,A00);
1174 if(A01.get()) M->setNonconstBlock(0,1,A01);
1175 if(A10.get()) M->setNonconstBlock(1,0,A10);
1176 if(A11.get()) M->setNonconstBlock(1,1,A11);
1179 M->setObjectLabel(label);
1191#define THYRA_DEFAULT_BLOCKED_LINEAR_OP_INSTANT(SCALAR) \
1193 template class DefaultBlockedLinearOp<SCALAR >; \
1195 template RCP<DefaultBlockedLinearOp<SCALAR > > \
1196 defaultBlockedLinearOp<SCALAR >(); \
1198 template RCP<const LinearOpBase<SCALAR > > \
1200 const RCP<const LinearOpBase<SCALAR > > &A00, \
1201 const std::string &label \
1204 template RCP<const LinearOpBase<SCALAR > > \
1206 const RCP<const LinearOpBase<SCALAR > > &A00, \
1207 const RCP<const LinearOpBase<SCALAR > > &A01, \
1208 const std::string &label \
1211 template RCP<const LinearOpBase<SCALAR > > \
1213 const RCP<const LinearOpBase<SCALAR > > &A00, \
1214 const RCP<const LinearOpBase<SCALAR > > &A10, \
1215 const std::string &label \
1218 template RCP<const LinearOpBase<SCALAR > > \
1220 const RCP<const LinearOpBase<SCALAR > > &A00, \
1221 const RCP<const LinearOpBase<SCALAR > > &A01, \
1222 const RCP<const LinearOpBase<SCALAR > > &A10, \
1223 const RCP<const LinearOpBase<SCALAR > > &A11, \
1224 const std::string &label \
1227 template RCP<LinearOpBase<SCALAR > > \
1229 const RCP<LinearOpBase<SCALAR > > &A00, \
1230 const std::string &label \
1233 template RCP<LinearOpBase<SCALAR > > \
1235 const RCP<LinearOpBase<SCALAR > > &A00, \
1236 const RCP<LinearOpBase<SCALAR > > &A01, \
1237 const std::string &label \
1240 template RCP<LinearOpBase<SCALAR > > \
1242 const RCP<LinearOpBase<SCALAR > > &A00, \
1243 const RCP<LinearOpBase<SCALAR > > &A10, \
1244 const std::string &label \
1247 template RCP<LinearOpBase<SCALAR > > \
1249 const RCP<LinearOpBase<SCALAR > > &A00, \
1250 const RCP<LinearOpBase<SCALAR > > &A01, \
1251 const RCP<LinearOpBase<SCALAR > > &A10, \
1252 const RCP<LinearOpBase<SCALAR > > &A11, \
1253 const std::string &label \
virtual std::string description() const
Teuchos::RCP< const VectorSpaceBase< Scalar > > domain() const
bool blockIsConst(const int i, const int j) const
virtual void scaleRightImpl(const VectorBase< Scalar > &col_scaling)
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
Teuchos::RCP< LinearOpBase< Scalar > > nonconstBlock2x2(const Teuchos::RCP< LinearOpBase< Scalar > > &A00, const Teuchos::RCP< LinearOpBase< Scalar > > &A01, const Teuchos::RCP< LinearOpBase< Scalar > > &A10, const Teuchos::RCP< LinearOpBase< Scalar > > &A11, const std::string &label="")
Form an implicit block 2x2 linear operator [ A00, A01; A10, A11 ].
bool acceptsBlock(const int i, const int j) const
Teuchos::RCP< const VectorSpaceBase< Scalar > > range() const
virtual bool rowStatIsSupportedImpl(const RowStatLinearOpBaseUtils::ERowStat rowStat) const
virtual bool supportsScaleRightImpl() const
virtual bool supportsScaleLeftImpl() const
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstBlock(const int i, const int j)
Teuchos::RCP< const LinearOpBase< Scalar > > getBlock(const int i, const int j) const
bool blockExists(const int i, const int j) const
Teuchos::RCP< const LinearOpBase< Scalar > > block2x1(const Teuchos::RCP< const LinearOpBase< Scalar > > &A00, const Teuchos::RCP< const LinearOpBase< Scalar > > &A10, const std::string &label="")
Form an implicit block 2x1 linear operator [ A00; A10 ].
virtual void scaleLeftImpl(const VectorBase< Scalar > &row_scaling)
void setNonconstBlock(const int i, const int j, const Teuchos::RCP< LinearOpBase< Scalar > > &block)
Teuchos::RCP< LinearOpBase< Scalar > > nonconstBlock1x2(const Teuchos::RCP< LinearOpBase< Scalar > > &A00, const Teuchos::RCP< LinearOpBase< Scalar > > &A01, const std::string &label="")
Form an implicit block 1x2 linear operator [ A00, A01 ].
Teuchos::RCP< const ProductVectorSpaceBase< Scalar > > productDomain() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Prints the details about the constituent linear operators.
RCP< DefaultBlockedLinearOp< Scalar > > defaultBlockedLinearOp()
Nonmember default constructor.
Teuchos::RCP< const ProductVectorSpaceBase< Scalar > > productRange() const
virtual void getRowStatImpl(const RowStatLinearOpBaseUtils::ERowStat rowStat, const Teuchos::Ptr< VectorBase< Scalar > > &rowStatVec) const
void setBlock(const int i, const int j, const Teuchos::RCP< const LinearOpBase< Scalar > > &block)
std::string description() const
Prints just the name DefaultBlockedLinearOp along with the overall dimensions and the number of const...
Teuchos::RCP< const LinearOpBase< Scalar > > block1x2(const Teuchos::RCP< const LinearOpBase< Scalar > > &A00, const Teuchos::RCP< const LinearOpBase< Scalar > > &A01, const std::string &label="")
Form an implicit block 1x2 linear operator [ A00, A01 ].
Teuchos::RCP< LinearOpBase< Scalar > > nonconstBlock2x1(const Teuchos::RCP< LinearOpBase< Scalar > > &A00, const Teuchos::RCP< LinearOpBase< Scalar > > &A10, const std::string &label="")
Form an implicit block 2x1 linear operator [ A00; A10 ].
Teuchos::RCP< const LinearOpBase< Scalar > > block2x2(const Teuchos::RCP< const LinearOpBase< Scalar > > &A00, const Teuchos::RCP< const LinearOpBase< Scalar > > &A01, const Teuchos::RCP< const LinearOpBase< Scalar > > &A10, const Teuchos::RCP< const LinearOpBase< Scalar > > &A11, const std::string &label="")
Form an implicit block 2x2 linear operator [ A00, A01; A10, A11 ].
bool blockFillIsActive() const
Teuchos::RCP< const LinearOpBase< Scalar > > clone() const
bool opSupportedImpl(EOpTransp M_trans) const
Returns true only if all constituent operators support M_trans.
Teuchos::RCP< const LinearOpBase< Scalar > > block1x1(const Teuchos::RCP< const LinearOpBase< Scalar > > &A00, const std::string &label="")
Form an implicit block 1x1 linear operator [ A00 ].
Teuchos::RCP< LinearOpBase< Scalar > > nonconstBlock1x1(const Teuchos::RCP< LinearOpBase< Scalar > > &A00, const std::string &label="")
Form an implicit block 1x1 linear operator [ A00 ].
RCP< const ProductMultiVectorBase< Scalar > > castOrCreateSingleBlockProductMultiVector(const RCP< const DefaultProductVectorSpace< Scalar > > &productSpace, const RCP< const MultiVectorBase< Scalar > > &mv)
Dynamic cast to a const product multi-vector or create a new product multi-vector with one component ...
RCP< ProductMultiVectorBase< Scalar > > nonconstCastOrCreateSingleBlockProductMultiVector(const RCP< const DefaultProductVectorSpace< Scalar > > &productSpace, const RCP< MultiVectorBase< Scalar > > &mv)
Dynamic cast to a const product multi-vector or create a new product multi-vector with one component ...
RCP< DefaultProductVectorSpace< Scalar > > productVectorSpace()
Nonmember constructor that constructs to uninitialized.
RCP< const LinearOpBase< Scalar > > scale(const Scalar &scalar, const RCP< const LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit const scaled linear operator.
Base class for all linear operators.
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(...).
bool opSupported(const LinearOpBase< Scalar > &M, EOpTransp M_trans)
Determines if an operation is supported for a single scalar type.
Interface for a collection of column vectors called a multi-vector.
void Vp_V(const Ptr< MultiVectorBase< Scalar > > &Z, const MultiVectorBase< Scalar > &X)
Z(i,j) += X(i,j), i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
Base interface for product vectors.
virtual RCP< const VectorBase< Scalar > > getVectorBlock(const int k) const =0
Returns a non-persisting const view of the (zero-based) kth block vector.
RCP< const ProductVectorSpaceBase< Scalar > > productVectorSpaceBase(const RCP< const VectorSpaceBase< Scalar > > &v, const bool forceSuccess=true)
Dynamic cast from a const VectorSpaceBase to a const ProductVectorSpaceBase object and thow exception...
Interface for exxtracting row statistics as a VectorBase from a supporting LinearOpBase object.
Applies left or right sclaing to the linear operator.
Abstract interface for finite-dimensional dense vectors.
void put_scalar(const Scalar &alpha, const Ptr< VectorBase< Scalar > > &y)
Assign all elements to a scalar: y(i) = alpha, i = 0...y->space()->dim()-1.
void reciprocal(const VectorBase< Scalar > &x, const Ptr< VectorBase< Scalar > > &y)
Element-wise reciprocal: y(i) = 1/x(i), i = 0...y->space()->dim()-1.
RCP< VectorBase< Scalar > > createMember(const RCP< const VectorSpaceBase< Scalar > > &vs, const std::string &label="")
Create a vector member from the vector space.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
#define TEUCHOS_ASSERT_INEQUALITY(val1, comp, val2)
bool is_null(const std::shared_ptr< T > &p)
#define THYRA_ASSERT_LINEAR_OP_MULTIVEC_APPLY_SPACES(FUNC_NAME, M, M_T, X, Y)
This is a very useful macro that should be used to validate that the spaces for the multi-vector vers...
#define THYRA_ASSERT_VEC_SPACES_NAMES(FUNC_NAME, VS1, VS1_NAME, VS2, VS2_NAME)
Helper assertion macro.
void unwrap(const LinearOpBase< Scalar > &Op, Scalar *scalar, EOpTransp *transp, const LinearOpBase< Scalar > **origOp)
Extract the overallScalar, overallTransp and const origOp from a const LinearOpBase object.
const char * toString(EOpTransp transp)
Return a string name for a EOpTransp value.
NOTRANS
Type for the dimension of a vector space. `**/ typedef Teuchos::Ordinal Ordinal;.
EOpTransp real_trans(EOpTransp transp)
Return NOTRANS or TRANS for real scalar valued operators and this also is used for determining struct...
TypeTo as(const TypeFrom &t)
T_To & dyn_cast(T_From &from)
std::string toString(const T &t)
basic_FancyOStream< char > FancyOStream
basic_OSTab< char > OSTab
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)