18 apply(
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
19 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y,
20 Teuchos::ETransp mode,
23 AllocateTemporaryMultiVectors(X.getNumVectors());
25 const auto one = Teuchos::ScalarTraits<Scalar>::one();
26 const auto zero = Teuchos::ScalarTraits<Scalar>::zero();
28#define toggle(opmode) ((opmode) == Teuchos::NO_TRANS) ? Teuchos::TRANS : Teuchos::NO_TRANS
30 if (ops_.size() >= 2) {
31 if (mode == Teuchos::NO_TRANS) {
32 ops_[ops_.size() - 1]->apply(X, *tempVecs_[ops_.size() - 2], modes_[ops_.size() - 1], one, zero);
33 for (
size_t i = ops_.size() - 2; i > 0; --i) {
34 ops_[i]->apply(*tempVecs_[i], *tempVecs_[i - 1], modes_[i], one, zero);
36 ops_[0]->apply(*tempVecs_[0], Y, modes_[0], alpha, beta);
38 ops_[0]->apply(X, *tempVecs_[0],
toggle(modes_[0]), one, zero);
39 for (
size_t i = 1; i < ops_.size() - 1; ++i) {
40 ops_[i]->apply(*tempVecs_[i - 1], *tempVecs_[i],
toggle(modes_[i]), one, zero);
42 ops_[ops_.size() - 1]->apply(*tempVecs_[ops_.size() - 2], Y,
toggle(modes_[ops_.size() - 1]), alpha, beta);
45 if (mode == Teuchos::NO_TRANS)
46 ops_[0]->apply(X, Y, modes_[0], alpha, beta);
48 ops_[0]->apply(X, Y,
toggle(modes_[0]), alpha, beta);
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.