| Line 96... |
Line 96... |
char filename[PETSC_MAX_PATH_LEN];
|
char filename[PETSC_MAX_PATH_LEN];
|
EPSSortForSTData data;
|
EPSSortForSTData data;
|
Mat A,B;
|
Mat A,B;
|
KSP ksp;
|
KSP ksp;
|
Vec w,x;
|
Vec w,x;
|
|
#define NUMEXTSOLV 5
|
|
const EPSType solvers[NUMEXTSOLV] = { EPSARPACK, EPSBLZPACK, EPSTRLAN, EPSBLOPEX, EPSPRIMME };
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(eps,EPS_COOKIE,1);
|
PetscValidHeaderSpecific(eps,EPS_COOKIE,1);
|
|
|
flg = PETSC_FALSE;
|
flg = PETSC_FALSE;
|
| Line 120... |
Line 122... |
eps->evecsavailable = PETSC_FALSE;
|
eps->evecsavailable = PETSC_FALSE;
|
eps->nconv = 0;
|
eps->nconv = 0;
|
eps->its = 0;
|
eps->its = 0;
|
for (i=0;i<eps->ncv;i++) eps->eigr[i]=eps->eigi[i]=eps->errest[i]=0.0;
|
for (i=0;i<eps->ncv;i++) eps->eigr[i]=eps->eigi[i]=eps->errest[i]=0.0;
|
EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,eps->ncv);
|
EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,eps->ncv);
|
|
|
|
flg = PETSC_FALSE;
|
|
for (i=0;i<NUMEXTSOLV && !flg;i++) {
|
|
ierr = PetscTypeCompare((PetscObject)eps,solvers[i],&flg);CHKERRQ(ierr);
|
|
}
|
|
|
ierr = PetscLogEventBegin(EPS_Solve,eps,eps->V[0],eps->V[0],0);CHKERRQ(ierr);
|
ierr = PetscLogEventBegin(EPS_Solve,eps,eps->V[0],eps->V[0],0);CHKERRQ(ierr);
|
|
|
/* temporarily change which */
|
if (!flg) {
|
data.old_which = eps->which;
|
/* temporarily change which */
|
data.old_which_func = eps->which_func;
|
data.old_which = eps->which;
|
data.old_which_ctx = eps->which_ctx;
|
data.old_which_func = eps->which_func;
|
eps->which = EPS_WHICH_USER;
|
data.old_which_ctx = eps->which_ctx;
|
eps->which_func = EPSSortForSTFunc;
|
eps->which = EPS_WHICH_USER;
|
eps->which_ctx = &data;
|
eps->which_func = EPSSortForSTFunc;
|
|
eps->which_ctx = &data;
|
|
}
|
|
|
/* call solver */
|
/* call solver */
|
ierr = (*eps->ops->solve)(eps);CHKERRQ(ierr);
|
ierr = (*eps->ops->solve)(eps);CHKERRQ(ierr);
|
|
|
/* restore which */
|
if (!flg) {
|
eps->which = data.old_which;
|
/* restore which */
|
eps->which_func = data.old_which_func;
|
eps->which = data.old_which;
|
eps->which_ctx = data.old_which_ctx;
|
eps->which_func = data.old_which_func;
|
|
eps->which_ctx = data.old_which_ctx;
|
|
}
|
|
|
ierr = STGetMatMode(eps->OP,&matmode);CHKERRQ(ierr);
|
ierr = STGetMatMode(eps->OP,&matmode);CHKERRQ(ierr);
|
if (matmode == ST_MATMODE_INPLACE && eps->ispositive) {
|
if (matmode == ST_MATMODE_INPLACE && eps->ispositive) {
|
/* Purify eigenvectors before reverting operator */
|
/* Purify eigenvectors before reverting operator */
|
ierr = (*eps->ops->computevectors)(eps);CHKERRQ(ierr);
|
ierr = (*eps->ops->computevectors)(eps);CHKERRQ(ierr);
|