Actual source code: ex29.c

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

  3: #include <petscsys.h>

  5: int main(int argc, char **args)
  6: {
  7:   PetscHeap h;
  8:   PetscInt  id, val, cnt, *values;

 10:   PetscFunctionBeginUser;
 11:   PetscCall(PetscInitialize(&argc, &args, NULL, help));
 12:   PetscCall(PetscHeapCreate(9, &h));
 13:   PetscCall(PetscHeapAdd(h, 0, 100));
 14:   PetscCall(PetscHeapAdd(h, 1, 19));
 15:   PetscCall(PetscHeapAdd(h, 2, 36));
 16:   PetscCall(PetscHeapAdd(h, 3, 17));
 17:   PetscCall(PetscHeapAdd(h, 4, 3));
 18:   PetscCall(PetscHeapAdd(h, 5, 25));
 19:   PetscCall(PetscHeapAdd(h, 6, 1));
 20:   PetscCall(PetscHeapAdd(h, 8, 2));
 21:   PetscCall(PetscHeapAdd(h, 9, 7));
 22:   PetscCall(PetscPrintf(PETSC_COMM_SELF, "Initial heap:\n"));
 23:   PetscCall(PetscHeapView(h, NULL));

 25:   PetscCall(PetscHeapPop(h, &id, &val));
 26:   PetscCall(PetscHeapStash(h, id, val + 10));
 27:   PetscCall(PetscHeapPop(h, &id, &val));
 28:   PetscCall(PetscHeapStash(h, id, val + 10));
 29:   PetscCall(PetscPrintf(PETSC_COMM_SELF, "Pop two items, increment, and place in stash:\n"));
 30:   PetscCall(PetscHeapView(h, NULL));

 32:   PetscCall(PetscHeapUnstash(h));
 33:   PetscCall(PetscPrintf(PETSC_COMM_SELF, "After unpacking the stash:\n"));
 34:   PetscCall(PetscHeapView(h, NULL));

 36:   PetscCall(PetscMalloc1(9, &values));
 37:   PetscCall(PetscHeapPop(h, &id, &val));
 38:   cnt = 0;
 39:   while (id >= 0) {
 40:     values[cnt++] = val;
 41:     PetscCall(PetscHeapPop(h, &id, &val));
 42:   }
 43:   PetscCall(PetscPrintf(PETSC_COMM_SELF, "Sorted values:\n"));
 44:   PetscCall(PetscIntView(cnt, values, PETSC_VIEWER_STDOUT_SELF));
 45:   PetscCall(PetscFree(values));
 46:   PetscCall(PetscHeapDestroy(&h));
 47:   PetscCall(PetscFinalize());
 48:   return 0;
 49: }

 51: /*TEST

 53:    test:

 55: TEST*/