22#ifndef EXADG_SOLVERS_AND_PRECONDITIONERS_UTILITIES_COMPUTE_EIGENVALUES_H_
23#define EXADG_SOLVERS_AND_PRECONDITIONERS_UTILITIES_COMPUTE_EIGENVALUES_H_
26#include <deal.II/numerics/vector_tools_mean_value.h>
32template<
typename Operator,
typename VectorType>
33std::pair<double, double>
34compute_eigenvalues(Operator
const & op,
36 bool const operator_is_singular,
37 unsigned int const eig_n_iter = 10000)
40 solution.reinit(inverse_diagonal);
41 rhs.reinit(inverse_diagonal,
true);
44 for(
unsigned int i = 0; i < rhs.locally_owned_size(); ++i)
45 rhs.local_element(i) = (double)rand() / RAND_MAX;
46 if(operator_is_singular)
47 dealii::VectorTools::subtract_mean_value(rhs);
49 dealii::SolverControl control(eig_n_iter, rhs.l2_norm() * 1e-5);
50 dealii::internal::EigenvalueTracker eigenvalue_tracker;
52 dealii::SolverCG<VectorType> solver(control);
54 solver.connect_eigenvalues_slot(std::bind(&dealii::internal::EigenvalueTracker::slot,
56 std::placeholders::_1));
62 solver.solve(op, solution, rhs, preconditioner);
64 catch(dealii::SolverControl::NoConvergence &)
68 std::pair<double, double> eigenvalues;
69 if(eigenvalue_tracker.values.empty())
71 eigenvalues.first = eigenvalues.second = 1.;
75 eigenvalues.first = eigenvalue_tracker.values.front();
76 eigenvalues.second = eigenvalue_tracker.values.back();
82template<
typename Number>
87 slot(
const std::vector<Number> & eigenvalues)
92 std::vector<Number> values;
Definition jacobi_preconditioner.h:35
Definition compute_eigenvalues.h:84