[petsc-users] Use block Jacobi preconditioner with SNES

Smith, Barry F. bsmith at mcs.anl.gov
Fri Aug 24 19:01:55 CDT 2018


   What you would like to do is reasonable but unfortunately the order of the operations in SNES/KSP means that the KSPSetUp() cannot be called before the SNESSolve() because the Jacobian matrix has yet to be provided to KSP. Thus you have to, as Jed suggested, use the options database to set the options. Note that if you want the options "hardwired" into the code you can use PetscOptionsSetValue() from the code.

  Barry


> On Aug 24, 2018, at 1:48 PM, Ali Reza Khaz'ali <arkhazali at cc.iut.ac.ir> wrote:
> 
> Hi,
> 
> I am trying to use block Jacobi preconditioner in SNES (SNESNEWTONLS). However, PCBJacobiGetSubKSP function returns an error stating "Object is in wrong state, Must call KSPSetUp() or PCSetUp() first". When I add KSPSetUp, I got and error from them as: "Must call DMShellSetGlobalVector() or DMShellSetCreateGlobalVector()", and if PCSetUp is added, "Object is in wrong state, Matrix must be set first" error is printed.
> 
> Below is a part of my code. It is run serially. Any help is much appreciated.
> 
>     ierr = SNESGetKSP(snes, &Petsc_ksp);
>     CHKERRQ(ierr);
>     ierr = KSPGetPC(Petsc_ksp, &Petsc_pc);
>     CHKERRQ(ierr);
>     ierr = KSPSetTolerances(Petsc_ksp, 1.e-3, 1e-3, PETSC_DEFAULT, 20000);
>     CHKERRQ(ierr);
>     ierr = SNESSetTolerances(snes, 1e-1, 1e-1, 1e-1, 2000, 2000);
>     CHKERRQ(ierr);
>     ierr = SNESSetType(snes, SNESNEWTONLS);
>     CHKERRQ(ierr);
>     ierr = KSPSetType(Petsc_ksp, KSPGMRES);
>     CHKERRQ(ierr);
>     ierr = PCSetType(Petsc_pc, PCBJACOBI);
>     CHKERRQ(ierr);
>     ierr = PCSetType(Petsc_pc, PCBJACOBI);
>     CHKERRQ(ierr);
>     ierr = PCBJacobiSetTotalBlocks(Petsc_pc, 2*Nx*Ny*Nz, SadeqSize);
>     CHKERRQ(ierr);
> 
>     SNESSetUp(snes);
>     CHKERRQ(ierr);
>     ierr = PCBJacobiGetSubKSP(Petsc_pc, &nLocal, &Firstly, &subKSP);
>     CHKERRQ(ierr);
> 
>     for (i = 0; i < nLocal; i++) {
>         ierr = KSPGetPC(subKSP[i], &SubPc);
>         CHKERRQ(ierr);
>         ierr = PCSetType(SubPc, PCLU);
>         CHKERRQ(ierr);
>         ierr = PCFactorSetMatSolverPackage(SubPc, "mkl_pardiso");
>         CHKERRQ(ierr);
>         ierr = KSPSetType(subKSP[i], KSPPREONLY);
>         CHKERRQ(ierr);
>         ierr = KSPSetTolerances(subKSP[i], 1.e-6, PETSC_DEFAULT, PETSC_DEFAULT, PETSC_DEFAULT);
>         CHKERRQ(ierr);
>     }
>     ierr = SNESSolve(snes, NULL, Petsc_X);
>     CHKERRQ(ierr);
> 
> 
> 
> -- 
> Ali Reza Khaz’ali
> Assistant Professor of Petroleum Engineering,
> Department of Chemical Engineering
> Isfahan University of Technology
> Isfahan, Iran
> 



More information about the petsc-users mailing list