17 const Xpetra::Vector<double, int, int, Xpetra::EpetraNode>& Dinv,
18 const Xpetra::Matrix<double, int, int, Xpetra::EpetraNode>& A,
19 const Xpetra::Matrix<double, int, int, Xpetra::EpetraNode>& B,
20 Xpetra::Matrix<double, int, int, Xpetra::EpetraNode>& C,
21 bool call_FillComplete_on_result,
22 bool doOptimizeStorage,
23 const std::string& label,
24 const Teuchos::RCP<Teuchos::ParameterList>& params) {
28 typedef Xpetra::EpetraNode NO;
31 "MueLu::Jacobi: row map of C is not same as row map of A")
33 "MueLu::Jacobi: row map of C is not same as row map of B");
37 bool haveMultiplyDoFillComplete = call_FillComplete_on_result && doOptimizeStorage;
39 if (C.getRowMap()->lib() == Xpetra::UseEpetra) {
40#ifndef HAVE_MUELU_EPETRAEXT
43 Epetra_CrsMatrix& epA = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstEpetraCrs(A);
44 Epetra_CrsMatrix& epB = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstEpetraCrs(B);
45 Epetra_CrsMatrix& epC = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstEpetraCrs(C);
47 XPETRA_DYNAMIC_CAST(
const Xpetra::EpetraVectorT<GO XPETRA_COMMA NO>, Dinv, epD,
"MueLu::Jacobi() only accepts Xpetra::EpetraVector as input argument.");
50 if (haveMultiplyDoFillComplete) {
61 std::ostringstream buf;
63 std::string msg =
"EpetraExt::MatrixMatrix::Jacobi return value of " + buf.str();
67 }
else if (C.getRowMap()->lib() == Xpetra::UseTpetra) {
68#if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_INT))) || \
69 (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_INT))))
72 const Tpetra::CrsMatrix<SC, LO, GO, NO>& tpA = Xpetra::Helpers<SC, LO, GO, NO>::Op2TpetraCrs(A);
73 const Tpetra::CrsMatrix<SC, LO, GO, NO>& tpB = Xpetra::Helpers<SC, LO, GO, NO>::Op2TpetraCrs(B);
74 Tpetra::CrsMatrix<SC, LO, GO, NO>& tpC = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstTpetraCrs(C);
75 const RCP<Tpetra::Vector<SC, LO, GO, NO> >& tpD = toTpetra(Dinv);
76 Tpetra::MatrixMatrix::Jacobi(omega, *tpD, tpA, tpB, tpC, haveMultiplyDoFillComplete, label, params);
80 if (call_FillComplete_on_result && !haveMultiplyDoFillComplete) {
81 RCP<Teuchos::ParameterList> ppp = rcp(
new Teuchos::ParameterList());
82 ppp->set(
"Optimize Storage", doOptimizeStorage);
83 C.fillComplete(B.getDomainMap(), B.getRangeMap(), ppp);
87 Teuchos::RCP<Xpetra::Matrix<SC, LO, GO, NO> > rcpA = Teuchos::rcp_const_cast<Xpetra::Matrix<SC, LO, GO, NO> >(Teuchos::rcpFromRef(A));
88 Teuchos::RCP<Xpetra::Matrix<SC, LO, GO, NO> > rcpB = Teuchos::rcp_const_cast<Xpetra::Matrix<SC, LO, GO, NO> >(Teuchos::rcpFromRef(B));
89 C.CreateView(
"stridedMaps", rcpA,
false, rcpB,
false);
96 const Xpetra::Vector<double, int, long long, Xpetra::EpetraNode>& Dinv,
97 const Xpetra::Matrix<double, int, long long, Xpetra::EpetraNode>& A,
98 const Xpetra::Matrix<double, int, long long, Xpetra::EpetraNode>& B,
99 Xpetra::Matrix<double, int, long long, Xpetra::EpetraNode>& C,
100 bool call_FillComplete_on_result,
101 bool doOptimizeStorage,
102 const std::string& label,
103 const Teuchos::RCP<Teuchos::ParameterList>& params) {
106 typedef long long GO;
107 typedef Xpetra::EpetraNode NO;
110 "MueLu::Jacobi: row map of C is not same as row map of A")
112 "MueLu::Jacobi: row map of C is not same as row map of B");
116 bool haveMultiplyDoFillComplete = call_FillComplete_on_result && doOptimizeStorage;
118 if (C.getRowMap()->lib() == Xpetra::UseEpetra) {
119#ifndef HAVE_MUELU_EPETRAEXT
122 Epetra_CrsMatrix& epA = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstEpetraCrs(A);
123 Epetra_CrsMatrix& epB = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstEpetraCrs(B);
124 Epetra_CrsMatrix& epC = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstEpetraCrs(C);
126 XPETRA_DYNAMIC_CAST(
const Xpetra::EpetraVectorT<GO XPETRA_COMMA NO>, Dinv, epD,
"MueLu::Jacobi() only accepts Xpetra::EpetraVector as input argument.");
129 if (haveMultiplyDoFillComplete) {
140 std::ostringstream buf;
142 std::string msg =
"EpetraExt::MatrixMatrix::Jacobi return value of " + buf.str();
146 }
else if (C.getRowMap()->lib() == Xpetra::UseTpetra) {
147#if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
148 (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
151 const Tpetra::CrsMatrix<SC, LO, GO, NO>& tpA = Xpetra::Helpers<SC, LO, GO, NO>::Op2TpetraCrs(A);
152 const Tpetra::CrsMatrix<SC, LO, GO, NO>& tpB = Xpetra::Helpers<SC, LO, GO, NO>::Op2TpetraCrs(B);
153 Tpetra::CrsMatrix<SC, LO, GO, NO>& tpC = Xpetra::Helpers<SC, LO, GO, NO>::Op2NonConstTpetraCrs(C);
154 const RCP<Tpetra::Vector<SC, LO, GO, NO> >& tpD = toTpetra(Dinv);
155 Tpetra::MatrixMatrix::Jacobi(omega, *tpD, tpA, tpB, tpC, haveMultiplyDoFillComplete, label, params);
159 if (call_FillComplete_on_result && !haveMultiplyDoFillComplete) {
160 RCP<Teuchos::ParameterList> ppp = rcp(
new Teuchos::ParameterList());
161 ppp->set(
"Optimize Storage", doOptimizeStorage);
162 C.fillComplete(B.getDomainMap(), B.getRangeMap(), ppp);
166 Teuchos::RCP<Xpetra::Matrix<SC, LO, GO, NO> > rcpA = Teuchos::rcp_const_cast<Xpetra::Matrix<SC, LO, GO, NO> >(Teuchos::rcpFromRef(A));
167 Teuchos::RCP<Xpetra : Matrix<SC, LO, GO, NO> > rcpB = Teuchos::rcp_const_cast<Xpetra::Matrix<SC, LO, GO, NO> >(Teuchos::rcpFromRef(B));
168 C.CreateView(
"stridedMaps", rcpA,
false, rcpB,
false);
void Jacobi< double, int, long long, Xpetra::EpetraNode >(double omega, const Xpetra::Vector< double, int, long long, Xpetra::EpetraNode > &Dinv, const Xpetra::Matrix< double, int, long long, Xpetra::EpetraNode > &A, const Xpetra::Matrix< double, int, long long, Xpetra::EpetraNode > &B, Xpetra::Matrix< double, int, long long, Xpetra::EpetraNode > &C, bool call_FillComplete_on_result, bool doOptimizeStorage, const std::string &label, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
void Jacobi< double, int, int, Xpetra::EpetraNode >(double omega, const Xpetra::Vector< double, int, int, Xpetra::EpetraNode > &Dinv, const Xpetra::Matrix< double, int, int, Xpetra::EpetraNode > &A, const Xpetra::Matrix< double, int, int, Xpetra::EpetraNode > &B, Xpetra::Matrix< double, int, int, Xpetra::EpetraNode > &C, bool call_FillComplete_on_result, bool doOptimizeStorage, const std::string &label, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)