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.