[petsc-users] ghost values

Gideon Simpson gideon.simpson at gmail.com
Tue Apr 14 19:43:42 CDT 2015


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 <bsmith at mcs.anl.gov> wrote:
> 
> 
>> On Apr 14, 2015, at 6:25 PM, Gideon Simpson <gideon.simpson at 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 <knepley at gmail.com> wrote:
>>> 
>>> On Tue, Apr 14, 2015 at 6:15 PM, Gideon Simpson <gideon.simpson at 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 <bsmith at 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.simpson at 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
>> 
> 



More information about the petsc-users mailing list