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, NULL, 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(PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
59: PetscCall(VecView(y, sviewer));
60: PetscCall(PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
61: PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
63: PetscCall(VecScatterDestroy(&ctx));
65: PetscCall(VecDestroy(&x));
66: PetscCall(VecDestroy(&y));
67: PetscCall(ISDestroy(&is1));
68: PetscCall(ISDestroy(&is2));
70: PetscCall(PetscFinalize());
71: return 0;
72: }
74: /*TEST
76: testset:
77: nsize: 3
78: output_file: output/ex24_1.out
79: filter: grep -v " type:"
80: test:
81: suffix: standard
82: args: -vec_type standard
83: test:
84: requires: cuda
85: suffix: cuda
86: args: -vec_type cuda
87: test:
88: requires: viennacl
89: suffix: viennacl
90: args: -vec_type viennacl
92: TEST*/