libMesh
slepc_eigen_solver.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2024 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.
32 EXTERN_C_FOR_SLEPC_BEGIN
33 # include "libmesh/ignore_warnings.h"
34 # include <slepceps.h>
35 # include "libmesh/restore_warnings.h"
36 EXTERN_C_FOR_SLEPC_END
37 
38 namespace libMesh
39 {
40  template <typename T> class PetscVector;
41 
50 template <typename T>
51 class SlepcEigenSolver : public EigenSolver<T>
52 {
53 
54 public:
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>
92  solve_standard (SparseMatrix<T> & matrix_A,
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 
259 private:
260 
264  std::pair<unsigned int, unsigned int> _solve_standard_helper (Mat mat,
265  Mat precond,
266  int nev,
267  int ncv,
268  const double tol,
269  const unsigned int m_its);
270 
274  std::pair<unsigned int, unsigned int> _solve_generalized_helper (Mat mat_A,
275  Mat mat_B,
276  Mat precond,
277  int nev,
278  int ncv,
279  const double tol,
280  const unsigned int m_its);
281 
285  std::pair<unsigned int, unsigned int> _solve_helper (Mat precond,
286  int nev,
287  int ncv,
288  const double tol,
289  const unsigned int m_its);
290 
295  void set_slepc_solver_type ();
296 
301  void set_slepc_problem_type ();
302 
308 
314  static PetscErrorCode _petsc_shell_matrix_mult(Mat mat, Vec arg, Vec dest);
315 
321  static PetscErrorCode _petsc_shell_matrix_get_diagonal(Mat mat, Vec dest);
322 
326  EPS _eps;
327 
332 };
333 
334 } // namespace libMesh
335 
336 
337 #endif // #ifdef LIBMESH_HAVE_SLEPC
338 #endif // LIBMESH_SLEPC_EIGEN_SOLVER_H
This class provides a nice interface to PETSc&#39;s Vec object.
Definition: petsc_vector.h:73
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.
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.
Real get_relative_error(unsigned int i)
This class provides an interface to the SLEPc eigenvalue solver library from http://slepc.upv.es/.
virtual std::pair< Real, Real > get_eigenvalue(dof_id_type i) override
Same as above, but does not copy the eigenvector.
PetscVector< T > * _initial_space
A vector used for initial space.
Provides a uniform interface to vector storage schemes for different linear algebra libraries...
Definition: vector_fe_ex5.C:43
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&#39;s get_diagonal funct...
The libMesh namespace provides an interface to certain functionality in the library.
void set_slepc_solver_type()
Tells Slepc to use the user-specified solver stored in _eigen_solver_type.
Generic sparse matrix.
Definition: vector_fe_ex5.C:45
virtual void set_initial_space(NumericVector< T > &initial_space_in) override
Use initial_space_in as the initial guess.
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.
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_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...
EPS _eps
Eigenproblem solver context.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void clear() noexcept override
Release all memory and clear data structures.
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&#39;s matrix multiplicat...
SlepcEigenSolver(const Parallel::Communicator &comm_in)
Constructor.
void set_slepc_position_of_spectrum()
Tells Slepc to compute the spectrum at the position stored in _position_of_spectrum.
virtual void init() override
Initialize data structures if not done so already.
Generic shell matrix, i.e.
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 void attach_deflation_space(NumericVector< T > &deflation_vector) override
Attach a deflation space defined by a single vector.
virtual std::pair< Real, Real > get_eigenpair(dof_id_type i, NumericVector< T > &solution_in) override
uint8_t dof_id_type
Definition: id_types.h:67
This class provides an interface to solvers for eigenvalue problems.
Definition: eigen_solver.h:58