| Line 197... |
Line 197... |
@*/
|
@*/
|
PetscErrorCode SVDGetSingularTriplet(SVD svd, PetscInt i, PetscReal *sigma, Vec u, Vec v)
|
PetscErrorCode SVDGetSingularTriplet(SVD svd, PetscInt i, PetscReal *sigma, Vec u, Vec v)
|
{
|
{
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
PetscReal norm;
|
PetscReal norm;
|
PetscInt j;
|
PetscInt j,nloc;
|
|
PetscScalar *pU;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(svd,SVD_COOKIE,1);
|
PetscValidHeaderSpecific(svd,SVD_COOKIE,1);
|
PetscValidPointer(sigma,3);
|
PetscValidPointer(sigma,3);
|
if (svd->reason == SVD_CONVERGED_ITERATING) {
|
if (svd->reason == SVD_CONVERGED_ITERATING) {
|
| Line 213... |
Line 214... |
*sigma = svd->sigma[svd->perm[i]];
|
*sigma = svd->sigma[svd->perm[i]];
|
if (u) {
|
if (u) {
|
PetscValidHeaderSpecific(u,VEC_COOKIE,4);
|
PetscValidHeaderSpecific(u,VEC_COOKIE,4);
|
if (!svd->U) {
|
if (!svd->U) {
|
ierr = PetscMalloc(sizeof(Vec)*svd->ncv,&svd->U);CHKERRQ(ierr);
|
ierr = PetscMalloc(sizeof(Vec)*svd->ncv,&svd->U);CHKERRQ(ierr);
|
for (j=0;j<svd->ncv;j++) { ierr = SVDMatGetVecs(svd,PETSC_NULL,svd->U+j);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);
|
|
}
|
for (j=0;j<svd->nconv;j++) {
|
for (j=0;j<svd->nconv;j++) {
|
ierr = SVDMatMult(svd,PETSC_FALSE,svd->V[j],svd->U[j]);CHKERRQ(ierr);
|
ierr = SVDMatMult(svd,PETSC_FALSE,svd->V[j],svd->U[j]);CHKERRQ(ierr);
|
ierr = IPOrthogonalize(svd->ip,j,PETSC_NULL,svd->U,svd->U[j],PETSC_NULL,&norm,PETSC_NULL,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
|
ierr = IPOrthogonalize(svd->ip,j,PETSC_NULL,svd->U,svd->U[j],PETSC_NULL,&norm,PETSC_NULL,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
|
ierr = VecScale(svd->U[j],1.0/norm);CHKERRQ(ierr);
|
ierr = VecScale(svd->U[j],1.0/norm);CHKERRQ(ierr);
|
}
|
}
|