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", 8 "DOUBLE","COMPLEX","LONG","SHORT","FLOAT", 9 "CHAR","LOGICAL","ENUM","BOOL","LONGDOUBLE", 10 "OBJECT","FUNCTION","STRING","FP16","STRUCT", 11 "INT", 12 "PetscDataType","PETSC_",0}; 13 14 /*@C 15 PetscDataTypeToMPIDataType - Converts the PETSc name of a datatype to its MPI name. 16 17 Not collective 18 19 Input Parameter: 20 . ptype - the PETSc datatype name (for example PETSC_DOUBLE) 21 22 Output Parameter: 23 . mtype - the MPI datatype (for example MPI_DOUBLE, ...) 24 25 Level: advanced 26 27 .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType() 28 @*/ 29 PetscErrorCode PetscDataTypeToMPIDataType(PetscDataType ptype,MPI_Datatype *mtype) 30 { 31 PetscFunctionBegin; 32 if (ptype == PETSC_INT) *mtype = MPIU_INT; 33 else if (ptype == PETSC_DOUBLE) *mtype = MPI_DOUBLE; 34 #if defined(PETSC_USE_COMPLEX) 35 #if defined(PETSC_USE_REAL_SINGLE) 36 else if (ptype == PETSC_COMPLEX) *mtype = MPIU_C_COMPLEX; 37 #elif defined(PETSC_USE_REAL___FLOAT128) 38 else if (ptype == PETSC_COMPLEX) *mtype = MPIU___COMPLEX128; 39 #else 40 else if (ptype == PETSC_COMPLEX) *mtype = MPIU_C_DOUBLE_COMPLEX; 41 #endif 42 #endif 43 else if (ptype == PETSC_LONG) *mtype = MPI_LONG; 44 else if (ptype == PETSC_SHORT) *mtype = MPI_SHORT; 45 else if (ptype == PETSC_ENUM) *mtype = MPI_INT; 46 else if (ptype == PETSC_BOOL) *mtype = MPI_INT; 47 else if (ptype == PETSC_FLOAT) *mtype = MPI_FLOAT; 48 else if (ptype == PETSC_CHAR) *mtype = MPI_CHAR; 49 else if (ptype == PETSC_BIT_LOGICAL) *mtype = MPI_BYTE; 50 #if defined(PETSC_USE_REAL___FLOAT128) 51 else if (ptype == PETSC___FLOAT128) *mtype = MPIU___FLOAT128; 52 #elif defined(PETSC_USE_REAL___FP16) 53 else if (ptype == PETSC___FP16) *mtype = MPIU___FP16; 54 #endif 55 else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype"); 56 PetscFunctionReturn(0); 57 } 58 59 /*@C 60 PetscMPIDataTypeToPetscDataType Finds the PETSc name of a datatype from its MPI name 61 62 Not collective 63 64 Input Parameter: 65 . mtype - the MPI datatype (for example MPI_DOUBLE, ...) 66 67 Output Parameter: 68 . ptype - the PETSc datatype name (for example PETSC_DOUBLE) 69 70 Level: advanced 71 72 .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType() 73 @*/ 74 PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype mtype,PetscDataType *ptype) 75 { 76 PetscFunctionBegin; 77 if (mtype == MPIU_INT) *ptype = PETSC_INT; 78 #if defined(PETSC_USE_64BIT_INDICES) 79 else if (mtype == MPI_INT) *ptype = PETSC_ENUM; 80 #endif 81 else if (mtype == MPI_DOUBLE) *ptype = PETSC_DOUBLE; 82 #if defined(PETSC_USE_COMPLEX) 83 #if defined(PETSC_USE_REAL_SINGLE) 84 else if (mtype == MPIU_C_COMPLEX) *ptype = PETSC_COMPLEX; 85 #elif defined(PETSC_USE_REAL___FLOAT128) 86 else if (mtype == MPIU___COMPLEX128) *ptype = PETSC_COMPLEX; 87 #else 88 else if (mtype == MPIU_C_DOUBLE_COMPLEX) *ptype = PETSC_COMPLEX; 89 #endif 90 #endif 91 else if (mtype == MPI_LONG) *ptype = PETSC_LONG; 92 else if (mtype == MPI_SHORT) *ptype = PETSC_SHORT; 93 else if (mtype == MPI_FLOAT) *ptype = PETSC_FLOAT; 94 else if (mtype == MPI_CHAR) *ptype = PETSC_CHAR; 95 #if defined(PETSC_USE_REAL___FLOAT128) 96 else if (mtype == MPIU___FLOAT128) *ptype = PETSC___FLOAT128; 97 #elif defined(PETSC_USE_REAL___FP16) 98 else if (mtype == MPIU___FP16) *ptype = PETSC___FP16; 99 #endif 100 else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unhandled MPI datatype"); 101 PetscFunctionReturn(0); 102 } 103 104 typedef enum {PETSC_INT_SIZE = sizeof(PetscInt), 105 PETSC_DOUBLE_SIZE = sizeof(double), 106 PETSC_COMPLEX_SIZE = sizeof(PetscScalar), 107 PETSC_LONG_SIZE = sizeof(long), 108 PETSC_SHORT_SIZE = sizeof(short), 109 PETSC_FLOAT_SIZE = sizeof(float), 110 PETSC_CHAR_SIZE = sizeof(char), 111 PETSC_BIT_LOGICAL_SIZE = sizeof(char), 112 PETSC_ENUM_SIZE = sizeof(PetscBool), 113 PETSC_BOOL_SIZE = sizeof(PetscBool) 114 #if defined(PETSC_USE_REAL___FLOAT128) 115 ,PETSC___FLOAT128_SIZE = sizeof(__float128) 116 #elif defined(PETSC_USE_REAL___FP16) 117 ,PETSC___FP16_SIZE = sizeof(__fp16) 118 #endif 119 } PetscDataTypeSize; 120 121 /*@C 122 PetscDataTypeGetSize - Gets the size (in bytes) of a PETSc datatype 123 124 Not collective 125 126 Input Parameter: 127 . ptype - the PETSc datatype name (for example PETSC_DOUBLE) 128 129 Output Parameter: 130 . size - the size in bytes (for example the size of PETSC_DOUBLE is 8) 131 132 Level: advanced 133 134 .seealso: PetscDataType, PetscDataTypeToMPIDataType() 135 @*/ 136 PetscErrorCode PetscDataTypeGetSize(PetscDataType ptype,size_t *size) 137 { 138 PetscFunctionBegin; 139 if ((int) ptype < 0) { 140 *size = -(int) ptype; 141 PetscFunctionReturn(0); 142 } 143 144 if (ptype == PETSC_INT) *size = PETSC_INT_SIZE; 145 else if (ptype == PETSC_DOUBLE) *size = PETSC_DOUBLE_SIZE; 146 #if defined(PETSC_USE_COMPLEX) 147 else if (ptype == PETSC_COMPLEX) *size = PETSC_COMPLEX_SIZE; 148 #endif 149 else if (ptype == PETSC_LONG) *size = PETSC_LONG_SIZE; 150 else if (ptype == PETSC_SHORT) *size = PETSC_SHORT_SIZE; 151 else if (ptype == PETSC_FLOAT) *size = PETSC_FLOAT_SIZE; 152 else if (ptype == PETSC_CHAR) *size = PETSC_CHAR_SIZE; 153 else if (ptype == PETSC_ENUM) *size = PETSC_ENUM_SIZE; 154 else if (ptype == PETSC_BIT_LOGICAL) *size = PETSC_BIT_LOGICAL_SIZE; 155 else if (ptype == PETSC_BOOL) *size = PETSC_BOOL_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(0); 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 or Scalar) 172 173 Output Parameter: 174 + ptype - the enum value 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 PetscErrorCode ierr; 184 185 PetscFunctionBegin; 186 ierr = PetscEnumFind(PetscDataTypes,name,(PetscEnum*)ptype,found);CHKERRQ(ierr); 187 if (!*found) { 188 char formatted[16]; 189 190 ierr = PetscStrncpy(formatted,name,16);CHKERRQ(ierr); 191 ierr = PetscStrtolower(formatted);CHKERRQ(ierr); 192 ierr = PetscStrcmp(formatted,"scalar",found);CHKERRQ(ierr); 193 if (*found) { 194 *ptype = PETSC_SCALAR; 195 } else { 196 ierr = PetscStrcmp(formatted,"real",found);CHKERRQ(ierr); 197 if (*found) { 198 *ptype = PETSC_REAL; 199 } 200 } 201 } 202 PetscFunctionReturn(0); 203 } 204