Subversion Repositories slepc-dev

Rev

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

Rev 2769 Rev 2772
Line 324... Line 324...
#undef __FUNCT__  
#undef __FUNCT__  
#define __FUNCT__ "EPSSolve_Arnoldi"
#define __FUNCT__ "EPSSolve_Arnoldi"
PetscErrorCode EPSSolve_Arnoldi(EPS eps)
PetscErrorCode EPSSolve_Arnoldi(EPS eps)
{
{
  PetscErrorCode     ierr;
  PetscErrorCode     ierr;
  PetscInt           i,k,lwork,nv,ld;
  PetscInt           i,k,nv,ld;
  Vec                f=eps->work[0];
  Vec                f=eps->work[0];
  PetscScalar        *H,*U,*g,*work,*Hcopy;
  PetscScalar        *H,*U,*g,*work,*Hcopy;
  PetscReal          beta,gnorm,corrf=1.0;
  PetscReal          beta,gnorm,corrf=1.0;
  PetscBool          breakdown;
  PetscBool          breakdown;
  IPOrthogRefineType orthog_ref;
  IPOrthogRefineType orthog_ref;
  EPS_ARNOLDI        *arnoldi = (EPS_ARNOLDI*)eps->data;
  EPS_ARNOLDI        *arnoldi = (EPS_ARNOLDI*)eps->data;
 
 
  PetscFunctionBegin;
  PetscFunctionBegin;
  lwork = PetscMax((eps->ncv+1)*eps->ncv,7*eps->ncv);
  ierr = PetscMalloc(7*eps->ncv*sizeof(PetscScalar),&work);CHKERRQ(ierr);
  ierr = PetscMalloc(lwork*sizeof(PetscScalar),&work);CHKERRQ(ierr);
 
  if (eps->extraction==EPS_HARMONIC || eps->extraction==EPS_REFINED_HARMONIC) {
  if (eps->extraction==EPS_HARMONIC || eps->extraction==EPS_REFINED_HARMONIC) {
    ierr = PetscMalloc(eps->ncv*sizeof(PetscScalar),&g);CHKERRQ(ierr);
    ierr = PetscMalloc(eps->ncv*sizeof(PetscScalar),&g);CHKERRQ(ierr);
  }
  }
  if (eps->extraction==EPS_REFINED || eps->extraction==EPS_REFINED_HARMONIC) {
  if (eps->extraction==EPS_REFINED || eps->extraction==EPS_REFINED_HARMONIC) {
    ierr = PetscMalloc((eps->ncv+1)*eps->ncv*sizeof(PetscScalar),&Hcopy);CHKERRQ(ierr);
    ierr = PetscMalloc((eps->ncv+1)*eps->ncv*sizeof(PetscScalar),&Hcopy);CHKERRQ(ierr);
Line 374... Line 373...
      Hcopy[nv+(nv-1)*eps->ncv] = beta;
      Hcopy[nv+(nv-1)*eps->ncv] = beta;
    }
    }
 
 
    /* Compute translation of Krylov decomposition if harmonic extraction used */
    /* Compute translation of Krylov decomposition if harmonic extraction used */
    if (eps->extraction==EPS_HARMONIC || eps->extraction==EPS_REFINED_HARMONIC) {
    if (eps->extraction==EPS_HARMONIC || eps->extraction==EPS_REFINED_HARMONIC) {
      ierr = EPSTranslateHarmonic(nv,H,eps->ncv,eps->target,(PetscScalar)beta,g,work);CHKERRQ(ierr);
      ierr = PSTranslateHarmonic(eps->ps,eps->target,(PetscScalar)beta,g);CHKERRQ(ierr);
      gnorm = 0.0;
      gnorm = 0.0;
      for (i=0;i<nv;i++)
      for (i=0;i<nv;i++)
        gnorm = gnorm + PetscRealPart(g[i]*PetscConj(g[i]));
        gnorm = gnorm + PetscRealPart(g[i]*PetscConj(g[i]));
      corrf = PetscSqrtReal(1.0+gnorm);
      corrf = PetscSqrtReal(1.0+gnorm);
    }
    }