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