1 #ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP 2 #define MUELU_CREATE_TPETRA_PRECONDITIONER_HPP 7 #include <Teuchos_XMLParameterListHelpers.hpp> 8 #include <Tpetra_Operator.hpp> 9 #include <Tpetra_RowMatrix.hpp> 10 #include <Xpetra_TpetraBlockCrsMatrix.hpp> 11 #include <Tpetra_Experimental_BlockCrsMatrix.hpp> 12 #include <Xpetra_CrsMatrix.hpp> 13 #include <Xpetra_MultiVector.hpp> 14 #include <Xpetra_MultiVectorFactory.hpp> 19 #include <MueLu_Hierarchy.hpp> 21 #include <MueLu_MLParameterListInterpreter.hpp> 22 #include <MueLu_ParameterListInterpreter.hpp> 23 #include <MueLu_TpetraOperator.hpp> 25 #include <MueLu_Utilities.hpp> 26 #include <MueLu_HierarchyUtils.hpp> 29 #if defined(HAVE_MUELU_EXPERIMENTAL) and defined(HAVE_MUELU_AMGX) 30 #include <MueLu_AMGXOperator.hpp> 32 #include "cuda_runtime.h" 46 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
47 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
49 Teuchos::ParameterList& inParamList,
50 Teuchos::ParameterList& dummyList)
53 typedef LocalOrdinal LO;
54 typedef GlobalOrdinal GO;
57 using Teuchos::ParameterList;
59 typedef Xpetra::MultiVector<SC,LO,GO,NO> MultiVector;
60 typedef Xpetra::Matrix<SC,LO,GO,NO> Matrix;
62 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> crs_matrix_type;
63 typedef Tpetra::Experimental::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> block_crs_matrix_type;
65 #if defined(HAVE_MUELU_EXPERIMENTAL) and defined(HAVE_MUELU_AMGX) 66 std::string externalMG =
"use external multigrid package";
67 if (hasParamList && paramList.isParameter(externalMG) && paramList.get<std::string>(externalMG) ==
"amgx"){
68 constCrsA = rcp_dynamic_cast<
const crs_matrix_type>(inA);
69 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.");
76 RCP<block_crs_matrix_type> bcrsA = rcp_dynamic_cast<block_crs_matrix_type>(inA);
77 RCP<crs_matrix_type> crsA = rcp_dynamic_cast<crs_matrix_type>(inA);
78 if (crsA != Teuchos::null)
79 A = TpetraCrs_To_XpetraMatrix<SC,LO,GO,NO>(crsA);
80 else if (bcrsA != Teuchos::null) {
81 RCP<Xpetra::CrsMatrix<SC,LO,GO,NO> > temp = rcp(
new Xpetra::TpetraBlockCrsMatrix<SC,LO,GO,NO>(bcrsA));
82 TEUCHOS_TEST_FOR_EXCEPTION(temp==Teuchos::null,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: cast from Tpetra::Experimental::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
83 A = rcp(
new Xpetra::CrsMatrixWrap<SC,LO,GO,NO>(temp));
86 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
89 Teuchos::ParameterList& userList = inParamList.sublist(
"user data");
90 if (userList.isParameter(
"Coordinates")) {
91 RCP<Xpetra::MultiVector<double,LO,GO,NO> > coordinates = Teuchos::null;
93 coordinates = TpetraMultiVector_To_XpetraMultiVector<double,LO,GO,NO>(userList.get<RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node> > >(
"Coordinates"));
94 }
catch(Teuchos::Exceptions::InvalidParameterType) {
95 coordinates = userList.get<RCP<Xpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node> > >(
"Coordinates");
97 userList.set<RCP<Xpetra::MultiVector<double,LO,GO,NO> > >(
"Coordinates", coordinates);
99 RCP<MultiVector> nullspace = Teuchos::null;
100 if (userList.isParameter(
"Nullspace")) {
102 nullspace = TpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(userList.get<RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >(
"Nullspace"));
103 }
catch(Teuchos::Exceptions::InvalidParameterType) {
104 nullspace = userList.get<RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >(
"Nullspace");
107 if(nullspace == Teuchos::null) {
108 int nPDE = MueLu::MasterList::getDefault<int>(
"number of equations");
109 if (inParamList.isSublist(
"Matrix")) {
111 const Teuchos::ParameterList& operatorList = inParamList.sublist(
"Matrix");
112 if (operatorList.isParameter(
"PDE equations"))
113 nPDE = operatorList.get<
int>(
"PDE equations");
115 }
else if (inParamList.isParameter(
"number of equations")) {
117 nPDE = inParamList.get<
int>(
"number of equations");
120 nullspace = Xpetra::MultiVectorFactory<SC,LO,GO,NO>::Build(A->getDomainMap(), nPDE);
122 nullspace->putScalar(Teuchos::ScalarTraits<Scalar>::one());
125 for (
int i = 0; i < nPDE; i++) {
126 Teuchos::ArrayRCP<Scalar> nsData = nullspace->getDataNonConst(i);
127 for (
int j = 0; j < nsData.size(); j++) {
128 GlobalOrdinal GID = A->getDomainMap()->getGlobalElement(j) - A->getDomainMap()->getIndexBase();
129 if ((GID-i) % nPDE == 0)
130 nsData[j] = Teuchos::ScalarTraits<Scalar>::one();
135 if(nullspace == Teuchos::null) {std::cout <<
"The nullspace is still Teuchos::null as it is added to the Hierarchy!" << std::endl;}
136 userList.set<RCP<MultiVector> >(
"Nullspace", nullspace);
138 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC,LO,GO,NO>(A,inParamList,inParamList);
152 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
153 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
155 Teuchos::ParameterList& inParamList,
156 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
157 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
160 typedef LocalOrdinal LO;
161 typedef GlobalOrdinal GO;
164 using Teuchos::ParameterList;
170 Teuchos::ParameterList& userList = inParamList.sublist(
"user data");
171 if (inCoords != Teuchos::null) {
172 userList.set<RCP<Tpetra::MultiVector<double,LO,GO,NO> > >(
"Coordinates", inCoords);
174 if (inNullspace != Teuchos::null) {
175 userList.set<RCP<Tpetra::MultiVector<SC,LO,GO,NO> > >(
"Nullspace", inNullspace);
178 return CreateTpetraPreconditioner<SC,LO,GO,NO>(inA,inParamList,inParamList);
194 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
196 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
198 Teuchos::ParameterList& inParamList,
199 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
200 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
202 RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>> opMat(inA);
203 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(opMat, inParamList, inCoords, inNullspace);
218 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
220 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
222 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
223 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
225 Teuchos::ParameterList paramList;
226 RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>> opMat(inA);
227 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(opMat, paramList, inCoords, inNullspace);
243 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
245 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
247 const std::string& xmlFileName,
248 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
249 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
251 Teuchos::ParameterList paramList;
252 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *inA->getComm());
254 RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>> opMat(inA);
255 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(opMat, paramList, inCoords, inNullspace);
269 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
270 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
272 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
273 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
275 Teuchos::ParameterList paramList;
276 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList, inCoords, inNullspace);
291 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
292 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
294 const std::string& xmlFileName,
295 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
296 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
298 Teuchos::ParameterList paramList;
299 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *inA->getDomainMap()->getComm());
300 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList, inCoords, inNullspace);
311 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
315 typedef LocalOrdinal LO;
316 typedef GlobalOrdinal GO;
319 typedef Xpetra::Matrix<SC,LO,GO,NO> Matrix;
320 typedef MueLu ::Hierarchy<SC,LO,GO,NO>
Hierarchy;
323 RCP<Matrix> A = TpetraCrs_To_XpetraMatrix<SC,LO,GO,NO>(inA);
325 MueLu::ReuseXpetraPreconditioner<SC,LO,GO,NO>(A, H);
330 #endif //ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP Various adapters that will create a MueLu preconditioner that is an Xpetra::Matrix.
Namespace for MueLu classes and methods.
RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > GetHierarchy() const
Direct access to the underlying MueLu::Hierarchy.
Teuchos::RCP< MueLu::TpetraOperator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateTpetraPreconditioner(const Teuchos::RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &inA, Teuchos::ParameterList &inParamList, Teuchos::ParameterList &dummyList)
Helper function to create a MueLu or AMGX preconditioner that can be used by Tpetra.Given a Tpetra::Operator, this function returns a constructed MueLu preconditioner.
Wraps an existing MueLu::Hierarchy as a Tpetra::Operator.
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.
Exception throws to report errors in the internal logical of the program.
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
Adapter for AmgX library from Nvidia.