Actual source code: ex2.c
2: static char help[] = "Tests application ordering.\n\n";
4: #include <petscsys.h>
5: #include <petscao.h>
6: #include <petscviewer.h>
8: int main(int argc, char **argv)
9: {
10: PetscMPIInt rank, size;
11: PetscInt n, *ispetsc, *isapp, start, N, i;
12: AO ao;
14: PetscFunctionBeginUser;
15: PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
16: PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
17: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
18: n = rank + 2;
19: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
21: /* create the orderings */
22: PetscCall(PetscMalloc2(n, &ispetsc, n, &isapp));
24: PetscCallMPI(MPI_Scan(&n, &start, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD));
25: PetscCall(MPIU_Allreduce(&n, &N, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD));
26: start -= n;
28: for (i = 0; i < n; i++) {
29: ispetsc[i] = start + i;
30: isapp[i] = N - start - i - 1;
31: }
33: /* create the application ordering */
34: PetscCall(AOCreateBasic(PETSC_COMM_WORLD, n, isapp, ispetsc, &ao));
35: PetscCall(AOView(ao, PETSC_VIEWER_STDOUT_WORLD));
37: /* check the mapping */
38: PetscCall(AOPetscToApplication(ao, n, ispetsc));
39: for (i = 0; i < n; i++) {
40: if (ispetsc[i] != isapp[i]) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "[%d] Problem with mapping %" PetscInt_FMT " to %" PetscInt_FMT "\n", rank, i, ispetsc[i]));
41: }
42: PetscCall(PetscFree2(ispetsc, isapp));
44: PetscCall(AODestroy(&ao));
45: PetscCall(PetscFinalize());
46: return 0;
47: }
49: /*TEST
51: test:
53: test:
54: suffix: 2
55: nsize: 2
57: test:
58: suffix: 3
59: nsize: 3
61: TEST*/