Feellgood
iter.h
Go to the documentation of this file.
1 #ifndef ITER_H
2 #define ITER_H
3 
4 #include <iomanip>
5 
15 namespace algebra
16 {
24  {
25  UNDEFINED = -1,
26  CONVERGED = 0,
27  ITER_OVERFLOW = 1,
28  CANNOT_CONVERGE = 2
29  };
30 
35 template <typename T>
36 class iteration
37  {
38  protected:
39 
41  T rhsn;
42 
44  const int maxiter;
45 
47  const bool noise;
48 
50  int nit;
51 
53  T res;
54 
56  bool written;
57 
58  private:
60  const std::string solver_name;
61 
63  std::string str_status(void) const
64  {
65  std::string s;
66  switch(status)
67  {
68  case UNDEFINED:
69  s="UNDEFINED";
70  break;
71  case CONVERGED:
72  s="CONVERGED";
73  break;
74  case ITER_OVERFLOW:
75  s="ITER_OVERFLOW";
76  break;
77  case CANNOT_CONVERGE:
78  s="CANNOT_CONVERGE";
79  break;
80  }
81  return s;
82  }
83 
84  public :
86  iteration(const std::string name, T r, bool _noise, int _maxiter): rhsn(1.0), maxiter(_maxiter),
87  noise(_noise), nit(0), res(std::numeric_limits<T>::max()), written(false), solver_name(name), resmax(r)
88  { status = UNDEFINED; }
89 
92 
94  const T resmax;
95 
97  void reset(void)
98  {
99  rhsn=1.0;
100  nit = 0;
101  res = std::numeric_limits<T>::max();
102  written = false;
103  status = UNDEFINED;
104  }
105 
107  std::string infos(void) const
108  {
109  std::stringstream sstr;
110  sstr << solver_name << " status " << str_status() << " after " << nit << " iterations, residu= " << res;
111  return sstr.str();
112  }
113 
115  void operator ++(int)
116  {
117  nit++;
118  written = false;
119  if (nit >= maxiter)
120  { status = ITER_OVERFLOW; }
121  }
122 
124  void operator ++() { (*this)++; }
125 
127  T get_res() const { return res; }
128 
130  int get_iteration() const { return nit; }
131 
133  T get_rhsnorm() const { return rhsn; }
134 
136  void set_rhsnorm(T r) { rhsn = r; }
137 
139  bool converged(T nr)
140  {
141  bool cv(false);
142  res = std::fabs(nr);// fabs should be useless
143  if (std::isnan(res))
144  { status = CANNOT_CONVERGE; }
145  else
146  {
147  cv = (res <= rhsn * resmax);
148  if(cv)
149  { status = CONVERGED; }
150  }
151  return cv;
152  }
153 
155  bool finished(T nr)
156  {
157  if (noise && !written)
158  {
159  T a = (rhsn == 0) ? 1.0 : rhsn;
160  converged(nr);
161  std::cout << " iter " << std::setw(3) << nit << " residual " << std::setw(12) << std::fabs(nr) / a << std::endl;
162  written = true;
163  }
164  return converged(nr);
165  }
166  };// end class
167 }//end namespace
168 #endif
Definition: iter.h:37
std::string infos(void) const
Definition: iter.h:107
const bool noise
Definition: iter.h:47
const int maxiter
Definition: iter.h:44
T get_rhsnorm() const
Definition: iter.h:133
bool finished(T nr)
Definition: iter.h:155
void set_rhsnorm(T r)
Definition: iter.h:136
bool converged(T nr)
Definition: iter.h:139
int get_iteration() const
Definition: iter.h:130
const std::string solver_name
Definition: iter.h:60
T get_res() const
Definition: iter.h:127
iteration(const std::string name, T r, bool _noise, int _maxiter)
Definition: iter.h:86
const T resmax
Definition: iter.h:94
void operator++()
Definition: iter.h:124
void reset(void)
Definition: iter.h:97
int nit
Definition: iter.h:50
T rhsn
Definition: iter.h:41
algebra::algoStatus status
Definition: iter.h:91
bool written
Definition: iter.h:56
T res
Definition: iter.h:53
std::string str_status(void) const
Definition: iter.h:63
constexpr double a[N][NPI]
Definition: facette.h:28
algoStatus
Definition: iter.h:24