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