| 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);
|
}
|
}
|