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,
86 const integer_t* d_ind,
const scalar_t* d_val,
87 const integer_t* o_ptr,
const integer_t* o_ind,
88 const scalar_t* o_val,
const integer_t* garray,
93 integer_t local_nnz()
const {
return lnnz_; }
94 integer_t local_rows()
const {
return lrows_; }
95 integer_t begin_row()
const {
return brow_; }
96 integer_t end_row()
const {
return brow_ + lrows_; }
97 MPIComm Comm()
const {
return comm_; }
98 MPI_Comm comm()
const {
return comm_.
comm(); }
100 const std::vector<integer_t>& dist()
const {
return dist_; }
101 const integer_t& dist(std::size_t p)
const {
102 assert(p < dist_.size());
106 real_t norm1()
const override;
109 void spmv(
const scalar_t* x, scalar_t* y)
const override;
111 void permute(
const integer_t* iorder,
const integer_t* order)
override;
113 std::unique_ptr<CSRMatrix<scalar_t,integer_t>> gather()
const;
114 std::unique_ptr<CSRGraph<integer_t>> gather_graph()
const;
133 Equil_t equilibration()
const override;
135 void equilibrate(
const Equil_t&)
override;
137 void permute_columns(
const std::vector<integer_t>& perm)
override;
139 void symmetrize_sparsity()
override;
141 int read_matrix_market(
const std::string& filename)
override;
146 real_t max_scaled_residual(
const scalar_t* x,
const scalar_t* b)
150 get_sub_graph(
const std::vector<integer_t>& perm,
151 const std::vector<std::pair<integer_t,integer_t>>&
155 extract_graph(
int ordering_level,
156 integer_t lo, integer_t hi)
const override {
161 void print()
const override;
162 void print_dense(
const std::string& name)
const override;
163 void print_matrix_market(
const std::string& filename)
const override;
167 #ifndef DOXYGEN_SHOULD_SKIP_THIS
169 void extract_separator
170 (integer_t,
const std::vector<std::size_t>&,
171 const std::vector<std::size_t>&, DenseM_t&,
int)
const override {}
172 void extract_separator_2d
173 (integer_t,
const std::vector<std::size_t>&,
174 const std::vector<std::size_t>&, DistM_t&)
const override {}
176 (DenseM_t&, DenseM_t&, DenseM_t&, integer_t,
177 integer_t,
const std::vector<integer_t>&,
int)
const override {}
178 void push_front_elements
179 (integer_t, integer_t,
const std::vector<integer_t>&,
180 std::vector<Triplet<scalar_t>>&, std::vector<Triplet<scalar_t>>&,
181 std::vector<Triplet<scalar_t>>&)
const override {}
182 void set_front_elements
183 (integer_t, integer_t,
const std::vector<integer_t>&,
184 Triplet<scalar_t>*, Triplet<scalar_t>*,
185 Triplet<scalar_t>*)
const override {}
186 void count_front_elements
187 (integer_t, integer_t,
const std::vector<integer_t>&,
188 std::size_t&, std::size_t&, std::size_t&)
const override {}
190 void extract_F11_block
191 (scalar_t*, integer_t, integer_t, integer_t,
192 integer_t, integer_t)
const override {}
193 void extract_F12_block
194 (scalar_t*, integer_t, integer_t, integer_t, integer_t,
195 integer_t,
const integer_t*)
const override {}
196 void extract_F21_block
197 (scalar_t*, integer_t, integer_t, integer_t, integer_t,
198 integer_t,
const integer_t*)
const override {}
200 (integer_t, integer_t,
const std::vector<integer_t>&,
201 const DenseM_t&, DenseM_t&, DenseM_t&,
int depth)
const override {}
202 void front_multiply_2d
203 (integer_t, integer_t,
const std::vector<integer_t>&,
const DistM_t&,
204 DistM_t&, DistM_t&,
int)
const override {}
205 void front_multiply_2d
206 (
Trans op, integer_t, integer_t,
const std::vector<integer_t>&,
207 const DistM_t&, DistM_t&,
int)
const override {}
209 CSRGraph<integer_t> extract_graph_sep_CB
210 (
int ordering_level, integer_t lo, integer_t hi,
211 const std::vector<integer_t>& upd)
const override {
212 return CSRGraph<integer_t>(); };
213 CSRGraph<integer_t> extract_graph_CB_sep
214 (
int ordering_level, integer_t lo, integer_t hi,
215 const std::vector<integer_t>& upd)
const override {
216 return CSRGraph<integer_t>(); };
217 CSRGraph<integer_t> extract_graph_CB
218 (
int ordering_level,
const std::vector<integer_t>& upd)
const override {
219 return CSRGraph<integer_t>(); };
221 void front_multiply_F11
222 (
Trans op, integer_t slo, integer_t shi,
223 const DenseM_t& R, DenseM_t& S,
int depth)
const override {};
224 void front_multiply_F12
225 (
Trans op, integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
226 const DenseM_t& R, DenseM_t& S,
int depth)
const override {};
227 void front_multiply_F21
228 (
Trans op, integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
229 const DenseM_t& R, DenseM_t& S,
int depth)
const override {};
233 void split_diag_offdiag();
234 void setup_spmv_buffers()
const;
244 std::vector<integer_t> dist_;
250 std::vector<integer_t> offdiag_start_;
256 mutable SPMVBuffers<scalar_t,integer_t> spmv_bufs_;
262 void scale(
const std::vector<scalar_t>& lDr,
263 const std::vector<scalar_t>& gDc)
override;
264 void scale_real(
const std::vector<real_t>& lDr,
265 const std::vector<real_t>& gDc)
override;
272 using CSM_t::symm_sparse_;
286 template<
typename scalar_t,
typename integer_t,
typename cast_t>
287 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:54
Abstract base class for compressed sparse matrix storage.
Definition: CompressedSparseMatrix.hpp:150
bool symm_sparse() const
Definition: CompressedSparseMatrix.hpp:285
This class represents a matrix, stored in column major format, to allow direct use of BLAS/LAPACK rou...
Definition: DenseMatrix.hpp:138
Definition: DistributedMatrix.hpp:52
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:42
MatchingJob
Definition: StrumpackOptions.hpp:113
Trans
Definition: DenseMatrix.hpp:51
CSRMatrix< cast_t, integer_t > cast_matrix(const CSRMatrix< scalar_t, integer_t > &mat)