<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Thu, May 29, 2014 at 7:27 PM, Jed Brown <span dir="ltr"><<a href="mailto:jed@jedbrown.org" target="_blank">jed@jedbrown.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Matthew Knepley <<a href="mailto:knepley@gmail.com">knepley@gmail.com</a>> writes:<br>

> There might be an easier way to do this:<br>
>   PetscScalar val = 0.0, gval;<br>
><br>
>   VecGetOwnershipRange(xr, &low, &high);<br>
>   if ((myindex >= low) && (myindex < high)) {<br>
>     VecGetArray(localx1,&a);<br>
>     val = a[myindex-low];<br>
>     VecRestoreArray(localx1, &a);<br>
>   }<br>
>   MPI_Allreduce(&val, &gval, 1, MPIU_SCALAR, MPI_SUM, PETSC_COMM_WORLD);<br>
><br>
> Now everyone has the value at myindex.<br>
<br>
Yes, but VecGetArray is collective so please don't do it quite this way.<br>
Instead, write<br>
<br>
  VecGetArray(localx1,&a);<br>
  if ((myindex >= low) && (myindex < high)) {<br>
    val = a[myindex-low];<br>
  }<br>
  VecRestoreArray(localx1, &a);<br>
  MPI_Allreduce(&val, &gval, 1, MPIU_SCALAR, MPI_SUM, PETSC_COMM_WORLD);<br>
</blockquote></div><br>I think its better to use the non-collective version:</div><div class="gmail_extra"><br></div><div class="gmail_extra">VecGetOwnershipRange(xr, &low, &high);<br>if ((myindex >= low) && (myindex < high)) {<br>
   VecGetArrayRead(xr,&a);<br>   val = a[myindex-low];<br>   VecRestoreArrayRead(xr, &a);<br>}<br>MPI_Allreduce(&val, &gval, 1, MPIU_SCALAR, MPI_SUM, PETSC_COMM_WORLD);<br><div><br></div><div>  Thanks</div>
<div><br></div><div>      Matt</div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener
</div></div>