-
EPSCreate(MPI_Comm comm,EPS *eps);
- 创建求解器
-
EPSSetOperators(EPS eps,Mat A,Mat B);
- 设置要解的算符
-
EPSSetFromOptions(EPS eps);
- 添加运行时设置
-
EPSSolve(EPS eps);
- 运行求解器
-
EPSDestroy(EPS *eps);
- 销毁求解器
-
EPSSetUp(EPS eps);
- 某些更具体的设置, 如果有需要的话,要在运行求解器之前设置
-
EPSGetST(EPS eps,ST *st);
- 获得谱变换器(ST), EPS 会默认自动创建一个 ST 对象,如果需要设置谱变换,就要这样获得它
-
EPSView(EPS eps,PetscViewer viewer);
- 打印求解器配置
#include <slepceps.h>
Mat A; /* problem matrix */
/* do something to fill A */
PetscErrorCode ierr;
/* Create eigensolver context */
EPS eps; /* eigenproblem solver context */
ierr = EPSCreate(PETSC_COMM_WORLD, &eps);
CHKERRQ(ierr);
/* Set operators. In this case, it is a standard eigenvalue problem */
ierr = EPSSetOperators(eps, A, NULL);
CHKERRQ(ierr);
ierr = EPSSetProblemType(eps, EPS_HEP);
CHKERRQ(ierr);
/* show EPS setup */
ierr = EPSView(eps, PETSC_VIEWER_STDOUT_WORLD) ;
CHKERRQ(ierr);
/* Set solver parameters at runtime */
ierr = EPSSetFromOptions(eps);
CHKERRQ(ierr);
/* Solve the eigensystem */
ierr = EPSSolve(eps);
CHKERRQ(ierr);
/* Optional: Get some information from the solver and display it */
PetscInt its;
ierr = EPSGetIterationNumber(eps, &its);
CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD, " Number of iterations of the method: %D\n", its);
CHKERRQ(ierr);
EPSType type;
ierr = EPSGetType(eps, &type);
CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD, " Solution method: %s\n\n", type);
CHKERRQ(ierr);
PetscInt nev;
ierr = EPSGetDimensions(eps, &nev, NULL, NULL);
CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD, " Number of requested eigenvalues: %D\n", nev);
CHKERRQ(ierr);
PetscReal tol;
PetscInt maxit;
ierr = EPSGetTolerances(eps, &tol, &maxit);
CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD, " Stopping condition: tol=%.4g, maxit=%D\n", (double)tol, maxit);
CHKERRQ(ierr);
/* Display solution and clean up */
/* Get number of converged approximate eigenpairs */
PetscInt nconv;
ierr = EPSGetConverged(eps, &nconv);
CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD, " Number of converged eigenpairs: %D\n\n", nconv);
CHKERRQ(ierr);
if (nconv > 0) {
/* Display eigenvalues and relative errors */
ierr = PetscPrintf(PETSC_COMM_WORLD,
" k ||Ax-kx||/||kx||\n"
" ----------------- ------------------\n");
CHKERRQ(ierr);
for (i = 0; i < nconv; i++) {
/* Get converged eigenpairs: i-th eigenvalue is stored in kr (real part) and ki (imaginary part) */
PetscScalar kr, ki;
Vec xr, xi;
ierr = MatCreateVecs(A, NULL, &xr);
CHKERRQ(ierr);
ierr = MatCreateVecs(A, NULL, &xi);
CHKERRQ(ierr);
ierr = EPSGetEigenpair(eps, i, &kr, &ki, xr, xi);
CHKERRQ(ierr);
/* Compute the relative error associated to each eigenpair */
PetscReal error;
ierr = EPSComputeError(eps, i, EPS_ERROR_RELATIVE, &error);
CHKERRQ(ierr);
PetscReal re = PetscRealPart(kr);
PetscReal im = PetscImaginaryPart(kr);
if (im != 0.0) {
ierr = PetscPrintf(PETSC_COMM_WORLD, " %9f%+9fi %12g\n", (double)re, (double)im, (double)error);
CHKERRQ(ierr);
} else {
ierr = PetscPrintf(PETSC_COMM_WORLD, " %12f %12g\n", (double)re, (double)error);
CHKERRQ(ierr);
}
}
ierr = PetscPrintf(PETSC_COMM_WORLD, "\n");
CHKERRQ(ierr);
}
/* Free work space */
ierr = EPSDestroy(&eps);
CHKERRQ(ierr);
ierr = MatDestroy(&A);
CHKERRQ(ierr);
ierr = VecDestroy(&xr);
CHKERRQ(ierr);
ierr = VecDestroy(&xi);
CHKERRQ(ierr);