| Line 44... |
Line 44... |
PetscScalar *pU;
|
PetscScalar *pU;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
ierr = SVDMatGetSize(svd,PETSC_NULL,&N);CHKERRQ(ierr);
|
ierr = SVDMatGetSize(svd,PETSC_NULL,&N);CHKERRQ(ierr);
|
if (svd->ncv) { /* ncv set */
|
if (svd->ncv) { /* ncv set */
|
if (svd->ncv<svd->nsv) SETERRQ(1,"The value of ncv must be at least nsv");
|
if (svd->ncv<svd->nsv) SETERRQ(((PetscObject)svd)->comm,1,"The value of ncv must be at least nsv");
|
}
|
}
|
else if (svd->mpd) { /* mpd set */
|
else if (svd->mpd) { /* mpd set */
|
svd->ncv = PetscMin(N,svd->nsv+svd->mpd);
|
svd->ncv = PetscMin(N,svd->nsv+svd->mpd);
|
}
|
}
|
else { /* neither set: defaults depend on nsv being small or large */
|
else { /* neither set: defaults depend on nsv being small or large */
|
if (svd->nsv<500) svd->ncv = PetscMin(N,PetscMax(2*svd->nsv,10));
|
if (svd->nsv<500) svd->ncv = PetscMin(N,PetscMax(2*svd->nsv,10));
|
else { svd->mpd = 500; svd->ncv = PetscMin(N,svd->nsv+svd->mpd); }
|
else { svd->mpd = 500; svd->ncv = PetscMin(N,svd->nsv+svd->mpd); }
|
}
|
}
|
if (!svd->mpd) svd->mpd = svd->ncv;
|
if (!svd->mpd) svd->mpd = svd->ncv;
|
if (svd->ncv>svd->nsv+svd->mpd) SETERRQ(1,"The value of ncv must not be larger than nev+mpd");
|
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)
|
if (!svd->max_it)
|
svd->max_it = PetscMax(N/svd->ncv,100);
|
svd->max_it = PetscMax(N/svd->ncv,100);
|
if (svd->U) {
|
if (svd->U) {
|
ierr = VecGetArray(svd->U[0],&pU);CHKERRQ(ierr);
|
ierr = VecGetArray(svd->U[0],&pU);CHKERRQ(ierr);
|
for (i=0;i<svd->n;i++) { ierr = VecDestroy(svd->U[i]); CHKERRQ(ierr); }
|
for (i=0;i<svd->n;i++) { ierr = VecDestroy(svd->U[i]); CHKERRQ(ierr); }
|
| Line 154... |
Line 154... |
#define __FUNCT__ "SVDSolve_LANCZOS"
|
#define __FUNCT__ "SVDSolve_LANCZOS"
|
PetscErrorCode SVDSolve_LANCZOS(SVD svd)
|
PetscErrorCode SVDSolve_LANCZOS(SVD svd)
|
{
|
{
|
#if defined(SLEPC_MISSING_LAPACK_BDSDC)
|
#if defined(SLEPC_MISSING_LAPACK_BDSDC)
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
SETERRQ(PETSC_ERR_SUP,"BDSDC - Lapack routine is unavailable.");
|
SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_SUP,"BDSDC - Lapack routine is unavailable.");
|
#else
|
#else
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
SVD_LANCZOS *lanczos = (SVD_LANCZOS *)svd->data;
|
SVD_LANCZOS *lanczos = (SVD_LANCZOS *)svd->data;
|
PetscReal *alpha,*beta,norm,*work,*Q,*PT;
|
PetscReal *alpha,*beta,norm,*work,*Q,*PT;
|
PetscScalar *swork;
|
PetscScalar *swork;
|