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