| Line 72... |
Line 72... |
#define __FUNCT__ "SVDSetUp_CYCLIC"
|
#define __FUNCT__ "SVDSetUp_CYCLIC"
|
PetscErrorCode SVDSetUp_CYCLIC(SVD svd)
|
PetscErrorCode SVDSetUp_CYCLIC(SVD svd)
|
{
|
{
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
SVD_CYCLIC *cyclic = (SVD_CYCLIC *)svd->data;
|
SVD_CYCLIC *cyclic = (SVD_CYCLIC *)svd->data;
|
PetscInt M,N,m,n,i,j,start,end,ncols,*pos;
|
PetscInt M,N,m,n,i,j,start,end,ncols,*pos,nloc;
|
const PetscInt *cols;
|
const PetscInt *cols;
|
const PetscScalar *vals;
|
const PetscScalar *vals;
|
|
PetscScalar *pU;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
|
|
if (cyclic->mat) {
|
if (cyclic->mat) {
|
ierr = MatDestroy(cyclic->mat);CHKERRQ(ierr);
|
ierr = MatDestroy(cyclic->mat);CHKERRQ(ierr);
|
| Line 138... |
Line 139... |
ierr = EPSSetTolerances(cyclic->eps,svd->tol,svd->max_it);CHKERRQ(ierr);
|
ierr = EPSSetTolerances(cyclic->eps,svd->tol,svd->max_it);CHKERRQ(ierr);
|
ierr = EPSSetUp(cyclic->eps);CHKERRQ(ierr);
|
ierr = EPSSetUp(cyclic->eps);CHKERRQ(ierr);
|
ierr = EPSGetDimensions(cyclic->eps,PETSC_NULL,&svd->ncv,&svd->mpd);CHKERRQ(ierr);
|
ierr = EPSGetDimensions(cyclic->eps,PETSC_NULL,&svd->ncv,&svd->mpd);CHKERRQ(ierr);
|
ierr = EPSGetTolerances(cyclic->eps,&svd->tol,&svd->max_it);CHKERRQ(ierr);
|
ierr = EPSGetTolerances(cyclic->eps,&svd->tol,&svd->max_it);CHKERRQ(ierr);
|
|
|
if (svd->U) {
|
if (svd->ncv != svd->n) {
|
for (i=0;i<svd->n;i++) { ierr = VecDestroy(svd->U[i]); CHKERRQ(ierr); }
|
if (svd->U) {
|
ierr = PetscFree(svd->U);CHKERRQ(ierr);
|
ierr = VecGetArray(svd->U[0],&pU);CHKERRQ(ierr);
|
|
for (i=0;i<svd->n;i++) { ierr = VecDestroy(svd->U[i]); CHKERRQ(ierr); }
|
|
ierr = PetscFree(pU);CHKERRQ(ierr);
|
|
ierr = PetscFree(svd->U);CHKERRQ(ierr);
|
|
}
|
|
ierr = PetscMalloc(sizeof(Vec)*svd->ncv,&svd->U);CHKERRQ(ierr);
|
|
ierr = SVDMatGetLocalSize(svd,&nloc,PETSC_NULL);CHKERRQ(ierr);
|
|
ierr = PetscMalloc(svd->ncv*nloc*sizeof(PetscScalar),&pU);CHKERRQ(ierr);
|
|
for (i=0;i<svd->ncv;i++) {
|
|
ierr = VecCreateMPIWithArray(((PetscObject)svd)->comm,nloc,PETSC_DECIDE,pU+i*nloc,&svd->U[i]);CHKERRQ(ierr);
|
|
}
|
}
|
}
|
ierr = PetscMalloc(sizeof(Vec)*svd->ncv,&svd->U);CHKERRQ(ierr);
|
|
for (i=0;i<svd->ncv;i++) { ierr = SVDMatGetVecs(svd,PETSC_NULL,svd->U+i);CHKERRQ(ierr); }
|
|
|
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|