Tpetra parallel linear algebra  Version of the Day
Tpetra_LocalCrsMatrixOperator_decl.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Tpetra: Templated Linear Algebra Services Package
5 // Copyright (2008) Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // ************************************************************************
38 // @HEADER
39 
40 #ifndef TPETRA_LOCALCRSMATRIXOPERATOR_DECL_HPP
41 #define TPETRA_LOCALCRSMATRIXOPERATOR_DECL_HPP
42 
43 #include "Tpetra_LocalCrsMatrixOperator_fwd.hpp"
44 #include "Tpetra_LocalOperator.hpp"
45 #include "KokkosSparse_CrsMatrix.hpp"
46 #include <memory> // std::shared_ptr
47 
48 namespace Tpetra {
49 
59  template<class MultiVectorScalar, class MatrixScalar, class Device>
61  public LocalOperator<MultiVectorScalar, Device> {
62  private:
63  using mv_scalar_type =
65  using matrix_scalar_type =
66  typename LocalOperator<MatrixScalar, Device>::scalar_type;
67  using array_layout =
69  using device_type =
71  using local_ordinal_type =
73  using execution_space = typename Device::execution_space;
74  public:
75  using local_matrix_device_type =
76  KokkosSparse::CrsMatrix<matrix_scalar_type,
77  local_ordinal_type,
78  device_type,
79  void,
80  size_t>;
81  private:
82  //The type of a matrix with offset=ordinal, but otherwise the same as local_matrix_device_type
83  using local_cusparse_matrix_type =
84  KokkosSparse::CrsMatrix<matrix_scalar_type,
85  local_ordinal_type,
86  device_type,
87  void,
88  local_ordinal_type>;
89  using local_graph_device_type = typename local_matrix_device_type::StaticCrsGraphType;
90 
91  public:
92  using ordinal_view_type = typename local_graph_device_type::entries_type::non_const_type;
93 
94  LocalCrsMatrixOperator (const std::shared_ptr<local_matrix_device_type>& A);
95  LocalCrsMatrixOperator (const std::shared_ptr<local_matrix_device_type>& A, const ordinal_view_type& A_ordinal_rowptrs);
96  ~LocalCrsMatrixOperator () override = default;
97 
98  void
99  apply (Kokkos::View<const mv_scalar_type**, array_layout,
100  device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> > X,
101  Kokkos::View<mv_scalar_type**, array_layout,
102  device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> > Y,
103  const Teuchos::ETransp mode,
104  const mv_scalar_type alpha,
105  const mv_scalar_type beta) const override;
106 
107  void
109  Kokkos::View<const mv_scalar_type**, array_layout,
110  device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> > X,
111  Kokkos::View<mv_scalar_type**, array_layout,
112  device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged> > Y,
113  const Teuchos::ETransp mode,
114  const mv_scalar_type alpha,
115  const mv_scalar_type beta) const;
116 
117  bool hasTransposeApply () const override;
118 
119  const local_matrix_device_type& getLocalMatrixDevice () const;
120 
121  private:
122  std::shared_ptr<local_matrix_device_type> A_;
123  local_cusparse_matrix_type A_cusparse;
124  const bool have_A_cusparse;
125  };
126 
127 } // namespace Tpetra
128 
129 #endif // TPETRA_LOCALCRSMATRIXOPERATOR_DECL_HPP
Namespace Tpetra contains the class and methods constituting the Tpetra library.
Abstract interface for local operators (e.g., matrices and preconditioners).
Abstract interface for local operators (e.g., matrices and preconditioners).
void applyImbalancedRows(Kokkos::View< const mv_scalar_type **, array_layout, device_type, Kokkos::MemoryTraits< Kokkos::Unmanaged > > X, Kokkos::View< mv_scalar_type **, array_layout, device_type, Kokkos::MemoryTraits< Kokkos::Unmanaged > > Y, const Teuchos::ETransp mode, const mv_scalar_type alpha, const mv_scalar_type beta) const
Same behavior as apply() above, except give KokkosKernels a hint to use an SPMV algorithm that can ef...
int local_ordinal_type
Default value of Scalar template parameter.