[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