8#if defined(FEAT_HAVE_SUPERLU_DIST) && defined(FEAT_HAVE_MPI)
12#include <superlu_ddefs.h>
35 superlu_dist_options_t slu_opts;
37 SuperLUStat_t slu_stats;
39 SuperMatrix slu_matrix;
41 NRformat_loc slu_matrix_store;
43 dScalePermstruct_t slu_scale_perm;
45 dLUstruct_t slu_lu_struct;
47 dSOLVEstruct_t slu_solve_struct;
50 const IT slu_dof_offset, slu_num_owned_dofs, slu_num_global_dofs, slu_num_nonzeros;
54 std::vector<IT> slu_row_ptr, slu_col_idx, slu_col_idx2;
56 std::vector<double> slu_mat_val;
58 std::vector<double> slu_vector;
60 std::vector<double> slu_v_berr;
67 explicit Core(
const void* comm, Index num_global_dofs, Index my_dof_offset,
68 Index num_owned_dofs, Index num_nonzeros) :
69 _comm(*reinterpret_cast<const MPI_Comm*>(comm)),
71 slu_dof_offset(IT(my_dof_offset)),
72 slu_num_owned_dofs(IT(num_owned_dofs)),
73 slu_num_global_dofs(IT(num_global_dofs)),
74 slu_num_nonzeros(IT(num_nonzeros)),
78 memset(&slu_grid, 0,
sizeof(gridinfo_t));
79 memset(&slu_opts, 0,
sizeof(superlu_dist_options_t));
80 memset(&slu_stats, 0,
sizeof(SuperLUStat_t));
81 memset(&slu_matrix, 0,
sizeof(SuperMatrix));
82 memset(&slu_matrix_store, 0,
sizeof(NRformat_loc));
83 memset(&slu_scale_perm, 0,
sizeof(dScalePermstruct_t));
84 memset(&slu_lu_struct, 0,
sizeof(dLUstruct_t));
85 memset(&slu_solve_struct, 0,
sizeof(dSOLVEstruct_t));
89 MPI_Comm_size(_comm, &ranks);
90 superlu_gridinit(_comm, ranks, 1, &slu_grid);
93 slu_row_ptr.resize(num_owned_dofs+1u);
94 slu_col_idx.resize(num_nonzeros);
95 slu_col_idx2.resize(num_nonzeros);
96 slu_mat_val.resize(num_nonzeros);
97 slu_vector.resize(num_owned_dofs);
98 slu_v_berr.resize(num_owned_dofs);
101 slu_matrix.Stype = SLU_NR_loc;
102 slu_matrix.Dtype = SLU_D;
103 slu_matrix.Mtype = SLU_GE;
104 slu_matrix.nrow = slu_num_global_dofs;
105 slu_matrix.ncol = slu_num_global_dofs;
106 slu_matrix.Store = &slu_matrix_store;
109 slu_matrix_store.nnz_loc = slu_num_nonzeros;
110 slu_matrix_store.m_loc = slu_num_owned_dofs;
111 slu_matrix_store.fst_row = slu_dof_offset;
112 slu_matrix_store.nzval = slu_mat_val.data();
113 slu_matrix_store.rowptr = slu_row_ptr.data();
114 slu_matrix_store.colind = slu_col_idx2.data();
119 PStatFree(&slu_stats);
120 dLUstructFree(&slu_lu_struct);
121 dScalePermstructFree(&slu_scale_perm);
122 dSolveFinalize(&slu_opts, &slu_solve_struct);
123 superlu_gridexit(&slu_grid);
129 memcpy(slu_col_idx2.data(), slu_col_idx.data(),
sizeof(IT)*slu_col_idx.size());
132 set_default_options_dist(&slu_opts);
135 slu_opts.PrintStat = NO;
138 slu_opts.ReplaceTinyPivot = YES;
141 dScalePermstructInit(slu_num_global_dofs, slu_num_global_dofs, &slu_scale_perm);
144 dLUstructInit(slu_num_global_dofs, &slu_lu_struct);
147 PStatInit(&slu_stats);
154 memcpy(slu_col_idx2.data(), slu_col_idx.data(),
sizeof(IT)*slu_col_idx.size());
157 slu_opts.Fact = (was_factorized ? SamePattern : DOFACT);
165 int(slu_num_owned_dofs),
179 was_factorized =
true;
188 dDestroy_LU(slu_matrix.nrow, &slu_grid, &slu_lu_struct);
194 slu_opts.Fact = FACTORED;
202 int(slu_num_owned_dofs),
216 void* create_core(
const void* comm, Index num_global_dofs, Index dof_offset,
217 Index num_owned_dofs, Index num_nonzeros)
219 return new Core(comm, num_global_dofs, dof_offset, num_owned_dofs, num_nonzeros);
222 void destroy_core(
void* core)
224 delete reinterpret_cast<Core*
>(core);
227 int_t* get_row_ptr(
void* core)
229 return reinterpret_cast<Core*
>(core)->slu_row_ptr.data();
232 int_t* get_col_idx(
void* core)
234 return reinterpret_cast<Core*
>(core)->slu_col_idx.data();
237 double* get_mat_val(
void* core)
239 return reinterpret_cast<Core*
>(core)->slu_mat_val.data();
242 double* get_vector(
void* core)
244 return reinterpret_cast<Core*
>(core)->slu_vector.data();
247 void init_symbolic(
void* core)
249 reinterpret_cast<Core*
>(core)->init_symbolic();
252 int init_numeric(
void* core)
254 return reinterpret_cast<Core*
>(core)->init_numeric();
257 void done_numeric(
void* core)
259 reinterpret_cast<Core*
>(core)->done_numeric();
262 int solve(
void* core)
264 return reinterpret_cast<Core*
>(core)->
solve();
272void dummy_superlu_function() {}
Status solve(SolverBase< Vector_ > &solver, Vector_ &vec_sol, const Vector_ &vec_rhs, const Matrix_ &matrix, const Filter_ &filter)
Solve linear system with initial solution guess.