Actual source code: pointqueue.c

  1: #include <petsc/private/dmpleximpl.h>

  3: PetscErrorCode DMPlexPointQueueCreate(PetscInt size, DMPlexPointQueue *queue)
  4: {
  5:   DMPlexPointQueue q;

  7:   PetscFunctionBegin;
  8:   PetscCheck(size >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Queue size %" PetscInt_FMT " must be non-negative", size);
  9:   PetscCall(PetscCalloc1(1, &q));
 10:   q->size = size;
 11:   PetscCall(PetscMalloc1(q->size, &q->points));
 12:   q->num   = 0;
 13:   q->front = 0;
 14:   q->back  = q->size - 1;
 15:   *queue   = q;
 16:   PetscFunctionReturn(PETSC_SUCCESS);
 17: }

 19: PetscErrorCode DMPlexPointQueueDestroy(DMPlexPointQueue *queue)
 20: {
 21:   DMPlexPointQueue q = *queue;

 23:   PetscFunctionBegin;
 24:   PetscCall(PetscFree(q->points));
 25:   PetscCall(PetscFree(q));
 26:   *queue = NULL;
 27:   PetscFunctionReturn(PETSC_SUCCESS);
 28: }

 30: PetscErrorCode DMPlexPointQueueEnsureSize(DMPlexPointQueue queue)
 31: {
 32:   PetscFunctionBegin;
 33:   if (queue->num < queue->size) PetscFunctionReturn(PETSC_SUCCESS);
 34:   queue->size *= 2;
 35:   PetscCall(PetscRealloc(queue->size * sizeof(PetscInt), &queue->points));
 36:   PetscFunctionReturn(PETSC_SUCCESS);
 37: }

 39: PetscErrorCode DMPlexPointQueueEnqueue(DMPlexPointQueue queue, PetscInt p)
 40: {
 41:   PetscFunctionBegin;
 42:   PetscCall(DMPlexPointQueueEnsureSize(queue));
 43:   queue->back                = (queue->back + 1) % queue->size;
 44:   queue->points[queue->back] = p;
 45:   ++queue->num;
 46:   PetscFunctionReturn(PETSC_SUCCESS);
 47: }

 49: PetscErrorCode DMPlexPointQueueDequeue(DMPlexPointQueue queue, PetscInt *p)
 50: {
 51:   PetscFunctionBegin;
 52:   PetscCheck(queue->num, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Cannot dequeue from an empty queue");
 53:   *p           = queue->points[queue->front];
 54:   queue->front = (queue->front + 1) % queue->size;
 55:   --queue->num;
 56:   PetscFunctionReturn(PETSC_SUCCESS);
 57: }

 59: PetscErrorCode DMPlexPointQueueFront(DMPlexPointQueue queue, PetscInt *p)
 60: {
 61:   PetscFunctionBegin;
 62:   PetscCheck(queue->num, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Cannot get the front of an empty queue");
 63:   *p = queue->points[queue->front];
 64:   PetscFunctionReturn(PETSC_SUCCESS);
 65: }

 67: PetscErrorCode DMPlexPointQueueBack(DMPlexPointQueue queue, PetscInt *p)
 68: {
 69:   PetscFunctionBegin;
 70:   PetscCheck(queue->num, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Cannot get the back of an empty queue");
 71:   *p = queue->points[queue->back];
 72:   PetscFunctionReturn(PETSC_SUCCESS);
 73: }

 75: PetscBool DMPlexPointQueueEmpty(DMPlexPointQueue queue)
 76: {
 77:   if (!queue->num) return PETSC_TRUE;
 78:   return PETSC_FALSE;
 79: }

 81: PetscErrorCode DMPlexPointQueueEmptyCollective(PetscObject obj, DMPlexPointQueue queue, PetscBool *empty)
 82: {
 83:   PetscFunctionBeginHot;
 84:   *empty = DMPlexPointQueueEmpty(queue);
 85:   PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, empty, 1, MPIU_BOOL, MPI_LAND, PetscObjectComm(obj)));
 86:   PetscFunctionReturn(PETSC_SUCCESS);
 87: }