20 #ifndef __mast_slepc_hermitian_eigen_solver_h__ 21 #define __mast_slepc_hermitian_eigen_solver_h__ 36 namespace SLEPcWrapper {
71 "Eigenvalue index must be less than n_converged");
76 EPSGetEigenvalue(
_eps, i, &re, &im);
91 "Eigenvalue index must be less than n_converged");
104 EPSGetEigenpair(
_eps, i, &eig, &im, x, vi);
118 bool computeEigenvectors) {
126 MatGetSize(A_mat, &m, &n);
128 Assert2(m == n, m, n,
"Matrix must be square");
136 MatGetSize(*B_mat, &m2, &n2);
139 "Eigensolver type must be Generalized Hermitian");
140 Assert2(m==m2 && n==n2, m2, n2,
"A and B must be same size");
147 EPSSetOperators(
_eps, A_mat, PETSC_NULL);
154 EPSSetOperators(
_eps, A_mat, *B_mat);
160 if (spectrum == EPS_LARGEST_MAGNITUDE)
161 EPSSetWhichEigenpairs(
_eps, EPS_LARGEST_MAGNITUDE);
162 else if (spectrum == EPS_SMALLEST_MAGNITUDE)
163 EPSSetWhichEigenpairs(
_eps, EPS_SMALLEST_MAGNITUDE);
164 else if (spectrum == EPS_LARGEST_IMAGINARY)
165 EPSSetWhichEigenpairs(
_eps, EPS_LARGEST_IMAGINARY);
166 else if (spectrum == EPS_SMALLEST_IMAGINARY)
167 EPSSetWhichEigenpairs(
_eps, EPS_SMALLEST_IMAGINARY);
168 else if (spectrum == EPS_LARGEST_REAL)
169 EPSSetWhichEigenpairs(
_eps, EPS_LARGEST_REAL);
170 else if (spectrum == EPS_SMALLEST_REAL)
171 EPSSetWhichEigenpairs(
_eps, EPS_SMALLEST_REAL);
173 Assert0(
false,
"Invalid spectrum type");
175 EPSSetDimensions(
_eps, nev, PETSC_DEFAULT, PETSC_DEFAULT);
176 EPSSetFromOptions(
_eps);
195 MatCreateVecs(B, &v1, PETSC_NULL);
196 MatCreateVecs(B, &v2, PETSC_NULL);
197 MatCreateVecs(B, &v3, PETSC_NULL);
208 VecDot(v1, v2, &denom);
211 MatMult(A_sens, v1, v2);
215 MatMult(*B_sens, v1, v3);
218 VecAXPY(v2, -eig, v3);
222 VecAXPY(v2, -eig, v1);
224 VecDot(v1, v2, &num);
236 EPSComputeError(
_eps, i, EPS_ERROR_RELATIVE, &error);
238 << std::setw(10) << i
239 << std::setw(30) << this->
eig(i)
240 << std::setw(30) << error << std::endl;
258 #endif // __mast_slepc_hermitian_eigen_solver_h__
virtual ~HermitianEigenSolver()
unsigned int n_converged()
HermitianEigenSolver(MPI_Comm comm, EPSProblemType type)
void printResidualForEigenPairs()
#define Assert0(cond, msg)
#define Assert2(cond, v1, v2, msg)
real_t eig(uint_t i)
this method returns the eigen value
void solve(Mat A_mat, Mat *B_mat, uint_t nev, EPSWhich spectrum, bool computeEigenvectors)
method for eigenvalue problems
void getEigenPair(uint_t i, real_t &eig, Vec x)
this method returns the eigen pair
real_t sensitivity_solve(Mat B, Mat A_sens, Mat *B_sens, uint_t i)
compute the sensitivity of i th eigenvalue