[petsc-dev] xlocal = da.getLocalVec() .. da.restoreLocalVec(xlocal) skip the restore

Barry Smith bsmith at petsc.dev
Wed Feb 1 21:35:56 CST 2023



> On Feb 1, 2023, at 9:17 PM, Matthew Knepley <knepley at gmail.com> wrote:
> 
> On Wed, Feb 1, 2023 at 9:06 PM Barry Smith <bsmith at petsc.dev <mailto:bsmith at 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 <knepley at gmail.com <mailto:knepley at gmail.com>> wrote:
>>> 
>>> On Wed, Feb 1, 2023 at 6:33 PM Barry Smith <bsmith at petsc.dev <mailto:bsmith at 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/>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20230201/97742744/attachment.html>


More information about the petsc-dev mailing list