> 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.

   I'll try tomorrow.

  Thanks again for pointing to the with construct.

  Barry



> 
>   Matt
>  
>>   Barry
>> 
>> 
>>> On Feb 1, 2023, at 8:07 PM, Matthew Knepley <knep...@gmail.com 
>>> <mailto: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/>
>> 
> 
> 
> -- 
> 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