| ierr = PetscFree(eps->errest);CHKERRQ(ierr); |
| ierr = PetscFree(eps->errest_left);CHKERRQ(ierr); |
| ierr = SlepcVecDestroyVecs(eps->allocated_ncv,&eps->V);CHKERRQ(ierr); |
| if (eps->W) { |
| ierr = SlepcVecDestroyVecs(eps->allocated_ncv,&eps->W);CHKERRQ(ierr); |
| } |
| ierr = SlepcVecDestroyVecs(eps->allocated_ncv,&eps->W);CHKERRQ(ierr); |
| eps->allocated_ncv = 0; |
| } |
| PetscFunctionReturn(0); |
| ierr = PetscFree((*svd)->sigma);CHKERRQ(ierr); |
| ierr = PetscFree((*svd)->perm);CHKERRQ(ierr); |
| ierr = PetscFree((*svd)->errest);CHKERRQ(ierr); |
| if ((*svd)->U) { |
| ierr = SlepcVecDestroyVecs((*svd)->n,&(*svd)->U);CHKERRQ(ierr); |
| } |
| ierr = SlepcVecDestroyVecs((*svd)->n,&(*svd)->U);CHKERRQ(ierr); |
| ierr = SlepcVecDestroyVecs((*svd)->n,&(*svd)->V);CHKERRQ(ierr); |
| } |
| ierr = SVDMonitorCancel(*svd);CHKERRQ(ierr); |
| } |
| if (!svd->mpd) svd->mpd = svd->ncv; |
| if (svd->ncv>svd->nsv+svd->mpd) SETERRQ(((PetscObject)svd)->comm,1,"The value of ncv must not be larger than nev+mpd"); |
| if (!svd->max_it) |
| svd->max_it = PetscMax(N/svd->ncv,100); |
| if (!svd->max_it) svd->max_it = PetscMax(N/svd->ncv,100); |
| if (svd->ncv!=svd->n) { |
| if (svd->U) { |
| ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr); |
| } |
| ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr); |
| ierr = SVDMatGetLocalSize(svd,&nloc,PETSC_NULL);CHKERRQ(ierr); |
| ierr = VecCreateMPIWithArray(((PetscObject)svd)->comm,nloc,PETSC_DECIDE,PETSC_NULL,&t);CHKERRQ(ierr); |
| ierr = SlepcVecDuplicateVecs(t,svd->ncv,&svd->U);CHKERRQ(ierr); |
| ierr = EPSGetTolerances(cyclic->eps,&svd->tol,&svd->max_it);CHKERRQ(ierr); |
| if (svd->ncv != svd->n) { |
| if (svd->U) { |
| ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr); |
| } |
| ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr); |
| ierr = SVDMatGetLocalSize(svd,&nloc,PETSC_NULL);CHKERRQ(ierr); |
| ierr = VecCreateMPIWithArray(((PetscObject)svd)->comm,nloc,PETSC_DECIDE,PETSC_NULL,&t);CHKERRQ(ierr); |
| ierr = SlepcVecDuplicateVecs(t,svd->ncv,&svd->U);CHKERRQ(ierr); |
| } |
| if (!svd->mpd) svd->mpd = svd->ncv; |
| if (svd->ncv>svd->nsv+svd->mpd) SETERRQ(((PetscObject)svd)->comm,1,"The value of ncv must not be larger than nev+mpd"); |
| if (!svd->max_it) |
| svd->max_it = PetscMax(N/svd->ncv,100); |
| if (svd->U) { |
| ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr); |
| } |
| if (!svd->max_it) svd->max_it = PetscMax(N/svd->ncv,100); |
| ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr); |
| if (!lanczos->oneside) { |
| ierr = SVDMatGetLocalSize(svd,&nloc,PETSC_NULL);CHKERRQ(ierr); |
| ierr = VecCreateMPIWithArray(((PetscObject)svd)->comm,nloc,PETSC_DECIDE,PETSC_NULL,&t);CHKERRQ(ierr); |
| if (svd->mpd) PetscInfo(svd,"Warning: parameter mpd ignored\n"); |
| svd->max_it = 1; |
| if (svd->ncv!=svd->n) { |
| if (svd->U) { |
| ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr); |
| } |
| ierr = SlepcVecDestroyVecs(svd->n,&svd->U);CHKERRQ(ierr); |
| ierr = SVDMatGetLocalSize(svd,&nloc,PETSC_NULL);CHKERRQ(ierr); |
| ierr = VecCreateMPIWithArray(((PetscObject)svd)->comm,nloc,PETSC_DECIDE,PETSC_NULL,&t);CHKERRQ(ierr); |
| ierr = SlepcVecDuplicateVecs(t,svd->ncv,&svd->U);CHKERRQ(ierr); |
| PetscFunctionBegin; |
| PetscValidPointer(V,2); |
| if (!*V) PetscFunctionReturn(0); |
| if (m <= 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"m must be > 0: m = %D",m); |
| SlepcValidVecsContiguous(*V,m,2); |
| for (i=0;i<m;i++) { |