[petsc-users] Slepc eigen value solver gives strange behavior
Jose E. Roman
jroman at dsic.upv.es
Wed Apr 6 13:33:27 CDT 2011
El 06/04/2011, a las 05:21, Gong Ding escribió:
> Dear Jose,
> will you please also take a look at the SVD code for smallest singular value?
> It seems work except the time consuming SVDCyclicSetExplicitMatrix routine.
> However, I wonder if there exist some more clever method.
I think it is correct.
Jose
>
> // SVD solver for smallest singular value
> SVD svd_s;
> EPS eps_s;
> ST st_s;
> KSP ksp_s;
> PC pc_s;
>
> PetscErrorCode ierr;
>
> // Create singular value solver context
> ierr = SVDCreate(PETSC_COMM_WORLD, &svd_s);
>
> // Set operator
> ierr = SVDSetOperator(svd_s, J);
>
>
> // small singular value use eigen value solver on Cyclic Matrix
> ierr = SVDSetWhichSingularTriplets(svd_s, SVD_SMALLEST);
> ierr = SVDSetType(svd_s, SVDCYCLIC);
> ierr = SVDCyclicSetExplicitMatrix(svd_s, PETSC_TRUE); // <-----time consuming
> // shift-and-invert spectral transformation to enhance convergence of eigenvalues near zero
> ierr = SVDCyclicGetEPS(svd_s, &eps_s);
> ierr = EPSSetType(eps_s, EPSKRYLOVSCHUR);
> ierr = EPSGetST(eps_s, &st_s);
> ierr = STSetType(st_s, STSINVERT);
>
> ierr = STGetKSP(st_s, &ksp_s);
> ierr = KSPGetPC(ksp_s, &pc_s);
> // since we have to deal with bad conditioned problem, we choose direct solver whenever possible
>
> // direct solver as preconditioner
> ierr = KSPSetType (ksp_s, (char*) KSPGMRES); assert(!ierr);
> // superlu which use static pivot seems very stable
> ierr = PCSetType (pc_s, (char*) PCLU); assert(!ierr);
> ierr = PCFactorSetMatSolverPackage (pc_s, "superlu"); assert(!ierr);
>
> // Set solver parameters at runtime
> ierr = SVDSetFromOptions(svd_s); assert(!ierr);
>
> ierr = SVDSetUp(svd_s); assert(!ierr);
>
> PetscReal sigma_large=1, sigma_small=1;
> PetscInt nconv;
> PetscReal error;
>
> // find the smallest singular value
> SVDSolve(svd_s);
More information about the petsc-users
mailing list