1 2 /* 3 Provides utility routines for manipulating any type of PETSc object. 4 */ 5 #include <petscsys.h> /*I "petscsys.h" I*/ 6 7 const char *const PetscDataTypes[] = {"UNKNOWN", "DOUBLE", "COMPLEX", "LONG", "SHORT", "FLOAT", "CHAR", "LOGICAL", "ENUM", "BOOL", "LONGDOUBLE", "OBJECT", "FUNCTION", "STRING", "FP16", "STRUCT", "INT", "INT64", "PetscDataType", "PETSC_", NULL}; 8 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_HAVE_COMPLEX) 30 #if defined(PETSC_USE_REAL_SINGLE) 31 else if (ptype == PETSC_COMPLEX) *mtype = MPI_C_COMPLEX; 32 #elif defined(PETSC_USE_REAL___FLOAT128) 33 else if (ptype == PETSC_COMPLEX) *mtype = MPIU___COMPLEX128; 34 #else 35 else if (ptype == PETSC_COMPLEX) *mtype = MPI_C_DOUBLE_COMPLEX; 36 #endif 37 #endif 38 else if (ptype == PETSC_LONG) *mtype = MPI_LONG; 39 else if (ptype == PETSC_SHORT) *mtype = MPI_SHORT; 40 else if (ptype == PETSC_ENUM) *mtype = MPI_INT; 41 else if (ptype == PETSC_BOOL) *mtype = MPI_INT; 42 else if (ptype == PETSC_INT64) *mtype = MPIU_INT64; 43 else if (ptype == PETSC_FLOAT) *mtype = MPI_FLOAT; 44 else if (ptype == PETSC_CHAR) *mtype = MPI_CHAR; 45 else if (ptype == PETSC_BIT_LOGICAL) *mtype = MPI_BYTE; 46 #if defined(PETSC_USE_REAL___FLOAT128) 47 else if (ptype == PETSC___FLOAT128) *mtype = MPIU___FLOAT128; 48 #elif defined(PETSC_USE_REAL___FP16) 49 else if (ptype == PETSC___FP16) *mtype = MPIU___FP16; 50 #endif 51 else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Unknown PETSc datatype"); 52 PetscFunctionReturn(PETSC_SUCCESS); 53 } 54 55 /*@C 56 PetscMPIDataTypeToPetscDataType - Finds the PETSc name of a datatype from its MPI name 57 58 Not collective 59 60 Input Parameter: 61 . mtype - the MPI datatype (for example `MPI_DOUBLE`, ...) 62 63 Output Parameter: 64 . ptype - the PETSc datatype name (for example `PETSC_DOUBLE`) 65 66 Level: advanced 67 68 .seealso: `PetscDataType`, `PetscMPIDataTypeToPetscDataType()` 69 @*/ 70 PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype mtype, PetscDataType *ptype) 71 { 72 PetscFunctionBegin; 73 if (mtype == MPIU_INT) *ptype = PETSC_INT; 74 #if defined(PETSC_USE_64BIT_INDICES) 75 else if (mtype == MPI_INT) *ptype = PETSC_ENUM; 76 #endif 77 else if (mtype == MPIU_INT64) *ptype = PETSC_INT64; 78 else if (mtype == MPI_DOUBLE) *ptype = PETSC_DOUBLE; 79 #if defined(PETSC_HAVE_COMPLEX) 80 #if defined(PETSC_USE_REAL_SINGLE) 81 else if (mtype == MPI_C_COMPLEX) *ptype = PETSC_COMPLEX; 82 #elif defined(PETSC_USE_REAL___FLOAT128) 83 else if (mtype == MPIU___COMPLEX128) *ptype = PETSC_COMPLEX; 84 #else 85 else if (mtype == MPI_C_DOUBLE_COMPLEX) *ptype = PETSC_COMPLEX; 86 #endif 87 #endif 88 else if (mtype == MPI_LONG) *ptype = PETSC_LONG; 89 else if (mtype == MPI_SHORT) *ptype = PETSC_SHORT; 90 else if (mtype == MPI_FLOAT) *ptype = PETSC_FLOAT; 91 else if (mtype == MPI_CHAR) *ptype = PETSC_CHAR; 92 #if defined(PETSC_USE_REAL___FLOAT128) 93 else if (mtype == MPIU___FLOAT128) *ptype = PETSC___FLOAT128; 94 #elif defined(PETSC_USE_REAL___FP16) 95 else if (mtype == MPIU___FP16) *ptype = PETSC___FP16; 96 #endif 97 else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unhandled MPI datatype"); 98 PetscFunctionReturn(PETSC_SUCCESS); 99 } 100 101 typedef enum { 102 PETSC_INT_SIZE = sizeof(PetscInt), 103 PETSC_DOUBLE_SIZE = sizeof(double), 104 #if defined(PETSC_HAVE_COMPLEX) 105 PETSC_COMPLEX_SIZE = sizeof(PetscComplex), 106 #else 107 PETSC_COMPLEX_SIZE = 2 * sizeof(PetscReal), 108 #endif 109 PETSC_LONG_SIZE = sizeof(long), 110 PETSC_SHORT_SIZE = sizeof(short), 111 PETSC_FLOAT_SIZE = sizeof(float), 112 PETSC_CHAR_SIZE = sizeof(char), 113 PETSC_ENUM_SIZE = sizeof(PetscEnum), 114 PETSC_BOOL_SIZE = sizeof(PetscBool), 115 PETSC_INT64_SIZE = sizeof(PetscInt64), 116 PETSC_BIT_LOGICAL_SIZE = sizeof(char) 117 #if defined(PETSC_USE_REAL___FLOAT128) 118 , 119 PETSC___FLOAT128_SIZE = sizeof(__float128) 120 #elif defined(PETSC_USE_REAL___FP16) 121 , 122 PETSC___FP16_SIZE = sizeof(__fp16) 123 #endif 124 } PetscDataTypeSize; 125 126 /*@C 127 PetscDataTypeGetSize - Gets the size (in bytes) of a PETSc datatype 128 129 Not collective 130 131 Input Parameter: 132 . ptype - the PETSc datatype name (for example `PETSC_DOUBLE`) 133 134 Output Parameter: 135 . size - the size in bytes (for example the size of `PETSC_DOUBLE` is 8) 136 137 Level: advanced 138 139 .seealso: `PetscDataType`, `PetscDataTypeToMPIDataType()` 140 @*/ 141 PetscErrorCode PetscDataTypeGetSize(PetscDataType ptype, size_t *size) 142 { 143 PetscFunctionBegin; 144 if ((int)ptype < 0) *size = -(int)ptype; 145 else if (ptype == PETSC_INT) *size = PETSC_INT_SIZE; 146 else if (ptype == PETSC_DOUBLE) *size = PETSC_DOUBLE_SIZE; 147 else if (ptype == PETSC_COMPLEX) *size = PETSC_COMPLEX_SIZE; 148 else if (ptype == PETSC_LONG) *size = PETSC_LONG_SIZE; 149 else if (ptype == PETSC_SHORT) *size = PETSC_SHORT_SIZE; 150 else if (ptype == PETSC_FLOAT) *size = PETSC_FLOAT_SIZE; 151 else if (ptype == PETSC_CHAR) *size = PETSC_CHAR_SIZE; 152 else if (ptype == PETSC_ENUM) *size = PETSC_ENUM_SIZE; 153 else if (ptype == PETSC_BOOL) *size = PETSC_BOOL_SIZE; 154 else if (ptype == PETSC_INT64) *size = PETSC_INT64_SIZE; 155 else if (ptype == PETSC_BIT_LOGICAL) *size = PETSC_BIT_LOGICAL_SIZE; 156 #if defined(PETSC_USE_REAL___FLOAT128) 157 else if (ptype == PETSC___FLOAT128) *size = PETSC___FLOAT128_SIZE; 158 #elif defined(PETSC_USE_REAL___FP16) 159 else if (ptype == PETSC___FP16) *size = PETSC___FP16_SIZE; 160 #endif 161 else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Unknown PETSc datatype"); 162 PetscFunctionReturn(PETSC_SUCCESS); 163 } 164 165 /*@C 166 PetscDataTypeFromString - Gets the enum value of a PETSc datatype represented as a string 167 168 Not collective 169 170 Input Parameter: 171 . name - the PETSc datatype name (for example, "double" or "real") 172 173 Output Parameters: 174 + ptype - the enum value, only valid if found is `PETSC_TRUE` 175 - found - the string matches one of the data types 176 177 Level: advanced 178 179 .seealso: `PetscDataType`, `PetscDataTypeToMPIDataType()`, `PetscDataTypeGetSize()` 180 @*/ 181 PetscErrorCode PetscDataTypeFromString(const char *name, PetscDataType *ptype, PetscBool *found) 182 { 183 PetscFunctionBegin; 184 PetscCall(PetscEnumFind(PetscDataTypes, name, (PetscEnum *)ptype, found)); 185 if (!*found) { 186 char formatted[16]; 187 188 PetscCall(PetscStrncpy(formatted, name, 16)); 189 PetscCall(PetscStrtolower(formatted)); 190 PetscCall(PetscStrcmp(formatted, "scalar", found)); 191 if (*found) { 192 *ptype = PETSC_SCALAR; 193 } else { 194 PetscCall(PetscStrcmp(formatted, "real", found)); 195 if (*found) *ptype = PETSC_REAL; 196 } 197 } 198 PetscFunctionReturn(PETSC_SUCCESS); 199 } 200