[petsc-users] Combine distributed vector into local vector

Hong hzhang at mcs.anl.gov
Fri Jan 19 14:42:12 CST 2018


Anthony:
You can use VecScatterCreateToAll
http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecScatterCreateToAll.html

See petsc/src/vec/vec/examples/tests/ex33.c

Hong

Hello, I am working on converting a serial code to use Petsc. To do this it
> starts in serial with the old code, creates some Petsc matrices/vectors and
> does the most critical calculations in Petsc, and then returns to serial to
> return to the old code. After this I was planning to expand the area of the
> code which uses Petsc, but starting with a small chunk seemed appropriate.
> To return to the serial code, I need to have every process receive a full
> copy of a vector. I believe VecScatters are intended for this, but I cannot
> get it to work. I have produced a minimal example which starts with a
> serial double array, creates a Vec which is successfully distributed, and
> then tries to use a VecScatter to aggregate the vector from each process.
> After the VecScatter step, each process only has the parts of the vector
> which were available to the process in the distributed vector. If you could
> please show how to aggregate the vector, it would be greatly appreciated.
>
> Use with: mpiexec -n 2 ./test:
>
>     #include <petscvec.h>
>
>     double primes[] = {2,3,5,7,11,13,17};
>     int nprimes = 7;
>
>     int main(int argc,char **argv)
>     {
>     PetscInitialize(&argc,&argv, NULL,NULL);
>     MPI_Comm       comm=MPI_COMM_WORLD;
>     Vec xpar,xseq;
>     PetscInt low,high;
>     IS index_set_global, index_set_local;
>     const PetscInt *indices;
>     VecScatter vc;
>     PetscErrorCode ierr;
>     //Set up parallel vector
>     ierr = VecCreateMPI(comm, PETSC_DETERMINE, nprimes, &xpar);
> CHKERRQ(ierr);
>     ierr = VecGetOwnershipRange(xpar, &low, &high); CHKERRQ(ierr);
>     ierr = ISCreateStride(comm, high - low, low, 1, &index_set_global);
> CHKERRQ(ierr);
>     ierr = ISGetIndices(index_set_global, &indices); CHKERRQ(ierr);
>     ierr = ISView(index_set_global, PETSC_VIEWER_STDOUT_WORLD);
> CHKERRQ(ierr);
>     ierr = VecSetValues(xpar, high - low, indices, primes + low,
> INSERT_VALUES);CHKERRQ(ierr);
>     ierr = VecAssemblyBegin(xpar); CHKERRQ(ierr);
>     ierr = VecAssemblyEnd(xpar); CHKERRQ(ierr);
>     ierr = VecView(xpar, PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr);
>     //Scatter parallel vector so all processes have full vector
>     ierr = VecCreateSeq(PETSC_COMM_SELF, nprimes, &xseq); CHKERRQ(ierr);
>     //ierr = VecCreateMPI(comm, high - low, nprimes, &xseq); CHKERRQ(ierr);
>     ierr = ISCreateStride(comm, high - low, 0, 1, &index_set_local);
> CHKERRQ(ierr);
>     ierr = VecScatterCreate(xpar, index_set_local, xseq, index_set_global,
> &vc); CHKERRQ(ierr);
>     ierr = VecScatterBegin(vc, xpar, xseq, ADD_VALUES, SCATTER_FORWARD);
> CHKERRQ(ierr);
>         ierr = VecScatterEnd(vc, xpar, xseq, ADD_VALUES, SCATTER_FORWARD);
> CHKERRQ(ierr);
>     ierr = PetscPrintf(PETSC_COMM_SELF, "\nPrinting out scattered
> vector\n"); CHKERRQ(ierr);
>     ierr = VecView(xseq, PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr);
>
>     PetscFinalize();
>     }
>
>
> Output:
>
>     IS Object: 2 MPI processes
>     type: stride
>     [0] Index set is permutation
>     [0] Number of indices in (stride) set 4
>     [0] 0 0
>     [0] 1 1
>     [0] 2 2
>     [0] 3 3
>     [1] Number of indices in (stride) set 3
>     [1] 0 4
>     [1] 1 5
>     [1] 2 6
>     Vec Object: 2 MPI processes
>     type: mpi
>     Process [0]
>     2.
>     3.
>     5.
>     7.
>     Process [1]
>     11.
>     13.
>     17.
>
>     Printing out scattered vector
>
>     Printing out scattered vector
>     Vec Object: 1 MPI processes
>     type: seq
>     2.
>     3.
>     5.
>     7.
>     0.
>     0.
>     0.
>
>
>
>
> Anthony Ruth
> Condensed Matter Theory
> University of Notre Dame
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180119/f53b4c97/attachment.html>


More information about the petsc-users mailing list