xref: /petsc/src/sys/objects/device/tests/petscdevicetestcommon.h (revision 9a202e32d242a1072f1a7e3b448c486da801632a)
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*9a202e32SJacob Faibussowitsch     PetscAssert(                                                                               \
14*9a202e32SJacob Faibussowitsch       ((_p_dev_type__) >= PETSC_DEVICE_INVALID) && ((_p_dev_type__) <= PETSC_DEVICE_MAX),      \
15*9a202e32SJacob Faibussowitsch       PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDeviceType '%d': Argument #%d", \
16*9a202e32SJacob Faibussowitsch       (_p_dev_type__),(_p_arg__)                                                               \
17*9a202e32SJacob Faibussowitsch     );                                                                                         \
18*9a202e32SJacob Faibussowitsch     if (PetscUnlikely(!PetscDeviceConfiguredFor_Internal(_p_dev_type__))) {                    \
19a4af0ceeSJacob Faibussowitsch       switch(_p_dev_type__) {                                                                  \
20a4af0ceeSJacob Faibussowitsch       case PETSC_DEVICE_INVALID:                                                               \
21*9a202e32SJacob 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",                              \
34*9a202e32SJacob 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*9a202e32SJacob Faibussowitsch     PetscAssert(                                                                               \
45*9a202e32SJacob Faibussowitsch       (_p_dev__)->id >= 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,                                      \
46*9a202e32SJacob Faibussowitsch       "Invalid PetscDevice: Argument #%d; id %" PetscInt_FMT " < 0",(_p_arg__),(_p_dev__)->id  \
47*9a202e32SJacob Faibussowitsch     );                                                                                         \
48*9a202e32SJacob Faibussowitsch     PetscAssert(                                                                               \
49*9a202e32SJacob Faibussowitsch       (_p_dev__)->refcnt >= 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,                                  \
50*9a202e32SJacob Faibussowitsch       "Invalid PetscDevice: Argument #%d; negative reference count %" PetscInt_FMT,            \
51*9a202e32SJacob Faibussowitsch       (_p_arg__),(_p_dev__)->refcnt                                                            \
52*9a202e32SJacob Faibussowitsch     );                                                                                         \
53a4af0ceeSJacob Faibussowitsch   } while (0)
54a4af0ceeSJacob Faibussowitsch 
5555ed0643SJacob Faibussowitsch #undef  PetscCheckCompatibleDevices
56*9a202e32SJacob 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*9a202e32SJacob Faibussowitsch     PetscAssert(                                                                        \
60*9a202e32SJacob Faibussowitsch       (_p_dev1__)->type == (_p_dev2__)->type,PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,      \
61*9a202e32SJacob Faibussowitsch       "PetscDevices are incompatible: Arguments #%d and #%d",(_p_arg1__),(_p_arg2__)    \
62*9a202e32SJacob Faibussowitsch     );                                                                                  \
63a4af0ceeSJacob Faibussowitsch   } while (0)
64a4af0ceeSJacob Faibussowitsch 
6555ed0643SJacob Faibussowitsch #undef  PetscValidStreamType
66a4af0ceeSJacob Faibussowitsch #define PetscValidStreamType(_p_strm_type__,_p_arg__)  do {                                    \
67*9a202e32SJacob Faibussowitsch     PetscAssert(                                                                               \
68*9a202e32SJacob Faibussowitsch       ((_p_strm_type__) >= 0) && ((_p_strm_type__) <= PETSC_STREAM_MAX),                       \
69*9a202e32SJacob Faibussowitsch       PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscStreamType '%d': Argument #%d", \
70*9a202e32SJacob Faibussowitsch       (_p_strm_type__),(_p_arg__)                                                              \
71*9a202e32SJacob Faibussowitsch     );                                                                                         \
72*9a202e32SJacob Faibussowitsch     PetscAssert(                                                                               \
73*9a202e32SJacob Faibussowitsch       (_p_strm_type__) != PETSC_STREAM_MAX,PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,               \
74*9a202e32SJacob Faibussowitsch       "Invalid PetscStreamType '%s': Argument #%d",PetscStreamTypes[_p_strm_type__],(_p_arg__) \
75*9a202e32SJacob 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__);                                 \
82*9a202e32SJacob Faibussowitsch     if ((_p_dev_ctx__)->device) PetscValidDevice((_p_dev_ctx__)->device,_p_arg__);             \
83*9a202e32SJacob Faibussowitsch     else PetscAssert(                                                                          \
84*9a202e32SJacob Faibussowitsch       !((_p_dev_ctx__)->setup),PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,                       \
85a4af0ceeSJacob Faibussowitsch       "Invalid PetscDeviceContext: Argument #%d; "                                             \
86*9a202e32SJacob Faibussowitsch       "PetscDeviceContext is setup but has no PetscDevice",(_p_arg__)                          \
87*9a202e32SJacob Faibussowitsch     );                                                                                         \
88*9a202e32SJacob Faibussowitsch     PetscAssert(                                                                               \
89*9a202e32SJacob Faibussowitsch       (_p_dev_ctx__)->id >= 1,PETSC_COMM_SELF,PETSC_ERR_PLIB,                                  \
90*9a202e32SJacob Faibussowitsch       "Invalid PetscDeviceContext: Argument #%d; id %" PetscInt_FMT " < 1",                    \
91*9a202e32SJacob Faibussowitsch       (_p_arg__),(_p_dev_ctx__)->id                                                            \
92*9a202e32SJacob Faibussowitsch     );                                                                                         \
93*9a202e32SJacob Faibussowitsch     PetscAssert(                                                                               \
94*9a202e32SJacob Faibussowitsch       (_p_dev_ctx__)->numChildren <= (_p_dev_ctx__)->maxNumChildren,PETSC_COMM_SELF,           \
95*9a202e32SJacob Faibussowitsch       PETSC_ERR_ARG_CORRUPT,"Invalid PetscDeviceContext: Argument #%d; number of children %"   \
96*9a202e32SJacob Faibussowitsch       PetscInt_FMT " > max number of children %" PetscInt_FMT,                                 \
97*9a202e32SJacob Faibussowitsch       (_p_arg__),(_p_dev_ctx__)->numChildren,(_p_dev_ctx__)->maxNumChildren                    \
98*9a202e32SJacob 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__);                                          \
106*9a202e32SJacob Faibussowitsch     PetscCheckCompatibleDevices(                                                               \
107*9a202e32SJacob Faibussowitsch       (_p_dev_ctx1__)->device,_p_arg1__,(_p_dev_ctx2__)->device,_p_arg2__                      \
108*9a202e32SJacob 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  */
114a4af0ceeSJacob Faibussowitsch PETSC_STATIC_INLINE PetscErrorCode AssertDeviceExists(PetscDevice device)
115a4af0ceeSJacob Faibussowitsch {
116a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
117a4af0ceeSJacob Faibussowitsch   PetscValidDevice(device,1);
118a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
119a4af0ceeSJacob Faibussowitsch }
120a4af0ceeSJacob Faibussowitsch 
121a4af0ceeSJacob Faibussowitsch PETSC_STATIC_INLINE PetscErrorCode AssertDeviceDoesNotExist(PetscDevice device)
122a4af0ceeSJacob Faibussowitsch {
123a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
124*9a202e32SJacob Faibussowitsch   PetscAssert(!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 
128a4af0ceeSJacob Faibussowitsch PETSC_STATIC_INLINE PetscErrorCode AssertDeviceContextExists(PetscDeviceContext dctx)
129a4af0ceeSJacob Faibussowitsch {
130a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
131a4af0ceeSJacob Faibussowitsch   PetscValidDeviceContext(dctx,1);
132a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
133a4af0ceeSJacob Faibussowitsch }
134a4af0ceeSJacob Faibussowitsch 
135a4af0ceeSJacob Faibussowitsch PETSC_STATIC_INLINE PetscErrorCode AssertDeviceContextDoesNotExist(PetscDeviceContext dctx)
136a4af0ceeSJacob Faibussowitsch {
137a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
138*9a202e32SJacob Faibussowitsch   PetscAssert(!dctx,PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscDeviceContext was not destroyed");
139a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
140a4af0ceeSJacob Faibussowitsch }
141a4af0ceeSJacob Faibussowitsch 
142a4af0ceeSJacob Faibussowitsch PETSC_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*9a202e32SJacob Faibussowitsch   PetscAssert(left == right,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,errStr,PetscStreamTypes[left],PetscStreamTypes[right]);
148a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
149a4af0ceeSJacob Faibussowitsch }
150a4af0ceeSJacob Faibussowitsch 
151a4af0ceeSJacob Faibussowitsch PETSC_STATIC_INLINE PetscErrorCode AssertPetscDevicesValidAndEqual(PetscDevice left, PetscDevice right, const char *errStr)
152a4af0ceeSJacob Faibussowitsch {
153a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
154a4af0ceeSJacob Faibussowitsch   PetscCheckCompatibleDevices(left,1,right,2);
155*9a202e32SJacob Faibussowitsch   PetscAssert(left == right,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"%s",errStr);
156a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
157a4af0ceeSJacob Faibussowitsch }
158a4af0ceeSJacob Faibussowitsch 
159a4af0ceeSJacob Faibussowitsch PETSC_STATIC_INLINE PetscErrorCode AssertPetscDeviceContextsValidAndEqual(PetscDeviceContext left, PetscDeviceContext right, const char *errStr)
160a4af0ceeSJacob Faibussowitsch {
161a4af0ceeSJacob Faibussowitsch   PetscFunctionBegin;
162a4af0ceeSJacob Faibussowitsch   PetscCheckCompatibleDeviceContexts(left,1,right,2);
163*9a202e32SJacob Faibussowitsch   PetscAssert(left == right,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"%s",errStr);
164a4af0ceeSJacob Faibussowitsch   PetscFunctionReturn(0);
165a4af0ceeSJacob Faibussowitsch }
166a4af0ceeSJacob Faibussowitsch #endif /* PETSCDEVICETESTCOMMON_H */
167