monolish  0.16.0
MONOlithic LInear equation Solvers for Highly-parallel architecture
monolish_solver.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <vector>
3 
5 #include <functional>
6 
7 namespace monolish {
11 namespace solver {
12 
18 enum class initvec_scheme {
19  RANDOM,
20  USER,
21 };
22 
23 template <typename MATRIX, typename Float> class precondition;
24 
32 template <typename MATRIX, typename Float> class solver {
33 private:
34 protected:
35  int lib = 0;
36  double tol = 1.0e-8;
37  size_t miniter = 0;
38  size_t maxiter = SIZE_MAX;
39  size_t resid_method = 0;
40  bool print_rhistory = false;
41  std::string rhistory_file;
42  std::ostream *rhistory_stream;
44 
45  double final_resid = 0;
46  size_t final_iter = 0;
47 
48  Float omega = 1.9; // for SOR
49  int singularity; // for sparse LU/QR/Cholesky
50  int reorder = 3; // for sparse LU/QR/Cholesky;
51 
52  Float get_residual(vector<Float> &x);
54 
55 public:
59  solver(){};
60 
64  ~solver() {
65  if (rhistory_stream != &std::cout && rhistory_file.empty() != true) {
66  delete rhistory_stream;
67  }
68  }
69 
74  template <class PRECOND> void set_create_precond(PRECOND &p);
75 
80  template <class PRECOND> void set_apply_precond(PRECOND &p);
81 
86  void set_lib(int l) { lib = l; }
87 
92  void set_tol(double t) { tol = t; }
93 
98  void set_maxiter(size_t max) { maxiter = max; }
99 
104  void set_miniter(size_t min) { miniter = min; }
105 
110  void set_residual_method(size_t r) { resid_method = r; }
111 
116  void set_print_rhistory(bool flag) {
117  print_rhistory = flag;
118  rhistory_stream = &std::cout;
119  }
120 
125  void set_rhistory_filename(std::string file) {
126  rhistory_file = file;
127 
128  // file open
129  rhistory_stream = new std::ofstream(rhistory_file);
130  if (rhistory_stream->fail()) {
131  throw std::runtime_error("error bad filename");
132  }
133  }
134 
141 
146  [[nodiscard]] int get_lib() const { return lib; }
147 
152  [[nodiscard]] double get_tol() const { return tol; }
153 
158  [[nodiscard]] size_t get_maxiter() const { return maxiter; }
159 
164  [[nodiscard]] size_t get_miniter() const { return miniter; }
165 
170  [[nodiscard]] size_t get_residual_method() const { return resid_method; }
171 
176  bool get_print_rhistory() const { return print_rhistory; }
177 
183 
191  void set_omega(Float w) { omega = w; };
192 
199  Float get_omega() { return omega; };
200 
207  void set_reorder(int r) { reorder = r; }
208 
215  int get_reorder() { return reorder; }
216 
223  int get_singularity() { return singularity; }
224 
225  double get_final_residual() { return final_resid; }
226  size_t get_final_iter() { return final_iter; }
227 };
228 
232 template <typename MATRIX, typename Float> class precondition {
233 private:
234 public:
236  MATRIX *A;
237 
238  std::function<void(MATRIX &)> create_precond;
239  std::function<void(const vector<Float> &r, vector<Float> &z)> apply_precond;
240 
241  std::function<void(void)> get_precond();
242 
243  void set_precond_data(vector<Float> &m) { M = m; };
245 
247  auto create = [](MATRIX &) {};
248  auto apply = [](const vector<Float> &r, vector<Float> &z) { z = r; };
249  create_precond = create;
250  apply_precond = apply;
251  };
252 };
254 } // namespace solver
255 } // namespace monolish
monolish::solver::solver::singularity
int singularity
Definition: monolish_solver.hpp:49
monolish::solver::solver::reorder
int reorder
Definition: monolish_solver.hpp:50
monolish::solver::solver::set_apply_precond
void set_apply_precond(PRECOND &p)
set precondition apply function
monolish::solver::solver::get_omega
Float get_omega()
get the relaxation coefficient omega for SOR method (Default: 1.9)
Definition: monolish_solver.hpp:199
monolish::vml::min
void min(const matrix::CRS< double > &A, const matrix::CRS< double > &B, matrix::CRS< double > &C)
Create a new CRS matrix with smallest elements of two matrices (C[0:nnz] = min(A[0:nnz],...
monolish::solver::solver::precond
precondition< MATRIX, Float > precond
Definition: monolish_solver.hpp:53
monolish::solver::solver::rhistory_file
std::string rhistory_file
Definition: monolish_solver.hpp:41
monolish::vml::max
void max(const matrix::CRS< double > &A, const matrix::CRS< double > &B, matrix::CRS< double > &C)
Create a new CRS matrix with greatest elements of two matrices (C[0:nnz] = max(A[0:nnz],...
monolish::solver::solver::print_rhistory
bool print_rhistory
Definition: monolish_solver.hpp:40
monolish::solver::solver::set_lib
void set_lib(int l)
set library option (to change library, monolish, cusolver, etc.)
Definition: monolish_solver.hpp:86
monolish::solver::solver::get_final_residual
double get_final_residual()
Definition: monolish_solver.hpp:225
monolish::solver::solver::omega
Float omega
Definition: monolish_solver.hpp:48
monolish::solver::solver::get_final_iter
size_t get_final_iter()
Definition: monolish_solver.hpp:226
monolish::solver::solver::get_residual_method
size_t get_residual_method() const
get residual method(default=0)
Definition: monolish_solver.hpp:170
monolish::solver::solver::final_resid
double final_resid
Definition: monolish_solver.hpp:45
monolish::solver::precondition::set_precond_data
void set_precond_data(vector< Float > &m)
Definition: monolish_solver.hpp:243
monolish::solver::solver::get_tol
double get_tol() const
get tolerance
Definition: monolish_solver.hpp:152
monolish::solver::solver::set_residual_method
void set_residual_method(size_t r)
set residual method (default=0)
Definition: monolish_solver.hpp:110
monolish::solver::solver::set_miniter
void set_miniter(size_t min)
set min iter. (default = 0)
Definition: monolish_solver.hpp:104
monolish::solver::initvec_scheme
initvec_scheme
Enum class defining how to handle initial vectors RANDOM use randomly initialized vectors USER use in...
Definition: monolish_solver.hpp:18
monolish::solver::solver::~solver
~solver()
delete solver class
Definition: monolish_solver.hpp:64
monolish::solver::solver::set_maxiter
void set_maxiter(size_t max)
set max iter. (default = SIZE_MAX)
Definition: monolish_solver.hpp:98
monolish_common.hpp
monolish::solver::solver::get_maxiter
size_t get_maxiter() const
get maxiter
Definition: monolish_solver.hpp:158
monolish::solver::precondition::create_precond
std::function< void(MATRIX &)> create_precond
Definition: monolish_solver.hpp:238
monolish::solver::solver::final_iter
size_t final_iter
Definition: monolish_solver.hpp:46
monolish::solver::solver
solver base class
Definition: monolish_solver.hpp:32
monolish::solver::solver::solver
solver()
create solver class
Definition: monolish_solver.hpp:59
monolish::solver::initvec_scheme::RANDOM
@ RANDOM
monolish::solver::solver::get_residual
Float get_residual(vector< Float > &x)
monolish::solver::solver::resid_method
size_t resid_method
Definition: monolish_solver.hpp:39
monolish::solver::solver::initvecscheme
initvec_scheme initvecscheme
Definition: monolish_solver.hpp:43
monolish
monolish namespaces
Definition: monolish_matrix_blas.hpp:5
monolish::solver::precondition::A
MATRIX * A
Definition: monolish_solver.hpp:236
monolish::solver::precondition::apply_precond
std::function< void(const vector< Float > &r, vector< Float > &z)> apply_precond
Definition: monolish_solver.hpp:239
monolish::solver::solver::miniter
size_t miniter
Definition: monolish_solver.hpp:37
monolish::solver::solver::set_omega
void set_omega(Float w)
set the relaxation coefficient omega for SOR method (0 < w < 2, Default: 1.9)
Definition: monolish_solver.hpp:191
monolish::solver::solver::get_miniter
size_t get_miniter() const
get miniter
Definition: monolish_solver.hpp:164
monolish::solver::solver::get_reorder
int get_reorder()
0: no ordering 1: symrcm, 2: symamd, 3: csrmetisnd is used to reduce zero fill-in.
Definition: monolish_solver.hpp:215
monolish::solver::solver::rhistory_stream
std::ostream * rhistory_stream
Definition: monolish_solver.hpp:42
monolish::solver::solver::set_rhistory_filename
void set_rhistory_filename(std::string file)
rhistory filename
Definition: monolish_solver.hpp:125
monolish::solver::solver::set_initvec_scheme
void set_initvec_scheme(initvec_scheme scheme)
set how to handle initial vector
Definition: monolish_solver.hpp:139
monolish::solver::precondition::get_precond
std::function< void(void)> get_precond()
monolish::solver::solver::get_singularity
int get_singularity()
-1 if A is symmetric positive definite. default reorder algorithm is csrmetisnd
Definition: monolish_solver.hpp:223
monolish::solver::solver::set_tol
void set_tol(double t)
set tolerance (default:1.0e-8)
Definition: monolish_solver.hpp:92
monolish::solver::precondition::get_precond_data
vector< Float > get_precond_data()
Definition: monolish_solver.hpp:244
monolish::solver::initvec_scheme::USER
@ USER
monolish::solver::solver::maxiter
size_t maxiter
Definition: monolish_solver.hpp:38
monolish::vector
vector class
Definition: monolish_coo.hpp:25
monolish::solver::solver::tol
double tol
Definition: monolish_solver.hpp:36
monolish::solver::solver::set_print_rhistory
void set_print_rhistory(bool flag)
print rhistory to standart out true/false. (default = false)
Definition: monolish_solver.hpp:116
monolish::solver::solver::get_print_rhistory
bool get_print_rhistory() const
get print rhistory status
Definition: monolish_solver.hpp:176
monolish::solver::solver::get_lib
int get_lib() const
get library option
Definition: monolish_solver.hpp:146
monolish::solver::precondition::precondition
precondition()
Definition: monolish_solver.hpp:246
monolish::solver::precondition
precondition base class
Definition: monolish_solver.hpp:23
monolish::solver::solver::lib
int lib
Definition: monolish_solver.hpp:35
monolish::solver::solver::set_create_precond
void set_create_precond(PRECOND &p)
set precondition create function
monolish::solver::solver::get_initvec_scheme
initvec_scheme get_initvec_scheme() const
get handling scheme of initial vector handling
Definition: monolish_solver.hpp:182
monolish::solver::solver::set_reorder
void set_reorder(int r)
0: no ordering 1: symrcm, 2: symamd, 3: csrmetisnd is used to reduce zero fill-in.
Definition: monolish_solver.hpp:207
monolish::solver::precondition::M
vector< Float > M
Definition: monolish_solver.hpp:235