MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_XpetraOperator_def.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_XPETRAOPERATOR_DEF_HPP
11#define MUELU_XPETRAOPERATOR_DEF_HPP
12
14#include "MueLu_Behavior.hpp"
15
16namespace MueLu {
17
18template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
22
23template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
25 ~XpetraOperator() = default;
26
27template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
28const Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> >
30 getDomainMap() const {
31 typedef Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> Matrix;
32
33 RCP<Matrix> A = Hierarchy_->GetLevel(0)->template Get<RCP<Matrix> >("A");
34 return A->getDomainMap();
35}
36
37template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
38const Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> >
40 getRangeMap() const {
41 typedef Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> Matrix;
42
43 RCP<Matrix> A = Hierarchy_->GetLevel(0)->template Get<RCP<Matrix> >("A");
44 return A->getRangeMap();
45}
46
47template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
49 apply(const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& X,
50 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Y,
51 Teuchos::ETransp mode,
52 Scalar /* alpha */,
53 Scalar /* beta */) const {
54 TEUCHOS_TEST_FOR_EXCEPTION(mode != Teuchos::NO_TRANS, std::logic_error, "MueLu::XpetraOperator does not support applying the adjoint operator");
55 try {
56 if (Behavior::debug()) {
57 using Matrix = Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
58 RCP<Matrix> A = Hierarchy_->GetLevel(0)->template Get<RCP<Matrix> >("A");
59
60 // X is supposed to live in the range map of the operator (const rhs = B)
61 TEUCHOS_TEST_FOR_EXCEPTION(A->getRangeMap()->isSameAs(*(X.getMap())) == false, std::logic_error,
62 "MueLu::XpetraOperator::apply: map of X is incompatible with range map of A");
63 TEUCHOS_TEST_FOR_EXCEPTION(A->getDomainMap()->isSameAs(*(Y.getMap())) == false, std::logic_error,
64 "MueLu::XpetraOperator::apply: map of Y is incompatible with domain map of A");
65 }
66 Hierarchy_->Iterate(X, Y, 1, true);
67 } catch (std::exception& e) {
68 // FIXME add message and rethrow
69 std::cerr << "Caught an exception in MueLu::XpetraOperator::apply():" << std::endl
70 << e.what() << std::endl;
71 }
72}
73
74template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
79
80template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
82 residual(const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& X,
83 const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
84 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& R) const {
85 using STS = Teuchos::ScalarTraits<Scalar>;
86 R.update(STS::one(), B, STS::zero());
87 this->apply(X, R, Teuchos::NO_TRANS, -STS::one(), STS::one());
88}
89
90template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
91RCP<MueLu::Hierarchy<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
95
96} // namespace MueLu
97
98#endif // MUELU_XPETRAOPERATOR_DEF_HPP
MueLu::DefaultScalar Scalar
static bool debug()
Whether MueLu is in debug mode.
Provides methods to build a multigrid hierarchy and apply multigrid cycles.
const Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
const Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
Returns the Tpetra::Map object associated with the range of this operator.
virtual ~XpetraOperator()
Destructor.
void apply(const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar=Teuchos::ScalarTraits< Scalar >::one(), Scalar=Teuchos::ScalarTraits< Scalar >::one()) const
Returns in Y the result of a Xpetra::Operator applied to a Xpetra::MultiVector X.
void residual(const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &R) const
Compute a residual R = B - (*this) * X.
RCP< MueLu::Hierarchy< Scalar, LocalOrdinal, GlobalOrdinal, Node > > GetHierarchy() const
Direct access to the underlying MueLu::Hierarchy.
bool hasTransposeApply() const
Indicates whether this operator supports applying the adjoint operator.
Namespace for MueLu classes and methods.