47 #include "Teko_BlockUpperTriInverseOp.hpp" 49 #include "Teuchos_Utils.hpp" 65 BlockUpperTriInverseOp::BlockUpperTriInverseOp(BlockedLinearOp & U,
const std::vector<LinearOp> & invDiag)
72 TEUCHOS_ASSERT(blocks>0);
74 TEUCHOS_ASSERT(blocks==(
int)
invDiag_.size());
97 const double alpha,
const double beta)
const 105 srcScrap_ =
datacopy(src,srcScrap_);
106 BlockedMultiVector dstCopy;
108 dstScrap_ =
datacopy(dst,dstScrap_);
116 std::vector<MultiVector> dstVec;
117 std::vector<MultiVector> scrapVec;
118 for(
int b=0;b<blocks;b++) {
119 dstVec.push_back(
getBlock(b,dstCopy));
120 scrapVec.push_back(
getBlock(b,srcScrap_));
125 for(
int b=blocks-1;b>=0;b--) {
126 applyOp(
invDiag_[b], scrapVec[b], dstVec[b]);
129 for(
int i=0;i<b;i++) {
131 if(u_ib!=Teuchos::null) {
132 applyOp(u_ib,dstVec[b],scrapVec[i],-1.0,1.0);
139 update(alpha,dstCopy,beta,dst);
144 void BlockUpperTriInverseOp::describe(Teuchos::FancyOStream & out_arg,
145 const Teuchos::EVerbosityLevel verbLevel)
const 147 using Teuchos::OSTab;
149 RCP<Teuchos::FancyOStream> out = rcp(&out_arg,
false);
152 case Teuchos::VERB_DEFAULT:
153 case Teuchos::VERB_LOW:
154 *out << this->description() << std::endl;
156 case Teuchos::VERB_MEDIUM:
157 case Teuchos::VERB_HIGH:
158 case Teuchos::VERB_EXTREME:
160 *out << Teuchos::Describable::description() <<
"{" 161 <<
"rangeDim=" << this->
range()->dim()
162 <<
",domainDim=" << this->
domain()->dim()
168 *out <<
"[U Operator] = ";
169 *out << Teuchos::describe(*
U_,verbLevel);
173 *out <<
"[invDiag Operators]:\n";
176 *out <<
"[invD(" << i <<
")] = ";
177 *out << Teuchos::describe(*
invDiag_[i],verbLevel);
183 TEUCHOS_TEST_FOR_EXCEPT(
true);
int blockCount(const BlockedMultiVector &bmv)
Get the column count in a block linear operator.
virtual VectorSpace domain() const
Domain space of this operator.
int blockRowCount(const BlockedLinearOp &blo)
Get the row count in a block linear operator.
void scale(const double alpha, MultiVector &x)
Scale a multivector by a constant.
std::vector< LinearOp > invDiag_
(Approximate) Inverses of the diagonal operators
virtual VectorSpace range() const
Range space of this operator.
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productRange_
Range vector space.
virtual void implicitApply(const BlockedMultiVector &x, BlockedMultiVector &y, const double alpha=1.0, const double beta=0.0) const
Perform a matrix vector multiply with this operator.
const BlockedLinearOp U_
operator
MultiVector datacopy(const MultiVector &src, MultiVector &dst)
Copy the contents of a multivector to a destination vector.
MultiVector getBlock(int i, const BlockedMultiVector &bmv)
Get the ith block from a BlockedMultiVector object.
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productDomain_
Domain vector space.
int blockColCount(const BlockedLinearOp &blo)
Get the column count in a block linear operator.