21 typedef AlgebraT AlgebraType;
22 typedef typename AlgebraType::Matrix MatrixType;
23 typedef typename AlgebraType::Vector VectorType;
24 typedef typename MatrixType::ValueType ValueType;
25 typedef typename AlgebraType::FutureType FutureType;
27 Iteration(AlgebraType& algebra,
31 ITraceMng* trace_mng =
nullptr)
33 , m_max_iteration(max_iter)
38 , m_trace_mng(trace_mng)
40 m_algebra.dot(b, b, m_f_value);
41 m_nrm2_b = m_f_value.get();
44 m_trace_mng->info() <<
"STOP CRITERIA NORME B = " << m_nrm2_b;
45 m_criteria_value = m_tol * m_tol * m_nrm2_b;
46 m_sqrt_nrm2_b = std::sqrt(m_nrm2_b);
47 m_value = m_criteria_value + 1;
59 return m_nrm2_b == 0.;
67 bool stop(VectorType
const& r)
69 if (m_iter >= m_max_iteration)
71 m_algebra.dot(r, r, m_f_value);
72 m_status = m_f_value.get() < m_criteria_value;
81 m_trace_mng->info() <<
"================================";
82 m_trace_mng->info() <<
"iteration (" << m_iter <<
") criteria = " << getValue();
87 ValueType getValue()
const
89 if (m_sqrt_nrm2_b == 0)
92 return std::sqrt(m_value) / m_sqrt_nrm2_b;
95 int operator()()
const
100 bool getStatus()
const
107 AlgebraType& m_algebra;
108 int m_max_iteration = 0;
109 ValueType m_tol = 0.;
111 ValueType m_value = 0.;
112 FutureType m_f_value;
113 ValueType m_criteria_value = 0.;
114 ValueType m_value_init = 0.;
115 ValueType m_nrm2_b = 0.;
116 ValueType m_sqrt_nrm2_b = 0.;
117 bool m_status =
false;
118 ITraceMng* m_trace_mng =
nullptr;