Jed,
Thanks for the pointer, I got it working. > On Feb 2, 2023, at 1:11 PM, Jed Brown <j...@jedbrown.org> wrote: > > Barry Smith <bsm...@petsc.dev> writes: > >>> On Feb 1, 2023, at 9:17 PM, Matthew Knepley <knep...@gmail.com> wrote: >>> >>> On Wed, Feb 1, 2023 at 9:06 PM Barry Smith <bsm...@petsc.dev >>> <mailto:bsm...@petsc.dev>> wrote: >>>> >>>> Hmm, When I do >>>> >>>> def somePythonfunction(): >>>> ... >>>> x = da.createLocalVec() >>>> .... >>>> return >>>> >>>> The x seems to be properly "garbage collected" at some point; I was >>>> guessing it was at the return or some time later than the return, but it >>>> did not wait until PetscFinalize(). >>>> >>>> So does the x above HAVE to exist until PetscFinalize()? If not then >>>> somehow Python realizes x is no longer referenced and VecDestroy() is >>>> called on it when some garbage collection takes place. I would like the >>>> same thing happen with the x = da.getLocalVec() but calling >>>> x.da.restoreLocalVec() instead of x.destroy(). Note specifically >>>> parallelism doesn't play a role here because x is local. >>> >>> It can happen at a random time, so it is unsafe to structure without a >>> "with" since it could hold the local vector maybe after the user tries to >>> destroy the DA. >> >> Thanks. I am assuming you are talking about the getLocalVec() case. So it >> appears I need to dynamically attach an __exit__() method to the Vec in >> da.getLocalVec() so that restoreLocalVec() gets called >> https://www.geeksforgeeks.org/with-statement-in-python/ when the local >> vector goes out of scope of the with. >> >> I assume I can have multiple independent objects created with a with or I >> guess I could nest them when needed for local representations of u and du >> for TS.IFunction. > > Yes. > > See `with v.localForm() as loc` in src/binding/petsc4py/test/test_vec.py and > the corresponding implementation. There are a few other similar context > handlers. > > https://gitlab.com/petsc/petsc/-/commit/afbe0322dffa