OGS
LisLinearSolver.cpp
Go to the documentation of this file.
1 
15 #ifdef _OPENMP
16 #include <omp.h>
17 #endif
18 
19 #include "BaseLib/Logging.h"
20 #include "LisCheck.h"
21 #include "LisLinearSolver.h"
22 #include "LisMatrix.h"
23 #include "LisVector.h"
24 
25 namespace MathLib
26 {
27 LisLinearSolver::LisLinearSolver(const std::string /*solver_name*/,
28  const BaseLib::ConfigTree* const option)
29  : lis_option_(option)
30 {
31 }
32 
34 {
36 
37  INFO("------------------------------------------------------------------");
38  INFO("*** LIS solver computation");
39 
40  // Create solver
41  LIS_SOLVER solver;
42  int ierr = lis_solver_create(&solver);
43  if (!checkLisError(ierr))
44  return false;
45 
46  lis_solver_set_option(const_cast<char*>(lis_option_.option_string_.c_str()),
47  solver);
48 #ifdef _OPENMP
49  INFO("-> number of threads: {:d}", (int)omp_get_max_threads());
50 #endif
51  {
52  int precon;
53  ierr = lis_solver_get_precon(solver, &precon);
54  if (!checkLisError(ierr))
55  return false;
56  INFO("-> precon: {:d}", precon);
57  }
58  {
59  int slv;
60  ierr = lis_solver_get_solver(solver, &slv);
61  if (!checkLisError(ierr))
62  return false;
63  INFO("-> solver: {:d}", slv);
64  }
65 
66  // solve
67  INFO("-> solve");
68  ierr =
69  lis_solve(A.getRawMatrix(), b.getRawVector(), x.getRawVector(), solver);
70  if (!checkLisError(ierr))
71  return false;
72 
73  LIS_INT linear_solver_status;
74  ierr = lis_solver_get_status(solver, &linear_solver_status);
75  if (!checkLisError(ierr))
76  return false;
77 
78  INFO("-> status: {:d}", linear_solver_status);
79 
80  {
81  int iter = 0;
82  ierr = lis_solver_get_iter(solver, &iter);
83  if (!checkLisError(ierr))
84  return false;
85 
86  INFO("-> iteration: {:d}", iter);
87  }
88  {
89  double resid = 0.0;
90  ierr = lis_solver_get_residualnorm(solver, &resid);
91  if (!checkLisError(ierr))
92  return false;
93  INFO("-> residual: {:g}", resid);
94  }
95  {
96  double time, itime, ptime, p_ctime, p_itime;
97  ierr = lis_solver_get_timeex(solver, &time, &itime, &ptime, &p_ctime,
98  &p_itime);
99  if (!checkLisError(ierr))
100  return false;
101  INFO("-> time total (s): {:g}", time);
102  INFO("-> time iterations (s): {:g}", itime);
103  INFO("-> time preconditioning (s): {:g}", ptime);
104  INFO("-> time precond. create (s): {:g}", p_ctime);
105  INFO("-> time precond. iter (s): {:g}", p_itime);
106  }
107 
108  // Clear solver
109  ierr = lis_solver_destroy(solver);
110  if (!checkLisError(ierr))
111  return false;
112  INFO("------------------------------------------------------------------");
113 
114  return linear_solver_status == LIS_SUCCESS;
115 }
116 
117 } // namespace MathLib
Definition of the LisLinearSolver class.
Definition of the LisMatrix class.
Definition of the LisVector class.
void INFO(char const *fmt, Args const &... args)
Definition: Logging.h:32
bool solve(LisMatrix &A, LisVector &b, LisVector &x)
LisLinearSolver(const std::string solver_name="", BaseLib::ConfigTree const *const option=nullptr)
LisMatrix is a wrapper class for matrix types of the linear iterative solvers library.
Definition: LisMatrix.h:45
LIS_MATRIX & getRawMatrix()
return a raw Lis matrix object
Definition: LisMatrix.h:115
Lis vector wrapper class.
Definition: LisVector.h:29
LIS_VECTOR & getRawVector()
return a raw Lis vector object
Definition: LisVector.h:90
bool checkLisError(int err)
Definition: LisCheck.h:32
bool finalizeMatrixAssembly(MAT_T &)
std::string option_string_
Definition: LisOption.h:56