Actual source code: ex2.c
2: static char help[] = "Tests shared memory subcommunicators\n\n";
3: #include <petscsys.h>
4: #include <petscvec.h>
6: /*
7: One can use petscmpiexec -n 3 -hosts localhost,Barrys-MacBook-Pro.local ./ex2 -info to mimic
8: having two nodes that do not share common memory
9: */
11: int main(int argc, char **args)
12: {
13: PetscCommShared scomm;
14: MPI_Comm comm;
15: PetscMPIInt lrank, rank, size, i;
16: Vec x, y;
17: VecScatter vscat;
18: IS isstride, isblock;
19: PetscViewer singleton;
20: PetscInt indices[] = {0, 1, 2};
22: PetscInitialize(&argc, &args, (char *)0, help);
23: MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
24: MPI_Comm_size(PETSC_COMM_WORLD, &size);
27: PetscCommDuplicate(PETSC_COMM_WORLD, &comm, NULL);
28: PetscCommSharedGet(comm, &scomm);
30: for (i = 0; i < size; i++) {
31: PetscCommSharedGlobalToLocal(scomm, i, &lrank);
32: PetscSynchronizedPrintf(PETSC_COMM_WORLD, "[%d] Global rank %d shared memory comm rank %d\n", rank, i, lrank);
33: }
34: PetscSynchronizedFlush(PETSC_COMM_WORLD, stdout);
35: PetscCommDestroy(&comm);
37: VecCreateMPI(PETSC_COMM_WORLD, 2, PETSC_DETERMINE, &x);
38: VecSetBlockSize(x, 2);
39: VecSetValue(x, 2 * rank, (PetscScalar)(2 * rank + 10), INSERT_VALUES);
40: VecSetValue(x, 2 * rank + 1, (PetscScalar)(2 * rank + 1 + 10), INSERT_VALUES);
41: VecAssemblyBegin(x);
42: VecAssemblyEnd(x);
43: VecView(x, PETSC_VIEWER_STDOUT_WORLD);
45: VecCreateSeq(PETSC_COMM_SELF, 6, &y);
46: VecSetBlockSize(y, 2);
47: ISCreateStride(PETSC_COMM_SELF, 6, 0, 1, &isstride);
48: ISCreateBlock(PETSC_COMM_SELF, 2, 3, indices, PETSC_COPY_VALUES, &isblock);
49: VecScatterCreate(x, isblock, y, isstride, &vscat);
50: VecScatterBegin(vscat, x, y, INSERT_VALUES, SCATTER_FORWARD);
51: VecScatterEnd(vscat, x, y, INSERT_VALUES, SCATTER_FORWARD);
52: VecScatterDestroy(&vscat);
53: PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &singleton);
54: VecView(y, singleton);
55: PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &singleton);
57: ISDestroy(&isstride);
58: ISDestroy(&isblock);
59: VecDestroy(&x);
60: VecDestroy(&y);
61: PetscFinalize();
62: return 0;
63: }