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.

  Barry


> On Feb 1, 2023, at 8:07 PM, Matthew Knepley <knep...@gmail.com> wrote:
> 
> On Wed, Feb 1, 2023 at 6:33 PM Barry Smith <bsm...@petsc.dev 
> <mailto:bsm...@petsc.dev>> wrote:
>> 
>>   Would it be possible to rig the xlocal obtained from self.da.getLocalVec() 
>>  to automatically trigger the da.restoreLocalVec() when the xlocal goes out 
>> of scope so that the user does not need to explicitly make the call. If so, 
>> how should I go about implementing it?
> 
> This would work in C++ where the object has a defined lifetime, but Python is 
> garbage collected. The way it does this
> pattern is using the "with" statement.
> 
>    Matt
>  
>>   Barry
> -- 
> 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/>

Reply via email to