22 FlatOperator(
const Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> mat,
25 , constraint_(constraint) {
30 map_ = Xpetra::MapFactory<LocalOrdinal, GlobalOrdinal, Node>::Build(pattern->getRowMap()->lib(),
31 pattern->getGlobalNumEntries(),
32 pattern->getLocalNumEntries(),
33 pattern->getRowMap()->getIndexBase(),
39 apply(
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
40 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y,
41 Teuchos::ETransp mode,
44 AllocateTemporaryMatrix();
46 TEUCHOS_ASSERT(mode == Teuchos::NO_TRANS);
47 TEUCHOS_ASSERT(alpha == Teuchos::ScalarTraits<Scalar>::one());
48 TEUCHOS_ASSERT(beta == Teuchos::ScalarTraits<Scalar>::zero());
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));
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);
61 AP = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*mat_,
false, *tempMat_,
false, AP, GetOStream(
Runtime0),
true,
true,
"", params);
63 Kokkos::deep_copy(Kokkos::subview(Y.getLocalViewDevice(Tpetra::Access::OverwriteAll), Kokkos::ALL(), 0),
64 AP->getLocalMatrixDevice().values);
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.