MueLu Version of the Day
Loading...
Searching...
No Matches
BelosMueLuAdapter.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 BELOS_MUELU_ADAPTER_HPP
11#define BELOS_MUELU_ADAPTER_HPP
12
13// TAW: 3/4/2016: we use the Xpetra macros
14// These are available and Xpetra is prerequisite for MueLu
15
16#ifdef HAVE_MUELU_AMGX
18#endif
19
20#include <BelosOperatorT.hpp>
21
22#include "MueLu_ConfigDefs.hpp"
23#include "MueLu_Hierarchy.hpp"
24
25namespace Belos {
26using Teuchos::RCP;
27using Teuchos::rcpFromRef;
28
29//
31
32
36class MueLuOpFailure : public BelosError {
37 public:
38 MueLuOpFailure(const std::string& what_arg)
39 : BelosError(what_arg) {}
40};
41
53template <class Scalar,
54 class LocalOrdinal = int,
56 class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
57class MueLuOp : public OperatorT<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >,
58 public OperatorT<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > {
59 public:
61
62
66#ifdef HAVE_MUELU_AMGX
69#endif
71 virtual ~MueLuOp() {}
73
75
76
82 void Apply(const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& x, Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& y, ETrans trans = NOTRANS) const {
83 TEUCHOS_TEST_FOR_EXCEPTION(trans != NOTRANS, MueLuOpFailure,
84 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
85
86 // This does not matter for Hierarchy, but matters for AMGX
87 y.putScalar(0.0);
88
89#ifdef HAVE_MUELU_AMGX
90 if (!AMGX_.is_null()) {
91 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tX = Xpetra::toTpetra(x);
92 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tY = Xpetra::toTpetra(y);
93
94 AMGX_->apply(tX, tY);
95 }
96#endif
97 if (!Hierarchy_.is_null())
98 Hierarchy_->Iterate(x, y, 1, true);
99 }
101
102 // TO SKIP THE TRAIT IMPLEMENTATION OF XPETRA::MULTIVECTOR
108 void Apply(const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& x, Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& y, ETrans trans = NOTRANS) const {
109 TEUCHOS_TEST_FOR_EXCEPTION(trans != NOTRANS, MueLuOpFailure,
110 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
111
112 // FIXME InitialGuessIsZero currently does nothing in MueLu::Hierarchy.Iterate(), but it matters for AMGX
113 y.putScalar(0.0);
114
115#ifdef HAVE_MUELU_AMGX
116 if (!AMGX_.is_null())
117 AMGX_->apply(x, y);
118#endif
119
120 if (!Hierarchy_.is_null()) {
121 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& temp_x = const_cast<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>&>(x);
122
123 const Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tX(rcpFromRef(temp_x));
124 Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tY(rcpFromRef(y));
125 Hierarchy_->Iterate(tX, tY, 1, true);
126 }
127 }
128
129 private:
130 RCP<MueLu::Hierarchy<Scalar, LocalOrdinal, GlobalOrdinal, Node> > Hierarchy_;
131#ifdef HAVE_MUELU_AMGX
132 RCP<MueLu::AMGXOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node> > AMGX_;
133#endif
134};
135
136} // namespace Belos
137
138#endif // BELOS_MUELU_ADAPTER_HPP
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
MueLu::DefaultNode Node
MueLuOpFailure is thrown when a return value from an MueLu call on an Xpetra::Operator or MueLu::Hier...
MueLuOpFailure(const std::string &what_arg)
MueLuOp derives from Belos::OperatorT and administrates a MueLu::Hierarchy. It implements the apply c...
RCP< MueLu::AMGXOperator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > AMGX_
void Apply(const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x, Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &y, ETrans trans=NOTRANS) const
This routine takes the Tpetra::MultiVector x and applies the operator to it resulting in the Tpetra::...
RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Hierarchy_
virtual ~MueLuOp()
Destructor.
MueLuOp(const RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &H)
Default constructor.
void Apply(const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x, Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &y, ETrans trans=NOTRANS) const
This routine takes the Xpetra::MultiVector x and applies the operator to it resulting in the Xpetra::...
MueLuOp(const RCP< MueLu::AMGXOperator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &A)
Adapter for AmgX library from Nvidia.
Provides methods to build a multigrid hierarchy and apply multigrid cycles.