| Line 53... |
Line 53... |
EPS_LANCZOS *lanczos = (EPS_LANCZOS *)eps->data;
|
EPS_LANCZOS *lanczos = (EPS_LANCZOS *)eps->data;
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
if (eps->ncv) { /* ncv set */
|
if (eps->ncv) { /* ncv set */
|
if (eps->ncv<eps->nev) SETERRQ(1,"The value of ncv must be at least nev");
|
if (eps->ncv<eps->nev) SETERRQ(((PetscObject)eps)->comm,1,"The value of ncv must be at least nev");
|
}
|
}
|
else if (eps->mpd) { /* mpd set */
|
else if (eps->mpd) { /* mpd set */
|
eps->ncv = PetscMin(eps->n,eps->nev+eps->mpd);
|
eps->ncv = PetscMin(eps->n,eps->nev+eps->mpd);
|
}
|
}
|
else { /* neither set: defaults depend on nev being small or large */
|
else { /* neither set: defaults depend on nev being small or large */
|
if (eps->nev<500) eps->ncv = PetscMin(eps->n,PetscMax(2*eps->nev,eps->nev+15));
|
if (eps->nev<500) eps->ncv = PetscMin(eps->n,PetscMax(2*eps->nev,eps->nev+15));
|
else { eps->mpd = 500; eps->ncv = PetscMin(eps->n,eps->nev+eps->mpd); }
|
else { eps->mpd = 500; eps->ncv = PetscMin(eps->n,eps->nev+eps->mpd); }
|
}
|
}
|
if (!eps->mpd) eps->mpd = eps->ncv;
|
if (!eps->mpd) eps->mpd = eps->ncv;
|
if (eps->ncv>eps->nev+eps->mpd) SETERRQ(1,"The value of ncv must not be larger than nev+mpd");
|
if (eps->ncv>eps->nev+eps->mpd) SETERRQ(((PetscObject)eps)->comm,1,"The value of ncv must not be larger than nev+mpd");
|
if (!eps->max_it) eps->max_it = PetscMax(100,2*eps->n/eps->ncv);
|
if (!eps->max_it) eps->max_it = PetscMax(100,2*eps->n/eps->ncv);
|
|
|
if (!eps->which) eps->which = EPS_LARGEST_MAGNITUDE;
|
if (!eps->which) eps->which = EPS_LARGEST_MAGNITUDE;
|
switch (eps->which) {
|
switch (eps->which) {
|
case EPS_LARGEST_IMAGINARY:
|
case EPS_LARGEST_IMAGINARY:
|
case EPS_SMALLEST_IMAGINARY:
|
case EPS_SMALLEST_IMAGINARY:
|
case EPS_TARGET_IMAGINARY:
|
case EPS_TARGET_IMAGINARY:
|
SETERRQ(1,"Wrong value of eps->which");
|
SETERRQ(((PetscObject)eps)->comm,1,"Wrong value of eps->which");
|
default: ; /* default case to remove warning */
|
default: ; /* default case to remove warning */
|
}
|
}
|
if (!eps->ishermitian)
|
if (!eps->ishermitian)
|
SETERRQ(PETSC_ERR_SUP,"Requested method is only available for Hermitian problems");
|
SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Requested method is only available for Hermitian problems");
|
if (!eps->extraction) {
|
if (!eps->extraction) {
|
ierr = EPSSetExtraction(eps,EPS_RITZ);CHKERRQ(ierr);
|
ierr = EPSSetExtraction(eps,EPS_RITZ);CHKERRQ(ierr);
|
} else if (eps->extraction!=EPS_RITZ) {
|
} else if (eps->extraction!=EPS_RITZ) {
|
SETERRQ(PETSC_ERR_SUP,"Unsupported extraction type\n");
|
SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Unsupported extraction type\n");
|
}
|
}
|
|
|
ierr = EPSAllocateSolution(eps);CHKERRQ(ierr);
|
ierr = EPSAllocateSolution(eps);CHKERRQ(ierr);
|
if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_SELECTIVE) {
|
if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_SELECTIVE) {
|
ierr = VecDuplicateVecs(eps->V[0],eps->ncv,&lanczos->AV);CHKERRQ(ierr);
|
ierr = VecDuplicateVecs(eps->V[0],eps->ncv,&lanczos->AV);CHKERRQ(ierr);
|
| Line 93... |
Line 93... |
} else {
|
} else {
|
ierr = EPSDefaultGetWork(eps,1);CHKERRQ(ierr);
|
ierr = EPSDefaultGetWork(eps,1);CHKERRQ(ierr);
|
}
|
}
|
|
|
/* dispatch solve method */
|
/* dispatch solve method */
|
if (eps->leftvecs) SETERRQ(PETSC_ERR_SUP,"Left vectors not supported in this solver");
|
if (eps->leftvecs) SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Left vectors not supported in this solver");
|
eps->ops->solve = EPSSolve_LANCZOS;
|
eps->ops->solve = EPSSolve_LANCZOS;
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
| Line 514... |
Line 514... |
alpha[n-1] = PetscRealPart(T[n*(n-1)+n-1]);
|
alpha[n-1] = PetscRealPart(T[n*(n-1)+n-1]);
|
beta[n-1] = betam;
|
beta[n-1] = betam;
|
ierr = PetscFree(T);CHKERRQ(ierr);
|
ierr = PetscFree(T);CHKERRQ(ierr);
|
break;
|
break;
|
default:
|
default:
|
SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Invalid reorthogonalization type");
|
SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Invalid reorthogonalization type");
|
}
|
}
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
| Line 735... |
Line 735... |
case EPS_LANCZOS_REORTHOG_PERIODIC:
|
case EPS_LANCZOS_REORTHOG_PERIODIC:
|
case EPS_LANCZOS_REORTHOG_PARTIAL:
|
case EPS_LANCZOS_REORTHOG_PARTIAL:
|
lanczos->reorthog = reorthog;
|
lanczos->reorthog = reorthog;
|
break;
|
break;
|
default:
|
default:
|
SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Invalid reorthogonalization type");
|
SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Invalid reorthogonalization type");
|
}
|
}
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
EXTERN_C_END
|
EXTERN_C_END
|
|
|
| Line 844... |
Line 844... |
PetscTruth isascii;
|
PetscTruth isascii;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
|
ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
|
if (!isascii) {
|
if (!isascii) {
|
SETERRQ1(1,"Viewer type %s not supported for EPSLANCZOS",((PetscObject)viewer)->type_name);
|
SETERRQ1(((PetscObject)eps)->comm,1,"Viewer type %s not supported for EPSLANCZOS",((PetscObject)viewer)->type_name);
|
}
|
}
|
ierr = PetscViewerASCIIPrintf(viewer,"reorthogonalization: %s\n",lanczoslist[lanczos->reorthog]);CHKERRQ(ierr);
|
ierr = PetscViewerASCIIPrintf(viewer,"reorthogonalization: %s\n",lanczoslist[lanczos->reorthog]);CHKERRQ(ierr);
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|