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