1 2 static char help[] = "Tests application ordering.\n\n"; 3 4 #include <petscsys.h> 5 #include <petscao.h> 6 #include <petscviewer.h> 7 8 int main(int argc, char **argv) 9 { 10 PetscMPIInt rank, size; 11 PetscInt n, *ispetsc, *isapp, start, N, i; 12 AO ao; 13 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)); 20 21 /* create the orderings */ 22 PetscCall(PetscMalloc2(n, &ispetsc, n, &isapp)); 23 24 PetscCallMPI(MPI_Scan(&n, &start, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD)); 25 PetscCallMPI(MPI_Allreduce(&n, &N, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD)); 26 start -= n; 27 28 for (i = 0; i < n; i++) { 29 ispetsc[i] = start + i; 30 isapp[i] = N - start - i - 1; 31 } 32 33 /* create the application ordering */ 34 PetscCall(AOCreateBasic(PETSC_COMM_WORLD, n, isapp, ispetsc, &ao)); 35 PetscCall(AOView(ao, PETSC_VIEWER_STDOUT_WORLD)); 36 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)); 43 44 PetscCall(AODestroy(&ao)); 45 PetscCall(PetscFinalize()); 46 return 0; 47 } 48 49 /*TEST 50 51 test: 52 53 test: 54 suffix: 2 55 nsize: 2 56 57 test: 58 suffix: 3 59 nsize: 3 60 61 TEST*/ 62