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