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 #elif defined(PETSC_USE_REAL___FLOAT128) 33 else if (ptype == PETSC_COMPLEX) *mtype = MPIU___COMPLEX128; 34 #else 35 else if (ptype == PETSC_COMPLEX) *mtype = MPIU_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_FLOAT) *mtype = MPI_FLOAT; 43 else if (ptype == PETSC_CHAR) *mtype = MPI_CHAR; 44 else if (ptype == PETSC_BIT_LOGICAL) *mtype = MPI_BYTE; 45 #if defined(PETSC_USE_REAL___FLOAT128) 46 else if (ptype == PETSC___FLOAT128) *mtype = MPIU___FLOAT128; 47 #endif 48 else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype"); 49 PetscFunctionReturn(0); 50 } 51 52 #undef __FUNCT__ 53 #define __FUNCT__ "PetscMPIDataTypeToPetscDataType" 54 /*@C 55 PetscMPIDataTypeToPetscDataType Finds the PETSc name of a datatype from its MPI name 56 57 Not collective 58 59 Input Parameter: 60 . mtype - the MPI datatype (for example MPI_DOUBLE, ...) 61 62 Output Parameter: 63 . ptype - the PETSc datatype name (for example PETSC_DOUBLE) 64 65 Level: advanced 66 67 .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType() 68 @*/ 69 PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype mtype,PetscDataType *ptype) 70 { 71 PetscFunctionBegin; 72 if (mtype == MPIU_INT) *ptype = PETSC_INT; 73 else if (mtype == MPI_INT) *ptype = PETSC_INT; 74 else if (mtype == MPI_DOUBLE) *ptype = PETSC_DOUBLE; 75 #if defined(PETSC_USE_COMPLEX) 76 #if defined(PETSC_USE_REAL_SINGLE) 77 else if (mtype == MPIU_C_COMPLEX) *ptype = PETSC_COMPLEX; 78 #elif defined(PETSC_USE_REAL___FLOAT128) 79 else if (mtype == MPIU___COMPLEX128) *ptype = PETSC_COMPLEX; 80 #else 81 else if (mtype == MPIU_C_DOUBLE_COMPLEX) *ptype = PETSC_COMPLEX; 82 #endif 83 #endif 84 else if (mtype == MPI_LONG) *ptype = PETSC_LONG; 85 else if (mtype == MPI_SHORT) *ptype = PETSC_SHORT; 86 else if (mtype == MPI_FLOAT) *ptype = PETSC_FLOAT; 87 else if (mtype == MPI_CHAR) *ptype = PETSC_CHAR; 88 #if defined(PETSC_USE_REAL___FLOAT128) 89 else if (mtype == MPIU___FLOAT128) *ptype = PETSC___FLOAT128; 90 #endif 91 else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unhandled MPI datatype"); 92 PetscFunctionReturn(0); 93 } 94 95 typedef enum {PETSC_INT_SIZE = sizeof(PetscInt), 96 PETSC_DOUBLE_SIZE = sizeof(double), 97 PETSC_COMPLEX_SIZE = sizeof(PetscScalar), 98 PETSC_LONG_SIZE = sizeof(long), 99 PETSC_SHORT_SIZE = sizeof(short), 100 PETSC_FLOAT_SIZE = sizeof(float), 101 PETSC_CHAR_SIZE = sizeof(char), 102 PETSC_BIT_LOGICAL_SIZE = sizeof(char), 103 PETSC_ENUM_SIZE = sizeof(PetscBool), 104 PETSC_BOOL_SIZE = sizeof(PetscBool), 105 PETSC___FLOAT128_SIZE = sizeof(long double) 106 } PetscDataTypeSize; 107 108 #undef __FUNCT__ 109 #define __FUNCT__ "PetscDataTypeGetSize" 110 /*@C 111 PetscDataTypeGetSize - Gets the size (in bytes) of a PETSc datatype 112 113 Not collective 114 115 Input Parameter: 116 . ptype - the PETSc datatype name (for example PETSC_DOUBLE) 117 118 Output Parameter: 119 . size - the size in bytes (for example the size of PETSC_DOUBLE is 8) 120 121 Level: advanced 122 123 .seealso: PetscDataType, PetscDataTypeToMPIDataType() 124 @*/ 125 PetscErrorCode PetscDataTypeGetSize(PetscDataType ptype,size_t *size) 126 { 127 PetscFunctionBegin; 128 if ((int) ptype < 0) { 129 *size = -(int) ptype; 130 PetscFunctionReturn(0); 131 } 132 133 if (ptype == PETSC_INT) *size = PETSC_INT_SIZE; 134 else if (ptype == PETSC_DOUBLE) *size = PETSC_DOUBLE_SIZE; 135 #if defined(PETSC_USE_COMPLEX) 136 else if (ptype == PETSC_COMPLEX) *size = PETSC_COMPLEX_SIZE; 137 #endif 138 else if (ptype == PETSC_LONG) *size = PETSC_LONG_SIZE; 139 else if (ptype == PETSC_SHORT) *size = PETSC_SHORT_SIZE; 140 else if (ptype == PETSC_FLOAT) *size = PETSC_FLOAT_SIZE; 141 else if (ptype == PETSC_CHAR) *size = PETSC_CHAR_SIZE; 142 else if (ptype == PETSC_ENUM) *size = PETSC_ENUM_SIZE; 143 else if (ptype == PETSC_BIT_LOGICAL) *size = PETSC_BIT_LOGICAL_SIZE; 144 else if (ptype == PETSC_BOOL) *size = PETSC_BOOL_SIZE; 145 else if (ptype == PETSC___FLOAT128) *size = PETSC___FLOAT128_SIZE; 146 else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype"); 147 PetscFunctionReturn(0); 148 } 149 150 #undef __FUNCT__ 151 #define __FUNCT__ "PetscDataTypeFromString" 152 /*@ 153 PetscDataTypeFromString - Gets the enum value of a PETSc datatype represented as a string 154 155 Not collective 156 157 Input Parameter: 158 . name - the PETSc datatype name (for example, DOUBLE or real or Scalar) 159 160 Output Parameter: 161 + ptype - the enum value 162 - found - the string matches one of the data types 163 164 Level: advanced 165 166 .seealso: PetscDataType, PetscDataTypeToMPIDataType(), PetscDataTypeGetSize() 167 @*/ 168 PetscErrorCode PetscDataTypeFromString(const char*name, PetscDataType *ptype,PetscBool *found) 169 { 170 PetscErrorCode ierr; 171 172 PetscFunctionBegin; 173 ierr = PetscEnumFind(PetscDataTypes,name,(PetscEnum*)ptype,found);CHKERRQ(ierr); 174 if (!*found) { 175 char formatted[16]; 176 177 ierr = PetscStrncpy(formatted,name,16);CHKERRQ(ierr); 178 ierr = PetscStrtolower(formatted);CHKERRQ(ierr); 179 ierr = PetscStrcmp(formatted,"scalar",found);CHKERRQ(ierr); 180 if (*found) { 181 *ptype = PETSC_SCALAR; 182 } else { 183 ierr = PetscStrcmp(formatted,"real",found);CHKERRQ(ierr); 184 if (*found) { 185 *ptype = PETSC_REAL; 186 } 187 } 188 } 189 PetscFunctionReturn(0); 190 } 191