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 {}
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>>&,
181 std::vector<Triplet<scalar_t>>&,
182 std::vector<Triplet<scalar_t>>&)
const override {}
184 void extract_F11_block
185 (scalar_t*, integer_t, integer_t, integer_t,
186 integer_t, integer_t)
const override {}
187 void extract_F12_block
188 (scalar_t*, integer_t, integer_t, integer_t, integer_t,
189 integer_t,
const integer_t*)
const override {}
190 void extract_F21_block
191 (scalar_t*, integer_t, integer_t, integer_t, integer_t,
192 integer_t,
const integer_t*)
const override {}
194 (integer_t, integer_t,
const std::vector<integer_t>&,
196 void front_multiply_2d
197 (integer_t, integer_t,
const std::vector<integer_t>&,
const DistM_t&,
199 void front_multiply_2d
200 (
Trans op, integer_t, integer_t,
const std::vector<integer_t>&,
204 (
int ordering_level, integer_t lo, integer_t hi,
205 const std::vector<integer_t>& upd)
const override {
208 (
int ordering_level, integer_t lo, integer_t hi,
209 const std::vector<integer_t>& upd)
const override {
212 (
int ordering_level,
const std::vector<integer_t>& upd)
const override {
215 void front_multiply_F11
216 (
Trans op, integer_t slo, integer_t shi,
218 void front_multiply_F12
219 (
Trans op, integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
221 void front_multiply_F21
222 (
Trans op, integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
224 #endif //DOXYGEN_SHOULD_SKIP_THIS
227 void split_diag_offdiag();
228 void setup_spmv_buffers()
const;
238 std::vector<integer_t> dist_;
244 std::vector<integer_t> offdiag_start_;
256 void scale(
const std::vector<scalar_t>& lDr,
257 const std::vector<scalar_t>& gDc)
override;
258 void scale_real(
const std::vector<real_t>& lDr,
259 const std::vector<real_t>& gDc)
override;
266 using CSM_t::symm_sparse_;
280 template<
typename scalar_t,
typename integer_t,
typename cast_t>
286 #endif // STRUMPACK_CSRMATRIX_MPI_HPP