1c50b2d26SMatthew G. Knepley #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ 2c50b2d26SMatthew G. Knepley 3d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexPointQueueCreate(PetscInt size, DMPlexPointQueue *queue) 4d71ae5a4SJacob Faibussowitsch { 5c50b2d26SMatthew G. Knepley DMPlexPointQueue q; 6c50b2d26SMatthew G. Knepley 7c50b2d26SMatthew G. Knepley PetscFunctionBegin; 8c50b2d26SMatthew G. Knepley PetscCheck(size >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Queue size %" PetscInt_FMT " must be non-negative", size); 9c50b2d26SMatthew G. Knepley PetscCall(PetscCalloc1(1, &q)); 10c50b2d26SMatthew G. Knepley q->size = size; 11c50b2d26SMatthew G. Knepley PetscCall(PetscMalloc1(q->size, &q->points)); 12c50b2d26SMatthew G. Knepley q->num = 0; 13c50b2d26SMatthew G. Knepley q->front = 0; 14c50b2d26SMatthew G. Knepley q->back = q->size - 1; 15c50b2d26SMatthew G. Knepley *queue = q; 163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 17c50b2d26SMatthew G. Knepley } 18c50b2d26SMatthew G. Knepley 19d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexPointQueueDestroy(DMPlexPointQueue *queue) 20d71ae5a4SJacob Faibussowitsch { 21c50b2d26SMatthew G. Knepley DMPlexPointQueue q = *queue; 22c50b2d26SMatthew G. Knepley 23c50b2d26SMatthew G. Knepley PetscFunctionBegin; 24c50b2d26SMatthew G. Knepley PetscCall(PetscFree(q->points)); 25c50b2d26SMatthew G. Knepley PetscCall(PetscFree(q)); 26c50b2d26SMatthew G. Knepley *queue = NULL; 273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 28c50b2d26SMatthew G. Knepley } 29c50b2d26SMatthew G. Knepley 30d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexPointQueueEnsureSize(DMPlexPointQueue queue) 31d71ae5a4SJacob Faibussowitsch { 32c50b2d26SMatthew G. Knepley PetscFunctionBegin; 333ba16761SJacob Faibussowitsch if (queue->num < queue->size) PetscFunctionReturn(PETSC_SUCCESS); 34c50b2d26SMatthew G. Knepley queue->size *= 2; 35c50b2d26SMatthew G. Knepley PetscCall(PetscRealloc(queue->size * sizeof(PetscInt), &queue->points)); 363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 37c50b2d26SMatthew G. Knepley } 38c50b2d26SMatthew G. Knepley 39d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexPointQueueEnqueue(DMPlexPointQueue queue, PetscInt p) 40d71ae5a4SJacob Faibussowitsch { 41c50b2d26SMatthew G. Knepley PetscFunctionBegin; 42c50b2d26SMatthew G. Knepley PetscCall(DMPlexPointQueueEnsureSize(queue)); 43c50b2d26SMatthew G. Knepley queue->back = (queue->back + 1) % queue->size; 44c50b2d26SMatthew G. Knepley queue->points[queue->back] = p; 45c50b2d26SMatthew G. Knepley ++queue->num; 463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 47c50b2d26SMatthew G. Knepley } 48c50b2d26SMatthew G. Knepley 49d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexPointQueueDequeue(DMPlexPointQueue queue, PetscInt *p) 50d71ae5a4SJacob Faibussowitsch { 51c50b2d26SMatthew G. Knepley PetscFunctionBegin; 52c50b2d26SMatthew G. Knepley PetscCheck(queue->num, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Cannot dequeue from an empty queue"); 53c50b2d26SMatthew G. Knepley *p = queue->points[queue->front]; 54c50b2d26SMatthew G. Knepley queue->front = (queue->front + 1) % queue->size; 55c50b2d26SMatthew G. Knepley --queue->num; 563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 57c50b2d26SMatthew G. Knepley } 58c50b2d26SMatthew G. Knepley 59d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexPointQueueFront(DMPlexPointQueue queue, PetscInt *p) 60d71ae5a4SJacob Faibussowitsch { 61c50b2d26SMatthew G. Knepley PetscFunctionBegin; 62c50b2d26SMatthew G. Knepley PetscCheck(queue->num, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Cannot get the front of an empty queue"); 63c50b2d26SMatthew G. Knepley *p = queue->points[queue->front]; 643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 65c50b2d26SMatthew G. Knepley } 66c50b2d26SMatthew G. Knepley 67d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexPointQueueBack(DMPlexPointQueue queue, PetscInt *p) 68d71ae5a4SJacob Faibussowitsch { 69c50b2d26SMatthew G. Knepley PetscFunctionBegin; 70c50b2d26SMatthew G. Knepley PetscCheck(queue->num, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Cannot get the back of an empty queue"); 71c50b2d26SMatthew G. Knepley *p = queue->points[queue->back]; 723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 73c50b2d26SMatthew G. Knepley } 74c50b2d26SMatthew G. Knepley 75d71ae5a4SJacob Faibussowitsch PetscBool DMPlexPointQueueEmpty(DMPlexPointQueue queue) 76d71ae5a4SJacob Faibussowitsch { 77c50b2d26SMatthew G. Knepley if (!queue->num) return PETSC_TRUE; 78c50b2d26SMatthew G. Knepley return PETSC_FALSE; 79c50b2d26SMatthew G. Knepley } 80c50b2d26SMatthew G. Knepley 81d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexPointQueueEmptyCollective(PetscObject obj, DMPlexPointQueue queue, PetscBool *empty) 82d71ae5a4SJacob Faibussowitsch { 83c50b2d26SMatthew G. Knepley PetscFunctionBeginHot; 84c50b2d26SMatthew G. Knepley *empty = DMPlexPointQueueEmpty(queue); 85*5440e5dcSBarry Smith PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, empty, 1, MPI_C_BOOL, MPI_LAND, PetscObjectComm(obj))); 863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 87c50b2d26SMatthew G. Knepley } 88