22#ifndef INCLUDE_EXADG_SOLVERS_AND_PRECONDITIONERS_UTIL_COMPUTE_EIGENVALUES_H_
23#define INCLUDE_EXADG_SOLVERS_AND_PRECONDITIONERS_UTIL_COMPUTE_EIGENVALUES_H_
25#include <deal.II/numerics/vector_tools_mean_value.h>
31template<
typename Operator,
typename VectorType>
32std::pair<double, double>
33compute_eigenvalues(Operator
const & op,
35 bool const operator_is_singular,
36 unsigned int const eig_n_iter = 10000)
39 solution.reinit(inverse_diagonal);
40 rhs.reinit(inverse_diagonal,
true);
43 for(
unsigned int i = 0; i < rhs.locally_owned_size(); ++i)
44 rhs.local_element(i) = (double)rand() / RAND_MAX;
45 if(operator_is_singular)
46 dealii::VectorTools::subtract_mean_value(rhs);
48 dealii::SolverControl control(eig_n_iter, rhs.l2_norm() * 1e-5);
49 dealii::internal::EigenvalueTracker eigenvalue_tracker;
51 dealii::SolverCG<VectorType> solver(control);
53 solver.connect_eigenvalues_slot(std::bind(&dealii::internal::EigenvalueTracker::slot,
55 std::placeholders::_1));
61 solver.solve(op, solution, rhs, preconditioner);
63 catch(dealii::SolverControl::NoConvergence &)
67 std::pair<double, double> eigenvalues;
68 if(eigenvalue_tracker.values.empty())
70 eigenvalues.first = eigenvalues.second = 1.;
74 eigenvalues.first = eigenvalue_tracker.values.front();
75 eigenvalues.second = eigenvalue_tracker.values.back();
81template<
typename Number>
86 slot(
const std::vector<Number> & eigenvalues)
91 std::vector<Number> values;
Definition jacobi_preconditioner.h:35
Definition compute_eigenvalues.h:83