OGS
EigenLisLinearSolver.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include "BaseLib/Logging.h"
11
12namespace MathLib
13{
14EigenLisLinearSolver::EigenLisLinearSolver(std::string const& /*solver_name*/,
15 std::string const& lis_options)
16 : lis_options_(lis_options)
17{
18}
19
21 EigenVector& x_)
22{
23 static_assert(EigenMatrix::RawMatrixType::IsRowMajor,
24 "Sparse matrix is required to be in row major storage.");
25 auto& A = A_.getRawMatrix();
26 auto& b = b_.getRawVector();
27 auto& x = x_.getRawVector();
28
29 if (!A.isCompressed())
30 {
31 A.makeCompressed();
32 }
33 int nnz = A.nonZeros();
34 int* ptr = A.outerIndexPtr();
35 int* col = A.innerIndexPtr();
36 double* data = A.valuePtr();
37 LisMatrix lisA(A_.getNumberOfRows(), nnz, ptr, col, data);
38 LisVector lisb(b.rows(), b.data());
39 LisVector lisx(x.rows(), x.data());
40
41 bool const status = solve(lisA, lisb, lisx);
42
43 for (std::size_t i = 0; i < lisx.size(); i++)
44 {
45 x[i] = lisx[i];
46 }
47
48 return status;
49}
50
52{
54
55 INFO("------------------------------------------------------------------");
56 INFO("*** LIS solver computation");
57
58 // Create solver
59 LIS_SOLVER solver;
60 int ierr = lis_solver_create(&solver);
61 if (!checkLisError(ierr))
62 {
63 return false;
64 }
65 lis_solver_set_option(const_cast<char*>(lis_options_.c_str()), solver);
66#ifdef _OPENMP
67 INFO("-> number of threads: {:d}", (int)omp_get_max_threads());
68#endif
69 {
70 int precon;
71 ierr = lis_solver_get_precon(solver, &precon);
72 if (!checkLisError(ierr))
73 {
74 return false;
75 }
76 INFO("-> precon: {:d}", precon);
77 }
78 {
79 int slv;
80 ierr = lis_solver_get_solver(solver, &slv);
81 if (!checkLisError(ierr))
82 {
83 return false;
84 }
85 INFO("-> solver: {:d}", slv);
86 }
87
88 // solve
89 INFO("-> solve");
90 ierr =
91 lis_solve(A.getRawMatrix(), b.getRawVector(), x.getRawVector(), solver);
92 if (!checkLisError(ierr))
93 {
94 return false;
95 }
96
97 LIS_INT linear_solver_status;
98 ierr = lis_solver_get_status(solver, &linear_solver_status);
99 if (!checkLisError(ierr))
100 {
101 return false;
102 }
103
104 INFO("-> status: {:d}", linear_solver_status);
105
106 {
107 int iter = 0;
108 ierr = lis_solver_get_iter(solver, &iter);
109 if (!checkLisError(ierr))
110 {
111 return false;
112 }
113
114 INFO("-> iteration: {:d}", iter);
115 }
116 {
117 double resid = 0.0;
118 ierr = lis_solver_get_residualnorm(solver, &resid);
119 if (!checkLisError(ierr))
120 {
121 return false;
122 }
123 INFO("-> residual: {:g}", resid);
124 }
125 {
126 double time, itime, ptime, p_ctime, p_itime;
127 ierr = lis_solver_get_timeex(solver, &time, &itime, &ptime, &p_ctime,
128 &p_itime);
129 if (!checkLisError(ierr))
130 {
131 return false;
132 }
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);
138 }
139
140 // Clear solver
141 ierr = lis_solver_destroy(solver);
142 if (!checkLisError(ierr))
143 {
144 return false;
145 }
146 INFO("------------------------------------------------------------------");
147
148 return linear_solver_status == LIS_SUCCESS;
149}
150
151} // namespace MathLib
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:28
EigenLisLinearSolver(std::string const &solver_name, std::string const &lis_options)
bool solve(EigenMatrix &A, EigenVector &b, EigenVector &x)
IndexType getNumberOfRows() const
return the number of rows
Definition EigenMatrix.h:46
RawMatrixType & getRawMatrix()
Global vector based on Eigen vector.
Definition EigenVector.h:19
RawVectorType & getRawVector()
return a raw Eigen vector object
LisMatrix is a wrapper class for matrix types of the linear iterative solvers library.
Definition LisMatrix.h:31
LIS_MATRIX & getRawMatrix()
return a raw Lis matrix object
Definition LisMatrix.h:102
Lis vector wrapper class.
Definition LisVector.h:20
LIS_VECTOR & getRawVector()
return a raw Lis vector object
Definition LisVector.h:82
std::size_t size() const
return a vector length
Definition LisVector.cpp:35
bool checkLisError(int err)
Definition LisCheck.h:20
bool finalizeMatrixAssembly(MAT_T &)