<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, May 10, 2014 at 11:40 PM,  <span dir="ltr"><<a href="mailto:likunt@caltech.edu" target="_blank">likunt@caltech.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear Jed,<br>
<br>
Thanks for your reply. Below is a more complete version of the code. I<br>
need to loop over all the elements of aM to compute a new Vector called<br>
result. But this process is very slow, I would appreciate if you can give<br>
advice on speeding it up. Many thanks.<br>
<br>
//////////////////////////////////////////////////////////////<br>
Vec M,N,result;<br>
DM  da;<br>
DMDACreate1d(PETSC_COMM_WORLD,DMDA_BOUNDARY_NONE,NODE,1,1,NULL,&da);<br>
DMCreateGlobalVector(da, &M);<br>
//set values of M ..<br>
<div class="">VecScatterCreateToAll(M,&scatter_ctx,&N);<br>
VecScatterBegin(scatter_ctx,M,N,INSERT_VALUES,SCATTER_FORWARD);<br>
VecScatterEnd(scatter_ctx,M,N,INSERT_VALUES,SCATTER_FORWARD);<br>
VecGetArray(N, &aM);<br></div></blockquote><div><br></div><div>1) Everything below is nonsensical. The values of M are already in N.</div><div><br></div><div>2) Sending all values to a single process is inherently slow. It should not be done in parallel computing</div>
<div><br></div><div>  Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">
</div>DMDAGetCorners(da, &xs, 0, 0, &xm, 0, 0);<br>
for(i=xs; i<xs+xm; i++)<br>
{<br>
   val=0.0;<br>
   for(j=0; j<NODE; j++)<br>
   {<br>
      val=val+aM[j];<br>
<br>
   }<br>
   VecSetValues(result, 1, i, val, INSERT_VALUES);<br>
}<br>
<br>
VecRestoreArray(N, &aM);<br>
VecAssemblyBegin(result);<br>
VecAssemblyEnd(result);<br>
////////////////////////////////////////////////////////////<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
> <a href="mailto:likunt@caltech.edu">likunt@caltech.edu</a> writes:<br>
><br>
>> Dear Petsc developers,<br>
>><br>
>> I have a vector object M, I need all the elements of it in all the<br>
>> processors.<br>
>><br>
>> Here is a part of my code<br>
>><br>
>> //////////////////////////////////////////////////////////////<br>
>> Vec M;<br>
>> VecScatterCreateToAll(M,&scatter_ctx,&N);<br>
>> VecScatterBegin(scatter_ctx,M,N,INSERT_VALUES,SCATTER_FORWARD);<br>
>> VecScatterEnd(scatter_ctx,M,N,INSERT_VALUES,SCATTER_FORWARD);<br>
>><br>
>> VecGetArray(N, &aM);<br>
>><br>
>> for(i=xs; i<xs+xm; i++)<br>
><br>
> What are xs and xm in this setting.  What do you intend?<br>
><br>
>> {<br>
>>    //within the loop, requires all the elements of aM<br>
>> }<br>
>> ////////////////////////////////////////////////////////////<br>
>><br>
>> but this seems not working well.<br>
><br>
> The phrase "not working" should never appear unqualified in polite<br>
> conversation.  Send steps to reproduce, what you expect, and what you<br>
> observe.<br>
><br>
>> Would you please suggest a more efficient way? Thank you.<br>
><br>
<br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></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>