1*a4963045SJacob Faibussowitsch #pragma once 2a4af0ceeSJacob Faibussowitsch 30e6b6b59SJacob Faibussowitsch /* this file needs to be the one to include petsc/private/deviceimpl.h since it needs to define 40e6b6b59SJacob Faibussowitsch * a special macro to ensure that the error checking macros stay defined even in optimized 50e6b6b59SJacob Faibussowitsch * builds 6a4af0ceeSJacob Faibussowitsch */ 70e6b6b59SJacob Faibussowitsch #if defined(PETSCDEVICEIMPL_H) 80e6b6b59SJacob Faibussowitsch #error "must #include this file before petsc/private/deviceimpl.h" 90e6b6b59SJacob Faibussowitsch #endif 10a4af0ceeSJacob Faibussowitsch 110e6b6b59SJacob Faibussowitsch #if !defined(PETSC_DEVICE_KEEP_ERROR_CHECKING_MACROS) 120e6b6b59SJacob Faibussowitsch #define PETSC_DEVICE_KEEP_ERROR_CHECKING_MACROS 1 130e6b6b59SJacob Faibussowitsch #endif 140e6b6b59SJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 15a4af0ceeSJacob Faibussowitsch 16d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode AssertDeviceExists(PetscDevice device) 17d71ae5a4SJacob Faibussowitsch { 18a4af0ceeSJacob Faibussowitsch PetscFunctionBegin; 19a4af0ceeSJacob Faibussowitsch PetscValidDevice(device, 1); 203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21a4af0ceeSJacob Faibussowitsch } 22a4af0ceeSJacob Faibussowitsch 23d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode AssertDeviceDoesNotExist(PetscDevice device) 24d71ae5a4SJacob Faibussowitsch { 25a4af0ceeSJacob Faibussowitsch PetscFunctionBegin; 262c71b3e2SJacob Faibussowitsch PetscCheck(!device, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDevice was not destroyed for type %s", PetscDeviceTypes[device->type]); 273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 28a4af0ceeSJacob Faibussowitsch } 29a4af0ceeSJacob Faibussowitsch 30d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode AssertDeviceContextExists(PetscDeviceContext dctx) 31d71ae5a4SJacob Faibussowitsch { 32a4af0ceeSJacob Faibussowitsch PetscFunctionBegin; 33a4af0ceeSJacob Faibussowitsch PetscValidDeviceContext(dctx, 1); 343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35a4af0ceeSJacob Faibussowitsch } 36a4af0ceeSJacob Faibussowitsch 37d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode AssertDeviceContextDoesNotExist(PetscDeviceContext dctx) 38d71ae5a4SJacob Faibussowitsch { 39a4af0ceeSJacob Faibussowitsch PetscFunctionBegin; 402c71b3e2SJacob Faibussowitsch PetscCheck(!dctx, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDeviceContext was not destroyed"); 413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 42a4af0ceeSJacob Faibussowitsch } 43a4af0ceeSJacob Faibussowitsch 44d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode AssertPetscStreamTypesValidAndEqual(PetscStreamType left, PetscStreamType right, const char *errStr) 45d71ae5a4SJacob Faibussowitsch { 46a4af0ceeSJacob Faibussowitsch PetscFunctionBegin; 47a4af0ceeSJacob Faibussowitsch PetscValidStreamType(left, 1); 48a4af0ceeSJacob Faibussowitsch PetscValidStreamType(right, 2); 492c71b3e2SJacob Faibussowitsch PetscCheck(left == right, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, errStr, PetscStreamTypes[left], PetscStreamTypes[right]); 503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 51a4af0ceeSJacob Faibussowitsch } 52a4af0ceeSJacob Faibussowitsch 53d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode AssertPetscDeviceTypesValidAndEqual(PetscDeviceType left, PetscDeviceType right, const char *errStr) 54d71ae5a4SJacob Faibussowitsch { 550e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 560e6b6b59SJacob Faibussowitsch PetscValidDeviceType(left, 1); 570e6b6b59SJacob Faibussowitsch PetscValidDeviceType(right, 2); 580e6b6b59SJacob Faibussowitsch PetscCheck(left == right, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, errStr, PetscDeviceTypes[left], PetscDeviceTypes[right]); 593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 600e6b6b59SJacob Faibussowitsch } 610e6b6b59SJacob Faibussowitsch 62d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode AssertPetscDevicesValidAndEqual(PetscDevice left, PetscDevice right, const char *errStr) 63d71ae5a4SJacob Faibussowitsch { 64a4af0ceeSJacob Faibussowitsch PetscFunctionBegin; 65a4af0ceeSJacob Faibussowitsch PetscCheckCompatibleDevices(left, 1, right, 2); 667fca85f3SJacob Faibussowitsch PetscCheck(left == right, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "%s: %p != %p", errStr, (void *)left, (void *)right); 673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 68a4af0ceeSJacob Faibussowitsch } 69a4af0ceeSJacob Faibussowitsch 70d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode AssertPetscDeviceContextsValidAndEqual(PetscDeviceContext left, PetscDeviceContext right, const char *errStr) 71d71ae5a4SJacob Faibussowitsch { 72a4af0ceeSJacob Faibussowitsch PetscFunctionBegin; 73a4af0ceeSJacob Faibussowitsch PetscCheckCompatibleDeviceContexts(left, 1, right, 2); 742c71b3e2SJacob Faibussowitsch PetscCheck(left == right, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "%s", errStr); 753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 76a4af0ceeSJacob Faibussowitsch } 77