xref: /petsc/src/vec/vec/tests/ex33.c (revision 732aec7a18f2199fb53bb9a2f3aef439a834ce31) !
1 static char help[] = "Tests the routines VecScatterCreateToAll(), VecScatterCreateToZero()\n\n";
2 
3 #include <petscvec.h>
4 
main(int argc,char ** argv)5 int main(int argc, char **argv)
6 {
7   PetscInt    n = 3, i, len, start, end;
8   PetscMPIInt size, rank;
9   PetscScalar value, *yy;
10   Vec         x, y, z, y_t;
11   VecScatter  toall, tozero;
12 
13   PetscFunctionBeginUser;
14   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
15   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
16   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
17 
18   /* create two vectors */
19   PetscCall(VecCreateFromOptions(PETSC_COMM_WORLD, NULL, 1, PETSC_DECIDE, size * n, &x));
20 
21   /* each processor inserts its values */
22 
23   PetscCall(VecGetOwnershipRange(x, &start, &end));
24   for (i = start; i < end; i++) {
25     value = (PetscScalar)i;
26     PetscCall(VecSetValues(x, 1, &i, &value, INSERT_VALUES));
27   }
28   PetscCall(VecAssemblyBegin(x));
29   PetscCall(VecAssemblyEnd(x));
30   PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
31 
32   PetscCall(VecScatterCreateToAll(x, &toall, &y));
33   PetscCall(VecScatterBegin(toall, x, y, INSERT_VALUES, SCATTER_FORWARD));
34   PetscCall(VecScatterEnd(toall, x, y, INSERT_VALUES, SCATTER_FORWARD));
35   PetscCall(VecScatterDestroy(&toall));
36 
37   /* Cannot view the above vector with VecView(), so place it in an MPI Vec
38      and do a VecView() */
39   PetscCall(VecGetArray(y, &yy));
40   PetscCall(VecGetLocalSize(y, &len));
41   PetscCall(VecCreateMPIWithArray(PETSC_COMM_WORLD, 1, len, PETSC_DECIDE, yy, &y_t));
42   PetscCall(VecView(y_t, PETSC_VIEWER_STDOUT_WORLD));
43   PetscCall(VecDestroy(&y_t));
44   PetscCall(VecRestoreArray(y, &yy));
45 
46   PetscCall(VecScatterCreateToAll(x, &tozero, &z));
47   PetscCall(VecScatterBegin(tozero, x, z, INSERT_VALUES, SCATTER_FORWARD));
48   PetscCall(VecScatterEnd(tozero, x, z, INSERT_VALUES, SCATTER_FORWARD));
49   PetscCall(VecScatterDestroy(&tozero));
50   if (rank == 0) PetscCall(VecView(z, PETSC_VIEWER_STDOUT_SELF));
51   PetscCall(VecDestroy(&z));
52 
53   PetscCall(VecScatterCreateToZero(x, &tozero, &z));
54   PetscCall(VecScatterBegin(tozero, x, z, INSERT_VALUES, SCATTER_FORWARD));
55   PetscCall(VecScatterEnd(tozero, x, z, INSERT_VALUES, SCATTER_FORWARD));
56   PetscCall(VecScatterDestroy(&tozero));
57   PetscCall(VecDestroy(&z));
58 
59   PetscCall(VecDestroy(&x));
60   PetscCall(VecDestroy(&y));
61 
62   PetscCall(PetscFinalize());
63   return 0;
64 }
65 
66 /*TEST
67 
68    test:
69       nsize: 4
70 
71 TEST*/
72