10#ifndef TPETRA_LOCALCRSMATRIXOPERATOR_DEF_HPP 
   11#define TPETRA_LOCALCRSMATRIXOPERATOR_DEF_HPP 
   13#include "Tpetra_LocalOperator.hpp" 
   15#include "KokkosSparse.hpp" 
   16#include "Teuchos_TestForException.hpp" 
   17#include "Teuchos_OrdinalTraits.hpp" 
   21template <
class MultiVectorScalar, 
class MatrixScalar, 
class Device>
 
   22LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::
 
   23    LocalCrsMatrixOperator(
const std::shared_ptr<local_matrix_device_type>& A)
 
   25  , have_A_cusparse(false) {
 
   26  const char tfecfFuncName[] = 
"LocalCrsMatrixOperator: ";
 
   27  TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(A_.get() == 
nullptr, std::invalid_argument,
 
   28                                        "Input matrix A is null.");
 
   31template <
class MultiVectorScalar, 
class MatrixScalar, 
class Device>
 
   32LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::
 
   33    LocalCrsMatrixOperator(
const std::shared_ptr<local_matrix_device_type>& A, 
const ordinal_view_type& A_ordinal_rowptrs)
 
   35  , A_cusparse(
"LocalCrsMatrixOperator_cuSPARSE", A->numRows(), A->numCols(), A->nnz(),
 
   36               A->values, A_ordinal_rowptrs, A->graph.entries)
 
   37  , have_A_cusparse(true) {
 
   38  const char tfecfFuncName[] = 
"LocalCrsMatrixOperator: ";
 
   39  TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(A_.get() == 
nullptr, std::invalid_argument,
 
   40                                        "Input matrix A is null.");
 
   43template <
class MultiVectorScalar, 
class MatrixScalar, 
class Device>
 
   44bool LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::
 
   45    hasTransposeApply()
 const {
 
   49template <
class MultiVectorScalar, 
class MatrixScalar, 
class Device>
 
   50void LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::
 
   51    apply(Kokkos::View<
const mv_scalar_type**, array_layout,
 
   52                       device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> >
 
   54          Kokkos::View<mv_scalar_type**, array_layout,
 
   55                       device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> >
 
   57          const Teuchos::ETransp mode,
 
   58          const mv_scalar_type alpha,
 
   59          const mv_scalar_type beta)
 const {
 
   60  const bool conjugate = (mode == Teuchos::CONJ_TRANS);
 
   61  const bool transpose = (mode != Teuchos::NO_TRANS);
 
   63#ifdef HAVE_TPETRA_DEBUG 
   64  const char tfecfFuncName[] = 
"apply: ";
 
   66  TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(X.extent(1) != Y.extent(1), std::runtime_error,
 
   67                                        "X.extent(1) = " << X.extent(1) << 
" != Y.extent(1) = " 
   68                                                         << Y.extent(1) << 
".");
 
   71  TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(X.data() == Y.data() && X.data() != 
nullptr,
 
   72                                        std::runtime_error, 
"X and Y may not alias one another.");
 
   75  const auto op = transpose ? (conjugate ? KokkosSparse::ConjugateTranspose : KokkosSparse::Transpose) : KokkosSparse::NoTranspose;
 
   76  if (have_A_cusparse) {
 
   77    KokkosSparse::spmv(op, alpha, A_cusparse, X, beta, Y);
 
   79    KokkosSparse::spmv(op, alpha, *A_, X, beta, Y);
 
   85template <
class MultiVectorScalar, 
class MatrixScalar, 
class Device>
 
   88        Kokkos::View<
const mv_scalar_type**, array_layout,
 
   89                     device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> >
 
   91        Kokkos::View<mv_scalar_type**, array_layout,
 
   92                     device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> >
 
   94        const Teuchos::ETransp 
mode,
 
   95        const mv_scalar_type 
alpha,
 
   96        const mv_scalar_type 
beta)
 const {
 
 
  100template <
class MultiVectorScalar, 
class MatrixScalar, 
class Device>
 
  101const typename LocalCrsMatrixOperator<MultiVectorScalar, MatrixScalar, Device>::local_matrix_device_type&
 
  118#define TPETRA_LOCALCRSMATRIXOPERATOR_INSTANT(SC, NT) \ 
  119  template class LocalCrsMatrixOperator<SC, SC, NT::device_type>; 
  123#define TPETRA_LOCALCRSMATRIXOPERATOR_MIXED_INSTANT(SC, MATSC, LO, GO, NT) \ 
  124  template class LocalCrsMatrixOperator<SC, MATSC, NT::device_type>; 
Declaration of Tpetra::Details::Behavior, a class that describes Tpetra's behavior.
 
Struct that holds views of the contents of a CrsMatrix.
 
Abstract interface for local operators (e.g., matrices and preconditioners).
 
Namespace Tpetra contains the class and methods constituting the Tpetra library.