Hi,

Thanks for the help last week. The suggestions made the implementation I
had much cleaner. I had one follow up question. Is there a way to sort of
undo this operation? I know the vec scatter can be done backwards to
distribute the arrays but I didn't see an easy way to migrate the DMDA
vectors back into the DMStag object.

Thanks for any advice.

-Colton

On Wed, Dec 6, 2023 at 8:18 PM Barry Smith <bsm...@petsc.dev> wrote:

>
>
> On Dec 6, 2023, at 8:35 PM, Matthew Knepley <knep...@gmail.com> wrote:
>
> On Wed, Dec 6, 2023 at 8:10 PM Barry Smith <bsm...@petsc.dev> wrote:
>
>>
>>   Depending on the serial library you may not need to split the vector
>> into DMDA vectors with DMStagVecSplitToDMDA() for each component. Just
>> global to natural and scatter to zero on the full vector, now the full
>> vector is on the first rank and you can access what you need in that one
>> vector if possible.
>>
>
> Does DMStag have a GlobalToNatural?
>
>
>    Good point, it does not appear to have such a thing, though it could.
>
> Also, the serial code would have to have identical interleaving.
>
>   Thanks,
>
>      Matt
>
>> On Dec 6, 2023, at 6:37 PM, Colton Bryant <
>> coltonbryant2...@u.northwestern.edu> wrote:
>>
>> Ah excellent! I was not aware of the ability to preallocate the objects
>> and migrate them each time.
>>
>> Thanks!
>> -Colton
>>
>> On Wed, Dec 6, 2023 at 5:18 PM Matthew Knepley <knep...@gmail.com> wrote:
>>
>>> On Wed, Dec 6, 2023 at 5:54 PM Colton Bryant <
>>> coltonbryant2...@u.northwestern.edu> wrote:
>>>
>>>> Hello,
>>>>
>>>> I am working on a code in which a DMSTAG object is used to solve a
>>>> fluid flow problem and I need to gather this flow data on a single process
>>>> to interact with an existing (serial) library at each timestep of my
>>>> simulation. After looking around the solution I've tried is:
>>>>
>>>> -use DMStagVecSplitToDMDA to extract vectors of each component of the
>>>> flow
>>>> -use DMDACreateNaturalVector and DMDAGlobalToNatural to get the
>>>> components naturally ordered
>>>> -use VecScatterCreateToZero to set up and then do the scatter to gather
>>>> on the single process
>>>>
>>>> Unless I'm misunderstanding something this method results in a lot of
>>>> memory allocation/freeing happening at each step of the evolution and I was
>>>> wondering if there is a way to directly perform such a scatter from the
>>>> DMSTAG object without splitting as I'm doing here.
>>>>
>>>
>>> 1) You can see here:
>>>
>>>
>>> https://petsc.org/main/src/dm/impls/stag/stagda.c.html#DMStagVecSplitToDMDA
>>>
>>> that this function is small. You can do the DMDA creation manually, and
>>> then just call DMStagMigrateVecDMDA() each time, which will not create
>>> anything.
>>>
>>> 2) You can create the natural vector upfront, and just scatter each time.
>>>
>>> 3) You can create the serial vector upfront, and just scatter each time.
>>>
>>> This is some data movement. You can compress the g2n and 2zero scatters
>>> using
>>>
>>>   https://petsc.org/main/manualpages/PetscSF/PetscSFCompose/
>>>
>>> as an optimization.
>>>
>>>   Thanks,
>>>
>>>      Matt
>>>
>>>
>>>> Any advice would be much appreciated!
>>>>
>>>> Best,
>>>> Colton Bryant
>>>>
>>>
>>>
>>> --
>>> 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