monolish
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 
10 namespace monolish::solver {
11 
17 enum class initvec_scheme {
18  RANDOM,
19  USER,
20 };
21 
22 template <typename MATRIX, typename Float> class precondition;
23 
27 template <typename MATRIX, typename Float> class solver {
28 private:
29 protected:
30  int lib = 0;
31  double tol = 1.0e-8;
32  size_t miniter = 0;
33  size_t maxiter = SIZE_MAX;
34  size_t resid_method = 0;
35  bool print_rhistory = false;
36  std::string rhistory_file;
37  std::ostream *rhistory_stream;
39 
40  Float omega = 1.9; // for SOR
41  int singularity; // for sparse LU/QR/Cholesky
42  int reorder = 3; // for sparse LU/QR/Cholesky;
43 
44  Float get_residual(vector<Float> &x);
46 
47 public:
51  solver(){};
52 
56  ~solver() {
57  if (rhistory_stream != &std::cout && rhistory_file.empty() != true) {
58  delete rhistory_stream;
59  }
60  }
61 
66  template <class PRECOND> void set_create_precond(PRECOND &p);
67 
72  template <class PRECOND> void set_apply_precond(PRECOND &p);
73 
78  void set_lib(int l) { lib = l; }
79 
84  void set_tol(double t) { tol = t; }
85 
90  void set_maxiter(size_t max) { maxiter = max; }
91 
96  void set_miniter(size_t min) { miniter = min; }
97 
102  void set_residual_method(size_t r) { resid_method = r; }
103 
108  void set_print_rhistory(bool flag) {
109  print_rhistory = flag;
110  rhistory_stream = &std::cout;
111  }
112 
117  void set_rhistory_filename(std::string file) {
118  rhistory_file = file;
119 
120  // file open
121  rhistory_stream = new std::ofstream(rhistory_file);
122  if (rhistory_stream->fail()) {
123  throw std::runtime_error("error bad filename");
124  }
125  }
126 
133 
138  [[nodiscard]] int get_lib() const { return lib; }
139 
144  [[nodiscard]] double get_tol() const { return tol; }
145 
150  [[nodiscard]] size_t get_maxiter() const { return maxiter; }
151 
156  [[nodiscard]] size_t get_miniter() const { return miniter; }
157 
162  [[nodiscard]] size_t get_residual_method() const { return resid_method; }
163 
168  bool get_print_rhistory() const { return print_rhistory; }
169 
175 
183  void set_omega(Float w) { omega = w; };
184 
191  Float get_omega() { return omega; };
192 
199  void set_reorder(int r) { reorder = r; }
200 
207  int get_reorder() { return reorder; }
208 
215  int get_sigularity() { return singularity; }
216 };
217 
221 template <typename MATRIX, typename Float> class precondition {
222 private:
223 public:
225  MATRIX *A;
226 
227  std::function<void(MATRIX &)> create_precond;
228  std::function<void(const vector<Float> &r, vector<Float> &z)> apply_precond;
229 
230  std::function<void(void)> get_precond();
231 
232  void set_precond_data(vector<Float> &m) { M = m; };
234 
236  auto create = [](MATRIX &) {};
237  auto apply = [](const vector<Float> &r, vector<Float> &z) { z = r; };
238  create_precond = create;
239  apply_precond = apply;
240  };
241 };
242 } // namespace monolish::solver
monolish::solver::solver::singularity
int singularity
Definition: monolish_solver.hpp:41
monolish::solver::solver::reorder
int reorder
Definition: monolish_solver.hpp:42
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::set_apply_precond
void set_apply_precond(PRECOND &p)
set precondition apply fucntion
monolish::solver::solver::get_omega
Float get_omega()
get the relaxation coefficient omega for SOR method (Default: 1.9)
Definition: monolish_solver.hpp:191
monolish::solver::solver::precond
precondition< MATRIX, Float > precond
Definition: monolish_solver.hpp:45
monolish::solver::solver::rhistory_file
std::string rhistory_file
Definition: monolish_solver.hpp:36
monolish::solver::solver::print_rhistory
bool print_rhistory
Definition: monolish_solver.hpp:35
monolish::solver::solver::set_lib
void set_lib(int l)
set library option (to change library, monolish, cusolver, etc.)
Definition: monolish_solver.hpp:78
monolish::solver::solver::omega
Float omega
Definition: monolish_solver.hpp:40
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::get_residual_method
size_t get_residual_method() const
get residual method(default=0)
Definition: monolish_solver.hpp:162
monolish::solver::precondition::set_precond_data
void set_precond_data(vector< Float > &m)
Definition: monolish_solver.hpp:232
monolish::solver::solver::get_tol
double get_tol() const
get tolerance
Definition: monolish_solver.hpp:144
monolish::solver::solver::set_residual_method
void set_residual_method(size_t r)
set residual method (default=0)
Definition: monolish_solver.hpp:102
monolish::solver::solver::set_miniter
void set_miniter(size_t min)
set min iter. (default = 0)
Definition: monolish_solver.hpp:96
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:17
monolish::solver::solver::get_sigularity
int get_sigularity()
-1 if A is symmetric postive definite. default reorder algorithm is csrmetisnd
Definition: monolish_solver.hpp:215
monolish::solver::solver::~solver
~solver()
delete solver class
Definition: monolish_solver.hpp:56
monolish::solver::solver::set_maxiter
void set_maxiter(size_t max)
set max iter. (default = SIZE_MAX)
Definition: monolish_solver.hpp:90
monolish_common.hpp
monolish::solver::solver::get_maxiter
size_t get_maxiter() const
get maxiter
Definition: monolish_solver.hpp:150
monolish::solver::precondition::create_precond
std::function< void(MATRIX &)> create_precond
Definition: monolish_solver.hpp:227
monolish::solver::solver
solver base class
Definition: monolish_solver.hpp:27
monolish::solver::solver::solver
solver()
create solver class
Definition: monolish_solver.hpp:51
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:34
monolish::solver::solver::initvecscheme
initvec_scheme initvecscheme
Definition: monolish_solver.hpp:38
monolish::solver::precondition::A
MATRIX * A
Definition: monolish_solver.hpp:225
monolish::solver::precondition::apply_precond
std::function< void(const vector< Float > &r, vector< Float > &z)> apply_precond
Definition: monolish_solver.hpp:228
monolish::solver::solver::miniter
size_t miniter
Definition: monolish_solver.hpp:32
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:183
monolish::solver::solver::get_miniter
size_t get_miniter() const
get miniter
Definition: monolish_solver.hpp:156
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:207
monolish::solver::solver::rhistory_stream
std::ostream * rhistory_stream
Definition: monolish_solver.hpp:37
monolish::solver::solver::set_rhistory_filename
void set_rhistory_filename(std::string file)
rhistory filename
Definition: monolish_solver.hpp:117
monolish::solver::solver::set_initvec_scheme
void set_initvec_scheme(initvec_scheme scheme)
set how to handle initial vector
Definition: monolish_solver.hpp:131
monolish::solver::precondition::get_precond
std::function< void(void)> get_precond()
monolish::solver::solver::set_tol
void set_tol(double t)
set tolerance (default:1.0e-8)
Definition: monolish_solver.hpp:84
monolish::solver::precondition::get_precond_data
vector< Float > get_precond_data()
Definition: monolish_solver.hpp:233
monolish::solver::initvec_scheme::USER
@ USER
monolish::solver::solver::maxiter
size_t maxiter
Definition: monolish_solver.hpp:33
monolish::vector
vector class
Definition: monolish_coo.hpp:25
monolish::solver::solver::tol
double tol
Definition: monolish_solver.hpp:31
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:108
monolish::solver::solver::get_print_rhistory
bool get_print_rhistory() const
get print rhistory status
Definition: monolish_solver.hpp:168
monolish::solver::solver::get_lib
int get_lib() const
get library option
Definition: monolish_solver.hpp:138
monolish::solver
Linear solver base class.
Definition: monolish_solver.hpp:10
monolish::solver::precondition::precondition
precondition()
Definition: monolish_solver.hpp:235
monolish::solver::precondition
precondition base class
Definition: monolish_solver.hpp:22
monolish::solver::solver::lib
int lib
Definition: monolish_solver.hpp:30
monolish::solver::solver::set_create_precond
void set_create_precond(PRECOND &p)
set precondition create fucntion
monolish::solver::solver::get_initvec_scheme
initvec_scheme get_initvec_scheme() const
get handling scheme of initial vector handling
Definition: monolish_solver.hpp:174
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:199
monolish::solver::precondition::M
vector< Float > M
Definition: monolish_solver.hpp:224