40 #ifndef TPETRA_LOCALCRSMATRIXOPERATOR_DEF_HPP
41 #define TPETRA_LOCALCRSMATRIXOPERATOR_DEF_HPP
43 #include "Tpetra_LocalOperator.hpp"
44 #include "KokkosSparse.hpp"
45 #include "Teuchos_TestForException.hpp"
49 template<
class MultiVectorScalar,
class MatrixScalar,
class Device>
50 LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::
51 LocalCrsMatrixOperator (
const std::shared_ptr<local_matrix_type>& A)
54 const char tfecfFuncName[] =
"LocalCrsMatrixOperator: ";
55 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
56 (A_.get () ==
nullptr, std::invalid_argument,
57 "Input matrix A is null.");
60 template<
class MultiVectorScalar,
class MatrixScalar,
class Device>
62 LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::
63 hasTransposeApply ()
const
68 template<
class MultiVectorScalar,
class MatrixScalar,
class Device>
70 LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::
71 apply (Kokkos::View<
const mv_scalar_type**, array_layout,
72 device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> > X,
73 Kokkos::View<mv_scalar_type**, array_layout,
74 device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> > Y,
75 const Teuchos::ETransp mode,
76 const mv_scalar_type alpha,
77 const mv_scalar_type beta)
const
79 const bool conjugate = (mode == Teuchos::CONJ_TRANS);
80 const bool transpose = (mode != Teuchos::NO_TRANS);
82 #ifdef HAVE_TPETRA_DEBUG
83 const char tfecfFuncName[] =
"apply: ";
85 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
86 (X.extent (1) != Y.extent (1), std::runtime_error,
87 "X.extent(1) = " << X.extent (1) <<
" != Y.extent(1) = "
88 << Y.extent (1) <<
".");
91 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
92 (X.data () == Y.data () && X.data () !=
nullptr,
93 std::runtime_error,
"X and Y may not alias one another.");
94 #endif // HAVE_TPETRA_DEBUG
96 const auto op = transpose ?
97 (conjugate ? KokkosSparse::ConjugateTranspose :
98 KokkosSparse::Transpose) : KokkosSparse::NoTranspose;
99 KokkosSparse::spmv (op, alpha, *A_, X, beta, Y);
102 template<
class MultiVectorScalar,
class MatrixScalar,
class Device>
103 const typename LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::local_matrix_type&
104 LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::
105 getLocalMatrix ()
const
121 #define TPETRA_LOCALCRSMATRIXOPERATOR_INSTANT(SC,NT) \
122 template class LocalCrsMatrixOperator< SC, SC, NT::device_type >;
124 #endif // TPETRA_LOCALCRSMATRIXOPERATOR_DEF_HPP