58 double resminreach, resadd;
69 nit = 0; res = 0.0; written =
false;
70 resminreach = 1E200; resadd = 0.0;
75 double div_res = 1E200)
76 : rhsn(1.0), maxiter(mit), noise(noi), resmax(r), diverged_res(div_res)
79 void operator ++(
int) { nit++; written =
false; resadd += res; }
80 void operator ++() { (*this)++; }
82 bool first(
void) {
return nit == 0; }
85 int get_noisy(
void)
const {
return noise; }
86 void set_noisy(
int n) { noise = n; }
87 void reduce_noisy(
void) {
if (noise > 0) noise--; }
89 double get_resmax(
void)
const {
return resmax; }
90 void set_resmax(
double r) { resmax = r; }
92 double get_res()
const {
return res; }
93 void enforce_converged(
bool c =
true)
94 {
if (c) res = double(0);
else res = rhsn * resmax + double(1); }
101 double get_diverged_residual(
void)
const {
return diverged_res; }
102 void set_diverged_residual(
double r) { diverged_res = r; }
104 size_type get_iteration(
void)
const {
return nit; }
105 void set_iteration(size_type i) { nit = i; }
107 size_type get_maxiter(
void)
const {
return maxiter; }
108 void set_maxiter(size_type i) { maxiter = i; }
110 double get_rhsnorm(
void)
const {
return rhsn; }
111 void set_rhsnorm(
double r) { rhsn = r; }
113 bool converged(
void) {
114 return !isnan(res) && res <= rhsn * resmax;
116 bool converged(
double nr) {
118 resminreach = std::min(resminreach, res);
121 template <
typename VECT>
bool converged(
const VECT &v)
123 bool diverged(
void) {
124 return isnan(res) || (nit>=maxiter)
125 || (res>=rhsn*diverged_res && nit > 4);
127 bool diverged(
double nr) {
129 resminreach = std::min(resminreach, res);
133 bool finished(
double nr) {
134 if (callback) callback(*
this);
135 if (noise > 0 && !written) {
136 double a = (rhsn == 0) ? 1.0 : rhsn;
138 cout << name <<
" iter " << std::setw(3) << nit <<
" residual "
139 << std::setw(12) << gmm::abs(nr) / a;
148 return (converged(nr) || diverged(nr));
150 template <
typename VECT>
bool finished_vect(
const VECT &v)
154 void set_name(
const std::string &n) { name = n; }
155 const std::string &get_name(
void)
const {
return name; }
The Iteration object calculates whether the solution has reached the desired accuracy,...
number_traits< typename linalg_traits< V >::value_type >::magnitude_type vect_norm2(const V &v)
Euclidean norm of a vector.
Include the base gmm files.
size_t size_type
used as the common size type in the library