19 FlatOperator(
const Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> mat,
22 , constraint_(constraint) {
27 map_ = Xpetra::MapFactory<LocalOrdinal, GlobalOrdinal, Node>::Build(pattern->getRowMap()->lib(),
28 pattern->getGlobalNumEntries(),
29 pattern->getLocalNumEntries(),
30 pattern->getRowMap()->getIndexBase(),
36 apply(
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
37 Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y,
38 Teuchos::ETransp mode,
41 AllocateTemporaryMatrix();
43 TEUCHOS_ASSERT(mode == Teuchos::NO_TRANS);
44 TEUCHOS_ASSERT(alpha == Teuchos::ScalarTraits<Scalar>::one());
45 TEUCHOS_ASSERT(beta == Teuchos::ScalarTraits<Scalar>::zero());
48 auto lclMat = tempMat_->getLocalMatrixDevice();
49 auto lclVec = X.getLocalViewDevice(Tpetra::Access::ReadOnly);
50 TEUCHOS_ASSERT(lclMat.values.extent(0) == lclVec.extent(0));
51 Kokkos::deep_copy(lclMat.values, Kokkos::subview(lclVec, Kokkos::ALL(), 0));
54 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> AP;
55 AP = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*mat_,
false, *tempMat_,
false, AP, GetOStream(
Runtime0),
true,
true);
56 constraint_->AssignMatrixEntriesToVector(*AP, Y);
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.