47 #include "Teko_BlockUpperTriInverseOp.hpp"
49 #include "Teuchos_Utils.hpp"
65 BlockUpperTriInverseOp::BlockUpperTriInverseOp(BlockedLinearOp& U,
66 const std::vector<LinearOp>& invDiag)
71 int blocks = blockRowCount(
U_);
72 TEUCHOS_ASSERT(blocks > 0);
73 TEUCHOS_ASSERT(blocks == blockColCount(
U_));
74 TEUCHOS_ASSERT(blocks == (
int)
invDiag_.size());
85 const double alpha,
const double beta)
const {
103 const BlockedMultiVector& src, BlockedMultiVector& dst,
104 const double alpha,
const double beta)
const {
105 int blocks = blockCount(src);
107 TEUCHOS_ASSERT(blocks == blockRowCount(
U_));
108 TEUCHOS_ASSERT(blocks == blockCount(dst));
111 srcScrap_ = datacopy(src, srcScrap_);
112 BlockedMultiVector dstCopy;
114 dstScrap_ = datacopy(dst, dstScrap_);
121 std::vector<MultiVector> dstVec;
122 std::vector<MultiVector> scrapVec;
123 for (
int b = 0; b < blocks; b++) {
124 dstVec.push_back(getBlock(b, dstCopy));
125 scrapVec.push_back(getBlock(b, srcScrap_));
130 if (M_trans == Thyra::NOTRANS) {
131 for (
int b = blocks - 1; b >= 0; b--) {
132 applyOp(
invDiag_[b], scrapVec[b], dstVec[b]);
135 for (
int i = 0; i < b; i++) {
136 LinearOp u_ib = getBlock(i, b,
U_);
137 if (u_ib != Teuchos::null) {
138 applyOp(u_ib, dstVec[b], scrapVec[i], -1.0, 1.0);
142 }
else if (M_trans == Thyra::TRANS || M_trans == Thyra::CONJTRANS) {
143 for (
int b = 0; b < blocks; b++) {
144 applyTransposeOp(
invDiag_[b], scrapVec[b], dstVec[b]);
147 for (
int i = b + 1; i < blocks; i++) {
148 LinearOp u_bi = getBlock(b, i,
U_);
149 if (u_bi != Teuchos::null) {
150 applyTransposeOp(u_bi, dstVec[b], scrapVec[i], -1.0, 1.0);
155 TEUCHOS_TEST_FOR_EXCEPT(
true);
160 update(alpha, dstCopy, beta, dst);
161 else if (alpha != 1.0)
165 void BlockUpperTriInverseOp::describe(Teuchos::FancyOStream& out_arg,
166 const Teuchos::EVerbosityLevel verbLevel)
const {
167 using Teuchos::OSTab;
169 RCP<Teuchos::FancyOStream> out = rcp(&out_arg,
false);
172 case Teuchos::VERB_DEFAULT:
173 case Teuchos::VERB_LOW: *out << this->description() << std::endl;
break;
174 case Teuchos::VERB_MEDIUM:
175 case Teuchos::VERB_HIGH:
176 case Teuchos::VERB_EXTREME: {
177 *out << Teuchos::Describable::description() <<
"{"
178 <<
"rangeDim=" << this->
range()->dim() <<
",domainDim=" << this->
domain()->dim()
179 <<
",rows=" << blockRowCount(
U_) <<
",cols=" << blockColCount(
U_) <<
"}\n";
182 *out <<
"[U Operator] = ";
183 *out << Teuchos::describe(*
U_, verbLevel);
187 *out <<
"[invDiag Operators]:\n";
189 for (
int i = 0; i < blockRowCount(
U_); i++) {
190 *out <<
"[invD(" << i <<
")] = ";
191 *out << Teuchos::describe(*
invDiag_[i], verbLevel);
196 default: TEUCHOS_TEST_FOR_EXCEPT(
true);
virtual VectorSpace domain() const
Domain space of this operator.
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
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productDomain_
Domain vector space.