[petsc-users] VecSet and VecAssemblyBegin
Barry Smith
bsmith at petsc.dev
Sat Apr 26 12:46:36 CDT 2025
The guards are supposed to be universal, not one-offs that are put into specific locations. How come no errors with debug mode are detected in this situation?
Barry
> On Apr 26, 2025, at 1:09 PM, Matthew Knepley <knepley at gmail.com> wrote:
>
> Junchao, should we put guards in VecSet() and LocalToGlobal() for the array lock?
>
> Thanks,
>
> Matt
>
> On Sat, Apr 26, 2025 at 11:50 AM Junchao Zhang <junchao.zhang at gmail.com <mailto:junchao.zhang at gmail.com>> wrote:
>> Yes, that is correct.
>>
>> --Junchao Zhang
>>
>>
>> On Sat, Apr 26, 2025 at 10:35 AM Derek Teaney <derek.teaney at stonybrook.edu <mailto:derek.teaney at stonybrook.edu>> wrote:
>>> Ok -- got it -- thanks so just do the RestoreArray before the final step, e.g.
>>>
>>> Loop over cases
>>> VecSet(dn_local, 0.)
>>> GetArray(dn_local, &dn) // RIGHT
>>> Fill up dn
>>> Restore Array
>>> LocalToGlobal
>>>
>>>
>>> On Sat, Apr 26, 2025 at 9:50 AM Junchao Zhang <junchao.zhang at gmail.com <mailto:junchao.zhang at gmail.com>> wrote:
>>>> On Sat, Apr 26, 2025 at 8:27 AM Derek Teaney via petsc-users <petsc-users at mcs.anl.gov <mailto:petsc-users at mcs.anl.gov>> wrote:
>>>>> Thanks Barry -- this solved the issue.
>>>>>
>>>>> "probably will be fine" was fine with 3.17 and maybe 3.19, but definitely not fine with 3.20.
>>>>>
>>>>> For others the faulty logic is:
>>>>>
>>>>> GetArray(dn_local, &dn) //WRONG
>>>>> Loop over cases
>>>>> VecSet(dn_local, 0.)
>>>>> Fill up dn
>>>>> LocalToGlobal
>>>>> RestoreArray
>>>>>
>>>>> Where as one should do:
>>>>>
>>>>> Loop over cases
>>>>> VecSet(dn_local, 0.)
>>>>> GetArray(dn_local, &dn) // RIGHT
>>>>> Fill up dn
>>>>> LocalToGlobal
>>>>> RestoreArray
>>>> The above two pieces of code are both wrong, in my view.
>>>>>
>>>>> So, while nothing is copied, if I think of dn as a copy (and not a view) the logic will always be correct.
>>>>>
>>>>> Now I have a related question about "Technically you should not be calling VecSet() with any outstanding arrays but it will probably be fine."
>>>>> What about GlobalToLocal? should I always GetArray for the local array after the GlobalToLocal
>>>>>
>>>>> So, is this also bad logic:
>>>>>
>>>>> GetArray(n_local, &n)
>>>>> Loop over cases:
>>>>> GlobalToLocal(n_global, &n_local)
>>>>> do stuff with n
>>>>> LocalToGlobal(n_local, n_global)
>>>>> RestoreArray
>>>>>
>>>>> as opposed to
>>>>>
>>>>> Loop over cases:
>>>>> GlobalToLocal(n_global, &n_local)
>>>>> GetArray(n_local, &n)
>>>>> do stuff with n
>>>>> LocalToGlobal(n_local, n_global)
>>>>> RestoreArray
>>>> This is also wrong.
>>>> I think the rule here is: GetArray() puts the vector in an interim state. One shall not call any vector routines (ex. LocalToGlobal/GlobalToLocal) before RestoreArray(). You can only operate on the array instead.
>>>>
>>>>>
>>>>> Thanks again for all your help,
>>>>>
>>>>> Derek
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Apr 25, 2025 at 5:30 PM Barry Smith <bsmith at petsc.dev <mailto:bsmith at petsc.dev>> wrote:
>>>>>>
>>>>>> Technically you should not be calling VecSet() with any outstanding arrays but it will probably be fine.
>>>>>>
>>>>>> Even though GetArray() does not copy the array values; both GetArray/RestoreArray and Set track the current "state" of the vector and that count might get confused if they are used improperly.
>>>>>>
>>>>>>
>>>>>>
>>>>>>> On Apr 25, 2025, at 4:42 PM, Derek Teaney <derek.teaney at stonybrook.edu <mailto:derek.teaney at stonybrook.edu>> wrote:
>>>>>>>
>>>>>>> Thanks, I am working on providing a standalone code. A related question is - if I did have a view of a local vector provided by:
>>>>>>>
>>>>>>> data_node ***dn_array;
>>>>>>> DMDAVecGetArray(domain, dn_local, &dn_array);
>>>>>>>
>>>>>>> Can I assume through multiple calls to VecSet that the view dn_array is valid, or should this be restored, between calls.
>>>>>>>
>>>>>>> Thanks,
>>>>>>>
>>>>>>> Derek
>>>>>>>
>>>>>>> On Fri, Apr 25, 2025 at 1:26 PM Barry Smith <bsmith at petsc.dev <mailto:bsmith at petsc.dev>> wrote:
>>>>>>>>
>>>>>>>> You absolutely should not need to do an assembly after a VecSet. Please post a full reproducer that demonstrates the problem.
>>>>>>>>
>>>>>>>> Barry
>>>>>>>>
>>>>>>>>
>>>>>>>>> On Apr 25, 2025, at 1:23 PM, Derek Teaney via petsc-users <petsc-users at mcs.anl.gov <mailto:petsc-users at mcs.anl.gov>> wrote:
>>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> I was under the (mistaken) impression that one does not need to due a VecAssemblyBegin etc following a VecSet, e.g.
>>>>>>>>>
>>>>>>>>> VecSet(dn_local, 0.);
>>>>>>>>> VecAssemblyBegin(dn_local) ;
>>>>>>>>> VecAssemblyEnd(dn_local) ;
>>>>>>>>>
>>>>>>>>> Seems to give different results without the Assembly.
>>>>>>>>>
>>>>>>>>> Thanks for clarifying,
>>>>>>>>>
>>>>>>>>> Derek
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> ------------------------------------------------------------------------
>>>>>>>>> Derek Teaney
>>>>>>>>> Professor and Graduate Program Director
>>>>>>>>> Dept. of Physics & Astronomy
>>>>>>>>> Stony Brook University
>>>>>>>>> Stony Brook, NY 11794-3800
>>>>>>>>> Tel: (631) 632-4489
>>>>>>>>> Fax: (631) 632-9718
>>>>>>>>> e-mail: Derek.Teaney at stonybrook.edu <mailto:Derek.Teaney at stonybrook.edu>
>>>>>>>>> ------------------------------------------------------------------------
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> ------------------------------------------------------------------------
>>>>>>> Derek Teaney
>>>>>>> Professor and Graduate Program Director
>>>>>>> Dept. of Physics & Astronomy
>>>>>>> Stony Brook University
>>>>>>> Stony Brook, NY 11794-3800
>>>>>>> Tel: (631) 632-4489
>>>>>>> Fax: (631) 632-9718
>>>>>>> e-mail: Derek.Teaney at stonybrook.edu <mailto:Derek.Teaney at stonybrook.edu>
>>>>>>> ------------------------------------------------------------------------
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> ------------------------------------------------------------------------
>>>>> Derek Teaney
>>>>> Professor and Graduate Program Director
>>>>> Dept. of Physics & Astronomy
>>>>> Stony Brook University
>>>>> Stony Brook, NY 11794-3800
>>>>> Tel: (631) 632-4489
>>>>> Fax: (631) 632-9718
>>>>> e-mail: Derek.Teaney at stonybrook.edu <mailto:Derek.Teaney at stonybrook.edu>
>>>>> ------------------------------------------------------------------------
>>>>>
>>>
>>>
>>>
>>> --
>>> ------------------------------------------------------------------------
>>> Derek Teaney
>>> Professor and Graduate Program Director
>>> Dept. of Physics & Astronomy
>>> Stony Brook University
>>> Stony Brook, NY 11794-3800
>>> Tel: (631) 632-4489
>>> Fax: (631) 632-9718
>>> e-mail: Derek.Teaney at stonybrook.edu <mailto:Derek.Teaney at stonybrook.edu>
>>> ------------------------------------------------------------------------
>>>
>
>
>
> --
> 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://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!fE14MPtF_3o08eM3ty1elbmmVfVpJTt3JiSuxrBbKBXPwXIHLTC4l7wwrUT21_bE5_FN9mM0rKi3SAGYKstfsrg$ <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aIL-dQ6HGo2zkrc1_qEB3XbGFGhwsiPuJRK68V4emqBz31A_jzsgI-sJS8ki4Sx6hcqI_Ya3tzpzdl8ciLTN$>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20250426/f675093f/attachment-0001.html>
More information about the petsc-users
mailing list