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