xref: /petsc/src/dm/impls/forest/p4est/petsc_p4est_package.h (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
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