54 Teuchos::ParameterList& inParamList) {
55#include "Xpetra_UseShortNames.hpp"
57 using Teuchos::ParameterList;
59 using tpMultiVector = Tpetra::MultiVector<SC, LO, GO, NO>;
60 using coordMultiVector = Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO>;
61 using tpCoordMultiVector = Tpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO>;
62 using tpLocalOrdinalVector = Tpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>;
64 using crs_matrix_type = Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
65 using block_crs_matrix_type = Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
67#if defined(HAVE_MUELU_AMGX)
68 std::string externalMG =
"use external multigrid package";
69 if (inParamList.isParameter(externalMG) && inParamList.get<std::string>(externalMG) ==
"amgx") {
70 const RCP<crs_matrix_type> constCrsA = rcp_dynamic_cast<crs_matrix_type>(inA);
71 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.");
78 RCP<block_crs_matrix_type> bcrsA = rcp_dynamic_cast<block_crs_matrix_type>(inA);
79 RCP<crs_matrix_type> crsA = rcp_dynamic_cast<crs_matrix_type>(inA);
80 if (crsA != Teuchos::null)
81 A = Xpetra::toXpetra(crsA);
82 else if (bcrsA != Teuchos::null) {
83 RCP<Xpetra::CrsMatrix<SC, LO, GO, NO>> temp = rcp(
new Xpetra::TpetraBlockCrsMatrix<SC, LO, GO, NO>(bcrsA));
84 TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
85 A = rcp(
new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
87 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
90 Teuchos::ParameterList& userList = inParamList.sublist(
"user data");
91 if (userList.isParameter(
"Coordinates")) {
92 RCP<coordMultiVector> coordinates = Teuchos::null;
94 coordinates = Xpetra::toXpetra(userList.get<RCP<tpCoordMultiVector>>(
"Coordinates"));
95 }
catch (Teuchos::Exceptions::InvalidParameterType&) {
96 coordinates = userList.get<RCP<coordMultiVector>>(
"Coordinates");
98 userList.set<RCP<coordMultiVector>>(
"Coordinates", coordinates);
101 if (userList.isParameter(
"Material")) {
102 RCP<MultiVector> material = Teuchos::null;
104 material = Xpetra::toXpetra(userList.get<RCP<tpMultiVector>>(
"Material"));
105 }
catch (Teuchos::Exceptions::InvalidParameterType&) {
106 material = userList.get<RCP<MultiVector>>(
"Material");
108 userList.set<RCP<MultiVector>>(
"Material", material);
111 if (userList.isParameter(
"Nullspace")) {
112 RCP<MultiVector> nullspace = Teuchos::null;
114 nullspace = Xpetra::toXpetra(userList.get<RCP<tpMultiVector>>(
"Nullspace"));
115 }
catch (Teuchos::Exceptions::InvalidParameterType&) {
116 nullspace = userList.get<RCP<MultiVector>>(
"Nullspace");
118 userList.set<RCP<MultiVector>>(
"Nullspace", nullspace);
121 if (userList.isParameter(
"BlockNumber")) {
122 RCP<LocalOrdinalVector> blockNumber = Teuchos::null;
124 blockNumber = Xpetra::toXpetra(userList.get<RCP<tpLocalOrdinalVector>>(
"BlockNumber"));
125 }
catch (Teuchos::Exceptions::InvalidParameterType&) {
126 blockNumber = userList.get<RCP<LocalOrdinalVector>>(
"BlockNumber");
128 userList.set<RCP<LocalOrdinalVector>>(
"BlockNumber", blockNumber);
131 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC, LO, GO, NO>(A, inParamList);
147 const std::string& xmlFileName) {
148 Teuchos::ParameterList paramList;
149 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *inA->getDomainMap()->getComm());
150 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
200 typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
201 typedef MueLu ::Hierarchy<SC, LO, GO, NO>
Hierarchy;
204 RCP<Xpetra::CrsMatrix<SC, LO, GO, NO>> temp = rcp(
new Xpetra::TpetraBlockCrsMatrix<SC, LO, GO, NO>(inA));
205 TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null,
Exceptions::RuntimeError,
"ReuseTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
206 RCP<Matrix> A = rcp(
new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
208 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....