Alien  1.3.0
Developer documentation
Loading...
Searching...
No Matches
Iteration.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7
8#pragma once
9
10#include <ostream>
11#include <vector>
12
13namespace Alien
14{
15
16template <typename AlgebraT>
17class Iteration
18{
19 public:
20 // clang-format off
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;
26 // clang-format on
27 Iteration(AlgebraType& algebra,
28 VectorType const& b,
29 ValueType tol,
30 int max_iter,
31 ITraceMng* trace_mng = nullptr)
32 : m_algebra(algebra)
33 , m_max_iteration(max_iter)
34 , m_tol(tol)
35 , m_iter(0)
36 , m_value(0)
37 , m_f_value(m_value)
38 , m_trace_mng(trace_mng)
39 {
40 m_algebra.dot(b, b, m_f_value);
41 m_nrm2_b = m_f_value.get();
42 //m_nrm2_b = m_algebra.dot(b, b) ;
43 if (m_trace_mng)
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;
48 if (m_nrm2_b == 0)
49 m_status = true;
50 else
51 m_status = false;
52 }
53
54 virtual ~Iteration()
55 {}
56
57 bool nullRhs() const
58 {
59 return m_nrm2_b == 0.;
60 }
61
62 bool first() const
63 {
64 return m_iter == 0;
65 }
66
67 bool stop(VectorType const& r)
68 {
69 if (m_iter >= m_max_iteration)
70 return true;
71 m_algebra.dot(r, r, m_f_value);
72 m_status = m_f_value.get() < m_criteria_value;
73 //m_value = m_algebra.dot(r, r) ;
74 //m_status = m_value < m_criteria_value;
75 return m_status;
76 }
77
78 void operator++()
79 {
80 if (m_trace_mng) {
81 m_trace_mng->info() << "================================";
82 m_trace_mng->info() << "iteration (" << m_iter << ") criteria = " << getValue();
83 }
84 ++m_iter;
85 }
86
87 ValueType getValue() const
88 {
89 if (m_sqrt_nrm2_b == 0)
90 return 0.;
91 else
92 return std::sqrt(m_value) / m_sqrt_nrm2_b;
93 }
94
95 int operator()() const
96 {
97 return m_iter;
98 }
99
100 bool getStatus() const
101 {
102 return m_status;
103 }
104
105 private:
106 // clang-format off
107 AlgebraType& m_algebra;
108 int m_max_iteration = 0;
109 ValueType m_tol = 0.;
110 int m_iter = 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;
119 // clang-format on
120};
121
122} // namespace Alien
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17