<div dir="ltr"><b>I mean, the portion for A look like messy distribution, <span class="gmail-tlid-translation gmail-translation" lang="en"><span title="" class="gmail-">as if scatter was done wrong</span></span></b></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">El dom., 3 de nov. de 2019 a la(s) 23:41, Emmanuel Ayala (<a href="mailto:juaneah@gmail.com">juaneah@gmail.com</a>) escribió:<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>Hi everyone, thanks in advance.</div><div><br></div><div>I have three parallel vectors: A, B and C. A and B have different sizes, and C must be contain these two vectors (MatLab notation C=[A;B]). I need to do some operations on C then put back the proper portion of C on A and B, then I do some computations on A and B y put again on C, and the loop repeats.</div><div><br></div><div>For these propose I use Scatters:</div><div><br></div><div>C is created as a parallel vector with size of (sizeA + sizeB) with petsc_decide for parallel layout. The vectors have been distributed on the same amount of processes.<br><br>For the specific case with order [A;B]</div><div><br></div><div>VecGetOwnershipRange(A,&start,&end);<br>ISCreateStride(MPI_COMM_WORLD,(end-start),start,1,&is_fromA);<br>ISCreateStride(MPI_COMM_WORLD,(end-start),start,1,&is_toC1);// this is redundant<br>VecScatterCreate(A,is_fromA,C,is_toC1,&scatter1);<br><br>VecGetSize(A,&sizeA)<br>VecGetOwnershipRange(B,&start,&end);<br>ISCreateStride(MPI_COMM_WORLD,(end-start),start,1,&is_fromB);<br>ISCreateStride(MPI_COMM_WORLD,(end-start),(start+sizeA),1,&is_toC2); //shifts the index location<br>VecScatterCreate(B,is_fromB,C,is_toC2,&scatter2);<br><br>Then I can use <br>VecScatterBegin(scatter1,A,C,INSERT_VALUES,SCATTER_FORWARD);<br>VecScatterEnd(scatter1,A,C,INSERT_VALUES,SCATTER_FORWARD);<br><br>and<br>VecScatterBegin(scatter1,C,A,INSERT_VALUES,SCATTER_REVERSE);<br>VecScatterEnd(scatter1,C,A,INSERT_VALUES,SCATTER_REVERSE);<br><br>and the same with B.</div><div>I used MPI_COMM SELF and I got the same results.</div><div><br></div><div><b>The situation is: My results look good for the portion of B, but no for the portion of A, there is something that I'm doing wrong with the scattering?</b></div><div><br></div><div>Best regards.<br></div></div>
</blockquote></div>