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