54 Teuchos::ParameterList& inParamList) {
60 using Teuchos::ParameterList;
62 typedef Xpetra::MultiVector<SC, LO, GO, NO> MultiVector;
63 typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
65 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> crs_matrix_type;
66 typedef Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> block_crs_matrix_type;
68#if defined(HAVE_MUELU_AMGX)
69 std::string externalMG =
"use external multigrid package";
70 if (inParamList.isParameter(externalMG) && inParamList.get<std::string>(externalMG) ==
"amgx") {
71 const RCP<crs_matrix_type> constCrsA = rcp_dynamic_cast<crs_matrix_type>(inA);
72 TEUCHOS_TEST_FOR_EXCEPTION(constCrsA == Teuchos::null,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: failed to dynamic cast to Tpetra::CrsMatrix, which is required to be able to use AmgX.");
79 RCP<block_crs_matrix_type> bcrsA = rcp_dynamic_cast<block_crs_matrix_type>(inA);
80 RCP<crs_matrix_type> crsA = rcp_dynamic_cast<crs_matrix_type>(inA);
81 if (crsA != Teuchos::null)
83 else if (bcrsA != Teuchos::null) {
84 RCP<Xpetra::CrsMatrix<SC, LO, GO, NO> > temp = rcp(
new Xpetra::TpetraBlockCrsMatrix<SC, LO, GO, NO>(bcrsA));
85 TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
86 A = rcp(
new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
88 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
91 Teuchos::ParameterList& userList = inParamList.sublist(
"user data");
92 if (userList.isParameter(
"Coordinates")) {
93 RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO> > coordinates = Teuchos::null;
96 }
catch (Teuchos::Exceptions::InvalidParameterType&) {
97 coordinates = userList.get<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
LocalOrdinal,
GlobalOrdinal,
Node> > >(
"Coordinates");
99 userList.set<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO> > >(
"Coordinates", coordinates);
102 if (userList.isParameter(
"Material")) {
103 RCP<MultiVector> material = Teuchos::null;
106 }
catch (Teuchos::Exceptions::InvalidParameterType&) {
107 material = userList.get<RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >(
"Material");
109 userList.set<RCP<MultiVector> >(
"Material", material);
112 if (userList.isParameter(
"Nullspace")) {
113 RCP<MultiVector> nullspace = Teuchos::null;
116 }
catch (Teuchos::Exceptions::InvalidParameterType&) {
117 nullspace = userList.get<RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >(
"Nullspace");
119 userList.set<RCP<MultiVector> >(
"Nullspace", nullspace);
191 typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
192 typedef MueLu ::Hierarchy<SC, LO, GO, NO>
Hierarchy;
195 RCP<Xpetra::CrsMatrix<SC, LO, GO, NO> > temp = rcp(
new Xpetra::TpetraBlockCrsMatrix<SC, LO, GO, NO>(inA));
196 TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null,
Exceptions::RuntimeError,
"ReuseTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
197 RCP<Matrix> A = rcp(
new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
Teuchos::RCP< MueLu::TpetraOperator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateTpetraPreconditioner(const Teuchos::RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &inA, Teuchos::ParameterList &inParamList)
Helper function to create a MueLu or AMGX preconditioner that can be used by Tpetra....
void ReuseTpetraPreconditioner(const Teuchos::RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &inA, MueLu::TpetraOperator< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op)
Helper function to reuse an existing MueLu preconditioner.
void ReuseXpetraPreconditioner(const Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &A, Teuchos::RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &H)
Helper function to reuse an existing MueLu preconditioner.
Teuchos::RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateXpetraPreconditioner(Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > op, const Teuchos::ParameterList &inParamList)
Helper function to create a MueLu preconditioner that can be used by Xpetra.Given an Xpetra::Matrix,...