[petsc-dev] SNESSetKSP and SNESDestroy

Pierre Jolivet pierre.jolivet at enseeiht.fr
Thu May 30 08:22:20 CDT 2019



> On 30 May 2019, at 2:42 PM, Matthew Knepley <knepley at gmail.com> wrote:
> 
> On Thu, May 30, 2019 at 6:08 AM Pierre Jolivet via petsc-dev <petsc-dev at mcs.anl.gov <mailto:petsc-dev at mcs.anl.gov>> wrote:
> Hello,
> I’m doing a continuation loop with something like:
> KSP ksp;
> KSPSetUp(ksp);
> while(cond) {
>         SNES snes;
>         SNESCreate(&snes);
>         SNESSetKSP(snes, &ksp);
>         SNESSolve(snes);
>         SNESDestroy(&snes);
> }
> 
> For the first iteration, everything is OK.
> After that, it looks like SNESDestroy is messing up with my outer-defined KSP(*), i.e., for the code to work I need to comment out the SNESDestroy.
> Is this the expected behavior? (if not, I’ll provide a MWE)
> How to fix this properly, without having leaks by not destroying the inner-defined SNESes?
> 
> Thanks in advance,
> Pierre
> 
> (*) to the outer-defined KSP is attached a PCFIELDSPLIT, first SNESSolve, everything OK:
> PC Object: 1 MPI processes
>   type: fieldsplit
>     FieldSplit with MULTIPLICATIVE composition: total splits = 2
> 
> Second SNESSolve:
> [0]PETSC ERROR: PCFieldSplitSetDefaults() Unhandled case, must have at least two fields, not 1
> 
> I believe SNESDestroy() calls SNESReset(), which calls KSPReset(), which is wiping out your information.

OK, I thought there was a reference count in XXXReset, but it looks like it is just in the XXXDestroy. That explains why.

> This pattern is in a lot of places. Destroy calls Reset because it is natural to reuse the code which tears down
> the internal structures. Reset calls reset on subobjects because we also want to tear down their internal structures (usually).
> Reset wouldn't do what we want on resizing if we left subobjects unreset. However, this chain is causing subobjects to
> be wiped clean on Destroy, so that we cannot reuse subobjects.
> 
> It would not even work if you change the Destroy to Reset in the continuation loop. However, I think you can hoist all
> the SNES setup outside the loop. If you are changing sizes, then the KSP needs to be wiped out anyway.

Indeed, when I turn on mesh adaptation, I wipe out the KSP myself and set everything again, so no problem.

> If not, then
> you do not need to wipe out the SNES.

Now, this is more of a limitation of our DSL. I don’t expose PETSc SNES type to users, we just do SNESSolve(my Mat+KSP) in the loop, which Create, Solve, and Destroy.
But I guess I’ll have to split those steps.

Thanks,
Pierre

>   Thanks,
> 
>      Matt
> 
> -- 
> 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-dev/attachments/20190530/e33d9a8b/attachment.html>


More information about the petsc-dev mailing list