| Line 47... |
Line 47... |
#define __FUNCT__ "EPSSetUp_LANCZOS"
|
#define __FUNCT__ "EPSSetUp_LANCZOS"
|
PetscErrorCode EPSSetUp_LANCZOS(EPS eps)
|
PetscErrorCode EPSSetUp_LANCZOS(EPS eps)
|
{
|
{
|
EPS_LANCZOS *lanczos = (EPS_LANCZOS *)eps->data;
|
EPS_LANCZOS *lanczos = (EPS_LANCZOS *)eps->data;
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
PetscInt N;
|
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
ierr = VecGetSize(eps->vec_initial,&N);CHKERRQ(ierr);
|
|
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(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(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(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(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(1,"The value of ncv must not be larger than nev+mpd");
|
if (!eps->max_it) eps->max_it = PetscMax(100,2*N/eps->ncv);
|
if (!eps->max_it) eps->max_it = PetscMax(100,2*eps->n/eps->ncv);
|
|
|
if (eps->solverclass==EPS_ONE_SIDE) {
|
if (eps->solverclass==EPS_ONE_SIDE) {
|
switch (eps->which) {
|
switch (eps->which) {
|
case EPS_LARGEST_IMAGINARY:
|
case EPS_LARGEST_IMAGINARY:
|
case EPS_SMALLEST_IMAGINARY:
|
case EPS_SMALLEST_IMAGINARY:
|
| Line 898... |
Line 896... |
PetscFunctionBegin;
|
PetscFunctionBegin;
|
ierr = PetscNew(EPS_LANCZOS,&lanczos);CHKERRQ(ierr);
|
ierr = PetscNew(EPS_LANCZOS,&lanczos);CHKERRQ(ierr);
|
PetscLogObjectMemory(eps,sizeof(EPS_LANCZOS));
|
PetscLogObjectMemory(eps,sizeof(EPS_LANCZOS));
|
eps->data = (void *) lanczos;
|
eps->data = (void *) lanczos;
|
eps->ops->solve = EPSSolve_LANCZOS;
|
eps->ops->solve = EPSSolve_LANCZOS;
|
/* eps->ops->solvets = EPSSolve_TS_LANCZOS;*/
|
|
eps->ops->setup = EPSSetUp_LANCZOS;
|
eps->ops->setup = EPSSetUp_LANCZOS;
|
eps->ops->setfromoptions = EPSSetFromOptions_LANCZOS;
|
eps->ops->setfromoptions = EPSSetFromOptions_LANCZOS;
|
eps->ops->destroy = EPSDestroy_LANCZOS;
|
eps->ops->destroy = EPSDestroy_LANCZOS;
|
eps->ops->view = EPSView_LANCZOS;
|
eps->ops->view = EPSView_LANCZOS;
|
eps->ops->backtransform = EPSBackTransform_Default;
|
eps->ops->backtransform = EPSBackTransform_Default;
|
/*if (eps->solverclass==EPS_TWO_SIDE)
|
eps->ops->computevectors = EPSComputeVectors_Hermitian;
|
eps->ops->computevectors = EPSComputeVectors_Schur;
|
|
else*/ eps->ops->computevectors = EPSComputeVectors_Hermitian;
|
|
lanczos->reorthog = EPSLANCZOS_REORTHOG_LOCAL;
|
lanczos->reorthog = EPSLANCZOS_REORTHOG_LOCAL;
|
ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSLanczosSetReorthog_C","EPSLanczosSetReorthog_LANCZOS",EPSLanczosSetReorthog_LANCZOS);CHKERRQ(ierr);
|
ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSLanczosSetReorthog_C","EPSLanczosSetReorthog_LANCZOS",EPSLanczosSetReorthog_LANCZOS);CHKERRQ(ierr);
|
ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSLanczosGetReorthog_C","EPSLanczosGetReorthog_LANCZOS",EPSLanczosGetReorthog_LANCZOS);CHKERRQ(ierr);
|
ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSLanczosGetReorthog_C","EPSLanczosGetReorthog_LANCZOS",EPSLanczosGetReorthog_LANCZOS);CHKERRQ(ierr);
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|