xref: /petsc/src/vec/vec/tests/ex24.c (revision cb5db2414029547a5ccf00a1710ee072432a08af)
1 static char help[] = "Scatters from a parallel vector to a sequential vector.\n\
2 Tests where the local part of the scatter is a copy.\n\n";
3 
4 #include <petscvec.h>
5 
6 int main(int argc, char **argv)
7 {
8   PetscMPIInt size, rank;
9   PetscInt    n = 5, i, *blks, bs = 1, m = 2;
10   PetscScalar value;
11   Vec         x, y;
12   IS          is1, is2;
13   VecScatter  ctx = 0;
14   PetscViewer sviewer;
15 
16   PetscFunctionBeginUser;
17   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
18 
19   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
20   PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));
21 
22   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
23   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
24 
25   /* create two vectors */
26   PetscCall(VecCreate(PETSC_COMM_WORLD, &x));
27   PetscCall(VecSetSizes(x, PETSC_DECIDE, size * bs * n));
28   PetscCall(VecSetFromOptions(x));
29 
30   /* create two index sets */
31   if (rank < size - 1) m = n + 2;
32   else m = n;
33 
34   PetscCall(PetscMalloc1(m, &blks));
35   blks[0] = n * rank;
36   for (i = 1; i < m; i++) blks[i] = blks[i - 1] + 1;
37   PetscCall(ISCreateBlock(PETSC_COMM_SELF, bs, m, blks, PETSC_COPY_VALUES, &is1));
38   PetscCall(PetscFree(blks));
39 
40   PetscCall(VecCreateSeq(PETSC_COMM_SELF, bs * m, &y));
41   PetscCall(ISCreateStride(PETSC_COMM_SELF, bs * m, 0, 1, &is2));
42 
43   /* each processor inserts the entire vector */
44   /* this is redundant but tests assembly */
45   for (i = 0; i < bs * n * size; i++) {
46     value = (PetscScalar)i;
47     PetscCall(VecSetValues(x, 1, &i, &value, INSERT_VALUES));
48   }
49   PetscCall(VecAssemblyBegin(x));
50   PetscCall(VecAssemblyEnd(x));
51   PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
52 
53   PetscCall(VecScatterCreate(x, is1, y, is2, &ctx));
54   PetscCall(VecScatterBegin(ctx, x, y, INSERT_VALUES, SCATTER_FORWARD));
55   PetscCall(VecScatterEnd(ctx, x, y, INSERT_VALUES, SCATTER_FORWARD));
56 
57   PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
58   PetscCall(PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "----\n"));
59   PetscCall(PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
60   PetscCall(VecView(y, sviewer));
61   PetscCall(PetscFFlush(PETSC_STDOUT));
62   PetscCall(PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
63   PetscCall(PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD));
64   PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
65 
66   PetscCall(VecScatterDestroy(&ctx));
67 
68   PetscCall(VecDestroy(&x));
69   PetscCall(VecDestroy(&y));
70   PetscCall(ISDestroy(&is1));
71   PetscCall(ISDestroy(&is2));
72 
73   PetscCall(PetscFinalize());
74   return 0;
75 }
76 
77 /*TEST
78 
79    testset:
80       nsize: 3
81       output_file: output/ex24_1.out
82       filter: grep -v "  type:"
83       test:
84         suffix: standard
85         args: -vec_type standard
86       test:
87         requires: cuda
88         suffix: cuda
89         args: -vec_type cuda
90       test:
91         requires: viennacl
92         suffix:  viennacl
93         args: -vec_type viennacl
94 
95 TEST*/
96