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