66 const BlockedMultiVector& src, BlockedMultiVector& dst,
67 const double alpha,
const double beta)
const {
70 TEUCHOS_ASSERT(blocks == blockRowCount(
U_));
80 Thyra::assign<double>(srcScrap_.ptr(), *src);
81 BlockedMultiVector dstCopy;
83 Thyra::assign<double>(dstScrap_.ptr(), *dst);
90 std::vector<MultiVector> dstVec;
91 std::vector<MultiVector> scrapVec;
92 for (
int b = 0; b < blocks; b++) {
93 dstVec.push_back(
getBlock(b, dstCopy));
94 scrapVec.push_back(
getBlock(b, srcScrap_));
99 if (M_trans == Thyra::NOTRANS) {
100 for (
int b = blocks - 1; b >= 0; b--) {
101 applyOp(
invDiag_[b], scrapVec[b], dstVec[b]);
104 for (
int i = 0; i < b; i++) {
106 if (u_ib != Teuchos::null) {
107 applyOp(u_ib, dstVec[b], scrapVec[i], -1.0, 1.0);
111 }
else if (M_trans == Thyra::TRANS || M_trans == Thyra::CONJTRANS) {
112 for (
int b = 0; b < blocks; b++) {
113 applyTransposeOp(
invDiag_[b], scrapVec[b], dstVec[b]);
116 for (
int i = b + 1; i < blocks; i++) {
118 if (u_bi != Teuchos::null) {
119 applyTransposeOp(u_bi, dstVec[b], scrapVec[i], -1.0, 1.0);
124 TEUCHOS_TEST_FOR_EXCEPT(
true);
129 update(alpha, dstCopy, beta, dst);
130 else if (alpha != 1.0)