MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_ProductOperator_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_PRODUCTOPERATOR_DEF_HPP
11#define MUELU_PRODUCTOPERATOR_DEF_HPP
12
13#include "MueLu_ProductOperator.hpp"
14namespace MueLu {
15
16template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
18 apply(const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
19 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y,
20 Teuchos::ETransp mode,
21 Scalar alpha,
22 Scalar beta) const {
23 AllocateTemporaryMultiVectors(X.getNumVectors());
24
25 const auto one = Teuchos::ScalarTraits<Scalar>::one();
26 const auto zero = Teuchos::ScalarTraits<Scalar>::zero();
27
28#define toggle(opmode) ((opmode) == Teuchos::NO_TRANS) ? Teuchos::TRANS : Teuchos::NO_TRANS
29
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);
35 }
36 ops_[0]->apply(*tempVecs_[0], Y, modes_[0], alpha, beta);
37 } else {
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);
41 }
42 ops_[ops_.size() - 1]->apply(*tempVecs_[ops_.size() - 2], Y, toggle(modes_[ops_.size() - 1]), alpha, beta);
43 }
44 } else {
45 if (mode == Teuchos::NO_TRANS)
46 ops_[0]->apply(X, Y, modes_[0], alpha, beta);
47 else
48 ops_[0]->apply(X, Y, toggle(modes_[0]), alpha, beta);
49 }
50
51#undef toggle
52}
53
54} // namespace MueLu
55
56#endif
#define toggle(opmode)
MueLu::DefaultScalar Scalar
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.
Namespace for MueLu classes and methods.