Ifpack2 Templated Preconditioning Package  Version 1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Ifpack2_BorderedOperator_def.hpp
1 // @HEADER
2 // *****************************************************************************
3 // Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
4 //
5 // Copyright 2009 NTESS and the Ifpack2 contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef IFPACK2_BORDEREDOPERATOR_DEF_HPP
11 #define IFPACK2_BORDEREDOPERATOR_DEF_HPP
12 
13 #include "Ifpack2_BorderedOperator_decl.hpp"
14 #include "Tpetra_MultiVector.hpp"
16 
17 namespace Ifpack2 {
18 
19 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
21  BorderedOperator(const Teuchos::RCP<const Tpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& A)
22  : A_(A) {
24  A_.is_null(), std::runtime_error,
25  Teuchos::typeName(*this) << "::BorderedOperator constructor: "
26  "The input Operator A is null.");
27 }
28 
29 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
32  return A_->getDomainMap();
33 }
34 
35 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
38  return A_->getRangeMap();
39 }
40 
41 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
43  return A_->hasTransposeApply();
44 }
45 
46 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
48  apply(const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& X,
49  Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Y,
50  Teuchos::ETransp mode,
51  Scalar coefAx,
52  Scalar coefY) const {
54  X.getNumVectors() != Y.getNumVectors(), std::runtime_error,
55  "Ifpack2::BorderedOperator::apply(): X.getNumVectors() = "
56  << X.getNumVectors() << " != Y.getNumVectors() = "
57  << Y.getNumVectors() << ".");
58  A_->apply(X, Y, mode, coefAx, coefY);
59 }
60 
61 } // namespace Ifpack2
62 
63 #define IFPACK2_BORDEREDOPERATOR_INSTANT(S, LO, GO, N) \
64  template class Ifpack2::BorderedOperator<S, LO, GO, N>;
65 
66 #endif /* IFPACK2_BorderedOperator_DEF_HPP */
virtual Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
The range Map of this operator. It must be compatible with Y.getMap().
Definition: Ifpack2_BorderedOperator_def.hpp:37
void apply(const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const
Apply the bordered operator.
Definition: Ifpack2_BorderedOperator_def.hpp:48
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
virtual Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
The domain Map of this operator. It must be compatible with X.getMap().
Definition: Ifpack2_BorderedOperator_def.hpp:31
bool hasTransposeApply() const
Whether this operator can apply the transpose or conjugate transpose.
Definition: Ifpack2_BorderedOperator_def.hpp:42
BorderedOperator(const Teuchos::RCP< const Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &A)
Constructor with Tpetra::Operator input.
Definition: Ifpack2_BorderedOperator_def.hpp:21
std::string typeName(const T &t)
bool is_null() const