MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_CreateTpetraPreconditioner.hpp
Go to the documentation of this file.
1 #ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
2 #define MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
3 
6 
8 #include <Tpetra_Operator.hpp>
9 #include <Tpetra_RowMatrix.hpp>
10 #include <Xpetra_TpetraBlockCrsMatrix.hpp>
11 #include <Tpetra_BlockCrsMatrix.hpp>
12 #include <Xpetra_CrsMatrix.hpp>
13 #include <Xpetra_MultiVector.hpp>
14 #include <Xpetra_MultiVectorFactory.hpp>
15 
16 #include <MueLu.hpp>
17 
18 #include <MueLu_Exceptions.hpp>
19 #include <MueLu_Hierarchy.hpp>
20 #include <MueLu_MasterList.hpp>
21 #include <MueLu_ParameterListInterpreter.hpp>
22 #include <MueLu_TpetraOperator.hpp>
24 #include <MueLu_Utilities.hpp>
25 #include <MueLu_HierarchyUtils.hpp>
26 
27 #if defined(HAVE_MUELU_AMGX)
28 #include <MueLu_AMGXOperator.hpp>
29 #include <amgx_c.h>
30 #include "cuda_runtime.h"
31 #endif
32 
33 namespace MueLu {
34 
42 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
45  Teuchos::ParameterList& inParamList) {
46  typedef Scalar SC;
47  typedef LocalOrdinal LO;
48  typedef GlobalOrdinal GO;
49  typedef Node NO;
50 
52 
53  typedef Xpetra::MultiVector<SC, LO, GO, NO> MultiVector;
54  typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
58 
59 #if defined(HAVE_MUELU_AMGX)
60  std::string externalMG = "use external multigrid package";
61  if (inParamList.isParameter(externalMG) && inParamList.get<std::string>(externalMG) == "amgx") {
62  const RCP<crs_matrix_type> constCrsA = rcp_dynamic_cast<crs_matrix_type>(inA);
63  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.");
64  return rcp(new AMGXOperator<SC, LO, GO, NO>(constCrsA, inParamList));
65  }
66 #endif
67 
68  // Wrap A
69  RCP<Matrix> A;
70  RCP<block_crs_matrix_type> bcrsA = rcp_dynamic_cast<block_crs_matrix_type>(inA);
71  RCP<crs_matrix_type> crsA = rcp_dynamic_cast<crs_matrix_type>(inA);
72  if (crsA != Teuchos::null)
73  A = TpetraCrs_To_XpetraMatrix<SC, LO, GO, NO>(crsA);
74  else if (bcrsA != Teuchos::null) {
76  TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null, Exceptions::RuntimeError, "CreateTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
78  } else {
79  TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
80  }
81 
82  Teuchos::ParameterList& userList = inParamList.sublist("user data");
83  if (userList.isParameter("Coordinates")) {
85  try {
86  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"));
89  }
90  userList.set<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO> > >("Coordinates", coordinates);
91  }
92 
93  if (userList.isParameter("Nullspace")) {
94  RCP<MultiVector> nullspace = Teuchos::null;
95  try {
96  nullspace = TpetraMultiVector_To_XpetraMultiVector<SC, LO, GO, NO>(userList.get<RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >("Nullspace"));
98  nullspace = userList.get<RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >("Nullspace");
99  }
100  userList.set<RCP<MultiVector> >("Nullspace", nullspace);
101  }
102 
103  RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC, LO, GO, NO>(A, inParamList);
104  return rcp(new TpetraOperator<SC, LO, GO, NO>(H));
105 }
106 
116 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
119  const std::string& xmlFileName) {
120  Teuchos::ParameterList paramList;
121  Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(&paramList), *inA->getDomainMap()->getComm());
122  return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
123 }
124 
133 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
136  Teuchos::ParameterList paramList;
137  return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
138 }
139 
147 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
150  typedef Scalar SC;
151  typedef LocalOrdinal LO;
152  typedef GlobalOrdinal GO;
153  typedef Node NO;
154 
155  typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
157 
158  RCP<Hierarchy> H = Op.GetHierarchy();
159  RCP<Matrix> A = TpetraCrs_To_XpetraMatrix<SC, LO, GO, NO>(inA);
160 
161  MueLu::ReuseXpetraPreconditioner<SC, LO, GO, NO>(A, H);
162 }
163 
164 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
167  typedef Scalar SC;
168  typedef LocalOrdinal LO;
169  typedef GlobalOrdinal GO;
170  typedef Node NO;
171 
172  typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
174 
175  RCP<Hierarchy> H = Op.GetHierarchy();
177  TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null, Exceptions::RuntimeError, "ReuseTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
179 
180  MueLu::ReuseXpetraPreconditioner<SC, LO, GO, NO>(A, H);
181 }
182 
183 } // namespace MueLu
184 
185 #endif // ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
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.Given a Tpetra::Operator, this function returns a constructed MueLu preconditioner.
Various adapters that will create a MueLu preconditioner that is an Xpetra::Matrix.
MueLu::DefaultLocalOrdinal LocalOrdinal
GlobalOrdinal GO
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
LocalOrdinal LO
MueLu::DefaultNode Node
bool isParameter(const std::string &name) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Scalar SC
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.
Node NO
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
Exception throws to report errors in the internal logical of the program.
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.
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
Adapter for AmgX library from Nvidia.