xref: /petsc/src/dm/impls/plex/pointqueue.c (revision 8112c1cbf372cb53bf7c5aca994a84a6a303db4d) !
1c50b2d26SMatthew G. Knepley #include <petsc/private/dmpleximpl.h> /*I      "petscdmplex.h"   I*/
2c50b2d26SMatthew G. Knepley 
DMPlexPointQueueCreate(PetscInt size,DMPlexPointQueue * queue)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 
DMPlexPointQueueDestroy(DMPlexPointQueue * queue)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 
DMPlexPointQueueEnsureSize(DMPlexPointQueue queue)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 
DMPlexPointQueueEnqueue(DMPlexPointQueue queue,PetscInt p)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 
DMPlexPointQueueDequeue(DMPlexPointQueue queue,PetscInt * p)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 
DMPlexPointQueueFront(DMPlexPointQueue queue,PetscInt * p)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 
DMPlexPointQueueBack(DMPlexPointQueue queue,PetscInt * p)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 
DMPlexPointQueueEmpty(DMPlexPointQueue queue)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 
DMPlexPointQueueEmptyCollective(PetscObject obj,DMPlexPointQueue queue,PetscBool * empty)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