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