MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_FlatOperator_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_FLATOPERATOR_DEF_HPP
11#define MUELU_FLATOPERATOR_DEF_HPP
12
15#include "Xpetra_MapFactory.hpp"
16#include "Xpetra_MatrixFactory.hpp"
17#include "Xpetra_MatrixMatrix.hpp"
18
19namespace MueLu {
20
21template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
23 FlatOperator(const Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> mat,
25 : mat_(mat)
26 , constraint_(constraint) {
27 CheckMaps();
29
30 auto pattern = constraint_->GetPattern();
31 map_ = Xpetra::MapFactory<LocalOrdinal, GlobalOrdinal, Node>::Build(pattern->getRowMap()->lib(),
32 pattern->getGlobalNumEntries(),
33 pattern->getLocalNumEntries(),
34 pattern->getRowMap()->getIndexBase(),
35 pattern->getComm());
36}
37
38template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
40 apply(const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
41 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y,
42 Teuchos::ETransp mode,
43 Scalar alpha,
44 Scalar beta) const {
45 AllocateTemporaryMatrix();
46
47 TEUCHOS_ASSERT(mode == Teuchos::NO_TRANS);
48 TEUCHOS_ASSERT(alpha == Teuchos::ScalarTraits<Scalar>::one());
49 TEUCHOS_ASSERT(beta == Teuchos::ScalarTraits<Scalar>::zero());
50
51 {
52 auto lclMat = tempMat_->getLocalMatrixDevice();
53 auto lclVec = X.getLocalViewDevice(Tpetra::Access::ReadOnly);
54 TEUCHOS_ASSERT(lclMat.values.extent(0) == lclVec.extent(0));
55 Kokkos::deep_copy(lclMat.values, Kokkos::subview(lclVec, Kokkos::ALL(), 0));
56 }
57
58 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> AP = Xpetra::MatrixFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(constraint_->GetPattern());
59 auto params = Teuchos::rcp(new Teuchos::ParameterList());
60 params->set("MM Throw For Non-Existent Entries", false);
61
62 AP = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*mat_, false, *tempMat_, false, AP, GetOStream(Statistics2), true, true, "", params);
63
64 Kokkos::deep_copy(Kokkos::subview(Y.getLocalViewDevice(Tpetra::Access::OverwriteAll), Kokkos::ALL(), 0),
65 AP->getLocalMatrixDevice().values);
66}
67} // namespace MueLu
68#endif
MueLu::DefaultScalar Scalar
Constraint space information for the potential prolongator.
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.
RCP< Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > map_
RCP< MueLu::Constraint< Scalar, LocalOrdinal, GlobalOrdinal, Node > > constraint_
FlatOperator()=default
Namespace for MueLu classes and methods.
@ Statistics2
Print even more statistics.