Subversion Repositories slepc-dev

Rev

Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2774 Rev 2775
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);
    }
    }