36 finalP = MatrixFactory2::BuildCopy(rcpFromRef(P0));
40 RCP<const Matrix> A = rcpFromRef(Aref);
42 bool useTpetra = (A->getRowMap()->lib() == Xpetra::UseTpetra);
46 SC one = Teuchos::ScalarTraits<SC>::one();
48 RCP<Matrix> X, P, R, Z, AP;
49 RCP<Matrix> newX, tmpAP;
50#ifndef TWO_ARG_MATRIX_ADD
51 RCP<Matrix> newR, newP;
54 SC oldRZ, newRZ, alpha, beta, app;
57 RCP<CrsMatrix> T_ = CrsMatrixFactory::Build(C.
GetPattern());
58 T_->fillComplete(P0.getDomainMap(), P0.getRangeMap());
59 RCP<Matrix> T = rcp(
new CrsMatrixWrap(T_));
62 X = rcp_const_cast<Matrix>(rcpFromRef(P0));
64 tmpAP = MatrixMatrix::Multiply(*A,
false, *X,
false, mmfancy,
true ,
true );
68 R = Xpetra::MatrixFactory2<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildCopy(T);
73 Z = Xpetra::MatrixFactory2<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildCopy(R);
77 P = Xpetra::MatrixFactory2<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildCopy(Z);
81 for (
size_t i = 0; i <
nIts_; i++) {
83 if (i == 0 || useTpetra) {
88 tmpAP = MatrixMatrix::Multiply(*A,
false, *P,
false, mmfancy,
true ,
true );
91 tmpAP = MatrixMatrix::Multiply(*A,
false, *P,
false, tmpAP, mmfancy,
true ,
true );
97 if (Teuchos::ScalarTraits<SC>::magnitude(app) < Teuchos::ScalarTraits<SC>::sfmin()) {
102 X = MatrixFactory2::BuildCopy(rcpFromRef(P0));
111#ifndef TWO_ARG_MATRIX_ADD
112 newX = Teuchos::null;
113 MatrixMatrix::TwoMatrixAdd(*P,
false, alpha, *X,
false, one, newX, mmfancy);
114 newX->fillComplete(P0.getDomainMap(), P0.getRangeMap());
117 MatrixMatrix::TwoMatrixAdd(*P,
false, alpha, *X, one);
124#ifndef TWO_ARG_MATRIX_ADD
125 newR = Teuchos::null;
126 MatrixMatrix::TwoMatrixAdd(*AP,
false, -alpha, *R,
false, one, newR, mmfancy);
127 newR->fillComplete(P0.getDomainMap(), P0.getRangeMap());
130 MatrixMatrix::TwoMatrixAdd(*AP,
false, -alpha, *R, one);
134 Z = MatrixFactory2::BuildCopy(R);
139 beta = newRZ / oldRZ;
142#ifndef TWO_ARG_MATRIX_ADD
143 newP = Teuchos::null;
144 MatrixMatrix::TwoMatrixAdd(*P,
false, beta, *Z,
false, one, newP, mmfancy);
145 newP->fillComplete(P0.getDomainMap(), P0.getRangeMap());
148 MatrixMatrix::TwoMatrixAdd(*Z,
false, one, *P, beta);
static void MyOldScaleMatrix(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op, const Teuchos::ArrayRCP< const Scalar > &scalingVector, bool doInverse=true, bool doFillComplete=true, bool doOptimizeStorage=true)