54 template<
typename scalar_t,
typename integer_t>
class CSRMatrix
56#if defined(STRUMPACK_USE_MPI)
62 using real_t =
typename RealType<scalar_t>::value_type;
70 const scalar_t* values,
bool symm_sparsity=
false);
72 real_t norm1()
const override;
75 void spmv(
const scalar_t* x, scalar_t* y)
const override;
79 Equil_t equilibration()
const override;
81 void equilibrate(
const Equil_t& eq)
override;
83 void permute_columns(
const std::vector<integer_t>& perm)
override;
85 real_t max_scaled_residual(
const scalar_t* x,
const scalar_t* b)
90 std::unique_ptr<CSRMatrix<scalar_t,integer_t>>
91 add_missing_diagonal(
const scalar_t& s)
const;
93 int read_matrix_market(
const std::string& filename)
override;
94 int read_binary(
const std::string& filename);
95 void print_dense(
const std::string& name)
const override;
96 void print_matrix_market(
const std::string& filename)
const override;
97 void print_binary(
const std::string& filename)
const;
100 extract_graph(
int ordering_level,
101 integer_t lo, integer_t hi)
const override;
103 extract_graph_sep_CB(
int ordering_level, integer_t lo, integer_t hi,
104 const std::vector<integer_t>& upd)
const override;
106 extract_graph_CB_sep(
int ordering_level, integer_t lo, integer_t hi,
107 const std::vector<integer_t>& upd)
const override;
109 extract_graph_CB(
int ordering_level,
110 const std::vector<integer_t>& upd)
const override;
114#ifndef DOXYGEN_SHOULD_SKIP_THIS
116 void front_multiply(integer_t slo, integer_t shi,
117 const std::vector<integer_t>& upd,
119 int depth)
const override;
120 void extract_separator(integer_t sep_end,
121 const std::vector<std::size_t>& I,
122 const std::vector<std::size_t>& J,
123 DenseM_t& B,
int depth)
const override;
125 integer_t sep_begin, integer_t sep_end,
126 const std::vector<integer_t>& upd,
127 int depth)
const override;
129 void push_front_elements(integer_t, integer_t,
130 const std::vector<integer_t>&,
131 std::vector<Triplet<scalar_t>>&,
132 std::vector<Triplet<scalar_t>>&,
133 std::vector<Triplet<scalar_t>>&)
const override;
134 void set_front_elements(integer_t, integer_t,
135 const std::vector<integer_t>&,
136 Triplet<scalar_t>*, Triplet<scalar_t>*,
137 Triplet<scalar_t>*)
const override;
139 void set_front_elements_symmetric(integer_t, integer_t,
140 const std::vector<integer_t>&,
141 Triplet<scalar_t>*, Triplet<scalar_t>*)
const override;
143 void count_front_elements(integer_t, integer_t,
144 const std::vector<integer_t>&,
145 std::size_t&, std::size_t&, std::size_t&)
148 void count_front_elements_symmetric(integer_t, integer_t,
149 const std::vector<integer_t>&,
150 std::size_t&, std::size_t&)
const override;
152 void front_multiply_F11(
Trans op, integer_t slo, integer_t shi,
154 int depth)
const override;
155 void front_multiply_F12(
Trans op, integer_t slo, integer_t shi,
156 const std::vector<integer_t>& upd,
158 int depth)
const override;
159 void front_multiply_F21(
Trans op, integer_t slo, integer_t shi,
160 const std::vector<integer_t>& upd,
162 int depth)
const override;
164#if defined(STRUMPACK_USE_MPI)
165 void extract_F11_block(scalar_t*
F, integer_t ldF,
166 integer_t row, integer_t nr_rows,
167 integer_t col, integer_t nr_cols)
const override;
168 void extract_F12_block(scalar_t*
F, integer_t ldF,
169 integer_t row, integer_t nr_rows,
170 integer_t col, integer_t nr_cols,
171 const integer_t* upd)
const override;
172 void extract_F21_block(scalar_t*
F, integer_t ldF,
173 integer_t row, integer_t nr_rows,
174 integer_t col, integer_t nr_cols,
175 const integer_t* upd)
const override;
176 void extract_separator_2d(integer_t sep_end,
177 const std::vector<std::size_t>& I,
178 const std::vector<std::size_t>& J,
180 void front_multiply_2d(integer_t sep_begin, integer_t sep_end,
181 const std::vector<integer_t>& upd,
183 int depth)
const override;
184 void front_multiply_2d(
Trans op, integer_t sep_begin, integer_t sep_end,
185 const std::vector<integer_t>& upd,
187 int depth)
const override;
194 void scale(
const std::vector<scalar_t>& Dr,
195 const std::vector<scalar_t>& Dc)
override;
196 void scale_real(
const std::vector<real_t>& Dr,
197 const std::vector<real_t>& Dc)
override;
206 using CSM_t::symm_sparse_;