38 #include "abstract/sparse_solver.hpp"
40 #include <mpl/mpl.hpp>
42 using LIS_INT = int_t;
43 using LIS_SCALAR = double;
44 using LIS_REAL = double;
45 using LIS_Comm = MPI_Comm;
120 LIS_SCALAR** v_value;
135 LIS_INT* import_index;
137 LIS_INT* export_index;
140 MPI_Request *req1, *req2;
141 MPI_Status *sta1, *sta2;
196 LIS_INT is_fallocated;
208 LIS_SCALAR** w_value;
209 LIS_SCALAR*** v_value;
225 LIS_SCALAR*** values;
264 LIS_SCALAR params[15];
284 LIS_INT lis_finalize(
void);
285 LIS_INT lis_initialize(
int* argc,
char** argv[]);
287 LIS_INT lis_matrix_create(LIS_Comm comm,
LIS_MATRIX* Amat);
289 LIS_INT lis_matrix_set_csr(LIS_INT nnz, LIS_INT* row, LIS_INT* index, LIS_SCALAR* value,
LIS_MATRIX A);
290 LIS_INT lis_matrix_set_size(
LIS_MATRIX A, LIS_INT local_n, LIS_INT global_n);
293 LIS_INT lis_solver_create(
LIS_SOLVER* solver);
294 LIS_INT lis_solver_destroy(
LIS_SOLVER solver);
295 LIS_INT lis_solver_set_option(
const char* text,
LIS_SOLVER solver);
296 LIS_INT lis_vector_create(LIS_Comm comm,
LIS_VECTOR* vec);
298 LIS_INT lis_vector_set_size(
LIS_VECTOR vec, LIS_INT local_n, LIS_INT global_n);
299 LIS_INT lis_vector_set(
LIS_VECTOR vec, LIS_SCALAR* value);
301 void lis_do_not_handle_mpi();
307 const mpl::communicator& comm_world{mpl::environment::comm_world()};
310 lis_do_not_handle_mpi();
311 lis_initialize(
nullptr,
nullptr);
315 [[nodiscard]]
auto rank()
const {
return comm_world.rank(); }
317 [[nodiscard]]
auto native_handle()
const {
return comm_world.native_handle(); }
320 inline auto& get_lis_env() {
331 if(is_set) lis_matrix_unset(a_mat);
332 lis_matrix_destroy(a_mat);
336 auto create() {
return lis_matrix_create(get_lis_env().native_handle(), &a_mat); }
351 [[nodiscard]]
auto get()
const {
return a_mat; }
356 const bool is_root = 0 == get_lis_env().rank();
357 lis_matrix_set_size(a_mat, is_root ? A.n : 0, 0);
358 lis_matrix_set_csr(is_root ? A.nnz : 0, A.row_ptr, A.col_idx, A.data, a_mat);
359 lis_matrix_assemble(a_mat);
370 if(is_set) lis_vector_unset(v);
376 lis_vector_create(get_lis_env().native_handle(), &v);
377 if(n > 0) lis_vector_set_size(v, 0 == get_lis_env().rank() ? n : 0, 0);
387 lis_vector_destroy(v);
390 [[nodiscard]]
auto get()
const {
return v; }
392 auto& set(LIS_SCALAR* value) {
395 lis_vector_set(v, 0 == get_lis_env().rank() ? value :
nullptr);
414 explicit lis_solver(
const std::string_view setting)
417 void set_option(
const std::string_view setting)
const { lis_solver_set_option(setting.data(), solver); }
426 [[nodiscard]]
auto sync_error(LIS_INT error)
const {
427 env.comm_world.allreduce(mpl::min<LIS_INT>(), error);
443 explicit lis(
const std::string_view setting)
446 void set_option(
const std::string_view setting)
const { solver.set_option(setting); }
449 a_loc.set(std::move(A));
451 return solve(std::move(B));
455 if(a_loc.get()->gn != B.n_rows)
return -1;
459 std::vector<LIS_SCALAR> b_ref;
460 if(0 == env.rank()) {
461 b_ref.resize(B.n_rows * B.n_cols);
462 std::copy_n(B.data, b_ref.size(), b_ref.data());
467 for(decltype(B.n_rows) I = 0; I < B.n_rows * B.n_cols; I += B.n_rows) {
468 error = solver.solve(a_loc, b_loc.set(b_ref.data() + I), x_loc.set(B.data + I));
470 if(0 != error)
break;
Definition: traits.hpp:85
Definition: sparse_solver.hpp:69