Actual source code: ex33.c
1: static char help[] = "Tests the routines VecScatterCreateToAll(), VecScatterCreateToZero()\n\n";
3: #include <petscvec.h>
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;
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));
18: /* create two vectors */
19: PetscCall(VecCreateFromOptions(PETSC_COMM_WORLD, NULL, 1, PETSC_DECIDE, size * n, &x));
21: /* each processor inserts its values */
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));
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));
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));
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));
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));
59: PetscCall(VecDestroy(&x));
60: PetscCall(VecDestroy(&y));
62: PetscCall(PetscFinalize());
63: return 0;
64: }
66: /*TEST
68: test:
69: nsize: 4
71: TEST*/