151 using real_t =
typename RealType<scalar_t>::value_type;
152#if defined(STRUMPACK_USE_MPI)
169 integer_t
size()
const {
return n_; }
176 integer_t
nnz()
const {
return nnz_; }
187 const integer_t*
ptr()
const {
return ptr_.data(); }
196 const integer_t*
ind()
const {
return ind_.data(); }
205 const scalar_t*
val()
const {
return val_.data(); }
215 integer_t*
ptr() {
return ptr_.data(); }
224 integer_t*
ind() {
return ind_.data(); }
232 scalar_t*
val() {
return val_.data(); }
239 const integer_t&
ptr(integer_t i)
const { assert(i >= 0 && i <=
size());
return ptr_[i]; }
247 const integer_t&
ind(integer_t i)
const { assert(i >= 0 && i <
nnz());
return ind_[i]; }
254 const scalar_t&
val(integer_t i)
const { assert(i >= 0 && i <
nnz());
return val_[i]; }
261 integer_t&
ptr(integer_t i) { assert(i <=
size());
return ptr_[i]; }
269 integer_t&
ind(integer_t i) { assert(i <
nnz());
return ind_[i]; }
276 scalar_t&
val(integer_t i) { assert(i <
nnz());
return val_[i]; }
278 virtual real_t norm1()
const = 0;
324 virtual void spmv(
const scalar_t* x, scalar_t* y)
const = 0;
330 virtual void permute(
const integer_t* iorder,
const integer_t* order);
332 void permute(
const std::vector<integer_t>& iorder,
333 const std::vector<integer_t>& order) {
334 permute(iorder.data(), order.data());
337 virtual void permute_columns(
const std::vector<integer_t>& perm) = 0;
339 virtual Equil_t equilibration()
const {
return Equil_t(this->
size()); }
341 virtual void equilibrate(
const Equil_t&) {}
343 virtual Match_t matching(
MatchingJob,
bool apply=
true);
345 virtual void apply_matching(
const Match_t&);
347 virtual void symmetrize_sparsity();
349 virtual void print()
const;
350 virtual void print_dense(
const std::string& name)
const {
351 std::cerr <<
"print_dense not implemented for this matrix type"
354 virtual void print_matrix_market(
const std::string& filename)
const {
355 std::cerr <<
"print_matrix_market not implemented for this matrix type"
359 virtual int read_matrix_market(
const std::string& filename) = 0;
361 virtual real_t max_scaled_residual(
const scalar_t* x,
362 const scalar_t* b)
const = 0;
363 virtual real_t max_scaled_residual(
const DenseM_t& x,
364 const DenseM_t& b)
const = 0;
366#ifndef DOXYGEN_SHOULD_SKIP_THIS
367 virtual CSRGraph<integer_t>
368 extract_graph(
int ordering_level, integer_t lo, integer_t hi)
const = 0;
369 virtual CSRGraph<integer_t>
370 extract_graph_sep_CB(
int ordering_level, integer_t lo, integer_t hi,
371 const std::vector<integer_t>& upd)
const = 0;
372 virtual CSRGraph<integer_t>
373 extract_graph_CB_sep(
int ordering_level, integer_t lo, integer_t hi,
374 const std::vector<integer_t>& upd)
const = 0;
375 virtual CSRGraph<integer_t>
376 extract_graph_CB(
int ordering_level,
377 const std::vector<integer_t>& upd)
const = 0;
380 extract_separator(integer_t sep_end,
const std::vector<std::size_t>& I,
381 const std::vector<std::size_t>& J, DenseM_t& B,
382 int depth)
const = 0;
384 extract_front(DenseM_t& F11, DenseM_t& F12, DenseM_t& F21,
385 integer_t slo, integer_t shi,
386 const std::vector<integer_t>& upd,
387 int depth)
const = 0;
389 push_front_elements(integer_t, integer_t,
const std::vector<integer_t>&,
390 std::vector<Triplet<scalar_t>>&,
391 std::vector<Triplet<scalar_t>>&,
392 std::vector<Triplet<scalar_t>>&)
const = 0;
394 set_front_elements(integer_t, integer_t,
const std::vector<integer_t>&,
395 Triplet<scalar_t>*, Triplet<scalar_t>*,
396 Triplet<scalar_t>*)
const = 0;
400 set_front_elements_symmetric(integer_t, integer_t,
const std::vector<integer_t>&,
401 Triplet<scalar_t>*, Triplet<scalar_t>*)
const { abort(); };
404 count_front_elements(integer_t, integer_t,
const std::vector<integer_t>&,
405 std::size_t&, std::size_t&, std::size_t&)
const = 0;
408 front_multiply(integer_t slo, integer_t shi,
409 const std::vector<integer_t>& upd,
410 const DenseM_t&
R, DenseM_t& Sr, DenseM_t& Sc,
411 int depth)
const = 0;
415 count_front_elements_symmetric(integer_t, integer_t,
const std::vector<integer_t>&,
416 std::size_t&, std::size_t&)
const { abort(); };
419 front_multiply_F11(
Trans op, integer_t slo, integer_t shi,
420 const DenseM_t&
R, DenseM_t& S,
int depth)
const = 0;
422 front_multiply_F12(
Trans op, integer_t slo, integer_t shi,
423 const std::vector<integer_t>& upd,
424 const DenseM_t&
R, DenseM_t& S,
int depth)
const = 0;
426 front_multiply_F21(
Trans op, integer_t slo, integer_t shi,
427 const std::vector<integer_t>& upd,
428 const DenseM_t&
R, DenseM_t& S,
int depth)
const = 0;
430#if defined(STRUMPACK_USE_MPI)
432 extract_F11_block(scalar_t*
F, integer_t ldF,
433 integer_t row, integer_t nr_rows,
434 integer_t col, integer_t nr_cols)
const = 0;
436 extract_F12_block(scalar_t*
F, integer_t ldF,
437 integer_t row, integer_t nr_rows,
438 integer_t col, integer_t nr_cols,
439 const integer_t* upd)
const = 0;
441 extract_F21_block(scalar_t*
F, integer_t ldF,
442 integer_t row, integer_t nr_rows,
443 integer_t col, integer_t nr_cols,
444 const integer_t* upd)
const = 0;
446 extract_separator_2d(integer_t sep_end,
447 const std::vector<std::size_t>& I,
448 const std::vector<std::size_t>& J,
449 DistM_t& B)
const = 0;
451 front_multiply_2d(integer_t sep_begin, integer_t sep_end,
452 const std::vector<integer_t>& upd,
453 const DistM_t&
R, DistM_t& Srow, DistM_t& Scol,
454 int depth)
const = 0;
456 front_multiply_2d(
Trans op, integer_t sep_begin, integer_t sep_end,
457 const std::vector<integer_t>& upd,
const DistM_t&
R,
458 DistM_t& S,
int depth)
const = 0;
464 std::vector<integer_t> ptr_, ind_;
465 std::vector<scalar_t> val_;
468 enum MMsym {GENERAL, SYMMETRIC, SKEWSYMMETRIC, HERMITIAN};
470 CompressedSparseMatrix();
471 CompressedSparseMatrix(integer_t n, integer_t
nnz,
473 CompressedSparseMatrix(integer_t n,
474 const integer_t* row_ptr,
475 const integer_t* col_ind,
476 const scalar_t* values,
bool symm_sparsity);
478 std::vector<std::tuple<integer_t,integer_t,scalar_t>>
479 read_matrix_market_entries(
const std::string& filename);
481 virtual int strumpack_mc64(
MatchingJob, Match_t&) {
return 0; }
483 virtual void scale(
const std::vector<scalar_t>&,
484 const std::vector<scalar_t>&) = 0;
485 virtual void scale_real(
const std::vector<real_t>&,
486 const std::vector<real_t>&) = 0;
488 long long spmv_flops()
const;
489 long long spmv_bytes()
const;