<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div dir="ltr">
<div>With VecGhostUpdateBegin(v, INSERT_VALUES, SCATTER_REVERSE), the owner will get updated by ghost values. So in your case 1, proc0 gets either value1 or value2 from proc1/2;  in case 2; proc0 gets either value0 or value2 from proc1/2. </div>
<div>In short, you could not achieve your goal with INSERT_VALUES. Though you can do it with other interfaces in PETSc, e.g., PetscSFReduceBegin/End, I believe it is better to extend VecGhostUpdate to support MAX/MIN_VALUES, because it is a simpler interface
 for you and it is very easy to add.<br>
</div>
<div><br>
</div>
<div>Could you try branch jczhang/feature-vscat-min-values to see if it works for you?  See the end of src/vec/vec/examples/tutorials/ex9.c for an example of the new functionality. Use mpirun -n 2 ./ex9 -minvalues to test it and its expected output is output/ex9_2.out</div>
<div>Petsc will have a new release this weekend. Let's see whether I can put it in the new release.</div>
<div><br>
</div>
<div>Thanks.</div>
<div>
<div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">
<div dir="ltr">--Junchao Zhang</div>
</div>
</div>
<br>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Thu, Sep 26, 2019 at 3:28 AM Aulisa, Eugenio <<a href="mailto:Eugenio.Aulisa@ttu.edu">Eugenio.Aulisa@ttu.edu</a>> wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div id="gmail-m_240977805130087198divtagdefaultwrapper" style="font-size:12pt;color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif" dir="ltr">
<br>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
<br>
<br>
<br>
</div>
<blockquote>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
On Wed, Sep 25, 2019 at 9:11 AM Aulisa, Eugenio via petsc-users <<a href="mailto:petsc-users@mcs.anl.gov" id="gmail-m_240977805130087198LPlnk512389" target="_blank">petsc-users@mcs.anl.gov</a>> wrote:<br>
</div>
<blockquote type="cite">
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
Hi,<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
I have a vector with ghost nodes where each process may or may not change the value of a specific ghost node  (using INSERT_VALUES).
<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
At the end I would like for each process, that see a particular ghost node, to have the smallest of the set values.
<br>
</div>
</blockquote>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
Do you mean owner of ghost nodes gets the smallest values. That is, in your example below, proc0 gets Min(value0, value1, value2)?</div>
</blockquote>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
<div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif,serif,EmojiFont;font-size:11pt;color:black">
If I can get the <span>Min(value0, value1, value2)</span> on the owner then I can scatter it forward with INSERT_VALUES to all processes that ghost it. And if there is a easy way to get
<span>Min(value0, value1, value2)</span> on the owner (or on all processes) I would like to know.</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif,serif,EmojiFont;font-size:11pt;color:black">
<br>
</div>
Since I do not think there is a straightforward way to achieve that, I was looking at a workaround, and to do that I need to know the behavior of scatter reverse in the cases described below. Notice that I used the option INSERT_VALUES which I am not even sure is
 allowed. <br>
</div>
</div>
<blockquote>
<blockquote type="cite">
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
I do not think there is a straightforward way to achieve this, but I would like to be wrong.<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
Any suggestion?<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
%%%%%%%%%%%%%%%%<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
To build a work around I need to understand better the behavior of VecGhostUpdateBegin(...);  VecGhostUpdateEnd(...).<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
In particular in the documentation I do not see the option<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
VecGhostUpdateBegin(v, INSERT_VALUES, SCATTER_REVERSE);<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
VecGhostUpdateEnd(v, INSERT_VALUES, SCATTER_REVERSE);<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
In case this is possible to be used, what is the behavior of this call in the following two cases?<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
1) Assume that node-i belongs to proc0, and is ghosted in proc1 and proc2, also<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
assume that the current value of node-i is value0 and proc0 does not modify it, but proc1 and proc2 do.<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
start with:<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc0 -> value0 <br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc1 -> value0<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc2 -> value0<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
change to:<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc0 -> value0 <br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc1 -> value1<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc2 -> value2<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
I assume that calling<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
VecGhostUpdateBegin(v, INSERT_VALUES, SCATTER_REVERSE);<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
VecGhostUpdateEnd(v, INSERT_VALUES, SCATTER_REVERSE);<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
will have an unpredictable behavior as<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc0 -> either value1 or value2 <br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc1 -> value1<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc2 -> value2<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
2) Assume now that node-i belongs to proc0, and is ghosted in proc1 and proc2, also<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
assume that the current value of node-i is value0 and proc0 and proc1 do not modify it, but proc2 does.<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
start with:<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc0 -> value0 <br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc1 -> value0<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc2 -> value0<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
change to:<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc0 -> value0 <br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc1 -> value0<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc2 -> value2<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
Is the call <br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
VecGhostUpdateBegin(v, INSERT_VALUES, SCATTER_REVERSE);<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
VecGhostUpdateEnd(v, INSERT_VALUES, SCATTER_REVERSE);<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
still unpredictable?<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc0 -> either value0 or value2 <br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc1 -> value0<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc2 -> value2<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
or<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc0 -> value2  (since proc1 did not modify the original value, so it did not reverse scatter)<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc1 -> value0<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
proc2 -> value2<br>
<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
Thanks a lot for your help<br>
</div>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
Eugenio<br>
<br>
<br>
<br>
<br>
<br>
<br>
</div>
</blockquote>
<br>
<br>
</blockquote>
<div dir="auto" style="direction:ltr;margin:0px;padding:0px;font-family:sans-serif;font-size:11pt;color:black">
<br>
</div>
</div>
</div>
</blockquote>
</div>
</body>
</html>