17 #ifndef dealii_slepc_solver_h 18 # define dealii_slepc_solver_h 22 # ifdef DEAL_II_WITH_SLEPC 28 # include <petscconf.h> 29 # include <petscksp.h> 31 # include <slepceps.h> 178 template <
typename OutputVector>
183 const unsigned int n_eigenpairs = 1);
190 template <
typename OutputVector>
194 std::vector<PetscScalar> & eigenvalues,
195 std::vector<OutputVector> & eigenvectors,
196 const unsigned int n_eigenpairs = 1);
203 template <
typename OutputVector>
207 std::vector<double> & real_eigenvalues,
208 std::vector<double> & imag_eigenvalues,
209 std::vector<OutputVector> & real_eigenvectors,
210 std::vector<OutputVector> & imag_eigenvectors,
211 const unsigned int n_eigenpairs = 1);
219 template <
typename Vector>
274 <<
" An error with error number " << arg1
275 <<
" occurred while calling a SLEPc function");
283 <<
" The number of converged eigenvectors is " << arg1
284 <<
" but " << arg2 <<
" were requested. ");
311 solve(
const unsigned int n_eigenpairs,
unsigned int *n_converged);
320 PetscScalar & eigenvalues,
330 double & real_eigenvalues,
331 double & imag_eigenvalues,
371 PetscScalar real_eigenvalue,
372 PetscScalar imag_eigenvalue,
373 PetscReal residual_norm,
374 PetscReal * estimated_error,
375 void * solver_control);
484 const EPSLanczosReorthogType r = EPS_LANCZOS_REORTHOG_FULL);
659 template <
typename OutputVector>
664 const unsigned int n_eigenpairs)
667 AssertThrow((n_eigenpairs > 0) && (n_eigenpairs <= A.
m()),
674 unsigned int n_converged = 0;
675 solve(n_eigenpairs, &n_converged);
677 if (n_converged > n_eigenpairs)
678 n_converged = n_eigenpairs;
684 eigenvectors.resize(n_converged, eigenvectors.front());
685 eigenvalues.resize(n_converged);
687 for (
unsigned int index = 0; index < n_converged; ++index)
688 get_eigenpair(index, eigenvalues[index], eigenvectors[index]);
691 template <
typename OutputVector>
697 const unsigned int n_eigenpairs)
704 AssertThrow((n_eigenpairs > 0) && (n_eigenpairs <= A.
m()),
711 unsigned int n_converged = 0;
712 solve(n_eigenpairs, &n_converged);
714 if (n_converged >= n_eigenpairs)
715 n_converged = n_eigenpairs;
722 eigenvectors.resize(n_converged, eigenvectors.front());
723 eigenvalues.resize(n_converged);
725 for (
unsigned int index = 0; index < n_converged; ++index)
726 get_eigenpair(index, eigenvalues[index], eigenvectors[index]);
729 template <
typename OutputVector>
733 std::vector<double> & real_eigenvalues,
734 std::vector<double> & imag_eigenvalues,
735 std::vector<OutputVector> & real_eigenvectors,
736 std::vector<OutputVector> & imag_eigenvectors,
737 const unsigned int n_eigenpairs)
744 AssertThrow(real_eigenvalues.size() == imag_eigenvalues.size(),
746 imag_eigenvalues.size()));
747 AssertThrow(real_eigenvectors.size() == imag_eigenvectors.size(),
749 imag_eigenvectors.size()));
752 AssertThrow((n_eigenpairs > 0) && (n_eigenpairs <= A.
m()),
759 unsigned int n_converged = 0;
760 solve(n_eigenpairs, &n_converged);
762 if (n_converged >= n_eigenpairs)
763 n_converged = n_eigenpairs;
769 (imag_eigenvectors.size() != 0),
772 real_eigenvectors.resize(n_converged, real_eigenvectors.front());
773 imag_eigenvectors.resize(n_converged, imag_eigenvectors.front());
774 real_eigenvalues.resize(n_converged);
775 imag_eigenvalues.resize(n_converged);
777 for (
unsigned int index = 0; index < n_converged; ++index)
779 real_eigenvalues[index],
780 imag_eigenvalues[index],
781 real_eigenvectors[index],
782 imag_eigenvectors[index]);
785 template <
typename Vector>
789 std::vector<Vec> vecs(this_initial_space.size());
791 for (
unsigned int i = 0; i < this_initial_space.size(); i++)
794 ExcMessage(
"Initial vectors should be nonzero."));
795 vecs[i] = this_initial_space[i];
804 const PetscErrorCode ierr =
805 EPSSetInitialSpace(
eps, vecs.size(), vecs.data());
813 # endif // DEAL_II_WITH_SLEPC
static ::ExceptionBase & ExcSLEPcWrappersUsageError()
void set_problem_type(EPSProblemType set_problem)
#define DeclException2(Exception2, type1, type2, outsequence)
static int convergence_test(EPS eps, PetscScalar real_eigenvalue, PetscScalar imag_eigenvalue, PetscReal residual_norm, PetscReal *estimated_error, void *solver_control)
bool delayed_reorthogonalization
const AdditionalData additional_data
std::array< std::pair< Number, Tensor< 1, dim, Number > >, std::integral_constant< int, dim >::value > eigenvectors(const SymmetricTensor< 2, dim, Number > &T, const SymmetricTensorEigenvectorMethod method=SymmetricTensorEigenvectorMethod::ql_implicit_shifts)
std::vector< value_type > l2_norm(const typename ::Triangulation< dim, spacedim >::cell_iterator &parent, const value_type parent_value)
void set_which_eigenpairs(EPSWhich set_which)
void set_target_eigenvalue(const PetscScalar &this_target)
#define AssertThrow(cond, exc)
const MPI_Comm mpi_communicator
void get_eigenpair(const unsigned int index, PetscScalar &eigenvalues, PETScWrappers::VectorBase &eigenvectors)
const AdditionalData additional_data
EPSLanczosReorthogType reorthog
static ::ExceptionBase & ExcMessage(std::string arg1)
#define DeclException1(Exception1, type1, outsequence)
void get_solver_state(const SolverControl::State state)
void set_matrices(const PETScWrappers::MatrixBase &A)
#define Assert(cond, exc)
void set_initial_space(const std::vector< Vector > &initial_space)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
const AdditionalData additional_data
#define DeclException0(Exception0)
EPSConvergedReason reason
#define DEAL_II_NAMESPACE_CLOSE
SolverControl & control() const
const AdditionalData additional_data
const AdditionalData additional_data
void set_transformation(SLEPcWrappers::TransformationBase &this_transformation)
static ::ExceptionBase & ExcSLEPcEigenvectorConvergenceMismatchError(int arg1, int arg2)
#define DEAL_II_NAMESPACE_OPEN
SolverBase(SolverControl &cn, const MPI_Comm &mpi_communicator)
const AdditionalData additional_data
const AdditionalData additional_data
static ::ExceptionBase & ExcSLEPcError(int arg1)
void solve(const PETScWrappers::MatrixBase &A, std::vector< PetscScalar > &eigenvalues, std::vector< OutputVector > &eigenvectors, const unsigned int n_eigenpairs=1)
Eigenvalue vector is filled.
SolverControl & solver_control