xref: /petsc/src/sys/objects/device/tests/petscdevicetestcommon.h (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
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
12a4af0ceeSJacob Faibussowitsch #define PetscValidDeviceType(_p_dev_type__,_p_arg__) do {                                      \
13*2c71b3e2SJacob Faibussowitsch     PetscCheck(                                                                               \
149a202e32SJacob Faibussowitsch       ((_p_dev_type__) >= PETSC_DEVICE_INVALID) && ((_p_dev_type__) <= PETSC_DEVICE_MAX),      \
159a202e32SJacob Faibussowitsch       PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDeviceType '%d': Argument #%d", \
169a202e32SJacob Faibussowitsch       (_p_dev_type__),(_p_arg__)                                                               \
179a202e32SJacob Faibussowitsch     );                                                                                         \
189a202e32SJacob Faibussowitsch     if (PetscUnlikely(!PetscDeviceConfiguredFor_Internal(_p_dev_type__))) {                    \
19a4af0ceeSJacob Faibussowitsch       switch(_p_dev_type__) {                                                                  \
20a4af0ceeSJacob Faibussowitsch       case PETSC_DEVICE_INVALID:                                                               \
219a202e32SJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Invalid PetscDeviceType '%s': Argument #%d;"    \
22a4af0ceeSJacob Faibussowitsch                 " PETSc is not configured with device support",                                \
23a4af0ceeSJacob Faibussowitsch                 PetscDeviceTypes[_p_dev_type__],(_p_arg__));                                   \
24a4af0ceeSJacob Faibussowitsch         break;                                                                                 \
25a4af0ceeSJacob Faibussowitsch       case PETSC_DEVICE_MAX:                                                                   \
2698921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,                                          \
27a4af0ceeSJacob Faibussowitsch                 "Invalid PetscDeviceType '%s': Argument #%d",                                  \
28a4af0ceeSJacob Faibussowitsch                 PetscDeviceTypes[_p_dev_type__],(_p_arg__));                                   \
29a4af0ceeSJacob Faibussowitsch         break;                                                                                 \
30a4af0ceeSJacob Faibussowitsch       default:                                                                                 \
3198921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,                                                 \
32a4af0ceeSJacob Faibussowitsch                 "Not configured for PetscDeviceType '%s': Argument #%d;"                       \
33a4af0ceeSJacob Faibussowitsch                 " run configure --help %s for available options",                              \
349a202e32SJacob Faibussowitsch                 PetscDeviceTypes[_p_dev_type__],(_p_arg__),PetscDeviceTypes[_p_dev_type__]);   \
35a4af0ceeSJacob Faibussowitsch         break;                                                                                 \
36a4af0ceeSJacob Faibussowitsch       }                                                                                        \
37a4af0ceeSJacob Faibussowitsch     }                                                                                          \
38a4af0ceeSJacob Faibussowitsch   } while (0)
39a4af0ceeSJacob Faibussowitsch 
4055ed0643SJacob Faibussowitsch #undef  PetscValidDevice
41a4af0ceeSJacob Faibussowitsch #define PetscValidDevice(_p_dev__,_p_arg__)          do {                                      \
42a4af0ceeSJacob Faibussowitsch     PetscValidPointer(_p_dev__,_p_arg__);                                                      \
43a4af0ceeSJacob Faibussowitsch     PetscValidDeviceType((_p_dev__)->type,_p_arg__);                                           \
44*2c71b3e2SJacob Faibussowitsch     PetscCheck(                                                                               \
459a202e32SJacob Faibussowitsch       (_p_dev__)->id >= 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,                                      \
469a202e32SJacob Faibussowitsch       "Invalid PetscDevice: Argument #%d; id %" PetscInt_FMT " < 0",(_p_arg__),(_p_dev__)->id  \
479a202e32SJacob Faibussowitsch     );                                                                                         \
48*2c71b3e2SJacob Faibussowitsch     PetscCheck(                                                                               \
499a202e32SJacob Faibussowitsch       (_p_dev__)->refcnt >= 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,                                  \
509a202e32SJacob Faibussowitsch       "Invalid PetscDevice: Argument #%d; negative reference count %" PetscInt_FMT,            \
519a202e32SJacob Faibussowitsch       (_p_arg__),(_p_dev__)->refcnt                                                            \
529a202e32SJacob Faibussowitsch     );                                                                                         \
53a4af0ceeSJacob Faibussowitsch   } while (0)
54a4af0ceeSJacob Faibussowitsch 
5555ed0643SJacob Faibussowitsch #undef  PetscCheckCompatibleDevices
569a202e32SJacob Faibussowitsch #define PetscCheckCompatibleDevices(_p_dev1__,_p_arg1__,_p_dev2__,_p_arg2__) do {       \
57a4af0ceeSJacob Faibussowitsch     PetscValidDevice(_p_dev1__,_p_arg1__);                                              \
58a4af0ceeSJacob Faibussowitsch     PetscValidDevice(_p_dev2__,_p_arg2__);                                              \
59*2c71b3e2SJacob Faibussowitsch     PetscCheck(                                                                        \
609a202e32SJacob Faibussowitsch       (_p_dev1__)->type == (_p_dev2__)->type,PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,      \
619a202e32SJacob Faibussowitsch       "PetscDevices are incompatible: Arguments #%d and #%d",(_p_arg1__),(_p_arg2__)    \
629a202e32SJacob Faibussowitsch     );                                                                                  \
63a4af0ceeSJacob Faibussowitsch   } while (0)
64a4af0ceeSJacob Faibussowitsch 
6555ed0643SJacob Faibussowitsch #undef  PetscValidStreamType
66a4af0ceeSJacob Faibussowitsch #define PetscValidStreamType(_p_strm_type__,_p_arg__)  do {                                    \
67*2c71b3e2SJacob Faibussowitsch     PetscCheck(                                                                               \
689a202e32SJacob Faibussowitsch       ((_p_strm_type__) >= 0) && ((_p_strm_type__) <= PETSC_STREAM_MAX),                       \
699a202e32SJacob Faibussowitsch       PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscStreamType '%d': Argument #%d", \
709a202e32SJacob Faibussowitsch       (_p_strm_type__),(_p_arg__)                                                              \
719a202e32SJacob Faibussowitsch     );                                                                                         \
72*2c71b3e2SJacob Faibussowitsch     PetscCheck(                                                                               \
739a202e32SJacob Faibussowitsch       (_p_strm_type__) != PETSC_STREAM_MAX,PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,               \
749a202e32SJacob Faibussowitsch       "Invalid PetscStreamType '%s': Argument #%d",PetscStreamTypes[_p_strm_type__],(_p_arg__) \
759a202e32SJacob Faibussowitsch     );                                                                                         \
76a4af0ceeSJacob Faibussowitsch   } while (0)
77a4af0ceeSJacob Faibussowitsch 
7855ed0643SJacob Faibussowitsch #undef  PetscValidDeviceContext
79a4af0ceeSJacob Faibussowitsch #define PetscValidDeviceContext(_p_dev_ctx__,_p_arg__) do {                                    \
80a4af0ceeSJacob Faibussowitsch     PetscValidPointer(_p_dev_ctx__,_p_arg__);                                                  \
81a4af0ceeSJacob Faibussowitsch     PetscValidStreamType((_p_dev_ctx__)->streamType,_p_arg__);                                 \
829a202e32SJacob Faibussowitsch     if ((_p_dev_ctx__)->device) PetscValidDevice((_p_dev_ctx__)->device,_p_arg__);             \
83*2c71b3e2SJacob Faibussowitsch     else PetscCheck(                                                                          \
849a202e32SJacob Faibussowitsch       !((_p_dev_ctx__)->setup),PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,                       \
85a4af0ceeSJacob Faibussowitsch       "Invalid PetscDeviceContext: Argument #%d; "                                             \
869a202e32SJacob Faibussowitsch       "PetscDeviceContext is setup but has no PetscDevice",(_p_arg__)                          \
879a202e32SJacob Faibussowitsch     );                                                                                         \
88*2c71b3e2SJacob Faibussowitsch     PetscCheck(                                                                               \
899a202e32SJacob Faibussowitsch       (_p_dev_ctx__)->id >= 1,PETSC_COMM_SELF,PETSC_ERR_PLIB,                                  \
909a202e32SJacob Faibussowitsch       "Invalid PetscDeviceContext: Argument #%d; id %" PetscInt_FMT " < 1",                    \
919a202e32SJacob Faibussowitsch       (_p_arg__),(_p_dev_ctx__)->id                                                            \
929a202e32SJacob Faibussowitsch     );                                                                                         \
93*2c71b3e2SJacob Faibussowitsch     PetscCheck(                                                                               \
949a202e32SJacob Faibussowitsch       (_p_dev_ctx__)->numChildren <= (_p_dev_ctx__)->maxNumChildren,PETSC_COMM_SELF,           \
959a202e32SJacob Faibussowitsch       PETSC_ERR_ARG_CORRUPT,"Invalid PetscDeviceContext: Argument #%d; number of children %"   \
969a202e32SJacob Faibussowitsch       PetscInt_FMT " > max number of children %" PetscInt_FMT,                                 \
979a202e32SJacob Faibussowitsch       (_p_arg__),(_p_dev_ctx__)->numChildren,(_p_dev_ctx__)->maxNumChildren                    \
989a202e32SJacob Faibussowitsch     );                                                                                         \
99a4af0ceeSJacob Faibussowitsch   } while (0)
100a4af0ceeSJacob Faibussowitsch 
10155ed0643SJacob Faibussowitsch #undef  PetscCheckCompatibleDeviceContexts
102a4af0ceeSJacob Faibussowitsch #define PetscCheckCompatibleDeviceContexts(_p_dev_ctx1__,_p_arg1__,_p_dev_ctx2__,_p_arg2__)    \
103a4af0ceeSJacob Faibussowitsch   do {                                                                                         \
104a4af0ceeSJacob Faibussowitsch     PetscValidDeviceContext(_p_dev_ctx1__,_p_arg1__);                                          \
105a4af0ceeSJacob Faibussowitsch     PetscValidDeviceContext(_p_dev_ctx2__,_p_arg2__);                                          \
1069a202e32SJacob Faibussowitsch     PetscCheckCompatibleDevices(                                                               \
1079a202e32SJacob Faibussowitsch       (_p_dev_ctx1__)->device,_p_arg1__,(_p_dev_ctx2__)->device,_p_arg2__                      \
1089a202e32SJacob Faibussowitsch     );                                                                                         \
109a4af0ceeSJacob Faibussowitsch   } while (0)
110a4af0ceeSJacob Faibussowitsch 
111a4af0ceeSJacob Faibussowitsch /*  This header file should NEVER #include another file and should be the last thing included
112a4af0ceeSJacob Faibussowitsch  *  in the test file. This is to guard against ill-formed PetscDevice header files!
113a4af0ceeSJacob Faibussowitsch  */
1149fbee547SJacob Faibussowitsch static inline PetscErrorCode AssertDeviceExists(PetscDevice device)
115a4af0ceeSJacob Faibussowitsch {
116a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
117a4af0ceeSJacob Faibussowitsch   PetscValidDevice(device,1);
118a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
119a4af0ceeSJacob Faibussowitsch }
120a4af0ceeSJacob Faibussowitsch 
1219fbee547SJacob Faibussowitsch static inline PetscErrorCode AssertDeviceDoesNotExist(PetscDevice device)
122a4af0ceeSJacob Faibussowitsch {
123a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
124*2c71b3e2SJacob Faibussowitsch   PetscCheck(!device,PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscDevice was not destroyed for type %s",PetscDeviceTypes[device->type]);
125a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
126a4af0ceeSJacob Faibussowitsch }
127a4af0ceeSJacob Faibussowitsch 
1289fbee547SJacob Faibussowitsch static inline PetscErrorCode AssertDeviceContextExists(PetscDeviceContext dctx)
129a4af0ceeSJacob Faibussowitsch {
130a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
131a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(dctx,1);
132a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
133a4af0ceeSJacob Faibussowitsch }
134a4af0ceeSJacob Faibussowitsch 
1359fbee547SJacob Faibussowitsch static inline PetscErrorCode AssertDeviceContextDoesNotExist(PetscDeviceContext dctx)
136a4af0ceeSJacob Faibussowitsch {
137a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
138*2c71b3e2SJacob Faibussowitsch   PetscCheck(!dctx,PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscDeviceContext was not destroyed");
139a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
140a4af0ceeSJacob Faibussowitsch }
141a4af0ceeSJacob Faibussowitsch 
1429fbee547SJacob Faibussowitsch static inline PetscErrorCode AssertPetscStreamTypesValidAndEqual(PetscStreamType left, PetscStreamType right, const char *errStr)
143a4af0ceeSJacob Faibussowitsch {
144a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
145a4af0ceeSJacob Faibussowitsch   PetscValidStreamType(left,1);
146a4af0ceeSJacob Faibussowitsch   PetscValidStreamType(right,2);
147*2c71b3e2SJacob Faibussowitsch   PetscCheck(left == right,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,errStr,PetscStreamTypes[left],PetscStreamTypes[right]);
148a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
149a4af0ceeSJacob Faibussowitsch }
150a4af0ceeSJacob Faibussowitsch 
1519fbee547SJacob Faibussowitsch static inline PetscErrorCode AssertPetscDevicesValidAndEqual(PetscDevice left, PetscDevice right, const char *errStr)
152a4af0ceeSJacob Faibussowitsch {
153a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
154a4af0ceeSJacob Faibussowitsch   PetscCheckCompatibleDevices(left,1,right,2);
155*2c71b3e2SJacob Faibussowitsch   PetscCheck(left == right,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"%s",errStr);
156a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
157a4af0ceeSJacob Faibussowitsch }
158a4af0ceeSJacob Faibussowitsch 
1599fbee547SJacob Faibussowitsch static inline PetscErrorCode AssertPetscDeviceContextsValidAndEqual(PetscDeviceContext left, PetscDeviceContext right, const char *errStr)
160a4af0ceeSJacob Faibussowitsch {
161a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
162a4af0ceeSJacob Faibussowitsch   PetscCheckCompatibleDeviceContexts(left,1,right,2);
163*2c71b3e2SJacob Faibussowitsch   PetscCheck(left == right,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"%s",errStr);
164a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
165a4af0ceeSJacob Faibussowitsch }
166a4af0ceeSJacob Faibussowitsch #endif /* PETSCDEVICETESTCOMMON_H */
167