15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith This defines part of the private API for logging performance information. It is intended to be used only by the 45c6c1daeSBarry Smith PETSc PetscLog...() interface and not elsewhere, nor by users. Hence the prototypes for these functions are NOT 55c6c1daeSBarry Smith in the public PETSc include files. 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith */ 8af0996ceSBarry Smith #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith /*@C 115c6c1daeSBarry Smith PetscIntStackDestroy - This function destroys a stack. 125c6c1daeSBarry Smith 135c6c1daeSBarry Smith Not Collective 145c6c1daeSBarry Smith 155c6c1daeSBarry Smith Input Parameter: 165c6c1daeSBarry Smith . stack - The stack 175c6c1daeSBarry Smith 185c6c1daeSBarry Smith Level: developer 195c6c1daeSBarry Smith 20*db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()` 215c6c1daeSBarry Smith @*/ 225c6c1daeSBarry Smith PetscErrorCode PetscIntStackDestroy(PetscIntStack stack) 235c6c1daeSBarry Smith { 245c6c1daeSBarry Smith PetscFunctionBegin; 259566063dSJacob Faibussowitsch PetscCall(PetscFree(stack->stack)); 269566063dSJacob Faibussowitsch PetscCall(PetscFree(stack)); 275c6c1daeSBarry Smith PetscFunctionReturn(0); 285c6c1daeSBarry Smith } 295c6c1daeSBarry Smith 305c6c1daeSBarry Smith /*@C 315c6c1daeSBarry Smith PetscIntStackEmpty - This function determines whether any items have been pushed. 325c6c1daeSBarry Smith 335c6c1daeSBarry Smith Not Collective 345c6c1daeSBarry Smith 355c6c1daeSBarry Smith Input Parameter: 365c6c1daeSBarry Smith . stack - The stack 375c6c1daeSBarry Smith 385c6c1daeSBarry Smith Output Parameter: 395c6c1daeSBarry Smith . empty - PETSC_TRUE if the stack is empty 405c6c1daeSBarry Smith 415c6c1daeSBarry Smith Level: developer 425c6c1daeSBarry Smith 43*db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()` 445c6c1daeSBarry Smith @*/ 455c6c1daeSBarry Smith PetscErrorCode PetscIntStackEmpty(PetscIntStack stack, PetscBool *empty) 465c6c1daeSBarry Smith { 475c6c1daeSBarry Smith PetscFunctionBegin; 48064a246eSJacob Faibussowitsch PetscValidBoolPointer(empty,2); 49a297a907SKarl Rupp if (stack->top == -1) *empty = PETSC_TRUE; 50a297a907SKarl Rupp else *empty = PETSC_FALSE; 515c6c1daeSBarry Smith PetscFunctionReturn(0); 525c6c1daeSBarry Smith } 535c6c1daeSBarry Smith 545c6c1daeSBarry Smith /*@C 555c6c1daeSBarry Smith PetscIntStackTop - This function returns the top of the stack. 565c6c1daeSBarry Smith 575c6c1daeSBarry Smith Not Collective 585c6c1daeSBarry Smith 595c6c1daeSBarry Smith Input Parameter: 605c6c1daeSBarry Smith . stack - The stack 615c6c1daeSBarry Smith 625c6c1daeSBarry Smith Output Parameter: 635c6c1daeSBarry Smith . top - The integer on top of the stack 645c6c1daeSBarry Smith 655c6c1daeSBarry Smith Level: developer 665c6c1daeSBarry Smith 67*db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()` 685c6c1daeSBarry Smith @*/ 695c6c1daeSBarry Smith PetscErrorCode PetscIntStackTop(PetscIntStack stack, int *top) 705c6c1daeSBarry Smith { 715c6c1daeSBarry Smith PetscFunctionBegin; 725c6c1daeSBarry Smith PetscValidIntPointer(top,2); 735c6c1daeSBarry Smith *top = stack->stack[stack->top]; 745c6c1daeSBarry Smith PetscFunctionReturn(0); 755c6c1daeSBarry Smith } 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith /*@C 785c6c1daeSBarry Smith PetscIntStackPush - This function pushes an integer on the stack. 795c6c1daeSBarry Smith 805c6c1daeSBarry Smith Not Collective 815c6c1daeSBarry Smith 825c6c1daeSBarry Smith Input Parameters: 835c6c1daeSBarry Smith + stack - The stack 845c6c1daeSBarry Smith - item - The integer to push 855c6c1daeSBarry Smith 865c6c1daeSBarry Smith Level: developer 875c6c1daeSBarry Smith 88*db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPop()`, `PetscIntStackTop()` 895c6c1daeSBarry Smith @*/ 905c6c1daeSBarry Smith PetscErrorCode PetscIntStackPush(PetscIntStack stack, int item) 915c6c1daeSBarry Smith { 925c6c1daeSBarry Smith int *array; 935c6c1daeSBarry Smith 945c6c1daeSBarry Smith PetscFunctionBegin; 955c6c1daeSBarry Smith stack->top++; 965c6c1daeSBarry Smith if (stack->top >= stack->max) { 979566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(stack->max*2, &array)); 989566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(array, stack->stack, stack->max)); 999566063dSJacob Faibussowitsch PetscCall(PetscFree(stack->stack)); 100a297a907SKarl Rupp 1015c6c1daeSBarry Smith stack->stack = array; 1025c6c1daeSBarry Smith stack->max *= 2; 1035c6c1daeSBarry Smith } 1045c6c1daeSBarry Smith stack->stack[stack->top] = item; 1055c6c1daeSBarry Smith PetscFunctionReturn(0); 1065c6c1daeSBarry Smith } 1075c6c1daeSBarry Smith 1085c6c1daeSBarry Smith /*@C 1095c6c1daeSBarry Smith PetscIntStackPop - This function pops an integer from the stack. 1105c6c1daeSBarry Smith 1115c6c1daeSBarry Smith Not Collective 1125c6c1daeSBarry Smith 1135c6c1daeSBarry Smith Input Parameter: 1145c6c1daeSBarry Smith . stack - The stack 1155c6c1daeSBarry Smith 1165c6c1daeSBarry Smith Output Parameter: 1175c6c1daeSBarry Smith . item - The integer popped 1185c6c1daeSBarry Smith 1195c6c1daeSBarry Smith Level: developer 1205c6c1daeSBarry Smith 121*db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackTop()` 1225c6c1daeSBarry Smith @*/ 1235c6c1daeSBarry Smith PetscErrorCode PetscIntStackPop(PetscIntStack stack, int *item) 1245c6c1daeSBarry Smith { 1255c6c1daeSBarry Smith PetscFunctionBegin; 1265c6c1daeSBarry Smith PetscValidPointer(item,2); 12708401ef6SPierre Jolivet PetscCheck(stack->top != -1,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Stack is empty"); 1285c6c1daeSBarry Smith *item = stack->stack[stack->top--]; 1295c6c1daeSBarry Smith PetscFunctionReturn(0); 1305c6c1daeSBarry Smith } 1315c6c1daeSBarry Smith 1325c6c1daeSBarry Smith /*@C 1335c6c1daeSBarry Smith PetscIntStackCreate - This function creates a stack. 1345c6c1daeSBarry Smith 1355c6c1daeSBarry Smith Not Collective 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith Output Parameter: 1385c6c1daeSBarry Smith . stack - The stack 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith Level: developer 1415c6c1daeSBarry Smith 142*db781477SPatrick Sanan .seealso: `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()` 1435c6c1daeSBarry Smith @*/ 1445c6c1daeSBarry Smith PetscErrorCode PetscIntStackCreate(PetscIntStack *stack) 1455c6c1daeSBarry Smith { 1465c6c1daeSBarry Smith PetscIntStack s; 1475c6c1daeSBarry Smith 1485c6c1daeSBarry Smith PetscFunctionBegin; 1495c6c1daeSBarry Smith PetscValidPointer(stack,1); 1509566063dSJacob Faibussowitsch PetscCall(PetscNew(&s)); 151a297a907SKarl Rupp 1525c6c1daeSBarry Smith s->top = -1; 1535c6c1daeSBarry Smith s->max = 128; 154a297a907SKarl Rupp 1559566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(s->max, &s->stack)); 1565c6c1daeSBarry Smith *stack = s; 1575c6c1daeSBarry Smith PetscFunctionReturn(0); 1585c6c1daeSBarry Smith } 159