| { |
| EPS_LANCZOS *lanczos = (EPS_LANCZOS *)eps->data; |
| PetscErrorCode ierr; |
| PetscInt N; |
| |
| PetscFunctionBegin; |
| ierr = VecGetSize(eps->vec_initial,&N);CHKERRQ(ierr); |
| if (eps->ncv) { /* ncv set */ |
| if (eps->ncv<eps->nev) SETERRQ(1,"The value of ncv must be at least nev"); |
| } |
| 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 */ |
| if (eps->nev<500) eps->ncv = PetscMin(N,PetscMax(2*eps->nev,eps->nev+15)); |
| else { eps->mpd = 500; eps->ncv = PetscMin(N,eps->nev+eps->mpd); } |
| 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); } |
| } |
| 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->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) { |
| switch (eps->which) { |