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