48 #include "../external/mumps/cmumps_c.h"
49 #include "../external/mumps/dmumps_c.h"
50 #include "../external/mumps/smumps_c.h"
51 #include "../external/mumps/zmumps_c.h"
52 #include "abstract/sparse_solver.hpp"
54 #include <mpl/mpl.hpp>
60 using struct_type = DMUMPS_STRUC_C;
61 using entry_type = double;
62 static auto mumps_c(DMUMPS_STRUC_C* ptr) {
return dmumps_c(ptr); }
65 using struct_type = SMUMPS_STRUC_C;
66 using entry_type = float;
67 static auto mumps_c(SMUMPS_STRUC_C* ptr) {
return smumps_c(ptr); }
70 using struct_type = ZMUMPS_STRUC_C;
71 using entry_type = mumps_double_complex;
72 static auto mumps_c(ZMUMPS_STRUC_C* ptr) {
return zmumps_c(ptr); }
75 using struct_type = CMUMPS_STRUC_C;
76 using entry_type = mumps_complex;
77 static auto mumps_c(CMUMPS_STRUC_C* ptr) {
return cmumps_c(ptr); }
81 enum symmetric_pattern : std::int8_t {
83 symmetric_positive_definite = 1,
84 symmetric_indefinite = 2
87 enum parallel_mode : std::int8_t {
92 template<data_t DT, index_t IT>
class mumps final {
98 const mpl::communicator& comm_world{mpl::environment::comm_world()};
101 IT error =
id.infog[0] < 0 ? -1 : 0;
102 comm_world.allreduce(mpl::min<IT>(), error);
106 auto perform_job(
const IT job) {
112 explicit mumps(
const symmetric_pattern sym = unsymmetric,
const parallel_mode par = no_host) {
113 id.comm_fortran = MPI_Comm_c2f(comm_world.native_handle());
116 id.par = comm_world.size() == 1 ? 1 : par;
121 :
mumps(symmetric_pattern{
static_cast<std::int8_t
>(other.id.sym)}, parallel_mode{
static_cast<std::int8_t
>(other.id.par)}) {}
126 ~
mumps() { perform_job(-2); }
136 auto& icntl_output_error_message(
const auto config) {
137 id.icntl[0] = config;
140 auto& icntl_output_diagnostic_statistics_warning(
const auto config) {
141 id.icntl[1] = config;
144 auto& icntl_output_global_information(
const auto config) {
145 id.icntl[2] = config;
148 auto& icntl_printing_level(
const auto config) {
149 id.icntl[3] = config;
156 auto& icntl_permutation_and_scaling(
const auto config) {
157 id.icntl[5] = config;
160 auto& icntl_symmetric_permutation(
const auto config) {
161 id.icntl[6] = config;
164 auto& icntl_scaling_strategy(
const auto config) {
165 id.icntl[7] = config;
168 auto& icntl_transpose_matrix(
const auto config) {
169 id.icntl[8] = config;
172 auto& icntl_iterative_refinement(
const auto config) {
173 id.icntl[9] = config;
176 auto& icntl_error_analysis(
const auto config) {
177 id.icntl[10] = config;
180 auto& icntl_ordering_strategy(
const auto config) {
181 id.icntl[11] = config;
184 auto& icntl_root_parallelism(
const auto config) {
185 id.icntl[12] = config;
188 auto& icntl_working_space_percentage_increase(
const auto config) {
189 id.icntl[13] = config;
192 auto& icntl_compression_block_format(
const auto config) {
193 id.icntl[14] = config;
196 auto& icntl_openmp_threads(
const auto config) {
197 id.icntl[15] = config;
200 auto& icntl_distribution_strategy_input(
const auto config) {
201 id.icntl[17] = config;
204 auto& icntl_schur_complement(
const auto config) {
205 id.icntl[18] = config;
212 auto& icntl_distribution_strategy_solution(
const auto config) {
213 id.icntl[20] = config;
216 auto& icntl_out_of_core(
const auto config) {
217 id.icntl[21] = config;
220 auto& icntl_maximum_working_memory(
const auto config) {
221 id.icntl[22] = config;
224 auto& icntl_null_pivot_row_detection(
const auto config) {
225 id.icntl[23] = config;
228 auto& icntl_deficient_and_null_space_basis(
const auto config) {
229 id.icntl[24] = config;
232 auto& icntl_schur_complement_solution(
const auto config) {
233 id.icntl[25] = config;
236 auto& icntl_rhs_block_size(
const auto config) {
237 id.icntl[26] = config;
240 auto& icntl_ordering_computation(
const auto config) {
241 id.icntl[27] = config;
248 auto& icntl_inverse_computation(
const auto config) {
249 id.icntl[29] = config;
256 auto& icntl_forward_elimination(
const auto config) {
257 id.icntl[31] = config;
260 auto& icntl_determinant_computation(
const auto config) {
261 id.icntl[32] = config;
264 auto& icntl_out_of_core_file(
const auto config) {
265 id.icntl[33] = config;
268 auto& icntl_blr(
const auto config) {
269 id.icntl[34] = config;
272 auto& icntl_blr_variant(
const auto config) {
273 id.icntl[35] = config;
276 auto& icntl_blr_compression(
const auto config) {
277 id.icntl[36] = config;
280 auto& icntl_lu_compression_rate(
const auto config) {
281 id.icntl[37] = config;
284 auto& icntl_block_compression_rate(
const auto config) {
285 id.icntl[38] = config;
288 auto& icntl_tree_parallelism(
const auto config) {
289 id.icntl[47] = config;
292 auto& icntl_compact_working_space(
const auto config) {
293 id.icntl[48] = config;
296 auto& icntl_rank_revealing_factorization(
const auto config) {
297 id.icntl[55] = config;
300 auto& icntl_symbolic_factorization(
const auto config) {
301 id.icntl[57] = config;
305 auto& info() {
return id.info; }
306 auto& rinfo() {
return id.rinfo; }
307 auto& infog() {
return id.infog; }
308 auto& rinfog() {
return id.rinfog; }
310 IT solve(sparse_coo_mat<DT, IT>&& A, full_mat<DT, IT>&& B) {
311 if(A.n != B.n_rows)
return IT{-1};
318 id.a = (entry_t*)A.data;
322 id.rhs = (entry_t*)B.data;
330 IT solve(full_mat<DT, IT>&& B) {
331 if(
id.n != B.n_rows)
return IT{-1};
336 id.rhs = (entry_t*)B.data;
364 using WT = work_t<DT>;
366 const auto a =
id.rinfog[11];
367 const auto b = floating_t<DT> ? DT{0} :
id.rinfog[12];
368 const auto c = std::pow(WT{2},
id.infog[33]);
370 return std::complex<WT>{a, b} * c;
373 auto sign_det() const
374 requires floating_t<DT>
375 {
return id.rinfog[11] > work_t<DT>{0} ? 1 : -1; }
auto & operator()(const IT index)
Overloaded function call operator to access elements of the icntl array.
Definition: mumps.hpp:134
auto det() const
Computes the determinant of a matrix using MUMPS library data.
Definition: mumps.hpp:363