| Line 158... |
Line 158... |
@*/
|
@*/
|
PetscErrorCode SVDSetUp(SVD svd)
|
PetscErrorCode SVDSetUp(SVD svd)
|
{
|
{
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
PetscTruth flg;
|
PetscTruth flg;
|
PetscInt i,M,N;
|
PetscInt i,M,N,nloc;
|
|
PetscScalar *pV;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(svd,SVD_COOKIE,1);
|
PetscValidHeaderSpecific(svd,SVD_COOKIE,1);
|
if (svd->setupcalled) PetscFunctionReturn(0);
|
if (svd->setupcalled) PetscFunctionReturn(0);
|
ierr = PetscLogEventBegin(SVD_SetUp,svd,0,0,0);CHKERRQ(ierr);
|
ierr = PetscLogEventBegin(SVD_SetUp,svd,0,0,0);CHKERRQ(ierr);
|
| Line 233... |
Line 234... |
/* free memory for previous solution */
|
/* free memory for previous solution */
|
if (svd->n) {
|
if (svd->n) {
|
ierr = PetscFree(svd->sigma);CHKERRQ(ierr);
|
ierr = PetscFree(svd->sigma);CHKERRQ(ierr);
|
ierr = PetscFree(svd->perm);CHKERRQ(ierr);
|
ierr = PetscFree(svd->perm);CHKERRQ(ierr);
|
ierr = PetscFree(svd->errest);CHKERRQ(ierr);
|
ierr = PetscFree(svd->errest);CHKERRQ(ierr);
|
|
ierr = VecGetArray(svd->V[0],&pV);CHKERRQ(ierr);
|
for (i=0;i<svd->n;i++) {
|
for (i=0;i<svd->n;i++) {
|
ierr = VecDestroy(svd->V[i]);CHKERRQ(ierr);
|
ierr = VecDestroy(svd->V[i]);CHKERRQ(ierr);
|
}
|
}
|
|
ierr = PetscFree(pV);CHKERRQ(ierr);
|
ierr = PetscFree(svd->V);CHKERRQ(ierr);
|
ierr = PetscFree(svd->V);CHKERRQ(ierr);
|
}
|
}
|
/* allocate memory for next solution */
|
/* allocate memory for next solution */
|
ierr = PetscMalloc(svd->ncv*sizeof(PetscReal),&svd->sigma);CHKERRQ(ierr);
|
ierr = PetscMalloc(svd->ncv*sizeof(PetscReal),&svd->sigma);CHKERRQ(ierr);
|
ierr = PetscMalloc(svd->ncv*sizeof(PetscReal),&svd->perm);CHKERRQ(ierr);
|
ierr = PetscMalloc(svd->ncv*sizeof(PetscReal),&svd->perm);CHKERRQ(ierr);
|
ierr = PetscMalloc(svd->ncv*sizeof(PetscReal),&svd->errest);CHKERRQ(ierr);
|
ierr = PetscMalloc(svd->ncv*sizeof(PetscReal),&svd->errest);CHKERRQ(ierr);
|
ierr = PetscMalloc(svd->ncv*sizeof(Vec),&svd->V);CHKERRQ(ierr);
|
ierr = PetscMalloc(svd->ncv*sizeof(Vec),&svd->V);CHKERRQ(ierr);
|
|
ierr = VecGetLocalSize(svd->vec_initial,&nloc);CHKERRQ(ierr);
|
|
ierr = PetscMalloc(svd->ncv*nloc*sizeof(PetscScalar),&pV);CHKERRQ(ierr);
|
for (i=0;i<svd->ncv;i++) {
|
for (i=0;i<svd->ncv;i++) {
|
ierr = SVDMatGetVecs(svd,svd->V+i,PETSC_NULL);CHKERRQ(ierr);
|
ierr = VecCreateMPIWithArray(((PetscObject)svd)->comm,nloc,PETSC_DECIDE,pV+i*nloc,&svd->V[i]);CHKERRQ(ierr);
|
}
|
}
|
svd->n = svd->ncv;
|
svd->n = svd->ncv;
|
}
|
}
|
|
|
ierr = PetscLogEventEnd(SVD_SetUp,svd,0,0,0);CHKERRQ(ierr);
|
ierr = PetscLogEventEnd(SVD_SetUp,svd,0,0,0);CHKERRQ(ierr);
|