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. >
