xref: /petsc/src/sys/objects/ptype.c (revision 3ea0903d2ba02db55445d70698e3661f689aed8a)
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