43#include "abstract/sparse_solver.hpp"
48 enum matrix_type : std::int8_t {
68 std::int64_t
pt[64]{};
74 const mpl::communicator& comm_world{mpl::environment::comm_world()};
76 const int comm =
MPI_Comm_c2f(comm_world.native_handle());
87 if constexpr(
sizeof(IT) == 4) cluster_sparse_solver(
pt, &
one, &
one, &
mtype, &
PARDISO_ANA_FACT, &a_mat.n, a_mat.data, a_mat.row_ptr, a_mat.col_idx,
nullptr, &
negone,
iparm, &
msglvl,
nullptr,
nullptr, &comm, &
error);
88 else if constexpr(
sizeof(IT) == 8) cluster_sparse_solver_64(
pt, &
one, &
one, &
mtype, &
PARDISO_ANA_FACT, &a_mat.n, a_mat.data, a_mat.row_ptr, a_mat.col_idx,
nullptr, &
negone,
iparm, &
msglvl,
nullptr,
nullptr, &comm, &
error);
89 return sync_error(
error);
96 if constexpr(
sizeof(IT) == 4) cluster_sparse_solver(
pt, &
one, &
one, &
mtype, &
PARDISO_RELEASE, &
negone,
nullptr,
nullptr,
nullptr,
nullptr, &
negone,
iparm, &
msglvl,
nullptr,
nullptr, &comm, &
error);
97 else if constexpr(
sizeof(IT) == 8) cluster_sparse_solver_64(
pt, &
one, &
one, &
mtype, &
PARDISO_RELEASE, &
negone,
nullptr,
nullptr,
nullptr,
nullptr, &
negone,
iparm, &
msglvl,
nullptr,
nullptr, &comm, &
error);
98 for(
auto&
i :
pt)
i = 0;
101 auto sync_error(IT
error) {
102 comm_world.allreduce(mpl::min<IT>(),
error);
131 auto& operator()(
const IT index) {
return iparm[index]; }
199 if(A.n !=
B.n_rows)
return -1;
203 if constexpr(std::is_same_v<DT, double> || std::is_same_v<DT, complex16>)
iparm[27] = 0;
204 else if constexpr(std::is_same_v<DT, float> || std::is_same_v<DT, complex8>)
iparm[27] = 1;
209 return solve(std::move(
B));
213 if(a_mat.n !=
B.n_rows)
return -1;
215 std::vector<DT>
b_ref;
216 if(0 == comm_world.rank())
b_ref.resize(
B.n_rows *
B.n_cols);
222 if(0 == comm_world.rank()) std::copy_n(
B.data,
b_ref.size(),
b_ref.data());
233 if constexpr(
sizeof(IT) == 4) cluster_sparse_solver(
pt, &
one, &
one, &
mtype, &
PARDISO_SOLVE, &a_mat.n, a_mat.data, a_mat.row_ptr, a_mat.col_idx,
nullptr, &
B.n_cols,
iparm, &
msglvl,
b_ptr,
x_ptr, &comm, &
error);
234 else if constexpr(
sizeof(IT) == 8) cluster_sparse_solver_64(
pt, &
one, &
one, &
mtype, &
PARDISO_SOLVE, &a_mat.n, a_mat.data, a_mat.row_ptr, a_mat.col_idx,
nullptr, &
B.n_cols,
iparm, &
msglvl,
b_ptr,
x_ptr, &comm, &
error);
236 return sync_error(
error);
Solver for general sparse matrices.