72 using namespace dealii;
75 SolverControl::State solver_state = SolverControl::iterate;
77 LogStream::Prefix prefix(
"cg");
80 const bool do_eigenvalues =
81 !condition_number_signal.empty() || !all_condition_numbers_signal.empty() ||
82 !eigenvalues_signal.empty() || !all_eigenvalues_signal.empty();
85 std::vector<typename VectorType::value_type> diagonal;
86 std::vector<typename VectorType::value_type> offdiagonal;
88 typename VectorType::value_type eigen_beta_alpha = 0;
92 internal::SolverCG::IterationWorker<VectorType, MatrixType, PreconditionerType>
93 worker(A, preconditioner, determine_beta_by_flexible_formula, this->memory, x);
97 solver_state = this->iteration_status(0, worker.residual_norm, x);
98 if (solver_state != SolverControl::iterate)
103 while (solver_state == SolverControl::iterate)
107 worker.do_iteration(it);
109 print_vectors(it, x, worker.r, worker.p);
113 this->coefficients_signal(worker.previous_alpha, worker.beta);
118 diagonal.push_back(number(1.) / worker.previous_alpha + eigen_beta_alpha);
119 eigen_beta_alpha = worker.beta / worker.previous_alpha;
120 offdiagonal.push_back(std::sqrt(worker.beta) / worker.previous_alpha);
122 compute_eigs_and_cond(diagonal,
124 all_eigenvalues_signal,
125 all_condition_numbers_signal);
128 solver_state = this->iteration_status(it, worker.residual_norm, x);
131 worker.finalize_after_convergence(it);
133 compute_eigs_and_cond(diagonal,
136 condition_number_signal);
138 AssertThrow(solver_state == SolverControl::success,
139 SolverControl::NoConvergence(it, worker.residual_norm));