MueLu Version of the Day
Loading...
Searching...
No Matches
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
16#include <Teuchos_XMLParameterListHelpers.hpp>
17#include <Tpetra_CrsMatrix.hpp>
18#include <Tpetra_Operator.hpp>
19#include <Tpetra_RowMatrix.hpp>
20#include <Xpetra_TpetraBlockCrsMatrix.hpp>
21#include <Tpetra_BlockCrsMatrix.hpp>
22#include <Xpetra_CrsMatrix.hpp>
23#include <Xpetra_MultiVector.hpp>
24#include <Xpetra_MultiVectorFactory.hpp>
25
26#include <MueLu.hpp>
27
28#include <MueLu_Exceptions.hpp>
29#include <MueLu_Hierarchy.hpp>
30#include <MueLu_MasterList.hpp>
31#include <MueLu_ParameterListInterpreter.hpp>
32#include <MueLu_TpetraOperator.hpp>
34#include <MueLu_Utilities.hpp>
35#include <MueLu_HierarchyUtils.hpp>
36
37#if defined(HAVE_MUELU_AMGX)
39#include <amgx_c.h>
40#include "cuda_runtime.h"
41#endif
42
43namespace MueLu {
44
52template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
53Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
54CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
55 Teuchos::ParameterList& inParamList) {
56#include "Xpetra_UseShortNames.hpp"
57
58 using Teuchos::ParameterList;
59
60 using tpMultiVector = Tpetra::MultiVector<SC, LO, GO, NO>;
61 using coordMultiVector = Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO>;
62 using tpCoordMultiVector = Tpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO>;
63 using tpLocalOrdinalVector = Tpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>;
65 using crs_matrix_type = Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
66 using block_crs_matrix_type = Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
67
68#if defined(HAVE_MUELU_AMGX)
69 std::string externalMG = "use external multigrid package";
70 if (inParamList.isParameter(externalMG) && inParamList.get<std::string>(externalMG) == "amgx") {
71 const RCP<crs_matrix_type> constCrsA = rcp_dynamic_cast<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>(constCrsA, 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 = Xpetra::toXpetra(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::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
86 A = rcp(new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
87 } else {
88 TEUCHOS_TEST_FOR_EXCEPTION(true, Exceptions::RuntimeError, "CreateTpetraPreconditioner: only Tpetra CrsMatrix and BlockCrsMatrix types are supported.");
89 }
90
91 Teuchos::ParameterList& userList = inParamList.sublist("user data");
92 if (userList.isParameter("Coordinates")) {
93 RCP<coordMultiVector> coordinates = Teuchos::null;
94 try {
95 coordinates = Xpetra::toXpetra(userList.get<RCP<tpCoordMultiVector>>("Coordinates"));
96 } catch (Teuchos::Exceptions::InvalidParameterType&) {
97 coordinates = userList.get<RCP<coordMultiVector>>("Coordinates");
98 }
99 userList.set<RCP<coordMultiVector>>("Coordinates", coordinates);
100 }
101
102 if (userList.isParameter("Material")) {
103 RCP<MultiVector> material = Teuchos::null;
104 try {
105 material = Xpetra::toXpetra(userList.get<RCP<tpMultiVector>>("Material"));
106 } catch (Teuchos::Exceptions::InvalidParameterType&) {
107 material = userList.get<RCP<MultiVector>>("Material");
108 }
109 userList.set<RCP<MultiVector>>("Material", material);
110 }
111
112 if (userList.isParameter("Nullspace")) {
113 RCP<MultiVector> nullspace = Teuchos::null;
114 try {
115 nullspace = Xpetra::toXpetra(userList.get<RCP<tpMultiVector>>("Nullspace"));
116 } catch (Teuchos::Exceptions::InvalidParameterType&) {
117 nullspace = userList.get<RCP<MultiVector>>("Nullspace");
118 }
119 userList.set<RCP<MultiVector>>("Nullspace", nullspace);
120 }
121
122 if (userList.isParameter("BlockNumber")) {
123 RCP<LocalOrdinalVector> blockNumber = Teuchos::null;
124 try {
125 blockNumber = Xpetra::toXpetra(userList.get<RCP<tpLocalOrdinalVector>>("BlockNumber"));
126 } catch (Teuchos::Exceptions::InvalidParameterType&) {
127 blockNumber = userList.get<RCP<LocalOrdinalVector>>("BlockNumber");
128 }
129 userList.set<RCP<LocalOrdinalVector>>("BlockNumber", blockNumber);
130 }
131
132 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC, LO, GO, NO>(A, inParamList);
133 return rcp(new MueLu::TpetraOperator<SC, LO, GO, NO>(H));
134}
135
145template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
146Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
147CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
148 const std::string& xmlFileName) {
149 Teuchos::ParameterList paramList;
150 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(&paramList), *inA->getDomainMap()->getComm());
151 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
152}
153
162template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
163Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
164CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA) {
165 Teuchos::ParameterList paramList;
166 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
167}
168
182template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
183Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
184CreateTpetraPreconditioner(const Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
185 Teuchos::ParameterList& inParamList) {
186 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
187 Teuchos::rcp_const_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(inA), inParamList);
188}
189
190template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
191Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
192CreateTpetraPreconditioner(const Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
193 const std::string& xmlFileName) {
194 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
195 Teuchos::rcp_const_cast<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(inA), xmlFileName);
196}
197
198template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
199Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
200CreateTpetraPreconditioner(const Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA) {
201 Teuchos::ParameterList paramList;
202 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
203}
204
214template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
215Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
216CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
217 Teuchos::ParameterList& inParamList) {
218 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> op = inA;
219 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(op, inParamList);
220}
221
222template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
223Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
224CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
225 const std::string& xmlFileName) {
226 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> op = inA;
227 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(op, xmlFileName);
228}
229
230template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
231Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
232CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA) {
233 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> op = inA;
234 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(op);
235}
236
237template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
238Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
239CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
240 Teuchos::ParameterList& inParamList) {
241 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> op = inA;
242 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(op, inParamList);
243}
244
245template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
246Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
247CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
248 const std::string& xmlFileName) {
249 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> op = inA;
250 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(op, xmlFileName);
251}
252
253template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
254Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
255CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA) {
256 Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> op = inA;
257 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(op);
258}
259
267template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
268void ReuseTpetraPreconditioner(const Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
270 typedef Scalar SC;
271 typedef LocalOrdinal LO;
272 typedef GlobalOrdinal GO;
273 typedef Node NO;
274
275 typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
276 typedef MueLu ::Hierarchy<SC, LO, GO, NO> Hierarchy;
277
278 RCP<Hierarchy> H = Op.GetHierarchy();
279 RCP<Matrix> A = Xpetra::toXpetra(inA);
280
281 MueLu::ReuseXpetraPreconditioner<SC, LO, GO, NO>(A, H);
282}
283
289template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
290void ReuseTpetraPreconditioner(const Teuchos::RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
292 ReuseTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
293 Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(inA), Op);
294}
295
296template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
297void ReuseTpetraPreconditioner(const Teuchos::RCP<Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
299 typedef Scalar SC;
300 typedef LocalOrdinal LO;
301 typedef GlobalOrdinal GO;
302 typedef Node NO;
303
304 typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
305 typedef MueLu ::Hierarchy<SC, LO, GO, NO> Hierarchy;
306
307 RCP<Hierarchy> H = Op.GetHierarchy();
308 RCP<Xpetra::CrsMatrix<SC, LO, GO, NO>> temp = rcp(new Xpetra::TpetraBlockCrsMatrix<SC, LO, GO, NO>(inA));
309 TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null, Exceptions::RuntimeError, "ReuseTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
310 RCP<Matrix> A = rcp(new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
311
312 MueLu::ReuseXpetraPreconditioner<SC, LO, GO, NO>(A, H);
313}
314
320template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
321void ReuseTpetraPreconditioner(const Teuchos::RCP<const Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
323 ReuseTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
324 Teuchos::rcp_const_cast<Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(inA), Op);
325}
326
327} // namespace MueLu
328
329#endif // ifndef MUELU_CREATE_TPETRA_PRECONDITIONER_HPP
Various adapters that will create a MueLu preconditioner that is an Xpetra::Matrix.
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
MueLu::DefaultNode Node
Adapter for AmgX library from Nvidia.
Exception throws to report errors in the internal logical of the program.
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
Wraps an existing MueLu::Hierarchy as a Tpetra::Operator.
RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > GetHierarchy() const
Direct access to the underlying MueLu::Hierarchy.
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)
Helper function to create a MueLu or AMGX preconditioner that can be used by Tpetra....
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.