48 Teuchos::ParameterList& inParamList)
55 using Teuchos::ParameterList;
57 typedef Xpetra::MultiVector<SC,LO,GO,NO> MultiVector;
58 typedef Xpetra::Matrix<SC,LO,GO,NO> Matrix;
60 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> crs_matrix_type;
61 typedef Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> block_crs_matrix_type;
63#if defined(HAVE_MUELU_AMGX)
64 std::string externalMG =
"use external multigrid package";
65 if (inParamList.isParameter(externalMG) && inParamList.get<std::string>(externalMG) ==
"amgx"){
66 const RCP<crs_matrix_type> constCrsA = rcp_dynamic_cast<crs_matrix_type>(inA);
67 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.");
74 RCP<block_crs_matrix_type> bcrsA = rcp_dynamic_cast<block_crs_matrix_type>(inA);
75 RCP<crs_matrix_type> crsA = rcp_dynamic_cast<crs_matrix_type>(inA);
76 if (crsA != Teuchos::null)
77 A = TpetraCrs_To_XpetraMatrix<SC,LO,GO,NO>(crsA);
78 else if (bcrsA != Teuchos::null) {
79 RCP<Xpetra::CrsMatrix<SC,LO,GO,NO> > temp = rcp(
new Xpetra::TpetraBlockCrsMatrix<SC,LO,GO,NO>(bcrsA));
80 TEUCHOS_TEST_FOR_EXCEPTION(temp==Teuchos::null,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
81 A = rcp(
new Xpetra::CrsMatrixWrap<SC,LO,GO,NO>(temp));
84 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
87 Teuchos::ParameterList& userList = inParamList.sublist(
"user data");
88 if (userList.isParameter(
"Coordinates")) {
89 RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,LO,GO,NO> > coordinates = Teuchos::null;
91 coordinates = TpetraMultiVector_To_XpetraMultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,LO,GO,NO>(userList.get<RCP<Tpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
LocalOrdinal,
GlobalOrdinal,
Node> > >(
"Coordinates"));
92 }
catch(Teuchos::Exceptions::InvalidParameterType&) {
93 coordinates = userList.get<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,
LocalOrdinal,
GlobalOrdinal,
Node> > >(
"Coordinates");
95 userList.set<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType,LO,GO,NO> > >(
"Coordinates", coordinates);
98 if (userList.isParameter(
"Nullspace")) {
99 RCP<MultiVector> nullspace = Teuchos::null;
101 nullspace = TpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(userList.get<RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >(
"Nullspace"));
102 }
catch(Teuchos::Exceptions::InvalidParameterType&) {
103 nullspace = userList.get<RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >(
"Nullspace");
105 userList.set<RCP<MultiVector> >(
"Nullspace", nullspace);
108 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC,LO,GO,NO>(A, inParamList);
125 const std::string& xmlFileName)
127 Teuchos::ParameterList paramList;
128 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *inA->getDomainMap()->getComm());
129 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
165 typedef Xpetra::Matrix<SC,LO,GO,NO> Matrix;
166 typedef MueLu ::Hierarchy<SC,LO,GO,NO>
Hierarchy;
169 RCP<Matrix> A = TpetraCrs_To_XpetraMatrix<SC,LO,GO,NO>(inA);
171 MueLu::ReuseXpetraPreconditioner<SC,LO,GO,NO>(A, H);
182 typedef Xpetra::Matrix<SC,LO,GO,NO> Matrix;
183 typedef MueLu ::Hierarchy<SC,LO,GO,NO>
Hierarchy;
186 RCP<Xpetra::CrsMatrix<SC,LO,GO,NO> > temp = rcp(
new Xpetra::TpetraBlockCrsMatrix<SC,LO,GO,NO>(inA));
187 TEUCHOS_TEST_FOR_EXCEPTION(temp==Teuchos::null,
Exceptions::RuntimeError,
"ReuseTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
188 RCP<Matrix> A = rcp(
new Xpetra::CrsMatrixWrap<SC,LO,GO,NO>(temp));
190 MueLu::ReuseXpetraPreconditioner<SC,LO,GO,NO>(A, H);
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.