30 static_assert(EigenMatrix::RawMatrixType::IsRowMajor,
31 "Sparse matrix is required to be in row major storage.");
36 if (!A.isCompressed())
40 int nnz = A.nonZeros();
41 int* ptr = A.outerIndexPtr();
42 int* col = A.innerIndexPtr();
43 double* data = A.valuePtr();
48 bool const status =
solve(lisA, lisb, lisx);
50 for (std::size_t i = 0; i < lisx.
size(); i++)
62 INFO(
"------------------------------------------------------------------");
63 INFO(
"*** LIS solver computation");
67 int ierr = lis_solver_create(&solver);
72 lis_solver_set_option(
const_cast<char*
>(
lis_options_.c_str()), solver);
74 INFO(
"-> number of threads: {:d}", (
int)omp_get_max_threads());
78 ierr = lis_solver_get_precon(solver, &precon);
83 INFO(
"-> precon: {:d}", precon);
87 ierr = lis_solver_get_solver(solver, &slv);
92 INFO(
"-> solver: {:d}", slv);
104 LIS_INT linear_solver_status;
105 ierr = lis_solver_get_status(solver, &linear_solver_status);
111 INFO(
"-> status: {:d}", linear_solver_status);
115 ierr = lis_solver_get_iter(solver, &iter);
121 INFO(
"-> iteration: {:d}", iter);
125 ierr = lis_solver_get_residualnorm(solver, &resid);
130 INFO(
"-> residual: {:g}", resid);
133 double time, itime, ptime, p_ctime, p_itime;
134 ierr = lis_solver_get_timeex(solver, &time, &itime, &ptime, &p_ctime,
140 INFO(
"-> time total (s): {:g}", time);
141 INFO(
"-> time iterations (s): {:g}", itime);
142 INFO(
"-> time preconditioning (s): {:g}", ptime);
143 INFO(
"-> time precond. create (s): {:g}", p_ctime);
144 INFO(
"-> time precond. iter (s): {:g}", p_itime);
148 ierr = lis_solver_destroy(solver);
153 INFO(
"------------------------------------------------------------------");
155 return linear_solver_status == LIS_SUCCESS;