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 // @HEADER
2 // *****************************************************************************
3 // MueLu: A package for multigrid based preconditioning
4 //
5 // Copyright 2012 NTESS and the MueLu contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
11 #define MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
12 
15 
17 #include <Tpetra_Operator.hpp>
18 #include <Tpetra_RowMatrix.hpp>
19 #include <Xpetra_TpetraBlockCrsMatrix.hpp>
20 #include <Tpetra_BlockCrsMatrix.hpp>
21 #include <Xpetra_CrsMatrix.hpp>
22 #include <Xpetra_MultiVector.hpp>
23 #include <Xpetra_MultiVectorFactory.hpp>
24 
25 #include <MueLu.hpp>
26 
27 #include <MueLu_Exceptions.hpp>
28 #include <MueLu_Hierarchy.hpp>
29 #include <MueLu_MasterList.hpp>
30 #include <MueLu_ParameterListInterpreter.hpp>
31 #include <MueLu_TpetraOperator.hpp>
33 #include <MueLu_Utilities.hpp>
34 #include <MueLu_HierarchyUtils.hpp>
35 
36 #if defined(HAVE_MUELU_AMGX)
37 #include <MueLu_AMGXOperator.hpp>
38 #include <amgx_c.h>
39 #include "cuda_runtime.h"
40 #endif
41 
42 namespace MueLu {
43 
51 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
54  Teuchos::ParameterList& inParamList) {
55 #include "Xpetra_UseShortNames.hpp"
56 
58 
59  using tpMultiVector = Tpetra::MultiVector<SC, LO, GO, NO>;
66 
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.");
72  return rcp(new AMGXOperator<SC, LO, GO, NO>(constCrsA, inParamList));
73  }
74 #endif
75 
76  // Wrap A
77  RCP<Matrix> A;
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) {
84  TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null, Exceptions::RuntimeError, "CreateTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
86  } else {
87  TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
88  }
89 
90  Teuchos::ParameterList& userList = inParamList.sublist("user data");
91  if (userList.isParameter("Coordinates")) {
92  RCP<coordMultiVector> coordinates = Teuchos::null;
93  try {
94  coordinates = Xpetra::toXpetra(userList.get<RCP<tpCoordMultiVector>>("Coordinates"));
96  coordinates = userList.get<RCP<coordMultiVector>>("Coordinates");
97  }
98  userList.set<RCP<coordMultiVector>>("Coordinates", coordinates);
99  }
100 
101  if (userList.isParameter("Material")) {
102  RCP<MultiVector> material = Teuchos::null;
103  try {
104  material = Xpetra::toXpetra(userList.get<RCP<tpMultiVector>>("Material"));
106  material = userList.get<RCP<MultiVector>>("Material");
107  }
108  userList.set<RCP<MultiVector>>("Material", material);
109  }
110 
111  if (userList.isParameter("Nullspace")) {
112  RCP<MultiVector> nullspace = Teuchos::null;
113  try {
114  nullspace = Xpetra::toXpetra(userList.get<RCP<tpMultiVector>>("Nullspace"));
116  nullspace = userList.get<RCP<MultiVector>>("Nullspace");
117  }
118  userList.set<RCP<MultiVector>>("Nullspace", nullspace);
119  }
120 
121  if (userList.isParameter("BlockNumber")) {
122  RCP<LocalOrdinalVector> blockNumber = Teuchos::null;
123  try {
124  blockNumber = Xpetra::toXpetra(userList.get<RCP<tpLocalOrdinalVector>>("BlockNumber"));
126  blockNumber = userList.get<RCP<LocalOrdinalVector>>("BlockNumber");
127  }
128  userList.set<RCP<LocalOrdinalVector>>("BlockNumber", blockNumber);
129  }
130 
131  RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC, LO, GO, NO>(A, inParamList);
133 }
134 
144 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
147  const std::string& xmlFileName) {
148  Teuchos::ParameterList paramList;
149  Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(&paramList), *inA->getDomainMap()->getComm());
150  return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
151 }
152 
161 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
164  Teuchos::ParameterList paramList;
165  return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
166 }
167 
175 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
178  typedef Scalar SC;
179  typedef LocalOrdinal LO;
180  typedef GlobalOrdinal GO;
181  typedef Node NO;
182 
183  typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
185 
186  RCP<Hierarchy> H = Op.GetHierarchy();
187  RCP<Matrix> A = Xpetra::toXpetra(inA);
188 
189  MueLu::ReuseXpetraPreconditioner<SC, LO, GO, NO>(A, H);
190 }
191 
192 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
195  typedef Scalar SC;
196  typedef LocalOrdinal LO;
197  typedef GlobalOrdinal GO;
198  typedef Node NO;
199 
200  typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
202 
203  RCP<Hierarchy> H = Op.GetHierarchy();
205  TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null, Exceptions::RuntimeError, "ReuseTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
207 
208  MueLu::ReuseXpetraPreconditioner<SC, LO, GO, NO>(A, H);
209 }
210 
211 } // namespace MueLu
212 
213 #endif // ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
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)
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.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
LocalOrdinal LO
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
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
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.
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
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.
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
Adapter for AmgX library from Nvidia.