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_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)
38#include <amgx_c.h>
39#include "cuda_runtime.h"
40#endif
41
42namespace MueLu {
43
51template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
52Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
53CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
54 Teuchos::ParameterList& inParamList) {
55#include "Xpetra_UseShortNames.hpp"
56
57 using Teuchos::ParameterList;
58
59 using tpMultiVector = Tpetra::MultiVector<SC, LO, GO, NO>;
60 using coordMultiVector = Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO>;
61 using tpCoordMultiVector = Tpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO>;
62 using tpLocalOrdinalVector = Tpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>;
64 using crs_matrix_type = Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
65 using block_crs_matrix_type = Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
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) {
83 RCP<Xpetra::CrsMatrix<SC, LO, GO, NO>> temp = rcp(new Xpetra::TpetraBlockCrsMatrix<SC, LO, GO, NO>(bcrsA));
84 TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null, Exceptions::RuntimeError, "CreateTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
85 A = rcp(new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
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"));
95 } catch (Teuchos::Exceptions::InvalidParameterType&) {
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"));
105 } catch (Teuchos::Exceptions::InvalidParameterType&) {
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"));
115 } catch (Teuchos::Exceptions::InvalidParameterType&) {
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"));
125 } catch (Teuchos::Exceptions::InvalidParameterType&) {
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);
132 return rcp(new MueLu::TpetraOperator<SC, LO, GO, NO>(H));
133}
134
144template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
145Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
146CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
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
161template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
162Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
163CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA) {
164 Teuchos::ParameterList paramList;
165 return CreateTpetraPreconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>(inA, paramList);
166}
167
175template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
176void ReuseTpetraPreconditioner(const Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
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;
184 typedef MueLu ::Hierarchy<SC, LO, GO, NO> Hierarchy;
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
192template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
193void ReuseTpetraPreconditioner(const Teuchos::RCP<Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& inA,
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;
201 typedef MueLu ::Hierarchy<SC, LO, GO, NO> Hierarchy;
202
203 RCP<Hierarchy> H = Op.GetHierarchy();
204 RCP<Xpetra::CrsMatrix<SC, LO, GO, NO>> temp = rcp(new Xpetra::TpetraBlockCrsMatrix<SC, LO, GO, NO>(inA));
205 TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null, Exceptions::RuntimeError, "ReuseTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
206 RCP<Matrix> A = rcp(new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
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
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.