So in your example of the form function, is something happening where, when I 
leave the scope of FormFunction, the invocation of DMGetLocalVector on the DM 
keeps a note that it had been called previously and has that memory already 
allocated?  Does the design distinguish between different calls to 
DMGetLocalVector, like if I called it in one subroutine and then in another 
subroutine, or twice in a single subroutine?

-gideon

> On Apr 14, 2015, at 8:23 PM, Barry Smith <bsm...@mcs.anl.gov> wrote:
> 
> 
>> On Apr 14, 2015, at 6:25 PM, Gideon Simpson <gideon.simp...@gmail.com> wrote:
>> 
>> So other than the minor point of it zeroing out the data, is there any 
>> conceivable reason to use Create/Destroy over Get/Restore?
> 
>  The design intends that Create/Destroy are for long lived objects. For 
> example in main you might call Create to make a vector you will store the 
> solution for the entire simulation run in then just before you exit the 
> program you destroy it.
> 
>   The Get/Restore are for work vectors that are used within one routine. The 
> most classic example is in FormFunction where you often have something like  
> DMGetLocalVector() ;  DMGlobalToLocalBegin/End(global, local, ...) 
> DMDAVecGetArray(local) ..../  DMRestoreLocalVector(). The idea is that rather 
> creating work vectors in main and passing them around to use when needed, DM 
> manages a "pool" of work vectors that you can grab whenever you need them and 
> are low overhead to access.
> 
>  There is nothing that enforces you follow this style, but if you don't you 
> need to be careful to know which vectors to call VecDestroy() on and which 
> ones to call DMRestoreLocalVector() on plus it will be easier for other 
> people to follow your code.
> 
>  Barry
> 
>> 
>> -gideon
>> 
>>> On Apr 14, 2015, at 7:16 PM, Matthew Knepley <knep...@gmail.com> wrote:
>>> 
>>> On Tue, Apr 14, 2015 at 6:15 PM, Gideon Simpson <gideon.simp...@gmail.com> 
>>> wrote:
>>> Other than zeroing things out, is there any substantive difference between 
>>> DMCreateLocalVector and DMGetLocalVector?
>>> 
>>> The Get version caches vectors, so you are not continually 
>>> creating/destroying
>>> 
>>>   Matt
>>> 
>>> -gideon
>>> 
>>>> On Apr 14, 2015, at 7:02 PM, Barry Smith <bsm...@mcs.anl.gov> wrote:
>>>> 
>>>> 
>>>> When PETSc vectors are created initially they always have 0 everywhere. So 
>>>> if you use DMCreateLocalVector() it will have zero in all those ghost 
>>>> places (as well as everywhere else).
>>>> 
>>>>  But if you use DMGetLocalVector() it returns vectors that maybe dirty so 
>>>> you need to fill in any locations you want to have a known value with that 
>>>> known value. Or call VecSet() to clear the entire vector.
>>>> 
>>>> Barry
>>>> 
>>>>> On Apr 14, 2015, at 5:52 PM, Gideon Simpson <gideon.simp...@gmail.com> 
>>>>> wrote:
>>>>> 
>>>>> If i use the DM_BOUNDARY_GHOSTED flag in the creation of a DMDA array, 
>>>>> are the ghosted values automatically set to zero, or should they be 
>>>>> manually set to zero if that’s the desired ghost value?
>>>>> 
>>>>> -gideon
>>>>> 
>>>> 
>>> 
>>> 
>>> 
>>> 
>>> -- 
>>> 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
>> 
> 

Reply via email to