libMesh
Loading...
Searching...
No Matches
slepc_eigen_solver.h
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3
4// This library is free software; you can redistribute it and/or
5// modify it under the terms of the GNU Lesser General Public
6// License as published by the Free Software Foundation; either
7// version 2.1 of the License, or (at your option) any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// Lesser General Public License for more details.
13
14// You should have received a copy of the GNU Lesser General Public
15// License along with this library; if not, write to the Free Software
16// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
19
20#ifndef LIBMESH_SLEPC_EIGEN_SOLVER_H
21#define LIBMESH_SLEPC_EIGEN_SOLVER_H
22
23#include "libmesh/libmesh_config.h"
24
25#ifdef LIBMESH_HAVE_SLEPC
26
27// Local includes
28#include "libmesh/eigen_solver.h"
29#include "libmesh/slepc_macro.h"
30
31// SLEPc include files.
32EXTERN_C_FOR_SLEPC_BEGIN
33# include "libmesh/ignore_warnings.h"
34# include <slepceps.h>
35# include "libmesh/restore_warnings.h"
36EXTERN_C_FOR_SLEPC_END
37
38namespace libMesh
39{
40 template <typename T> class PetscVector;
41
50template <typename T>
52{
53
54public:
55
60
61
66
67
72 virtual void clear() noexcept override;
73
74
78 virtual void init() override;
79
80
91 virtual std::pair<unsigned int, unsigned int>
93 int nev,
94 int ncv,
95 const double tol,
96 const unsigned int m_its) override;
97
102 virtual std::pair<unsigned int, unsigned int>
103 solve_standard (ShellMatrix<T> & shell_matrix,
104 int nev,
105 int ncv,
106 const double tol,
107 const unsigned int m_its) override;
108
113 virtual std::pair<unsigned int, unsigned int>
114 solve_standard (ShellMatrix<T> & shell_matrix,
115 SparseMatrix<T> & precond,
116 int nev,
117 int ncv,
118 const double tol,
119 const unsigned int m_its) override;
120
125 virtual std::pair<unsigned int, unsigned int>
126 solve_standard (ShellMatrix<T> & shell_matrix,
127 ShellMatrix<T> & precond,
128 int nev,
129 int ncv,
130 const double tol,
131 const unsigned int m_its) override;
132
133
146 virtual std::pair<unsigned int, unsigned int>
148 SparseMatrix<T> & matrix_B,
149 int nev,
150 int ncv,
151 const double tol,
152 const unsigned int m_its) override;
153
158 virtual std::pair<unsigned int, unsigned int>
160 SparseMatrix<T> & matrix_B,
161 int nev,
162 int ncv,
163 const double tol,
164 const unsigned int m_its) override;
165
176 virtual std::pair<unsigned int, unsigned int>
178 ShellMatrix<T> & matrix_B,
179 int nev,
180 int ncv,
181 const double tol,
182 const unsigned int m_its) override;
183
194 virtual std::pair<unsigned int, unsigned int>
196 ShellMatrix<T> & matrix_B,
197 int nev,
198 int ncv,
199 const double tol,
200 const unsigned int m_its) override;
201
202
203 virtual std::pair<unsigned int, unsigned int>
205 ShellMatrix<T> & matrix_B,
206 SparseMatrix<T> & precond,
207 int nev,
208 int ncv,
209 const double tol,
210 const unsigned int m_its) override;
211
212 virtual std::pair<unsigned int, unsigned int>
214 ShellMatrix<T> & matrix_B,
215 ShellMatrix<T> & precond,
216 int nev,
217 int ncv,
218 const double tol,
219 const unsigned int m_its) override;
220
227 virtual std::pair<Real, Real>
229 NumericVector<T> & solution_in) override;
230
234 virtual std::pair<Real, Real>
235 get_eigenvalue (dof_id_type i) override;
236
241 Real get_relative_error (unsigned int i);
242
246 virtual void attach_deflation_space(NumericVector<T> & deflation_vector) override;
247
251 virtual void
252 set_initial_space(NumericVector<T> & initial_space_in) override;
253
257 EPS eps() { this->init(); return _eps; }
258
262 void print_eigenvalues() const;
263
264private:
265
269 std::pair<unsigned int, unsigned int> _solve_standard_helper (Mat mat,
270 Mat precond,
271 int nev,
272 int ncv,
273 const double tol,
274 const unsigned int m_its);
275
279 std::pair<unsigned int, unsigned int> _solve_generalized_helper (Mat mat_A,
280 Mat mat_B,
281 Mat precond,
282 int nev,
283 int ncv,
284 const double tol,
285 const unsigned int m_its);
286
290 std::pair<unsigned int, unsigned int> _solve_helper (Mat precond,
291 int nev,
292 int ncv,
293 const double tol,
294 const unsigned int m_its);
295
300 void set_slepc_solver_type ();
301
307
313
319 static PetscErrorCode _petsc_shell_matrix_mult(Mat mat, Vec arg, Vec dest);
320
326 static PetscErrorCode _petsc_shell_matrix_get_diagonal(Mat mat, Vec dest);
327
331 EPS _eps;
332
337};
338
339} // namespace libMesh
340
341
342#endif // #ifdef LIBMESH_HAVE_SLEPC
343#endif // LIBMESH_SLEPC_EIGEN_SOLVER_H
This class provides an interface to solvers for eigenvalue problems.
Provides a uniform interface to vector storage schemes for different linear algebra libraries.
This class provides a nice interface to PETSc's Vec object.
Generic shell matrix, i.e.
This class provides an interface to the SLEPc eigenvalue solver library from http://slepc....
void set_slepc_solver_type()
Tells Slepc to use the user-specified solver stored in _eigen_solver_type.
std::pair< unsigned int, unsigned int > _solve_generalized_helper(Mat mat_A, Mat mat_B, Mat precond, int nev, int ncv, const double tol, const unsigned int m_its)
Helper function that actually performs the generalized eigensolve.
virtual std::pair< unsigned int, unsigned int > solve_standard(SparseMatrix< T > &matrix_A, int nev, int ncv, const double tol, const unsigned int m_its) override
This function calls the SLEPc solver to compute the eigenpairs of the SparseMatrix matrix_A.
void set_slepc_problem_type()
Tells Slepc to deal with the type of problem stored in _eigen_problem_type.
virtual std::pair< unsigned int, unsigned int > solve_generalized(SparseMatrix< T > &matrix_A, SparseMatrix< T > &matrix_B, int nev, int ncv, const double tol, const unsigned int m_its) override
This function calls the SLEPc solver to compute the eigenpairs for the generalized eigenproblem defin...
virtual std::pair< Real, Real > get_eigenvalue(dof_id_type i) override
Same as above, but does not copy the eigenvector.
virtual std::pair< Real, Real > get_eigenpair(dof_id_type i, NumericVector< T > &solution_in) override
PetscVector< T > * _initial_space
A vector used for initial space.
std::pair< unsigned int, unsigned int > _solve_helper(Mat precond, int nev, int ncv, const double tol, const unsigned int m_its)
Helper function that actually performs either eigensolve.
void set_slepc_position_of_spectrum()
Tells Slepc to compute the spectrum at the position stored in _position_of_spectrum.
Real get_relative_error(unsigned int i)
virtual void attach_deflation_space(NumericVector< T > &deflation_vector) override
Attach a deflation space defined by a single vector.
void print_eigenvalues() const
Print the eigenvalues and associated error.
EPS _eps
Eigenproblem solver context.
static PetscErrorCode _petsc_shell_matrix_get_diagonal(Mat mat, Vec dest)
Internal function if shell matrix mode is used, this just calls the shell matrix's get_diagonal funct...
virtual void set_initial_space(NumericVector< T > &initial_space_in) override
Use initial_space_in as the initial guess.
static PetscErrorCode _petsc_shell_matrix_mult(Mat mat, Vec arg, Vec dest)
Internal function if shell matrix mode is used, this just calls the shell matrix's matrix multiplicat...
std::pair< unsigned int, unsigned int > _solve_standard_helper(Mat mat, Mat precond, int nev, int ncv, const double tol, const unsigned int m_its)
Helper function that actually performs the standard eigensolve.
virtual void clear() noexcept override
Release all memory and clear data structures.
virtual void init() override
Initialize data structures if not done so already.
Generic sparse matrix.
The libMesh namespace provides an interface to certain functionality in the library.
uint8_t dof_id_type
Definition id_types.h:67
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real