[petsc-users] On QN + Fieldsplit

Barry Smith bsmith at petsc.dev
Tue Oct 12 14:00:16 CDT 2021


  SNESSetKSP() (and friends) was a mistake, it was originally introduced for symmetry reasons but doesn't seem to have a good reason to exist.

  Barry


> On Oct 12, 2021, at 2:24 PM, Matthew Knepley <knepley at gmail.com> wrote:
> 
> On Tue, Oct 12, 2021 at 10:27 AM Nicolás Barnafi <nabw91 at gmail.com <mailto:nabw91 at gmail.com>> wrote:
> Thank you for the support. I rewrote the initialization in a simpler way, now it works as expected:
> 
> > dofmap_s = V.sub(0).dofmap().dofs(); is_s = PETSc.IS().createGeneral(dofmap_s)
> > dofmap_p = V.sub(1).dofmap().dofs(); is_p = PETSc.IS().createGeneral(dofmap_p)
> > snes = PETSc.SNES().create(MPI.COMM_WORLD)
> > snes.setFunction(problem.F, b.vec()); snes.setJacobian(problem.J, J_mat.mat())
> > pc = snes.ksp.getPC()
> > pc.setType('fieldsplit')
> > pc.setFieldSplitIS((None, is_s), (None, is_p))
> > snes.setFromOptions()
> > snes.solve(None, problem.u.vector().vec())
> 
> Apparently trying to setup the solver's internals is not recommended. As a side note, I tried also setting up the KSP using 'SNESSetKSP', but this solution is not so good as giving the command 'snes_ksp_ew' does nothing, even though it gets correctly read as shown by snes.view(). 
> 
> I think I can explain this. The Eisenstat-Walker scheme is a way to set tolerances for the linear solves inside a Newton iteration. The goal is
> to avoid over-solving the linear systems, meaning that far away from the solution accurate linear solves have no advantage over inaccurate ones.
> Implementing this involves coordination with the linear solver since we are setting the convergence tolerance. When you replace the linear solve,
> that setup is discarded. Thus, when configuring things, we recommend that you pull out the existing object
> 
>   SNESGetKSP()
> 
> and customize it, rather than creating a new object and setting it.
> 
>   Thanks,
> 
>      Matt
>  
> Thanks for the help!
> Best, 
> Nicolas
> 
> On Tue, Oct 12, 2021 at 4:23 PM Matthew Knepley <knepley at gmail.com <mailto:knepley at gmail.com>> wrote:
> I looked over every place we use that error code. I do not think it is coming from PETSc, but rather from petsc4py. However, something
> is eating the error message, and I think Stefano indicated. My first step would be to get the FEniCS folks to display the error message.
> 
> Another option is to just run it in Firedrake since I think we can see the stack properly there.
> 
>   Thanks,
> 
>      Matt
> 
> On Tue, Oct 12, 2021 at 8:37 AM Nicolás Barnafi <nabw91 at gmail.com <mailto:nabw91 at gmail.com>> wrote:
> Thank you Stefano for the help. I added the lines you indicated, but the error remains the same, here goes snes.view() + error
> 
> > SNES Object: 1 MPI processes
> >   type: qn
> >   SNES has not been set up so information may be incomplete
> >     type is BROYDEN, restart type is DEFAULT, scale type is JACOBIAN
> >     Stored subspace size: 10
> >     Using the single reduction variant.
> >   maximum iterations=10000, maximum function evaluations=30000
> >   tolerances: relative=1e-08, absolute=1e-50, solution=1e-08
> >   total number of function evaluations=0
> >   norm schedule ALWAYS
> >   SNESLineSearch Object: 1 MPI processes
> >     type: basic
> >     maxstep=1.000000e+08, minlambda=1.000000e-12
> >     tolerances: relative=1.000000e-08, absolute=1.000000e-15, lambda=1.000000e-08
> >     maximum iterations=1
> > Traceback (most recent call last):
> >   File "Twist.py", line 234, in <module>
> >     snes.setUp()
> >   File "PETSc/SNES.pyx", line 530, in petsc4py.PETSc.SNES.setUp
> > petsc4py.PETSc.Error: error code 83
> 
> On Tue, Oct 12, 2021 at 2:07 PM Stefano Zampini <stefano.zampini at gmail.com <mailto:stefano.zampini at gmail.com>> wrote:
> 
> 
> Il giorno mar 12 ott 2021 alle ore 13:56 Nicolás Barnafi <nabw91 at gmail.com <mailto:nabw91 at gmail.com>> ha scritto:
> Hello PETSc users, 
> 
> first email sent!
> I am creating a SNES solver using fenics, my example runs smoothly with 'newtonls', but gives a strange missing function error (error 83):
> 
> 
> Dolphin swallows any useful error information returned from PETSc. You can try using the below code snippet at the beginning of your script
> 
> from petsc4py import PETSc
> from dolfin import *
> # Remove the dolfin error handler
> PETSc.Sys.pushErrorHandler('python')
> 
>  
> 
> these are the relevant lines of code where I setup the solver:
> 
> > problem = SNESProblem(Res, sol, bcs)
> > b = PETScVector()  # same as b = PETSc.Vec()
> > J_mat = PETScMatrix()
> > snes = PETSc.SNES().create(MPI.COMM_WORLD)
> > snes.setFunction(problem.F, b.vec())
> > snes.setJacobian(problem.J, J_mat.mat())
> > # Set up fieldsplit
> > ksp = snes.ksp
> > ksp.setOperators(J_mat.mat())
> > pc = ksp.pc
> > pc.setType('fieldsplit')
> > dofmap_s = V.sub(0).dofmap().dofs()
> > dofmap_p = V.sub(1).dofmap().dofs()
> > is_s = PETSc.IS().createGeneral(dofmap_s)
> > is_p = PETSc.IS().createGeneral(dofmap_p)
> > pc.setFieldSplitIS((None, is_s), (None, is_p))
> > pc.setFromOptions()
> > snes.setFromOptions()
> > snes.setUp()
>   
> If it can be useful, this are the outputs of snes.view(), ksp.view() and pc.view():
> 
> >   type: qn
> >   SNES has not been set up so information may be incomplete
> >     type is BROYDEN, restart type is DEFAULT, scale type is JACOBIAN
> >     Stored subspace size: 10
> >     Using the single reduction variant.
> >   maximum iterations=10000, maximum function evaluations=30000
> >   tolerances: relative=1e-08, absolute=1e-50, solution=1e-08
> >   total number of function evaluations=0
> >   norm schedule ALWAYS
> >   SNESLineSearch Object: 4 MPI processes
> >     type: basic
> >     maxstep=1.000000e+08, minlambda=1.000000e-12
> >     tolerances: relative=1.000000e-08, absolute=1.000000e-15, lambda=1.000000e-08
> >     maximum iterations=1
> > KSP Object: 4 MPI processes
> >   type: gmres
> >     restart=1000, using Modified Gram-Schmidt Orthogonalization
> >     happy breakdown tolerance 1e-30
> >   maximum iterations=1000, initial guess is zero
> >   tolerances:  relative=1e-05, absolute=1e-50, divergence=10000.
> >   left preconditioning
> >   using UNPRECONDITIONED norm type for convergence test
> > PC Object: 4 MPI processes
> >   type: fieldsplit
> >   PC has not been set up so information may be incomplete
> >     FieldSplit with Schur preconditioner, factorization FULL
> 
> I know that PC is not setup, but if I do it before setting up the SNES, the error persists. Thanks in advance for your help. 
> 
> Best, 
> Nicolas
> -- 
> Nicolás Alejandro Barnafi Wittwer
> 
> 
> -- 
> Stefano
> 
> 
> -- 
> Nicolás Alejandro Barnafi Wittwer
> 
> 
> -- 
> What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
> -- Norbert Wiener
> 
> https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
> 
> 
> -- 
> Nicolás Alejandro Barnafi Wittwer
> 
> 
> -- 
> What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
> -- Norbert Wiener
> 
> https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20211012/41f0b915/attachment-0001.html>


More information about the petsc-users mailing list