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> 11 #include <Tpetra_Experimental_BlockCrsMatrix.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" 47 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
48 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
50 Teuchos::ParameterList& inParamList,
51 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
52 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
55 typedef LocalOrdinal
LO;
56 typedef GlobalOrdinal
GO;
59 using Teuchos::ParameterList;
65 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> crs_matrix_type;
66 typedef Tpetra::Experimental::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> block_crs_matrix_type;
68 #if defined(HAVE_MUELU_EXPERIMENTAL) and defined(HAVE_MUELU_AMGX) 69 std::string externalMG =
"use external multigrid package";
70 if (hasParamList && paramList.isParameter(externalMG) && paramList.get<std::string>(externalMG) ==
"amgx"){
71 constCrsA = rcp_dynamic_cast<
const 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)
82 A = TpetraCrs_To_XpetraMatrix<SC,LO,GO,NO>(crsA);
83 else if (bcrsA != Teuchos::null) {
85 TEUCHOS_TEST_FOR_EXCEPTION(temp==Teuchos::null,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: cast from Tpetra::Experimental::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
89 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
92 RCP<Xpetra::MultiVector<double,LO,GO,NO> > coordinates = Teuchos::null;
93 if (inCoords != Teuchos::null) {
94 coordinates = TpetraMultiVector_To_XpetraMultiVector<double,LO,GO,NO>(inCoords);
96 RCP<MultiVector> nullspace = Teuchos::null;
97 if (inNullspace != Teuchos::null) {
98 nullspace = TpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inNullspace);
101 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC,LO,GO,NO>(A,inParamList,coordinates,nullspace);
118 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
120 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
122 Teuchos::ParameterList& inParamList,
123 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
124 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
126 RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>> opMat(inA);
127 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(opMat, inParamList, inCoords, inNullspace);
142 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
144 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
146 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
147 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
149 Teuchos::ParameterList paramList;
150 RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>> opMat(inA);
151 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(opMat, paramList, inCoords, inNullspace);
167 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
169 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
171 const std::string& xmlFileName,
172 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
173 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
175 Teuchos::ParameterList paramList;
176 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *inA->getComm());
178 RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>> opMat(inA);
179 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(opMat, paramList, inCoords, inNullspace);
193 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
194 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
196 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
197 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
199 Teuchos::ParameterList paramList;
200 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList, inCoords, inNullspace);
215 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
216 Teuchos::RCP<MueLu::TpetraOperator<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
218 const std::string& xmlFileName,
219 const Teuchos::RCP<Tpetra::MultiVector<double, LocalOrdinal, GlobalOrdinal, Node>>& inCoords = Teuchos::null,
220 const Teuchos::RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inNullspace = Teuchos::null)
222 Teuchos::ParameterList paramList;
223 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(¶mList), *inA->getDomainMap()->getComm());
224 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList, inCoords, inNullspace);
235 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
239 typedef LocalOrdinal
LO;
240 typedef GlobalOrdinal
GO;
244 typedef MueLu ::Hierarchy<SC,LO,GO,NO>
Hierarchy;
247 RCP<Matrix> A = TpetraCrs_To_XpetraMatrix<SC,LO,GO,NO>(inA);
249 MueLu::ReuseXpetraPreconditioner<SC,LO,GO,NO>(A, H);
254 #endif //ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
Namespace for MueLu classes and methods.
Teuchos::RCP< MueLu::TpetraOperator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateTpetraPreconditioner(const Teuchos::RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &inA, Teuchos::ParameterList &inParamList, const Teuchos::RCP< Tpetra::MultiVector< double, LocalOrdinal, GlobalOrdinal, Node >> &inCoords=Teuchos::null, const Teuchos::RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node >> &inNullspace=Teuchos::null)
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.
RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > GetHierarchy() const
Direct access to the underlying MueLu::Hierarchy.
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.