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 typedef Scalar SC;
56 typedef LocalOrdinal LO;
57 typedef GlobalOrdinal GO;
58 typedef Node NO;
59
60 using Teuchos::ParameterList;
61
62 typedef Xpetra::MultiVector<SC, LO, GO, NO> MultiVector;
63 typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
65 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> crs_matrix_type;
66 typedef Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> block_crs_matrix_type;
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)
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<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO> > coordinates = Teuchos::null;
94 try {
95 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"));
96 } catch (Teuchos::Exceptions::InvalidParameterType&) {
97 coordinates = userList.get<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LocalOrdinal, GlobalOrdinal, Node> > >("Coordinates");
98 }
99 userList.set<RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO> > >("Coordinates", coordinates);
100 }
101
102 if (userList.isParameter("Material")) {
103 RCP<MultiVector> material = Teuchos::null;
104 try {
105 material = TpetraMultiVector_To_XpetraMultiVector<SC, LO, GO, NO>(userList.get<RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >("Material"));
106 } catch (Teuchos::Exceptions::InvalidParameterType&) {
107 material = userList.get<RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >("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 = TpetraMultiVector_To_XpetraMultiVector<SC, LO, GO, NO>(userList.get<RCP<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >("Nullspace"));
116 } catch (Teuchos::Exceptions::InvalidParameterType&) {
117 nullspace = userList.get<RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >("Nullspace");
118 }
119 userList.set<RCP<MultiVector> >("Nullspace", nullspace);
120 }
121
122 RCP<Hierarchy> H = MueLu::CreateXpetraPreconditioner<SC, LO, GO, NO>(A, inParamList);
123 return rcp(new TpetraOperator<SC, LO, GO, NO>(H));
124}
125
135template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
136Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
137CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& inA,
138 const std::string& xmlFileName) {
139 Teuchos::ParameterList paramList;
140 Teuchos::updateParametersFromXmlFileAndBroadcast(xmlFileName, Teuchos::Ptr<Teuchos::ParameterList>(&paramList), *inA->getDomainMap()->getComm());
142}
143
152template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
153Teuchos::RCP<MueLu::TpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
154CreateTpetraPreconditioner(const Teuchos::RCP<Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& inA) {
155 Teuchos::ParameterList paramList;
157}
158
166template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
167void ReuseTpetraPreconditioner(const Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& inA,
169 typedef Scalar SC;
170 typedef LocalOrdinal LO;
171 typedef GlobalOrdinal GO;
172 typedef Node NO;
173
174 typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
175 typedef MueLu ::Hierarchy<SC, LO, GO, NO> Hierarchy;
176
177 RCP<Hierarchy> H = Op.GetHierarchy();
179
181}
182
183template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
184void ReuseTpetraPreconditioner(const Teuchos::RCP<Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& inA,
186 typedef Scalar SC;
187 typedef LocalOrdinal LO;
188 typedef GlobalOrdinal GO;
189 typedef Node NO;
190
191 typedef Xpetra::Matrix<SC, LO, GO, NO> Matrix;
192 typedef MueLu ::Hierarchy<SC, LO, GO, NO> Hierarchy;
193
194 RCP<Hierarchy> H = Op.GetHierarchy();
195 RCP<Xpetra::CrsMatrix<SC, LO, GO, NO> > temp = rcp(new Xpetra::TpetraBlockCrsMatrix<SC, LO, GO, NO>(inA));
196 TEUCHOS_TEST_FOR_EXCEPTION(temp == Teuchos::null, Exceptions::RuntimeError, "ReuseTpetraPreconditioner: cast from Tpetra::BlockCrsMatrix to Xpetra::TpetraBlockCrsMatrix failed.");
197 RCP<Matrix> A = rcp(new Xpetra::CrsMatrixWrap<SC, LO, GO, NO>(temp));
198
200}
201
202} // namespace MueLu
203
204#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....
RCP< Xpetra::MultiVector< SC, LO, GO, NO > > TpetraMultiVector_To_XpetraMultiVector(const Teuchos::RCP< Tpetra::MultiVector< SC, LO, GO, NO > > &Vtpetra)
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.
void ReuseXpetraPreconditioner(const Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &A, Teuchos::RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &H)
Helper function to reuse an existing MueLu preconditioner.
RCP< Xpetra::Matrix< SC, LO, GO, NO > > TpetraCrs_To_XpetraMatrix(const Teuchos::RCP< Tpetra::CrsMatrix< SC, LO, GO, NO > > &Atpetra)
Teuchos::RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > CreateXpetraPreconditioner(Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > op, const Teuchos::ParameterList &inParamList)
Helper function to create a MueLu preconditioner that can be used by Xpetra.Given an Xpetra::Matrix,...