10#ifndef MUELU_PRODUCTOPERATOR_DECL_HPP
11#define MUELU_PRODUCTOPERATOR_DECL_HPP
13#include "Teuchos_RCP.hpp"
14#include "Xpetra_Map.hpp"
15#include "Xpetra_MultiVector.hpp"
16#include "Xpetra_MultiVectorFactory.hpp"
17#include "Xpetra_Operator.hpp"
19#include "Xpetra_Utils.hpp"
32 class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
33class ProductOperator :
public Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> {
38 virtual const Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>
getDomainMap()
const {
39 return (
modes_[
ops_.size() - 1] == Teuchos::NO_TRANS) ?
ops_[
ops_.size() - 1]->getDomainMap() :
ops_[
ops_.size() - 1]->getRangeMap();
43 virtual const Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>
getRangeMap()
const {
44 return (
modes_[0] == Teuchos::NO_TRANS) ?
ops_[0]->getRangeMap() :
ops_[0]->getDomainMap();
54 apply(
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
55 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y,
56 Teuchos::ETransp mode = Teuchos::NO_TRANS,
57 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
58 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero())
const;
72 std::string descr(
"");
73 for (
auto it =
ops_.begin(); it !=
ops_.end(); ++it) {
74 descr += (*it)->description();
80 void describe(Teuchos::FancyOStream &out,
const Teuchos::EVerbosityLevel verbLevel = Teuchos::Describable::verbLevel_default)
const {
81 for (
auto it =
ops_.begin(); it !=
ops_.end(); ++it) {
82 (*it)->describe(out, verbLevel);
94 ProductOperator(std::vector<Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>> ops,
95 std::vector<Teuchos::ETransp> modes)
98 TEUCHOS_ASSERT(
ops_.size() >= 1);
105 ProductOperator(std::vector<Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>> ops)
107 TEUCHOS_ASSERT(
ops_.size() >= 1);
109 for (
auto it =
ops_.begin(); it !=
ops_.end(); ++it) {
110 modes_.push_back(Teuchos::NO_TRANS);
118 for (
size_t i = 0; i <
ops_.size() - 1; ++i) {
121 TEUCHOS_ASSERT(mapLeftOp->isSameAs(*mapRightOp));
128 for (
size_t i = 0; i <
ops_.size() - 1; ++i) {
130 tempVecs_.push_back(Xpetra::MultiVectorFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(map, NumVectors));
136 void residual(
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
137 const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &B,
138 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &R)
const {
139 const auto one = Teuchos::ScalarTraits<Scalar>::one();
140 const auto zero = Teuchos::ScalarTraits<Scalar>::zero();
142 apply(X, R, Teuchos::NO_TRANS, one, zero);
143 R.update(one, B, -one);
149 std::vector<Teuchos::RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>>>
ops_;
151 mutable std::vector<Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>>
tempVecs_;
157#define MUELU_PRODUCTOPERATOR_SHORT
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Takes a sequence of operators and applies their product.
virtual bool hasTransposeApply() const
Whether this operator supports applying the transpose or conjugate transpose.
virtual const Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
The Map associated with the domain of this operator, which must be compatible with 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.
ProductOperator(std::vector< Teuchos::RCP< Xpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > > ops)
ProductOperator()=default
virtual void apply(const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, Xpetra::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
Computes the operator-multivector application.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with the given verbosity level to a FancyOStream.
std::string description() const
A simple one-line description of this object.
virtual const Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
The Map associated with the range of this operator, which must be compatible with Y....
std::vector< Teuchos::ETransp > modes_
std::vector< Teuchos::RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > > tempVecs_
ProductOperator(std::vector< Teuchos::RCP< Xpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > > ops, std::vector< Teuchos::ETransp > modes)
TpetraOperator constructor to wrap a Tpetra::Operator object.
void AllocateTemporaryMultiVectors(size_t NumVectors) const
std::vector< Teuchos::RCP< Xpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > > ops_
Namespace for MueLu classes and methods.