Actual source code: ex11.c


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

  4: #include <petscis.h>

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

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

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

 31:   PetscCall(PetscRandomCreate(comm, &randvalues));
 32:   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)randvalues, "values_"));
 33:   PetscCall(PetscRandomSetFromOptions(randvalues));

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

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

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

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

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

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

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

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

 86: /*TEST

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

 92: TEST*/