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)