32class NeumannPolyPreconditioner
36 typedef AlgebraT AlgebraType ;
37 typedef typename AlgebraType::Matrix MatrixType;
38 typedef typename AlgebraType::Vector VectorType;
39 typedef typename MatrixType::ValueType ValueType;
42 NeumannPolyPreconditioner(AlgebraType& algebra,
43 MatrixType
const& matrix,
47 ITraceMng* trace_mng =
nullptr)
51 , m_polynome_order(polynome_order)
52 , m_factor_max_iter(factor_max_iter)
53 , m_trace_mng(trace_mng)
57 virtual ~NeumannPolyPreconditioner()
63 void setOutputLevel(
int level)
65 m_output_level = level;
70 m_algebra.allocate(AlgebraType::resource(
m_matrix), m_y, m_yy);
71 m_algebra.assign(m_y, 0.);
72 m_algebra.assign(m_yy, 0.);
78 m_trace_mng->info() <<
"Neunmann Preconditioner Info :";
79 m_trace_mng->info() <<
"Polynome Degree : " << m_polynome_order;
80 m_trace_mng->info() <<
"Neunmann Factor : " <<
m_factor;
81 m_trace_mng->info() <<
"Power Method Max Iter : " << m_factor_max_iter;
91 for (
int i = 0; i < m_polynome_order; ++i) {
95 m_algebra.axpy(1., x, m_y);
97 m_algebra.copy(m_y, y);
109 for (
int i = 0; i < m_polynome_order; ++i) {
111 evalG(algebra, y, m_y);
113 algebra.axpy(1., x, m_y);
115 algebra.copy(m_y, y);
137 m_algebra.copy(x, y);
145 m_algebra.allocate(AlgebraType::resource(
m_matrix), x);
148 std::random_device rd;
149 std::mt19937 gen(rd());
150 std::uniform_real_distribution<> dis(-1., 1.);
156 m_algebra.assign(x, [&]([[maybe_unused]]
auto i) {
161 ValueType norme2_k = m_algebra.norm2(m_y);
162 for (
int i = 0; i < m_factor_max_iter; ++i) {
163 m_algebra.copy(m_y, x);
165 ValueType norme2 = m_algebra.norm2(m_y);
172 m_trace_mng->info() <<
"Poly Factor : " <<
m_factor;
179 AlgebraType& m_algebra;
186 int m_polynome_order = 3 ;
187 int m_factor_max_iter = 10 ;
189 mutable VectorType m_y;
190 mutable VectorType m_yy;
192 ITraceMng* m_trace_mng =
nullptr;
193 int m_output_level = 0 ;