1 #pragma once 2 #include <petscsys.h> 3 #if defined(PETSC_HAVE_MPIUNI) 4 #undef MPI_SUCCESS 5 #endif 6 #include <p4est_base.h> 7 #if defined(PETSC_HAVE_MPIUNI) 8 #define MPI_SUCCESS 0 9 #endif 10 11 #if defined(PETSC_HAVE_SETJMP_H) && defined(PETSC_USE_DEBUG) 12 #include <setjmp.h> 13 PETSC_INTERN jmp_buf PetscScJumpBuf; 14 15 #define PetscCallP4est(func, args) \ 16 do { \ 17 if (setjmp(PetscScJumpBuf)) { \ 18 return PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_LIB, PETSC_ERROR_REPEAT, "Error in p4est/libsc call %s()", #func); \ 19 } else { \ 20 PetscStackPushExternal(#func); \ 21 func args; \ 22 PetscStackPop; \ 23 } \ 24 } while (0) 25 #define PetscCallP4estReturn(ret, func, args) \ 26 do { \ 27 if (setjmp(PetscScJumpBuf)) { \ 28 return PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_LIB, PETSC_ERROR_REPEAT, "Error in p4est/libsc call %s()", #func); \ 29 } else { \ 30 PetscStackPushExternal(#func); \ 31 ret = func args; \ 32 PetscStackPop; \ 33 } \ 34 } while (0) 35 #else 36 #define PetscCallP4est(func, args) \ 37 do { \ 38 PetscStackPushExternal(#func); \ 39 func args; \ 40 PetscStackPop; \ 41 } while (0) 42 #define PetscCallP4estReturn(ret, func, args) \ 43 do { \ 44 PetscStackPushExternal(#func); \ 45 ret = func args; \ 46 PetscStackPop; \ 47 } while (0) 48 #endif 49 50 #if defined(P4EST_ENABLE_DEBUG) 51 #define PETSC_P4EST_ASSERT(x) P4EST_ASSERT(x) 52 #else 53 #define PETSC_P4EST_ASSERT(x) (void)(x) 54 #endif 55 56 PETSC_EXTERN PetscErrorCode PetscP4estInitialize(void); 57 58 static inline PetscErrorCode P4estLocidxCast(PetscInt a, p4est_locidx_t *b) 59 { 60 PetscFunctionBegin; 61 *b = (p4est_locidx_t)(a); 62 #if defined(PETSC_USE_64BIT_INDICES) 63 PetscCheck((a) <= P4EST_LOCIDX_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index to large for p4est_locidx_t"); 64 #endif 65 PetscFunctionReturn(PETSC_SUCCESS); 66 } 67 68 static inline PetscErrorCode P4estTopidxCast(PetscInt a, p4est_topidx_t *b) 69 { 70 PetscFunctionBegin; 71 *b = (p4est_topidx_t)(a); 72 #if defined(PETSC_USE_64BIT_INDICES) 73 PetscCheck((a) <= P4EST_TOPIDX_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index to large for p4est_topidx_t"); 74 #endif 75 PetscFunctionReturn(PETSC_SUCCESS); 76 } 77