include/meltpooldg/utilities/eigenvalues.hpp Source File

Developer Documentation: include/meltpooldg/utilities/eigenvalues.hpp Source File
Developer Documentation
eigenvalues.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/lac/precondition.h>
4#include <deal.II/lac/solver_gmres.h>
5
6namespace MeltPoolDG
7{
37 template <typename VectorType, typename Operator>
38 std::vector<std::complex<double>>
39 estimate_eigenvalues_gmres(const Operator &op,
40 const VectorType &b,
41 const unsigned max_eigenvalues = 100);
42
43 // --- template and inline functions --- //
44
45 template <typename VectorType, typename Operator>
46 std::vector<std::complex<double>>
47 estimate_eigenvalues_gmres(const Operator &op,
48 const VectorType &b,
49 const unsigned int max_eigenvalues)
50 {
51 VectorType x(b);
52 x.update_ghost_values();
53
54 const unsigned iterations = std::min(b.size(), max_eigenvalues);
55
56 // Set up the SolverControl to perform the specified number of iterations by
57 // requiring an unreachable tolerance.
58 dealii::SolverControl control_eigen(iterations, 0.0);
59
60 // Make sure that GMRES never restarts by setting its basis size
61 // accordingly.
62 typename dealii::SolverGMRES<VectorType>::AdditionalData data(iterations + 2);
63 data.orthogonalization_strategy =
64 dealii::LinearAlgebra::OrthogonalizationStrategy::modified_gram_schmidt;
65
66 dealii::SolverGMRES<VectorType> eigen_solver(control_eigen, data);
67 std::vector<std::complex<double>> eigen_values;
68
69 eigen_solver.connect_eigenvalues_slot(
70 [&eigen_values](const std::vector<std::complex<double>> &evs) { eigen_values = evs; }, true);
71
72 try
73 {
74 // We do not precondition the system because GMRES estimates the
75 // eigenvalues of the preconditioned system.
76 eigen_solver.solve(op, x, b, dealii::PreconditionIdentity());
77 }
78 catch (const dealii::SolverControl::NoConvergence &exc)
79 {
80 // We don't expect convergence and this is fine. However, we can check
81 // that we indeed got as many eigenvectors as iterations.
82 AssertDimension(eigen_values.size(), iterations);
83 }
84
85 return eigen_values;
86 }
87} // namespace MeltPoolDG
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17
std::vector< std::complex< double > > estimate_eigenvalues_gmres(const Operator &op, const VectorType &b, const unsigned max_eigenvalues=100)