| Line 176... |
Line 176... |
PetscErrorCode SVDGetConverged(SVD svd,PetscInt *nconv)
|
PetscErrorCode SVDGetConverged(SVD svd,PetscInt *nconv)
|
{
|
{
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
|
PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
|
PetscValidIntPointer(nconv,2);
|
PetscValidIntPointer(nconv,2);
|
if (svd->reason == SVD_CONVERGED_ITERATING) {
|
if (svd->reason == SVD_CONVERGED_ITERATING) SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_WRONGSTATE,"SVDSolve must be called first");
|
SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_WRONGSTATE,"SVDSolve must be called first");
|
|
}
|
|
*nconv = svd->nconv;
|
*nconv = svd->nconv;
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
| Line 220... |
Line 218... |
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
|
PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
|
if (u) { PetscValidHeaderSpecific(u,VEC_CLASSID,4); PetscCheckSameComm(svd,1,u,4); }
|
if (u) { PetscValidHeaderSpecific(u,VEC_CLASSID,4); PetscCheckSameComm(svd,1,u,4); }
|
if (v) { PetscValidHeaderSpecific(v,VEC_CLASSID,5); PetscCheckSameComm(svd,1,v,5); }
|
if (v) { PetscValidHeaderSpecific(v,VEC_CLASSID,5); PetscCheckSameComm(svd,1,v,5); }
|
if (svd->reason == SVD_CONVERGED_ITERATING) {
|
if (svd->reason == SVD_CONVERGED_ITERATING) SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_WRONGSTATE,"SVDSolve must be called first");
|
SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_WRONGSTATE,"SVDSolve must be called first");
|
if (i<0 || i>=svd->nconv) SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Argument 2 out of range");
|
}
|
|
if (i<0 || i>=svd->nconv) {
|
|
SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Argument 2 out of range");
|
|
}
|
|
*sigma = svd->sigma[svd->perm[i]];
|
*sigma = svd->sigma[svd->perm[i]];
|
ierr = MatGetSize(svd->OP,&M,&N);CHKERRQ(ierr);
|
ierr = MatGetSize(svd->OP,&M,&N);CHKERRQ(ierr);
|
if (M<N) { w = u; u = v; v = w; }
|
if (M<N) { w = u; u = v; v = w; }
|
if (u) {
|
if (u) {
|
if (!svd->U) {
|
if (!svd->U) {
|
| Line 281... |
Line 275... |
PetscInt M,N;
|
PetscInt M,N;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
|
PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
|
PetscValidLogicalCollectiveInt(svd,i,2);
|
PetscValidLogicalCollectiveInt(svd,i,2);
|
if (svd->reason == SVD_CONVERGED_ITERATING) {
|
if (svd->reason == SVD_CONVERGED_ITERATING) SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_WRONGSTATE,"SVDSolve must be called first");
|
SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_WRONGSTATE,"SVDSolve must be called first");
|
if (i<0 || i>=svd->nconv) SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Argument 2 out of range");
|
}
|
|
if (i<0 || i>=svd->nconv) {
|
|
SETERRQ(((PetscObject)svd)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Argument 2 out of range");
|
|
}
|
|
|
|
ierr = MatGetVecs(svd->OP,&v,&u);CHKERRQ(ierr);
|
ierr = MatGetVecs(svd->OP,&v,&u);CHKERRQ(ierr);
|
ierr = SVDGetSingularTriplet(svd,i,&sigma,u,v);CHKERRQ(ierr);
|
ierr = SVDGetSingularTriplet(svd,i,&sigma,u,v);CHKERRQ(ierr);
|
if (norm1) {
|
if (norm1) {
|
ierr = VecDuplicate(u,&x);CHKERRQ(ierr);
|
ierr = VecDuplicate(u,&x);CHKERRQ(ierr);
|