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) {
140 auto& icntl_output_diagnostic_statistics_warning(
const auto config) {
144 auto& icntl_output_global_information(
const auto config) {
148 auto& icntl_printing_level(
const auto config) {
156 auto& icntl_permutation_and_scaling(
const auto config) {
160 auto& icntl_symmetric_permutation(
const auto config) {
164 auto& icntl_scaling_strategy(
const auto config) {
168 auto& icntl_transpose_matrix(
const auto config) {
172 auto& icntl_iterative_refinement(
const auto config) {
176 auto& icntl_error_analysis(
const auto config) {
180 auto& icntl_ordering_strategy(
const auto config) {
184 auto& icntl_root_parallelism(
const auto config) {
188 auto& icntl_working_space_percentage_increase(
const auto config) {
192 auto& icntl_compression_block_format(
const auto config) {
196 auto& icntl_openmp_threads(
const auto config) {
200 auto& icntl_distribution_strategy_input(
const auto config) {
204 auto& icntl_schur_complement(
const auto config) {
212 auto& icntl_distribution_strategy_solution(
const auto config) {
216 auto& icntl_out_of_core(
const auto config) {
220 auto& icntl_maximum_working_memory(
const auto config) {
224 auto& icntl_null_pivot_row_detection(
const auto config) {
228 auto& icntl_deficient_and_null_space_basis(
const auto config) {
232 auto& icntl_schur_complement_solution(
const auto config) {
236 auto& icntl_rhs_block_size(
const auto config) {
240 auto& icntl_ordering_computation(
const auto config) {
248 auto& icntl_inverse_computation(
const auto config) {
256 auto& icntl_forward_elimination(
const auto config) {
260 auto& icntl_determinant_computation(
const auto config) {
264 auto& icntl_out_of_core_file(
const auto config) {
268 auto& icntl_blr(
const auto config) {
272 auto& icntl_blr_variant(
const auto config) {
276 auto& icntl_blr_compression(
const auto config) {
280 auto& icntl_lu_compression_rate(
const auto config) {
284 auto& icntl_block_compression_rate(
const auto config) {
288 auto& icntl_tree_parallelism(
const auto config) {
292 auto& icntl_compact_working_space(
const auto config) {
296 auto& icntl_rank_revealing_factorization(
const auto config) {
300 auto& icntl_symbolic_factorization(
const auto 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; }
311 if(A.n !=
B.n_rows)
return IT{-1};
318 id.a = (entry_t*)A.data;
322 id.rhs = (entry_t*)
B.data;
331 if(
id.n !=
B.n_rows)
return IT{-1};
336 id.rhs = (entry_t*)
B.data;
366 const auto a =
id.rinfog[11];
368 const auto c = std::pow(
WT{2},
id.infog[33]);
370 return std::complex<WT>{a, b} * c;
373 auto sign_det()
const
375 {
return id.rinfog[11] >
work_t<DT>{0} ? 1 : -1; }