xref: /petsc/src/sys/objects/device/tests/petscdevicetestcommon.h (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1a4af0ceeSJacob Faibussowitsch #ifndef PETSCDEVICE_H
2a4af0ceeSJacob Faibussowitsch #error "included this file before petscdevice.h, this file must be included last to ensure that public petsc headers are well formed"
3a4af0ceeSJacob Faibussowitsch #endif
4a4af0ceeSJacob Faibussowitsch #ifndef PETSCDEVICETESTCOMMON_H
5a4af0ceeSJacob Faibussowitsch #define PETSCDEVICETESTCOMMON_H
6a4af0ceeSJacob Faibussowitsch 
7a4af0ceeSJacob Faibussowitsch /* all of the error checking macros are undefined and redefined verbatim so that they are also
8a4af0ceeSJacob Faibussowitsch  * defined for optimized builds.
9a4af0ceeSJacob Faibussowitsch  */
10a4af0ceeSJacob Faibussowitsch 
1155ed0643SJacob Faibussowitsch #undef PetscValidDeviceType
12*9371c9d4SSatish Balay #define PetscValidDeviceType(_p_dev_type__, _p_arg__) \
13*9371c9d4SSatish Balay   do { \
14*9371c9d4SSatish Balay     PetscCheck(((int)(_p_dev_type__) >= (int)PETSC_DEVICE_INVALID) && ((_p_dev_type__) <= PETSC_DEVICE_MAX), PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscDeviceType '%d': Argument #%d", (_p_dev_type__), (_p_arg__)); \
159a202e32SJacob Faibussowitsch     if (PetscUnlikely(!PetscDeviceConfiguredFor_Internal(_p_dev_type__))) { \
16a4af0ceeSJacob Faibussowitsch       switch (_p_dev_type__) { \
17a4af0ceeSJacob Faibussowitsch       case PETSC_DEVICE_INVALID: \
18*9371c9d4SSatish Balay         SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, \
19*9371c9d4SSatish Balay                 "Invalid PetscDeviceType '%s': Argument #%d;" \
20a4af0ceeSJacob Faibussowitsch                 " PETSc is not configured with device support", \
21a4af0ceeSJacob Faibussowitsch                 PetscDeviceTypes[_p_dev_type__], (_p_arg__)); \
22a4af0ceeSJacob Faibussowitsch         break; \
23*9371c9d4SSatish Balay       case PETSC_DEVICE_MAX: SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "Invalid PetscDeviceType '%s': Argument #%d", PetscDeviceTypes[_p_dev_type__], (_p_arg__)); break; \
24a4af0ceeSJacob Faibussowitsch       default: \
2598921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, \
26a4af0ceeSJacob Faibussowitsch                 "Not configured for PetscDeviceType '%s': Argument #%d;" \
27a4af0ceeSJacob Faibussowitsch                 " run configure --help %s for available options", \
289a202e32SJacob Faibussowitsch                 PetscDeviceTypes[_p_dev_type__], (_p_arg__), PetscDeviceTypes[_p_dev_type__]); \
29a4af0ceeSJacob Faibussowitsch         break; \
30a4af0ceeSJacob Faibussowitsch       } \
31a4af0ceeSJacob Faibussowitsch     } \
32a4af0ceeSJacob Faibussowitsch   } while (0)
33a4af0ceeSJacob Faibussowitsch 
3455ed0643SJacob Faibussowitsch #undef PetscValidDevice
35*9371c9d4SSatish Balay #define PetscValidDevice(_p_dev__, _p_arg__) \
36*9371c9d4SSatish Balay   do { \
37a4af0ceeSJacob Faibussowitsch     PetscValidPointer(_p_dev__, _p_arg__); \
38a4af0ceeSJacob Faibussowitsch     PetscValidDeviceType((_p_dev__)->type, _p_arg__); \
39*9371c9d4SSatish Balay     PetscCheck((_p_dev__)->id >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid PetscDevice: Argument #%d; id %" PetscInt_FMT " < 0", (_p_arg__), (_p_dev__)->id); \
40*9371c9d4SSatish Balay     PetscCheck((_p_dev__)->refcnt >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid PetscDevice: Argument #%d; negative reference count %" PetscInt_FMT, (_p_arg__), (_p_dev__)->refcnt); \
41a4af0ceeSJacob Faibussowitsch   } while (0)
42a4af0ceeSJacob Faibussowitsch 
4355ed0643SJacob Faibussowitsch #undef PetscCheckCompatibleDevices
44*9371c9d4SSatish Balay #define PetscCheckCompatibleDevices(_p_dev1__, _p_arg1__, _p_dev2__, _p_arg2__) \
45*9371c9d4SSatish Balay   do { \
46a4af0ceeSJacob Faibussowitsch     PetscValidDevice(_p_dev1__, _p_arg1__); \
47a4af0ceeSJacob Faibussowitsch     PetscValidDevice(_p_dev2__, _p_arg2__); \
48*9371c9d4SSatish Balay     PetscCheck((_p_dev1__)->type == (_p_dev2__)->type, PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "PetscDevices are incompatible: Arguments #%d and #%d", (_p_arg1__), (_p_arg2__)); \
49a4af0ceeSJacob Faibussowitsch   } while (0)
50a4af0ceeSJacob Faibussowitsch 
5155ed0643SJacob Faibussowitsch #undef PetscValidStreamType
52*9371c9d4SSatish Balay #define PetscValidStreamType(_p_strm_type__, _p_arg__) \
53*9371c9d4SSatish Balay   do { \
54*9371c9d4SSatish Balay     PetscCheck(((int)(_p_strm_type__) >= 0) && ((_p_strm_type__) <= PETSC_STREAM_MAX), PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscStreamType '%d': Argument #%d", (_p_strm_type__), (_p_arg__)); \
55*9371c9d4SSatish Balay     PetscCheck((_p_strm_type__) != PETSC_STREAM_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "Invalid PetscStreamType '%s': Argument #%d", PetscStreamTypes[_p_strm_type__], (_p_arg__)); \
56a4af0ceeSJacob Faibussowitsch   } while (0)
57a4af0ceeSJacob Faibussowitsch 
5855ed0643SJacob Faibussowitsch #undef PetscValidDeviceContext
59*9371c9d4SSatish Balay #define PetscValidDeviceContext(_p_dev_ctx__, _p_arg__) \
60*9371c9d4SSatish Balay   do { \
61a4af0ceeSJacob Faibussowitsch     PetscValidPointer(_p_dev_ctx__, _p_arg__); \
62a4af0ceeSJacob Faibussowitsch     PetscValidStreamType((_p_dev_ctx__)->streamType, _p_arg__); \
639a202e32SJacob Faibussowitsch     if ((_p_dev_ctx__)->device) PetscValidDevice((_p_dev_ctx__)->device, _p_arg__); \
64*9371c9d4SSatish Balay     else \
65*9371c9d4SSatish Balay       PetscCheck(!((_p_dev_ctx__)->setup), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, \
66a4af0ceeSJacob Faibussowitsch                  "Invalid PetscDeviceContext: Argument #%d; " \
67*9371c9d4SSatish Balay                  "PetscDeviceContext is setup but has no PetscDevice", \
68*9371c9d4SSatish Balay                  (_p_arg__)); \
69*9371c9d4SSatish Balay     PetscCheck((_p_dev_ctx__)->id >= 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid PetscDeviceContext: Argument #%d; id %" PetscInt_FMT " < 1", (_p_arg__), (_p_dev_ctx__)->id); \
70*9371c9d4SSatish Balay     PetscCheck((_p_dev_ctx__)->numChildren <= (_p_dev_ctx__)->maxNumChildren, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "Invalid PetscDeviceContext: Argument #%d; number of children %" PetscInt_FMT " > max number of children %" PetscInt_FMT, (_p_arg__), \
71*9371c9d4SSatish Balay                (_p_dev_ctx__)->numChildren, (_p_dev_ctx__)->maxNumChildren); \
72a4af0ceeSJacob Faibussowitsch   } while (0)
73a4af0ceeSJacob Faibussowitsch 
7455ed0643SJacob Faibussowitsch #undef PetscCheckCompatibleDeviceContexts
75a4af0ceeSJacob Faibussowitsch #define PetscCheckCompatibleDeviceContexts(_p_dev_ctx1__, _p_arg1__, _p_dev_ctx2__, _p_arg2__) \
76a4af0ceeSJacob Faibussowitsch   do { \
77a4af0ceeSJacob Faibussowitsch     PetscValidDeviceContext(_p_dev_ctx1__, _p_arg1__); \
78a4af0ceeSJacob Faibussowitsch     PetscValidDeviceContext(_p_dev_ctx2__, _p_arg2__); \
79*9371c9d4SSatish Balay     PetscCheckCompatibleDevices((_p_dev_ctx1__)->device, _p_arg1__, (_p_dev_ctx2__)->device, _p_arg2__); \
80a4af0ceeSJacob Faibussowitsch   } while (0)
81a4af0ceeSJacob Faibussowitsch 
82a4af0ceeSJacob Faibussowitsch /*  This header file should NEVER #include another file and should be the last thing included
83a4af0ceeSJacob Faibussowitsch  *  in the test file. This is to guard against ill-formed PetscDevice header files!
84a4af0ceeSJacob Faibussowitsch  */
85*9371c9d4SSatish Balay static inline PetscErrorCode AssertDeviceExists(PetscDevice device) {
86a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
87a4af0ceeSJacob Faibussowitsch   PetscValidDevice(device, 1);
88a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
89a4af0ceeSJacob Faibussowitsch }
90a4af0ceeSJacob Faibussowitsch 
91*9371c9d4SSatish Balay static inline PetscErrorCode AssertDeviceDoesNotExist(PetscDevice device) {
92a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
932c71b3e2SJacob Faibussowitsch   PetscCheck(!device, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDevice was not destroyed for type %s", PetscDeviceTypes[device->type]);
94a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
95a4af0ceeSJacob Faibussowitsch }
96a4af0ceeSJacob Faibussowitsch 
97*9371c9d4SSatish Balay static inline PetscErrorCode AssertDeviceContextExists(PetscDeviceContext dctx) {
98a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
99a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(dctx, 1);
100a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
101a4af0ceeSJacob Faibussowitsch }
102a4af0ceeSJacob Faibussowitsch 
103*9371c9d4SSatish Balay static inline PetscErrorCode AssertDeviceContextDoesNotExist(PetscDeviceContext dctx) {
104a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
1052c71b3e2SJacob Faibussowitsch   PetscCheck(!dctx, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDeviceContext was not destroyed");
106a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
107a4af0ceeSJacob Faibussowitsch }
108a4af0ceeSJacob Faibussowitsch 
109*9371c9d4SSatish Balay static inline PetscErrorCode AssertPetscStreamTypesValidAndEqual(PetscStreamType left, PetscStreamType right, const char *errStr) {
110a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
111a4af0ceeSJacob Faibussowitsch   PetscValidStreamType(left, 1);
112a4af0ceeSJacob Faibussowitsch   PetscValidStreamType(right, 2);
1132c71b3e2SJacob Faibussowitsch   PetscCheck(left == right, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, errStr, PetscStreamTypes[left], PetscStreamTypes[right]);
114a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
115a4af0ceeSJacob Faibussowitsch }
116a4af0ceeSJacob Faibussowitsch 
117*9371c9d4SSatish Balay static inline PetscErrorCode AssertPetscDevicesValidAndEqual(PetscDevice left, PetscDevice right, const char *errStr) {
118a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
119a4af0ceeSJacob Faibussowitsch   PetscCheckCompatibleDevices(left, 1, right, 2);
1202c71b3e2SJacob Faibussowitsch   PetscCheck(left == right, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "%s", errStr);
121a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
122a4af0ceeSJacob Faibussowitsch }
123a4af0ceeSJacob Faibussowitsch 
124*9371c9d4SSatish Balay static inline PetscErrorCode AssertPetscDeviceContextsValidAndEqual(PetscDeviceContext left, PetscDeviceContext right, const char *errStr) {
125a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
126a4af0ceeSJacob Faibussowitsch   PetscCheckCompatibleDeviceContexts(left, 1, right, 2);
1272c71b3e2SJacob Faibussowitsch   PetscCheck(left == right, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "%s", errStr);
128a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
129a4af0ceeSJacob Faibussowitsch }
130a4af0ceeSJacob Faibussowitsch #endif /* PETSCDEVICETESTCOMMON_H */
131