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
AssertDeviceExists(PetscDevice device)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
AssertDeviceDoesNotExist(PetscDevice device)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
AssertDeviceContextExists(PetscDeviceContext dctx)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
AssertDeviceContextDoesNotExist(PetscDeviceContext dctx)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
AssertPetscStreamTypesValidAndEqual(PetscStreamType left,PetscStreamType right,const char * errStr)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
AssertPetscDeviceTypesValidAndEqual(PetscDeviceType left,PetscDeviceType right,const char * errStr)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
AssertPetscDevicesValidAndEqual(PetscDevice left,PetscDevice right,const char * errStr)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
AssertPetscDeviceContextsValidAndEqual(PetscDeviceContext left,PetscDeviceContext right,const char * errStr)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