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());
107 void spmv(
const scalar_t* x, scalar_t* y)
const override;
109 void permute(
const integer_t* iorder,
const integer_t* order)
override;
111 std::unique_ptr<CSRMatrix<scalar_t,integer_t>> gather()
const;
112 std::unique_ptr<CSRGraph<integer_t>> gather_graph()
const;
131 Equil_t equilibration()
const override;
133 void equilibrate(
const Equil_t&)
override;
135 void permute_columns(
const std::vector<integer_t>& perm)
override;
137 void symmetrize_sparsity()
override;
139 int read_matrix_market(
const std::string& filename)
override;
144 real_t max_scaled_residual(
const scalar_t* x,
const scalar_t* b)
148 get_sub_graph(
const std::vector<integer_t>& perm,
149 const std::vector<std::pair<integer_t,integer_t>>&
153 extract_graph(
int ordering_level,
154 integer_t lo, integer_t hi)
const override {
159 void print()
const override;
160 void print_dense(
const std::string& name)
const override;
161 void print_matrix_market(
const std::string& filename)
const override;
165 #ifndef DOXYGEN_SHOULD_SKIP_THIS
167 void extract_separator
168 (integer_t,
const std::vector<std::size_t>&,
169 const std::vector<std::size_t>&,
DenseM_t&,
int)
const override {}
170 void extract_separator_2d
171 (integer_t,
const std::vector<std::size_t>&,
172 const std::vector<std::size_t>&,
DistM_t&)
const override {}
175 integer_t,
const std::vector<integer_t>&,
int)
const override {}
176 void push_front_elements
177 (integer_t, integer_t,
const std::vector<integer_t>&,
178 std::vector<Triplet<scalar_t>>&,
179 std::vector<Triplet<scalar_t>>&,
180 std::vector<Triplet<scalar_t>>&)
const override {}
182 void extract_F11_block
183 (scalar_t*, integer_t, integer_t, integer_t,
184 integer_t, integer_t)
const override {}
185 void extract_F12_block
186 (scalar_t*, integer_t, integer_t, integer_t, integer_t,
187 integer_t,
const integer_t*)
const override {}
188 void extract_F21_block
189 (scalar_t*, integer_t, integer_t, integer_t, integer_t,
190 integer_t,
const integer_t*)
const override {}
192 (integer_t, integer_t,
const std::vector<integer_t>&,
194 void front_multiply_2d
195 (integer_t, integer_t,
const std::vector<integer_t>&,
const DistM_t&,
197 void front_multiply_2d
198 (
Trans op, integer_t, integer_t,
const std::vector<integer_t>&,
202 (
int ordering_level, integer_t lo, integer_t hi,
203 const std::vector<integer_t>& upd)
const override {
206 (
int ordering_level, integer_t lo, integer_t hi,
207 const std::vector<integer_t>& upd)
const override {
210 (
int ordering_level,
const std::vector<integer_t>& upd)
const override {
213 void front_multiply_F11
214 (
Trans op, integer_t slo, integer_t shi,
216 void front_multiply_F12
217 (
Trans op, integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
219 void front_multiply_F21
220 (
Trans op, integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
222 #endif //DOXYGEN_SHOULD_SKIP_THIS
225 void split_diag_offdiag();
226 void setup_spmv_buffers()
const;
236 std::vector<integer_t> dist_;
242 std::vector<integer_t> offdiag_start_;
254 void scale(
const std::vector<scalar_t>& lDr,
255 const std::vector<scalar_t>& gDc)
override;
256 void scale_real(
const std::vector<real_t>& lDr,
257 const std::vector<real_t>& gDc)
override;
264 using CSM_t::symm_sparse_;
269 #endif // STRUMPACK_CSRMATRIX_MPI_HPP