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 {
25  {
26  UNDEFINED = -1,
27  CONVERGED = 0,
28  ITER_OVERFLOW = 1,
29  CANNOT_CONVERGE = 2
30  };
31 
36 template <typename T>
37 class iteration
38  {
39  protected:
40 
42  T rhsn;
43 
45  const int maxiter;
46 
48  const bool noise;
49 
51  int nit;
52 
54  T res;
55 
57  bool written;
58 
59  private:
61  const std::string solver_name;
62 
64  std::string str_status(void) const
65  {
66  std::string s;
67  switch(status)
68  {
69  case UNDEFINED:
70  s="UNDEFINED";
71  break;
72  case CONVERGED:
73  s="CONVERGED";
74  break;
75  case ITER_OVERFLOW:
76  s="ITER_OVERFLOW";
77  break;
78  case CANNOT_CONVERGE:
79  s="CANNOT_CONVERGE";
80  break;
81  }
82  return s;
83  }
84 
85  public :
87  iteration(const std::string name, T r, bool _noise, int _maxiter)
88  : rhsn(1.0), maxiter(_maxiter), noise(_noise), nit(0),
89  res(std::numeric_limits<T>::max()), written(false), solver_name(name), resmax(r)
90  { status = UNDEFINED; }
91 
94 
96  const T resmax;
97 
99  void reset(void)
100  {
101  rhsn=1.0;
102  nit = 0;
103  res = std::numeric_limits<T>::max();
104  written = false;
105  status = UNDEFINED;
106  }
107 
110  std::string infos(void) const
111  {
112  std::stringstream sstr;
113  sstr << solver_name << " status " << str_status() << " after " << nit
114  << " iterations, residu= " << res;
115  return sstr.str();
116  }
117 
119  void operator ++(int)
120  {
121  nit++;
122  written = false;
123  if (nit >= maxiter)
124  { status = ITER_OVERFLOW; }
125  }
126 
128  void operator ++() { (*this)++; }
129 
131  T get_res() const { return res; }
132 
134  int get_iteration() const { return nit; }
135 
137  T get_rhsnorm() const { return rhsn; }
138 
140  void set_rhsnorm(T r) { rhsn = r; }
141 
144  bool converged()
145  {
146  bool cv(false);
147  if (std::isnan(res))
148  { status = CANNOT_CONVERGE; }
149  else
150  {
151  cv = (res <= rhsn * resmax);
152  if(cv)
153  { status = CONVERGED; }
154  }
155  return cv;
156  }
157 
159  bool converged(T nr)
160  {
161  res = std::fabs(nr);
162  return converged();
163  }
164 
167  bool finished(T nr)
168  {
169  if (noise && !written)
170  {
171  T a = (rhsn == 0) ? 1.0 : rhsn;
172  converged(nr);
173  std::cout << " iter " << std::setw(3) << nit
174  << " residual " << std::setw(12) << std::fabs(nr) / a << std::endl;
175  written = true;
176  }
177  return converged(nr);
178  }
179  };// end class
180 }//end namespace
181 #endif
Definition: iter.h:38
bool converged()
Definition: iter.h:144
std::string infos(void) const
Definition: iter.h:110
const bool noise
Definition: iter.h:48
const int maxiter
Definition: iter.h:45
T get_rhsnorm() const
Definition: iter.h:137
bool finished(T nr)
Definition: iter.h:167
void set_rhsnorm(T r)
Definition: iter.h:140
bool converged(T nr)
Definition: iter.h:159
int get_iteration() const
Definition: iter.h:134
const std::string solver_name
Definition: iter.h:61
T get_res() const
Definition: iter.h:131
iteration(const std::string name, T r, bool _noise, int _maxiter)
Definition: iter.h:87
const T resmax
Definition: iter.h:96
void operator++()
Definition: iter.h:128
void reset(void)
Definition: iter.h:99
int nit
Definition: iter.h:51
T rhsn
Definition: iter.h:42
algebra::algoStatus status
Definition: iter.h:93
bool written
Definition: iter.h:57
T res
Definition: iter.h:54
std::string str_status(void) const
Definition: iter.h:64
constexpr double a[N][NPI]
Definition: facette.h:55
algoStatus
Definition: iter.h:25