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