Actual source code: ex11.c

  1: static char help[] = "Tests ISSortGlobal().\n\n";

  3: #include <petscis.h>

  5: int main(int argc, char **argv)
  6: {
  7:   IS          is;
  8:   PetscInt    n, i, first, last, nmax = 100;
  9:   PetscMPIInt rank;
 10:   PetscRandom randsizes, randvalues;
 11:   PetscReal   r;
 12:   PetscInt   *keys, *keyscopy, *keyseven, *keyssorted;
 13:   PetscLayout map, mapeven;
 14:   PetscBool   sorted;
 15:   MPI_Comm    comm;

 17:   PetscFunctionBeginUser;
 18:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 19:   comm = MPI_COMM_WORLD;
 20:   PetscCallMPI(MPI_Comm_rank(comm, &rank));
 21:   PetscOptionsBegin(comm, "", "Parallel Sort Test Options", "IS");
 22:   PetscCall(PetscOptionsBoundedInt("-nmax", "Maximum number of keys per process", "ex11.c", nmax, &nmax, NULL, 0));
 23:   PetscOptionsEnd();

 25:   PetscCall(PetscRandomCreate(comm, &randsizes));
 26:   PetscCall(PetscRandomSetInterval(randsizes, 0., PetscMax(nmax, 1)));
 27:   PetscCall(PetscRandomSetOptionsPrefix(randsizes, "sizes_"));
 28:   PetscCall(PetscRandomSetFromOptions(randsizes));

 30:   PetscCall(PetscRandomCreate(comm, &randvalues));
 31:   PetscCall(PetscRandomSetOptionsPrefix(randvalues, "values_"));
 32:   PetscCall(PetscRandomSetFromOptions(randvalues));

 34:   PetscCall(PetscRandomGetValueReal(randsizes, &r));
 35:   n = (PetscInt)PetscMin(r, nmax);
 36:   PetscCall(PetscRandomSetInterval(randsizes, 0., 1.));
 37:   PetscCall(PetscRandomGetValueReal(randsizes, &r));
 38:   first = PETSC_INT_MIN + 1 + (PetscInt)((PETSC_INT_MAX - 1) * r);
 39:   PetscCall(PetscRandomGetValueReal(randsizes, &r));
 40:   last = first + (PetscInt)((PETSC_INT_MAX - 1) * r);

 42:   PetscCall(PetscRandomSetInterval(randvalues, first, last));
 43:   PetscCall(PetscMalloc3(n, &keys, n, &keyscopy, n, &keyssorted));
 44:   for (i = 0; i < n; i++) {
 45:     PetscCall(PetscRandomGetValueReal(randvalues, &r));
 46:     keys[i] = keyscopy[i] = (PetscInt)r;
 47:   }
 48:   PetscCall(ISCreateGeneral(comm, n, keys, PETSC_USE_POINTER, &is));
 49:   PetscCall(ISViewFromOptions(is, NULL, "-keys_view"));

 51:   PetscCall(ISGetLayout(is, &map));
 52:   PetscCall(PetscLayoutCreateFromSizes(map->comm, PETSC_DECIDE, map->N, 1, &mapeven));
 53:   PetscCall(PetscLayoutSetUp(mapeven));
 54:   PetscCall(PetscMalloc1(mapeven->n, &keyseven));

 56:   PetscCall(PetscParallelSortInt(map, mapeven, keys, keyseven));
 57:   PetscCall(PetscParallelSortedInt(mapeven->comm, mapeven->n, keyseven, &sorted));
 58:   PetscCheck(sorted, mapeven->comm, PETSC_ERR_PLIB, "PetscParallelSortInt() failed to sort");
 59:   for (i = 0; i < n; i++) PetscCheck(keys[i] == keyscopy[i], PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscParallelSortInt() modified input array");

 61:   PetscCall(PetscParallelSortInt(map, map, keys, keyssorted));
 62:   PetscCall(PetscParallelSortedInt(map->comm, map->n, keyssorted, &sorted));
 63:   PetscCheck(sorted, mapeven->comm, PETSC_ERR_PLIB, "PetscParallelSortInt() failed to sort");
 64:   for (i = 0; i < n; i++) PetscCheck(keys[i] == keyscopy[i], PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscParallelSortInt() modified input array");

 66:   PetscCall(PetscParallelSortInt(map, map, keys, keys));
 67:   PetscCall(PetscParallelSortedInt(map->comm, map->n, keys, &sorted));
 68:   PetscCheck(sorted, mapeven->comm, PETSC_ERR_PLIB, "PetscParallelSortInt() failed to sort");
 69:   /* TODO */
 70: #if 0
 71:   PetscCall(ISSortGlobal(is));
 72: #endif

 74:   PetscCall(PetscFree(keyseven));
 75:   PetscCall(PetscLayoutDestroy(&mapeven));
 76:   PetscCall(ISDestroy(&is));
 77:   PetscCall(PetscFree3(keys, keyscopy, keyssorted));
 78:   PetscCall(PetscRandomDestroy(&randvalues));
 79:   PetscCall(PetscRandomDestroy(&randsizes));

 81:   PetscCall(PetscFinalize());
 82:   return 0;
 83: }

 85: /*TEST

 87:    test:
 88:       nsize: {{1 2 3 4 5}}
 89:       args: -nmax {{0 1 5 10 100}}

 91: TEST*/