Actual source code: ex12.c


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

  4: #include <petscsys.h>

  6: int main(int argc, char **argv)
  7: {
  8:   PetscInt i, n = 1000, *values;
  9: #if defined(PETSC_USE_LOG)
 10:   PetscLogEvent event;
 11: #endif
 12:   PetscRandom rand;
 13:   PetscReal   value;
 14:   PetscBool   values_view = PETSC_FALSE;
 15:   PetscMPIInt rank;

 17:   PetscFunctionBeginUser;
 18:   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
 19:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
 20:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
 21:   PetscCall(PetscOptionsGetBool(NULL, 0, "-values_view", &values_view, NULL));

 23:   PetscCall(PetscRandomCreate(PETSC_COMM_SELF, &rand));
 24:   PetscCall(PetscRandomSetFromOptions(rand));

 26:   PetscCall(PetscMalloc1(n, &values));
 27:   for (i = 0; i < n; i++) {
 28:     PetscCall(PetscRandomGetValueReal(rand, &value));
 29:     values[i] = (PetscInt)(n * value + 2.0);
 30:   }
 31:   PetscCall(PetscSortInt(n, values));

 33:   PetscCall(PetscLogEventRegister("Sort", 0, &event));
 34:   PetscCall(PetscLogEventBegin(event, 0, 0, 0, 0));

 36:   for (i = 0; i < n; i++) {
 37:     PetscCall(PetscRandomGetValueReal(rand, &value));
 38:     values[i] = (PetscInt)(n * value + 2.0);
 39:   }
 40:   PetscCall(PetscSortInt(n, values));
 41:   PetscCall(PetscLogEventEnd(event, 0, 0, 0, 0));

 43:   for (i = 1; i < n; i++) {
 44:     PetscCheck(values[i] >= values[i - 1], PETSC_COMM_SELF, PETSC_ERR_PLIB, "Values not sorted");
 45:     if (values_view && rank == 0) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%" PetscInt_FMT " %" PetscInt_FMT "\n", i, values[i]));
 46:   }
 47:   PetscCall(PetscFree(values));
 48:   PetscCall(PetscRandomDestroy(&rand));

 50:   PetscCall(PetscFinalize());
 51:   return 0;
 52: }

 54: /*TEST

 56:    test:
 57:       args: -values_view

 59: TEST*/