10#include "Teko_BlockDiagonalInverseOp.hpp"
12#include "Teuchos_Utils.hpp"
18BlockDiagonalInverseOp::BlockDiagonalInverseOp(BlockedLinearOp& A,
19 const std::vector<LinearOp>& invDiag)
23 TEUCHOS_ASSERT(blocks > 0);
25 TEUCHOS_ASSERT(blocks == (
int)
invDiag_.size());
36 const double alpha,
const double beta)
const {
42bool compatibleMultiVectors(
const BlockedMultiVector& a,
const BlockedMultiVector& b) {
43 if (!a || !b)
return false;
45 return a->domain()->dim() == b->domain()->dim();
50 const BlockedMultiVector& src, BlockedMultiVector& dst,
51 const double alpha,
const double beta)
const {
54 TEUCHOS_ASSERT(blocks == (
int)
invDiag_.size());
56 bool needsAlloc = !allocated;
57 needsAlloc |= !compatibleMultiVectors(srcScrap_, src);
58 needsAlloc |= !compatibleMultiVectors(dstScrap_, dst);
66 Thyra::assign<double>(srcScrap_.ptr(), *src);
67 BlockedMultiVector dstCopy;
69 Thyra::assign<double>(dstScrap_.ptr(), *dst);
76 std::vector<MultiVector> dstVec;
77 std::vector<MultiVector> scrapVec;
78 for (
int b = 0; b < blocks; b++) {
79 dstVec.push_back(
getBlock(b, dstCopy));
80 scrapVec.push_back(
getBlock(b, srcScrap_));
83 if (M_trans == Thyra::NOTRANS) {
84 for (
int b = 0; b < blocks; b++) {
85 applyOp(
invDiag_[b], scrapVec[b], dstVec[b]);
87 }
else if (M_trans == Thyra::TRANS || M_trans == Thyra::CONJTRANS) {
88 for (
int b = 0; b < blocks; b++) {
89 applyTransposeOp(
invDiag_[b], scrapVec[b], dstVec[b]);
92 TEUCHOS_TEST_FOR_EXCEPT(
true);
97 update(alpha, dstCopy, beta, dst);
98 else if (alpha != 1.0)
102void BlockDiagonalInverseOp::describe(Teuchos::FancyOStream& out_arg,
103 const Teuchos::EVerbosityLevel verbLevel)
const {
104 using Teuchos::OSTab;
106 RCP<Teuchos::FancyOStream> out = rcp(&out_arg,
false);
109 case Teuchos::VERB_DEFAULT:
110 case Teuchos::VERB_LOW: *out << this->description() << std::endl;
break;
111 case Teuchos::VERB_MEDIUM:
112 case Teuchos::VERB_HIGH:
113 case Teuchos::VERB_EXTREME: {
114 *out << Teuchos::Describable::description() <<
"{"
115 <<
"rangeDim=" << this->
range()->dim() <<
",domainDim=" << this->
domain()->dim()
119 *out <<
"[invDiag Operators]:\n";
121 for (
auto i = 0U; i <
invDiag_.size(); i++) {
122 *out <<
"[invD(" << i <<
")] = ";
123 *out << Teuchos::describe(*
invDiag_[i], verbLevel);
128 default: TEUCHOS_TEST_FOR_EXCEPT(
true);
void scale(const double alpha, MultiVector &x)
Scale a multivector by a constant.
int blockRowCount(const BlockedLinearOp &blo)
Get the row count in a block linear operator.
int blockCount(const BlockedMultiVector &bmv)
Get the column count in a block linear operator.
MultiVector getBlock(int i, const BlockedMultiVector &bmv)
Get the ith block from a BlockedMultiVector object.
MultiVector deepcopy(const MultiVector &v)
Perform a deep copy of the vector.
int blockColCount(const BlockedLinearOp &blo)
Get the column count in a block linear operator.
virtual VectorSpace domain() const
Domain space of this operator.
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productRange_
Range vector space.
virtual VectorSpace range() const
Range space of this operator.
std::vector< LinearOp > invDiag_
(Approximate) Inverses of the diagonal operators
Teuchos::RCP< const Thyra::ProductVectorSpaceBase< double > > productDomain_
Domain 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.