33 #ifndef STRUMPACK_CSRMATRIX_MPI_HPP 
   34 #define STRUMPACK_CSRMATRIX_MPI_HPP 
   42 #include "dense/BLASLAPACKWrapper.hpp" 
   43 #include "CSRGraph.hpp" 
   48   template<
typename scalar_t,
typename integer_t> 
class SPMVBuffers {
 
   50     bool initialized = 
false;
 
   51     std::vector<integer_t> sranks, rranks, soff, roffs, sind;
 
   52     std::vector<scalar_t> sbuf, rbuf;
 
   55     std::vector<integer_t> prbuf;
 
   71   template<
typename scalar_t,
typename integer_t>
 
   76     using real_t = 
typename RealType<scalar_t>::value_type;
 
   82     CSRMatrixMPI(integer_t local_rows, 
const integer_t* row_ptr,
 
   83                  const integer_t* col_ind, 
const scalar_t* values,
 
   85     CSRMatrixMPI(integer_t rows, integer_t local_rows, integer_t local_nnz,
 
   88                  const integer_t* d_ind, 
const scalar_t* d_val,
 
   89                  const integer_t* o_ptr, 
const integer_t* o_ind,
 
   90                  const scalar_t* o_val, 
const integer_t* garray,
 
   95     integer_t local_nnz()
 const { 
return lnnz_; }
 
   96     integer_t local_rows()
 const { 
return lrows_; }
 
   97     integer_t begin_row()
 const { 
return brow_; }
 
   98     integer_t end_row()
 const { 
return brow_ + lrows_; }
 
  101     const MPIComm& Comm()
 const { 
return comm_; }
 
  103     MPI_Comm comm()
 const { 
return comm_.
comm(); }
 
  105     const std::vector<integer_t>& dist()
 const { 
return dist_; }
 
  106     const integer_t& dist(std::size_t p)
 const {
 
  107       assert(p < dist_.size());
 
  111     real_t norm1() 
const override;
 
  114     void spmv(
const scalar_t* x, scalar_t* y) 
const override;
 
  116     void permute(
const integer_t* iorder, 
const integer_t* order) 
override;
 
  118     std::unique_ptr<CSRMatrix<scalar_t,integer_t>> gather() 
const;
 
  119     std::unique_ptr<CSRGraph<integer_t>> gather_graph() 
const;
 
  138     Equil_t equilibration() 
const override;
 
  140     void equilibrate(
const Equil_t&) 
override;
 
  142     void permute_columns(
const std::vector<integer_t>& perm) 
override;
 
  144     void symmetrize_sparsity() 
override;
 
  146     int read_matrix_market(
const std::string& filename) 
override;
 
  151     real_t max_scaled_residual(
const scalar_t* x, 
const scalar_t* b)
 
  154     std::unique_ptr<CSRMatrixMPI<scalar_t,integer_t>>
 
  155     add_missing_diagonal(
const scalar_t& s) 
const;
 
  158     get_sub_graph(
const std::vector<integer_t>& perm,
 
  159                   const std::vector<std::pair<integer_t,integer_t>>&
 
  163     extract_graph(
int ordering_level,
 
  164                   integer_t lo, integer_t hi)
 const override {
 
  169     void print() 
const override;
 
  170     void print_dense(
const std::string& name) 
const override;
 
  171     void print_matrix_market(
const std::string& filename) 
const override;
 
  175 #ifndef DOXYGEN_SHOULD_SKIP_THIS 
  177     void extract_separator
 
  178     (integer_t, 
const std::vector<std::size_t>&,
 
  179      const std::vector<std::size_t>&, DenseM_t&, 
int)
 const override {}
 
  180     void extract_separator_2d
 
  181     (integer_t, 
const std::vector<std::size_t>&,
 
  182      const std::vector<std::size_t>&, DistM_t&)
 const override {}
 
  184     (DenseM_t&, DenseM_t&, DenseM_t&, integer_t,
 
  185      integer_t, 
const std::vector<integer_t>&, 
int)
 const override {}
 
  186     void push_front_elements
 
  187     (integer_t, integer_t, 
const std::vector<integer_t>&,
 
  188      std::vector<Triplet<scalar_t>>&, std::vector<Triplet<scalar_t>>&,
 
  189      std::vector<Triplet<scalar_t>>&)
 const override {}
 
  190     void set_front_elements
 
  191     (integer_t, integer_t, 
const std::vector<integer_t>&,
 
  192      Triplet<scalar_t>*, Triplet<scalar_t>*,
 
  193      Triplet<scalar_t>*)
 const override {}
 
  194     void count_front_elements
 
  195     (integer_t, integer_t, 
const std::vector<integer_t>&,
 
  196      std::size_t&, std::size_t&, std::size_t&)
 const override {}
 
  198     void extract_F11_block
 
  199     (scalar_t*, integer_t, integer_t, integer_t,
 
  200      integer_t, integer_t)
 const override {}
 
  201     void extract_F12_block
 
  202     (scalar_t*, integer_t, integer_t, integer_t, integer_t,
 
  203      integer_t, 
const integer_t*)
 const override {}
 
  204     void extract_F21_block
 
  205     (scalar_t*, integer_t, integer_t, integer_t, integer_t,
 
  206      integer_t, 
const integer_t*)
 const override {}
 
  208     (integer_t, integer_t, 
const std::vector<integer_t>&,
 
  209      const DenseM_t&, DenseM_t&, DenseM_t&, 
int depth)
 const override {}
 
  210     void front_multiply_2d
 
  211     (integer_t, integer_t, 
const std::vector<integer_t>&, 
const DistM_t&,
 
  212      DistM_t&, DistM_t&, 
int)
 const override {}
 
  213     void front_multiply_2d
 
  214     (
Trans op, integer_t, integer_t, 
const std::vector<integer_t>&,
 
  215      const DistM_t&, DistM_t&, 
int)
 const override {}
 
  217     CSRGraph<integer_t> extract_graph_sep_CB
 
  218     (
int ordering_level, integer_t lo, integer_t hi,
 
  219      const std::vector<integer_t>& upd)
 const override {
 
  220       return CSRGraph<integer_t>(); };
 
  221     CSRGraph<integer_t> extract_graph_CB_sep
 
  222     (
int ordering_level, integer_t lo, integer_t hi,
 
  223      const std::vector<integer_t>& upd)
 const override {
 
  224       return CSRGraph<integer_t>(); };
 
  225     CSRGraph<integer_t> extract_graph_CB
 
  226     (
int ordering_level, 
const std::vector<integer_t>& upd)
 const override {
 
  227       return CSRGraph<integer_t>(); };
 
  229     void front_multiply_F11
 
  230     (
Trans op, integer_t slo, integer_t shi,
 
  231      const DenseM_t& R, DenseM_t& S, 
int depth)
 const override {};
 
  232     void front_multiply_F12
 
  233     (
Trans op, integer_t slo, integer_t shi, 
const std::vector<integer_t>& upd,
 
  234      const DenseM_t& R, DenseM_t& S, 
int depth)
 const override {};
 
  235     void front_multiply_F21
 
  236     (
Trans op, integer_t slo, integer_t shi, 
const std::vector<integer_t>& upd,
 
  237      const DenseM_t& R, DenseM_t& S, 
int depth)
 const override {};
 
  241     void split_diag_offdiag();
 
  242     void setup_spmv_buffers() 
const;
 
  252     std::vector<integer_t> dist_;
 
  258     std::vector<integer_t> offdiag_start_;
 
  264     mutable SPMVBuffers<scalar_t,integer_t> spmv_bufs_;
 
  270     void scale(
const std::vector<scalar_t>& lDr,
 
  271                const std::vector<scalar_t>& gDc) 
override;
 
  272     void scale_real(
const std::vector<real_t>& lDr,
 
  273                     const std::vector<real_t>& gDc) 
override;
 
  282     using CSM_t::symm_sparse_;
 
  296   template<
typename scalar_t, 
typename integer_t, 
typename cast_t>
 
  297   CSRMatrixMPI<cast_t,integer_t>
 
Contains the compressed sparse row matrix storage class.
Contains some simple C++ MPI wrapper utilities.
Definition: CompressedSparseMatrix.hpp:49
Block-row distributed compressed sparse row storage.
Definition: CSRMatrixMPI.hpp:72
void permute(const integer_t *iorder, const integer_t *order) override
void spmv(const scalar_t *x, scalar_t *y) const override
void spmv(const DenseM_t &x, DenseM_t &y) const override
Match_t matching(MatchingJob job, bool apply=true) override
Class for storing a compressed sparse row matrix (single node).
Definition: CSRMatrix.hpp:55
Abstract base class for compressed sparse matrix storage.
Definition: CompressedSparseMatrix.hpp:149
bool symm_sparse() const
Definition: CompressedSparseMatrix.hpp:284
This class represents a matrix, stored in column major format, to allow direct use of BLAS/LAPACK rou...
Definition: DenseMatrix.hpp:138
2D block cyclicly distributed matrix, as used by ScaLAPACK.
Definition: DistributedMatrix.hpp:84
Definition: CompressedSparseMatrix.hpp:97
Wrapper class around an MPI_Comm object.
Definition: MPIWrapper.hpp:194
MPI_Comm comm() const
Definition: MPIWrapper.hpp:261
Definition: CompressedSparseMatrix.hpp:56
Definition: CSRMatrixMPI.hpp:48
Definition: StrumpackOptions.hpp:43
MatchingJob
Definition: StrumpackOptions.hpp:119
Trans
Definition: DenseMatrix.hpp:51
CSRMatrix< cast_t, integer_t > cast_matrix(const CSRMatrix< scalar_t, integer_t > &mat)