Actual source code: ex24.c
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";
4: #include <petscvec.h>
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;
16: PetscFunctionBeginUser;
17: PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
19: PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
20: PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));
22: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
23: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
25: /* create two vectors */
26: PetscCall(VecCreate(PETSC_COMM_WORLD, &x));
27: PetscCall(VecSetSizes(x, PETSC_DECIDE, size * bs * n));
28: PetscCall(VecSetFromOptions(x));
30: /* create two index sets */
31: if (rank < size - 1) m = n + 2;
32: else m = n;
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));
40: PetscCall(VecCreateSeq(PETSC_COMM_SELF, bs * m, &y));
41: PetscCall(ISCreateStride(PETSC_COMM_SELF, bs * m, 0, 1, &is2));
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));
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));
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));
66: PetscCall(VecScatterDestroy(&ctx));
68: PetscCall(VecDestroy(&x));
69: PetscCall(VecDestroy(&y));
70: PetscCall(ISDestroy(&is1));
71: PetscCall(ISDestroy(&is2));
73: PetscCall(PetscFinalize());
74: return 0;
75: }
77: /*TEST
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
95: TEST*/