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*/