You have to compute the length of the new vector (i.e., total number of
selected elements), and then create a VecMPI  with this length. PETSc will
compute a balanced layout for the vector. Then you create a vecscatter that
scatters selected elements from the old vector to the new vector. You may
need MPI_Exscan to build correct index mapping.

--Junchao Zhang


On Thu, May 7, 2020 at 3:37 PM Emmanuel Ayala <[email protected]> wrote:

> Hi, I hope everyone is well.
>
> I have a MPI vector, I selected some elements of this vector and for some
> processes there is not selected elements (I stored the indices elements
> into an array). So, I wan to to create a MPI vector using these selected
> elements, the selected elements must be fully distributed in a MPI vector,
> but I do not figure out how to do it properly.
>
> If I use VecGetSubVector, it creates a MPI vector, but in those processes
> where there is not selected elements, the subvector portion is empty, this
> means that the resultant vector is unbalanced.
>
> If I use:
>
> VecScatterCreate(Vec x,IS ix,Vec y,IS iy,VecScatter *ctx);
> VecScatterBegin(VecScatter ctx,Vec x,Vec y,INSERT VALUES,SCATTER FORWARD);
> VecScatterEnd(VecScatter ctx,Vec x,Vec y,INSERT VALUES,SCATTER FORWARD);
>
> The vector is still unbalanced.
>
> Any suggestion?
>
> Kind regards.
>

Reply via email to