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