| Line 138... |
Line 138... |
eps->ops->solve = EPSSolve_KrylovSchur_Default;
|
eps->ops->solve = EPSSolve_KrylovSchur_Default;
|
ierr = PSSetType(eps->ps,PSNHEP);CHKERRQ(ierr);
|
ierr = PSSetType(eps->ps,PSNHEP);CHKERRQ(ierr);
|
break;
|
break;
|
case EPS_KS_SYMM:
|
case EPS_KS_SYMM:
|
eps->ops->solve = EPSSolve_KrylovSchur_Symm;
|
eps->ops->solve = EPSSolve_KrylovSchur_Symm;
|
ierr = PSSetType(eps->ps,PSNHEP);CHKERRQ(ierr);
|
ierr = PSSetType(eps->ps,PSARROWTRIDSYMM);CHKERRQ(ierr);
|
break;
|
break;
|
case EPS_KS_SLICE:
|
case EPS_KS_SLICE:
|
eps->ops->solve = EPSSolve_KrylovSchur_Slice;
|
eps->ops->solve = EPSSolve_KrylovSchur_Slice;
|
ierr = PSSetType(eps->ps,PSNHEP);CHKERRQ(ierr);
|
ierr = PSSetType(eps->ps,PSNHEP);CHKERRQ(ierr);
|
break;
|
break;
|
| Line 209... |
Line 209... |
ierr = EPSKrylovConvergence(eps,PETSC_FALSE,eps->trackall,eps->nconv,nv-eps->nconv,S,ld,Q,ld,eps->V,nv,beta,gamma,&k,work);CHKERRQ(ierr);
|
ierr = EPSKrylovConvergence(eps,PETSC_FALSE,eps->trackall,eps->nconv,nv-eps->nconv,S,ld,Q,ld,eps->V,nv,beta,gamma,&k,work);CHKERRQ(ierr);
|
ierr = PSRestoreArray(eps->ps,PS_MAT_A,&S);CHKERRQ(ierr);
|
ierr = PSRestoreArray(eps->ps,PS_MAT_A,&S);CHKERRQ(ierr);
|
ierr = PSRestoreArray(eps->ps,PS_MAT_Q,&Q);CHKERRQ(ierr);
|
ierr = PSRestoreArray(eps->ps,PS_MAT_Q,&Q);CHKERRQ(ierr);
|
if (eps->its >= eps->max_it) eps->reason = EPS_DIVERGED_ITS;
|
if (eps->its >= eps->max_it) eps->reason = EPS_DIVERGED_ITS;
|
if (k >= eps->nev) eps->reason = EPS_CONVERGED_TOL;
|
if (k >= eps->nev) eps->reason = EPS_CONVERGED_TOL;
|
|
|
ierr = PSGetArray(eps->ps,PS_MAT_A,&S);CHKERRQ(ierr);
|
|
ierr = PSGetArray(eps->ps,PS_MAT_Q,&Q);CHKERRQ(ierr);
|
|
|
|
/* Update l */
|
/* Update l */
|
if (eps->reason != EPS_CONVERGED_ITERATING || breakdown) l = 0;
|
if (eps->reason != EPS_CONVERGED_ITERATING || breakdown) l = 0;
|
else {
|
else {
|
l = (nv-k)/2;
|
l = (nv-k)/2;
|
#if !defined(PETSC_USE_COMPLEX)
|
#if !defined(PETSC_USE_COMPLEX)
|
|
ierr = PSGetArray(eps->ps,PS_MAT_A,&S);CHKERRQ(ierr);
|
if (S[k+l+(k+l-1)*ld] != 0.0) {
|
if (S[k+l+(k+l-1)*ld] != 0.0) {
|
if (k+l<nv-1) l = l+1;
|
if (k+l<nv-1) l = l+1;
|
else l = l-1;
|
else l = l-1;
|
}
|
}
|
|
ierr = PSRestoreArray(eps->ps,PS_MAT_A,&S);CHKERRQ(ierr);
|
#endif
|
#endif
|
}
|
}
|
|
|
if (eps->reason == EPS_CONVERGED_ITERATING) {
|
if (eps->reason == EPS_CONVERGED_ITERATING) {
|
if (breakdown) {
|
if (breakdown) {
|
| Line 244... |
Line 243... |
/* gamma u^ = u - U*g~ */
|
/* gamma u^ = u - U*g~ */
|
ierr = SlepcVecMAXPBY(u,1.0,-1.0,ld,g,eps->V);CHKERRQ(ierr);
|
ierr = SlepcVecMAXPBY(u,1.0,-1.0,ld,g,eps->V);CHKERRQ(ierr);
|
ierr = VecScale(u,1.0/gamma);CHKERRQ(ierr);
|
ierr = VecScale(u,1.0/gamma);CHKERRQ(ierr);
|
}
|
}
|
/* Prepare the Rayleigh quotient for restart */
|
/* Prepare the Rayleigh quotient for restart */
|
|
ierr = PSGetArray(eps->ps,PS_MAT_A,&S);CHKERRQ(ierr);
|
|
ierr = PSGetArray(eps->ps,PS_MAT_Q,&Q);CHKERRQ(ierr);
|
for (i=k;i<k+l;i++) {
|
for (i=k;i<k+l;i++) {
|
S[k+l+i*ld] = Q[nv-1+i*ld]*beta*gamma;
|
S[k+l+i*ld] = Q[nv-1+i*ld]*beta*gamma;
|
}
|
}
|
|
ierr = PSRestoreArray(eps->ps,PS_MAT_A,&S);CHKERRQ(ierr);
|
|
ierr = PSRestoreArray(eps->ps,PS_MAT_Q,&Q);CHKERRQ(ierr);
|
}
|
}
|
}
|
}
|
/* Update the corresponding vectors V(:,idx) = V*Q(:,idx) */
|
/* Update the corresponding vectors V(:,idx) = V*Q(:,idx) */
|
|
ierr = PSGetArray(eps->ps,PS_MAT_Q,&Q);CHKERRQ(ierr);
|
ierr = SlepcUpdateVectors(nv,eps->V,eps->nconv,k+l,Q,ld,PETSC_FALSE);CHKERRQ(ierr);
|
ierr = SlepcUpdateVectors(nv,eps->V,eps->nconv,k+l,Q,ld,PETSC_FALSE);CHKERRQ(ierr);
|
ierr = PSRestoreArray(eps->ps,PS_MAT_A,&S);CHKERRQ(ierr);
|
|
ierr = PSRestoreArray(eps->ps,PS_MAT_Q,&Q);CHKERRQ(ierr);
|
ierr = PSRestoreArray(eps->ps,PS_MAT_Q,&Q);CHKERRQ(ierr);
|
|
|
if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) {
|
if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) {
|
ierr = VecCopy(u,eps->V[k+l]);CHKERRQ(ierr);
|
ierr = VecCopy(u,eps->V[k+l]);CHKERRQ(ierr);
|
}
|
}
|