1 2 /* 3 Provides utility routines for manipulating any type of PETSc object. 4 */ 5 #include <petscsys.h> /*I "petscsys.h" I*/ 6 7 #undef __FUNCT__ 8 #define __FUNCT__ "PetscDataTypeToMPIDataType" 9 /*@C 10 PetscDataTypeToMPIDataType - Converts the PETSc name of a datatype to its MPI name. 11 12 Not collective 13 14 Input Parameter: 15 . ptype - the PETSc datatype name (for example PETSC_DOUBLE) 16 17 Output Parameter: 18 . mtype - the MPI datatype (for example MPI_DOUBLE, ...) 19 20 Level: advanced 21 22 .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType() 23 @*/ 24 PetscErrorCode PetscDataTypeToMPIDataType(PetscDataType ptype,MPI_Datatype *mtype) 25 { 26 PetscFunctionBegin; 27 if (ptype == PETSC_INT) *mtype = MPIU_INT; 28 else if (ptype == PETSC_DOUBLE) *mtype = MPI_DOUBLE; 29 #if defined(PETSC_USE_COMPLEX) 30 #if defined(PETSC_USE_REAL_SINGLE) 31 else if (ptype == PETSC_COMPLEX) *mtype = MPIU_C_COMPLEX; 32 #else 33 else if (ptype == PETSC_COMPLEX) *mtype = MPIU_C_DOUBLE_COMPLEX; 34 #endif 35 #endif 36 else if (ptype == PETSC_LONG) *mtype = MPI_LONG; 37 else if (ptype == PETSC_SHORT) *mtype = MPI_SHORT; 38 else if (ptype == PETSC_ENUM) *mtype = MPI_INT; 39 else if (ptype == PETSC_BOOL) *mtype = MPI_INT; 40 else if (ptype == PETSC_FLOAT) *mtype = MPI_FLOAT; 41 else if (ptype == PETSC_CHAR) *mtype = MPI_CHAR; 42 else if (ptype == PETSC_BIT_LOGICAL) *mtype = MPI_BYTE; 43 else if (ptype == PETSC___FLOAT128) *mtype = MPI_LONG_DOUBLE; 44 else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype"); 45 PetscFunctionReturn(0); 46 } 47 48 #undef __FUNCT__ 49 #define __FUNCT__ "PetscMPIDataTypeToPetscDataType" 50 /*@C 51 PetscMPIDataTypeToPetscDataType Finds the PETSc name of a datatype from its MPI name 52 53 Not collective 54 55 Input Parameter: 56 . mtype - the MPI datatype (for example MPI_DOUBLE, ...) 57 58 Output Parameter: 59 . ptype - the PETSc datatype name (for example PETSC_DOUBLE) 60 61 Level: advanced 62 63 .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType() 64 @*/ 65 PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype mtype,PetscDataType *ptype) 66 { 67 PetscFunctionBegin; 68 if (mtype == MPIU_INT) *ptype = PETSC_INT; 69 else if (mtype == MPI_INT) *ptype = PETSC_INT; 70 else if (mtype == MPI_DOUBLE) *ptype = PETSC_DOUBLE; 71 #if defined(PETSC_USE_COMPLEX) 72 #if defined(PETSC_USE_REAL_SINGLE) 73 else if (mtype == MPIU_C_COMPLEX) *ptype = PETSC_COMPLEX; 74 #else 75 else if (mtype == MPIU_C_DOUBLE_COMPLEX) *ptype = PETSC_COMPLEX; 76 #endif 77 #endif 78 else if (mtype == MPI_LONG) *ptype = PETSC_LONG; 79 else if (mtype == MPI_SHORT) *ptype = PETSC_SHORT; 80 else if (mtype == MPI_FLOAT) *ptype = PETSC_FLOAT; 81 else if (mtype == MPI_CHAR) *ptype = PETSC_CHAR; 82 else if (mtype == MPI_LONG_DOUBLE) *ptype = PETSC___FLOAT128; 83 else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unhandled MPI datatype"); 84 PetscFunctionReturn(0); 85 } 86 87 typedef enum {PETSC_INT_SIZE = sizeof(PetscInt), 88 PETSC_DOUBLE_SIZE = sizeof(double), 89 PETSC_COMPLEX_SIZE = sizeof(PetscScalar), 90 PETSC_LONG_SIZE = sizeof(long), 91 PETSC_SHORT_SIZE = sizeof(short), 92 PETSC_FLOAT_SIZE = sizeof(float), 93 PETSC_CHAR_SIZE = sizeof(char), 94 PETSC_BIT_LOGICAL_SIZE = sizeof(char), 95 PETSC_ENUM_SIZE = sizeof(PetscBool), 96 PETSC_BOOL_SIZE = sizeof(PetscBool), 97 PETSC___FLOAT128_SIZE = sizeof(long double) 98 } PetscDataTypeSize; 99 100 #undef __FUNCT__ 101 #define __FUNCT__ "PetscDataTypeGetSize" 102 /*@ 103 PetscDataTypeGetSize - Gets the size (in bytes) of a PETSc datatype 104 105 Not collective 106 107 Input Parameter: 108 . ptype - the PETSc datatype name (for example PETSC_DOUBLE) 109 110 Output Parameter: 111 . size - the size in bytes (for example the size of PETSC_DOUBLE is 8) 112 113 Level: advanced 114 115 .seealso: PetscDataType, PetscDataTypeToMPIDataType() 116 @*/ 117 PetscErrorCode PetscDataTypeGetSize(PetscDataType ptype,size_t *size) 118 { 119 PetscFunctionBegin; 120 if ((int) ptype < 0) { 121 *size = -(int) ptype; 122 PetscFunctionReturn(0); 123 } 124 125 if (ptype == PETSC_INT) *size = PETSC_INT_SIZE; 126 else if (ptype == PETSC_DOUBLE) *size = PETSC_DOUBLE_SIZE; 127 #if defined(PETSC_USE_COMPLEX) 128 else if (ptype == PETSC_COMPLEX) *size = PETSC_COMPLEX_SIZE; 129 #endif 130 else if (ptype == PETSC_LONG) *size = PETSC_LONG_SIZE; 131 else if (ptype == PETSC_SHORT) *size = PETSC_SHORT_SIZE; 132 else if (ptype == PETSC_FLOAT) *size = PETSC_FLOAT_SIZE; 133 else if (ptype == PETSC_CHAR) *size = PETSC_CHAR_SIZE; 134 else if (ptype == PETSC_ENUM) *size = PETSC_ENUM_SIZE; 135 else if (ptype == PETSC_BIT_LOGICAL) *size = PETSC_BIT_LOGICAL_SIZE; 136 else if (ptype == PETSC_BOOL) *size = PETSC_BOOL_SIZE; 137 else if (ptype == PETSC___FLOAT128) *size = PETSC___FLOAT128_SIZE; 138 else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype"); 139 PetscFunctionReturn(0); 140 } 141