23 static_assert(EigenMatrix::RawMatrixType::IsRowMajor,
24 "Sparse matrix is required to be in row major storage.");
29 if (!A.isCompressed())
33 int nnz = A.nonZeros();
34 int* ptr = A.outerIndexPtr();
35 int* col = A.innerIndexPtr();
36 double* data = A.valuePtr();
41 bool const status =
solve(lisA, lisb, lisx);
43 for (std::size_t i = 0; i < lisx.
size(); i++)
55 INFO(
"------------------------------------------------------------------");
56 INFO(
"*** LIS solver computation");
60 int ierr = lis_solver_create(&solver);
65 lis_solver_set_option(
const_cast<char*
>(
lis_options_.c_str()), solver);
67 INFO(
"-> number of threads: {:d}", (
int)omp_get_max_threads());
71 ierr = lis_solver_get_precon(solver, &precon);
76 INFO(
"-> precon: {:d}", precon);
80 ierr = lis_solver_get_solver(solver, &slv);
85 INFO(
"-> solver: {:d}", slv);
97 LIS_INT linear_solver_status;
98 ierr = lis_solver_get_status(solver, &linear_solver_status);
104 INFO(
"-> status: {:d}", linear_solver_status);
108 ierr = lis_solver_get_iter(solver, &iter);
114 INFO(
"-> iteration: {:d}", iter);
118 ierr = lis_solver_get_residualnorm(solver, &resid);
123 INFO(
"-> residual: {:g}", resid);
126 double time, itime, ptime, p_ctime, p_itime;
127 ierr = lis_solver_get_timeex(solver, &time, &itime, &ptime, &p_ctime,
133 INFO(
"-> time total (s): {:g}", time);
134 INFO(
"-> time iterations (s): {:g}", itime);
135 INFO(
"-> time preconditioning (s): {:g}", ptime);
136 INFO(
"-> time precond. create (s): {:g}", p_ctime);
137 INFO(
"-> time precond. iter (s): {:g}", p_itime);
141 ierr = lis_solver_destroy(solver);
146 INFO(
"------------------------------------------------------------------");
148 return linear_solver_status == LIS_SUCCESS;