Pushed: http://petsc.cs.iit.edu/petsc/petsc-dev/rev/76f5543c7e89 On Thu, Mar 29, 2012 at 11:07 AM, Barry Smith <[email protected]> wrote:
I think Jed is suggesting changing:
PetscErrorCode KSPDestroy(KSP *ksp) { PetscErrorCode ierr;
PetscFunctionBegin; if (!*ksp) PetscFunctionReturn(0); PetscValidHeaderSpecific((*ksp),KSP_CLASSID,1); if (--((PetscObject)(*ksp))->refct > 0) {*ksp = 0; PetscFunctionReturn(0);}
ierr = KSPReset((*ksp));CHKERRQ(ierr);
to
PetscErrorCode KSPDestroy(KSP *ksp) { PetscErrorCode ierr; PC pc = (*ksp)->pc;
PetscFunctionBegin; if (!*ksp) PetscFunctionReturn(0); PetscValidHeaderSpecific((*ksp),KSP_CLASSID,1); if (--((PetscObject)(*ksp))->refct > 0) {*ksp = 0; PetscFunctionReturn(0);}
pc = (*ksp)->pc; (*ksp)->pc = PETSC_NULL; ierr = KSPReset((*ksp));CHKERRQ(ierr); (*ksp)->pc = pc;
Since KSPDestroy() doesn't need to have PCReset() called. This doesn't require any special code for users.
Barry
On Mar 29, 2012, at 10:38 AM, Dmitry Karpeev wrote:
On Thu, Mar 29, 2012 at 10:13 AM, Jed Brown <[email protected]>
wrote:
On Thu, Mar 29, 2012 at 08:28, Dmitry Karpeev <[email protected]> wrote: Back to the original problem: how shall we prevent a shared pc from being gutted by an unprotected PCReset() cascading from a KSPDestroy() on one of the containing ksps? I can factor out KSPReset_Private()/PCReset_Private() as indicated before, unless there are objections.
What do you think of my suggestion of masking ksp->pc when KSPDestroy calls KSPReset? Then KSPReset does not call PCReset if ksp->pc does not exist. I guess that works too, but I thought your suggestion applied to userland code right before calling KSPDestroy(&ksp)? I suppose that will fix Mark's problem. Maybe that's the right approach: he got himself into this mess by reusing a pc in the inner ksp, he should know how to extricate himself :-)
Dmitry.
participants (1)
-
Dmitry Karpeev