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
14#include "Xpetra_MapFactory.hpp"
15#include "Xpetra_MatrixFactory.hpp"
16#include "Xpetra_MatrixMatrix.hpp"
17
18namespace MueLu {
19
20template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
22 FlatOperator(const Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> mat,
24 : mat_(mat)
25 , constraint_(constraint) {
26 CheckMaps();
28
29 auto pattern = constraint_->GetPattern();
30 map_ = Xpetra::MapFactory<LocalOrdinal, GlobalOrdinal, Node>::Build(pattern->getRowMap()->lib(),
31 pattern->getGlobalNumEntries(),
32 pattern->getLocalNumEntries(),
33 pattern->getRowMap()->getIndexBase(),
34 pattern->getComm());
35}
36
37template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
39 apply(const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
40 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y,
41 Teuchos::ETransp mode,
42 Scalar alpha,
43 Scalar beta) const {
44 AllocateTemporaryMatrix();
45
46 TEUCHOS_ASSERT(mode == Teuchos::NO_TRANS);
47 TEUCHOS_ASSERT(alpha == Teuchos::ScalarTraits<Scalar>::one());
48 TEUCHOS_ASSERT(beta == Teuchos::ScalarTraits<Scalar>::zero());
49
50 {
51 auto lclMat = tempMat_->getLocalMatrixDevice();
52 auto lclVec = X.getLocalViewDevice(Tpetra::Access::ReadOnly);
53 TEUCHOS_ASSERT(lclMat.values.extent(0) == lclVec.extent(0));
54 Kokkos::deep_copy(lclMat.values, Kokkos::subview(lclVec, Kokkos::ALL(), 0));
55 }
56
57 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> AP = Xpetra::MatrixFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(constraint_->GetPattern());
58 auto params = Teuchos::rcp(new Teuchos::ParameterList());
59 params->set("MM Throw For Non-Existent Entries", false);
60
61 AP = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*mat_, false, *tempMat_, false, AP, GetOStream(Runtime0), true, true, "", params);
62
63 Kokkos::deep_copy(Kokkos::subview(Y.getLocalViewDevice(Tpetra::Access::OverwriteAll), Kokkos::ALL(), 0),
64 AP->getLocalMatrixDevice().values);
65}
66} // namespace MueLu
67#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.
@ Runtime0
One-liner description of what is happening.