MueLu  Version of the Day
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 
7 #include <Teuchos_XMLParameterListHelpers.hpp>
8 #include <Tpetra_Operator.hpp>
9 #include <Tpetra_RowMatrix.hpp>
11 #include <Tpetra_Experimental_BlockCrsMatrix.hpp>
12 #include <Xpetra_CrsMatrix.hpp>
13 #include <Xpetra_MultiVector.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_MLParameterListInterpreter.hpp>
22 #include <MueLu_ParameterListInterpreter.hpp>
23 #include <MueLu_TpetraOperator.hpp>
25 #include <MueLu_Utilities.hpp>
26 #include <MueLu_HierarchyUtils.hpp>
27 
28 
29 #if defined(HAVE_MUELU_EXPERIMENTAL) and defined(HAVE_MUELU_AMGX)
30 #include <MueLu_AMGXOperator.hpp>
31 #include <amgx_c.h>
32 #include "cuda_runtime.h"
33 #endif
34 
35 namespace MueLu {
36 
37 
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)
53  {
54  typedef Scalar SC;
55  typedef LocalOrdinal LO;
56  typedef GlobalOrdinal GO;
57  typedef Node NO;
58 
59  using Teuchos::ParameterList;
60 
61  typedef Xpetra::MultiVector<SC,LO,GO,NO> MultiVector;
62  typedef Xpetra::Matrix<SC,LO,GO,NO> Matrix;
64  //typedef HierarchyManager<SC,LO,GO,NO> HierarchyManager; // not used
67 
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.");
73  return rcp(new AMGXOperator<SC,LO,GO,NO>(inA,inParamList));
74  }
75 #endif
76 
77  // Wrap A
78  RCP<Matrix> A;
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) {
84  RCP<Xpetra::CrsMatrix<SC,LO,GO,NO> > temp = rcp(new Xpetra::TpetraBlockCrsMatrix<SC,LO,GO,NO>(bcrsA));
85  TEUCHOS_TEST_FOR_EXCEPTION(temp==Teuchos::null, Exceptions::RuntimeError, "CreateTpetraPreconditioner: cast from Tpetra::Experimental::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
86  A = rcp(new Xpetra::CrsMatrixWrap<SC,LO,GO,NO>(temp));
87  }
88  else {
89  TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
90  }
91 
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);
95  }
96  RCP<MultiVector> nullspace = Teuchos::null;
97  if (inNullspace != Teuchos::null) {
98  nullspace = TpetraMultiVector_To_XpetraMultiVector<SC,LO,GO,NO>(inNullspace);
99  }
100 
101  RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC,LO,GO,NO>(A,inParamList,coordinates,nullspace);
102  return rcp(new TpetraOperator<SC,LO,GO,NO>(H));
103  }
104 
105 
118  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
119  MUELU_DEPRECATED
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)
125  {
126  RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>> opMat(inA);
127  return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(opMat, inParamList, inCoords, inNullspace);
128  }
129 
130 
142  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
143  MUELU_DEPRECATED
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)
148  {
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);
152  }
153 
154 
167  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
168  MUELU_DEPRECATED
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)
174  {
175  Teuchos::ParameterList paramList;
176  Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(&paramList), *inA->getComm());
177 
178  RCP<Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>> opMat(inA);
179  return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(opMat, paramList, inCoords, inNullspace);
180  }
181 
182 
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)
198  {
199  Teuchos::ParameterList paramList;
200  return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList, inCoords, inNullspace);
201  }
202 
203 
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)
221  {
222  Teuchos::ParameterList paramList;
223  Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(&paramList), *inA->getDomainMap()->getComm());
224  return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList, inCoords, inNullspace);
225  }
226 
227 
235  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
238  typedef Scalar SC;
239  typedef LocalOrdinal LO;
240  typedef GlobalOrdinal GO;
241  typedef Node NO;
242 
243  typedef Xpetra::Matrix<SC,LO,GO,NO> Matrix;
244  typedef MueLu ::Hierarchy<SC,LO,GO,NO> Hierarchy;
245 
246  RCP<Hierarchy> H = Op.GetHierarchy();
247  RCP<Matrix> A = TpetraCrs_To_XpetraMatrix<SC,LO,GO,NO>(inA);
248 
249  MueLu::ReuseXpetraPreconditioner<SC,LO,GO,NO>(A, H);
250  }
251 
252 } //namespace
253 
254 #endif //ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
255 
GlobalOrdinal GO
LocalOrdinal LO
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.
Scalar SC
Wraps an existing MueLu::Hierarchy as a Tpetra::Operator.
Node NO
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.