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
P4estLocidxCast(PetscInt a,p4est_locidx_t * b)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
P4estTopidxCast(PetscInt a,p4est_topidx_t * b)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