16 #include <deal.II/lac/slepc_solver.h> 18 #ifdef DEAL_II_WITH_SLEPC 20 # include <deal.II/lac/petsc_matrix_base.h> 21 # include <deal.II/lac/petsc_vector_base.h> 22 # include <deal.II/lac/petsc_vector.h> 23 # include <deal.II/lac/slepc_spectral_transformation.h> 28 # include <petscversion.h> 29 # include <slepcversion.h> 31 DEAL_II_NAMESPACE_OPEN
37 const MPI_Comm &mpi_communicator)
40 mpi_communicator (mpi_communicator)
43 int ierr = EPSCreate (mpi_communicator, &
eps);
65 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 66 int ierr = EPSDestroy (
eps);
68 int ierr = EPSDestroy (&
eps);
78 int ierr = EPSSetOperators (
eps, A, PETSC_NULL);
87 int ierr = EPSSetOperators (
eps, A, B);
96 int ierr = EPSSetST(
eps,transformation.
st);
97 AssertThrow (ierr == 0, SolverBase::ExcSLEPcError(ierr));
104 ExcMessage(
"Initial vector should be nonzero."));
107 Vec vec = this_initial_vector;
108 #if DEAL_II_PETSC_VERSION_LT(3,1,0) 109 ierr = EPSSetInitialVector (
eps, &vec);
111 ierr = EPSSetInitialSpace (
eps, 1, &vec);
122 int ierr = EPSSetTarget (
eps, this_target );
130 int ierr = EPSSetWhichEigenpairs (
eps, eps_which);
137 int ierr = EPSSetProblemType (
eps, eps_problem);
143 unsigned int *n_converged)
148 ierr = EPSSetDimensions (
eps, n_eigenpairs,
149 PETSC_DECIDE, PETSC_DECIDE);
153 ierr = EPSSetFromOptions (
eps);
162 ierr = EPSSetConvergenceTest (
eps, EPS_CONV_ABS);
171 ierr = EPSSolve (
eps);
175 ierr = EPSGetConverged (
eps,
176 reinterpret_cast<PetscInt *>(n_converged));
179 PetscInt n_iterations = 0;
180 PetscReal residual_norm = 0;
186 ierr = EPSGetIterationNumber (
eps, &n_iterations);
190 for (
unsigned int i = 0; i < *n_converged; i++)
192 double residual_norm_i = 0.0;
197 ierr = EPSComputeResidualNorm (
eps, i, &residual_norm_i);
211 residual_norm = std::max (residual_norm, residual_norm_i);
232 PetscScalar &eigenvalues,
236 int ierr = EPSGetEigenpair (
eps, index,
237 &eigenvalues, PETSC_NULL,
238 eigenvectors, PETSC_NULL);
245 double &real_eigenvalues,
246 double &imag_eigenvalues,
250 #ifndef PETSC_USE_COMPLEX 252 int ierr = EPSGetEigenpair (
eps, index,
253 &real_eigenvalues, &imag_eigenvalues,
254 real_eigenvectors, imag_eigenvectors);
258 ExcMessage (
"Your PETSc/SLEPc installation was configured with scalar-type complex " 259 "but this function is not defined for complex types."));
268 case ::SolverControl::iterate:
269 reason = EPS_CONVERGED_ITERATING;
272 case ::SolverControl::success:
273 reason =
static_cast<EPSConvergedReason
>(1);
276 case ::SolverControl::failure:
278 reason = EPS_DIVERGED_ITS;
280 reason = EPS_DIVERGED_BREAKDOWN;
284 Assert (
false, ExcNotImplemented());
317 additional_data (data)
319 int ierr = EPSSetType (
eps, const_cast<char *>(EPSKRYLOVSCHUR));
327 delayed_reorthogonalization (delayed_reorthogonalization)
337 int ierr = EPSSetType (
eps, const_cast<char *>(EPSARNOLDI));
344 ierr = EPSArnoldiSetDelayed (
eps, PETSC_TRUE);
363 int ierr = EPSSetType (
eps, const_cast<char *>(EPSLANCZOS));
378 int ierr = EPSSetType (
eps, const_cast<char *>(EPSPOWER));
385 : double_expansion(double_expansion)
395 #if DEAL_II_PETSC_VERSION_GTE(3,1,0) 396 int ierr = EPSSetType (
eps, const_cast<char *>(EPSGD));
401 ierr = EPSGDSetDoubleExpansion (
eps, PETSC_TRUE);
407 ExcMessage (
"Your SLEPc installation does not include a copy of the " 408 "Generalized Davidson solver. A SLEPc version > 3.1.0 is required."));
420 #if DEAL_II_PETSC_VERSION_GTE(3,1,0) 422 ierr = EPSSetType (
eps, const_cast<char *>(EPSJD));
427 ExcMessage (
"Your SLEPc installation does not include a copy of the " 428 "Jacobi-Davidson solver. A SLEPc version > 3.1.0 is required."));
442 #if PETSC_HAVE_BLASLAPACK 444 ierr = EPSSetType (
eps, const_cast<char *>(EPSLAPACK));
448 ExcMessage (
"Your PETSc/SLEPc installation was not configured with BLAS/LAPACK " 449 "but this is needed to use the LAPACK solver."));
454 DEAL_II_NAMESPACE_CLOSE
456 #endif // DEAL_II_WITH_SLEPC
bool delayed_reorthogonalization
virtual State check(const unsigned int step, const double check_value)
AdditionalData(bool double_expansion=false)
void set_initial_vector(const PETScWrappers::VectorBase &this_initial_vector) DEAL_II_DEPRECATED
SolverJacobiDavidson(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
SolverPower(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
real_type l2_norm() const
::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
void solve(const PETScWrappers::MatrixBase &A, std::vector< PetscScalar > &eigenvalues, std::vector< OutputVector > &eigenvectors, const unsigned int n_eigenpairs=1)
const MPI_Comm mpi_communicator
const AdditionalData additional_data
SolverKrylovSchur(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
EPSLanczosReorthogType reorthog
SolverBase(SolverControl &cn, const MPI_Comm &mpi_communicator)
AdditionalData(const bool delayed_reorthogonalization=false)
void set_problem_type(EPSProblemType set_problem)
void set_target_eigenvalue(const PetscScalar &this_target)
void set_matrices(const PETScWrappers::MatrixBase &A)
void set_which_eigenpairs(EPSWhich set_which)
#define Assert(cond, exc)
SolverGeneralizedDavidson(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
EPSConvergedReason reason
const AdditionalData additional_data
void get_eigenpair(const unsigned int index, PetscScalar &eigenvalues, PETScWrappers::VectorBase &eigenvectors)
static int convergence_test(EPS eps, PetscScalar real_eigenvalue, PetscScalar imag_eigenvalue, PetscReal residual_norm, PetscReal *estimated_error, void *solver_control)
SolverLanczos(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
unsigned int last_step() const
unsigned int max_steps() const
SolverLAPACK(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
const AdditionalData additional_data
AdditionalData(const EPSLanczosReorthogType r=EPS_LANCZOS_REORTHOG_FULL)
const AdditionalData additional_data
void set_transformation(SLEPcWrappers::TransformationBase &this_transformation)
SolverControl & solver_control
SolverArnoldi(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
SolverControl & control() const
void get_solver_state(const SolverControl::State state)