xref: /petsc/src/sys/objects/ptype.c (revision 36366135a1972fb09bc2b7bdc4a57b3879d4b6c7)
1 #define PETSC_DLL
2 /*
3      Provides utility routines for manipulating any type of PETSc object.
4 */
5 #include "petsc.h"  /*I   "petsc.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 PETSC_DLLEXPORT PetscDataTypeToMPIDataType(PetscDataType ptype,MPI_Datatype* mtype)
25 {
26   PetscFunctionBegin;
27   if (ptype == PETSC_INT) {
28     *mtype = MPIU_INT;
29   } else if (ptype == PETSC_DOUBLE) {
30     *mtype = MPI_DOUBLE;
31 #if defined(PETSC_USE_COMPLEX)
32 #if defined(PETSC_USE_SCALAR_SINGLE)
33   } else if (ptype == PETSC_COMPLEX) {
34     *mtype = MPI_C_COMPLEX;
35 #else
36   } else if (ptype == PETSC_COMPLEX) {
37     *mtype = MPI_C_DOUBLE_COMPLEX;
38 #endif
39 #endif
40   } else if (ptype == PETSC_LONG) {
41     *mtype = MPI_LONG;
42   } else if (ptype == PETSC_SHORT) {
43     *mtype = MPI_SHORT;
44   } else if (ptype == PETSC_ENUM) {
45     *mtype = MPI_INT;
46   } else if (ptype == PETSC_TRUTH) {
47     *mtype = MPI_INT;
48   } else if (ptype == PETSC_FLOAT) {
49     *mtype = MPI_FLOAT;
50   } else if (ptype == PETSC_CHAR) {
51     *mtype = MPI_CHAR;
52   } else if (ptype == PETSC_LOGICAL) {
53     *mtype = MPI_BYTE;
54   } else if (ptype == PETSC_LONG_DOUBLE) {
55     *mtype = MPI_LONG_DOUBLE;
56   } else {
57     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
58   }
59   PetscFunctionReturn(0);
60 }
61 
62 #undef __FUNCT__
63 #define __FUNCT__ "PetscMPIDataTypeToPetscDataType"
64 /*@C
65      PetscMPIDataTypeToPetscDataType Finds the PETSc name of a datatype from its MPI name
66 
67    Not collective
68 
69     Input Parameter:
70 .     mtype - the MPI datatype (for example MPI_DOUBLE, ...)
71 
72     Output Parameter:
73 .     ptype - the PETSc datatype name (for example PETSC_DOUBLE)
74 
75     Level: advanced
76 
77 .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType()
78 @*/
79 PetscErrorCode PETSC_DLLEXPORT PetscMPIDataTypeToPetscDataType(MPI_Datatype mtype,PetscDataType *ptype)
80 {
81   PetscFunctionBegin;
82   if (mtype == MPIU_INT) {
83     *ptype = PETSC_INT;
84   } else if (mtype == MPI_INT) {
85     *ptype = PETSC_INT;
86   } else if (mtype == MPI_DOUBLE) {
87     *ptype = PETSC_DOUBLE;
88 #if defined(PETSC_USE_COMPLEX)
89 #if defined(PETSC_USE_SCALAR_SINGLE)
90   } else if (mtype == MPI_C_COMPLEX) {
91     *ptype = PETSC_COMPLEX;
92 #else
93   } else if (mtype == MPI_C_DOUBLE_COMPLEX) {
94     *ptype = PETSC_COMPLEX;
95 #endif
96 #endif
97   } else if (mtype == MPI_LONG) {
98     *ptype = PETSC_LONG;
99   } else if (mtype == MPI_SHORT) {
100     *ptype = PETSC_SHORT;
101   } else if (mtype == MPI_FLOAT) {
102     *ptype = PETSC_FLOAT;
103   } else if (mtype == MPI_CHAR) {
104     *ptype = PETSC_CHAR;
105   } else if (mtype == MPI_LONG_DOUBLE) {
106     *ptype = PETSC_LONG_DOUBLE;
107   } else {
108     SETERRQ(PETSC_ERR_SUP,"Unhandled MPI datatype");
109   }
110   PetscFunctionReturn(0);
111 }
112 
113 typedef enum {PETSC_INT_SIZE = sizeof(PetscInt),PETSC_DOUBLE_SIZE = sizeof(double),
114               PETSC_COMPLEX_SIZE = sizeof(PetscScalar),PETSC_LONG_SIZE=sizeof(long),
115               PETSC_SHORT_SIZE = sizeof(short),PETSC_FLOAT_SIZE = sizeof(float),
116               PETSC_CHAR_SIZE = sizeof(char),PETSC_LOGICAL_SIZE = sizeof(char),
117               PETSC_ENUM_SIZE = sizeof(PetscTruth), PETSC_TRUTH_SIZE = sizeof(PetscTruth),
118               PETSC_LONG_DOUBLE_SIZE = sizeof(long double)} PetscDataTypeSize;
119 #if defined(PETSC_USE_COMPLEX)
120 #define PETSC_SCALAR_SIZE PETSC_COMPLEX_SIZE
121 #else
122 #define PETSC_SCALAR_SIZE PETSC_DOUBLE_SIZE
123 #endif
124 #if defined(PETSC_USE_SCALAR_SINGLE)
125 #define PETSC_REAL_SIZE PETSC_FLOAT_SIZE
126 #elif defined(PETSC_USE_SCALAR_LONG_DOUBLE)
127 #define PETSC_REAL_SIZE PETSC_LONG_DOUBLE_SIZE
128 #elif defined(PETSC_USE_SCALAR_INT)
129 #define PETSC_REAL_SIZE PETSC_INT_SIZE
130 #else
131 #define PETSC_REAL_SIZE PETSC_DOUBLE_SIZE
132 #endif
133 #define PETSC_FORTRANADDR_SIZE PETSC_LONG_SIZE
134 
135 
136 #undef __FUNCT__
137 #define __FUNCT__ "PetscDataTypeGetSize"
138 /*@
139      PetscDataTypeGetSize - Gets the size (in bytes) of a PETSc datatype
140 
141    Not collective
142 
143     Input Parameter:
144 .     ptype - the PETSc datatype name (for example PETSC_DOUBLE)
145 
146     Output Parameter:
147 .     size - the size in bytes (for example the size of PETSC_DOUBLE is 8)
148 
149     Level: advanced
150 
151 .seealso: PetscDataType, PetscDataTypeToMPIDataType()
152 @*/
153 PetscErrorCode PETSC_DLLEXPORT PetscDataTypeGetSize(PetscDataType ptype,size_t *size)
154 {
155   PetscFunctionBegin;
156   if ((int) ptype < 0) {
157     *size = -(int) ptype;
158     PetscFunctionReturn(0);
159   }
160 
161   if (ptype == PETSC_INT) {
162     *size = PETSC_INT_SIZE;
163   } else if (ptype == PETSC_DOUBLE) {
164     *size = PETSC_DOUBLE_SIZE;
165 #if defined(PETSC_USE_COMPLEX)
166   } else if (ptype == PETSC_COMPLEX) {
167     *size = PETSC_COMPLEX_SIZE;
168 #endif
169   } else if (ptype == PETSC_LONG) {
170     *size = PETSC_LONG_SIZE;
171   } else if (ptype == PETSC_SHORT) {
172     *size = PETSC_SHORT_SIZE;
173   } else if (ptype == PETSC_FLOAT) {
174     *size = PETSC_FLOAT_SIZE;
175   } else if (ptype == PETSC_CHAR) {
176     *size = PETSC_CHAR_SIZE;
177   } else if (ptype == PETSC_ENUM) {
178     *size = PETSC_ENUM_SIZE;
179   } else if (ptype == PETSC_LOGICAL) {
180     *size = PETSC_LOGICAL_SIZE;
181   } else if (ptype == PETSC_TRUTH) {
182     *size = PETSC_TRUTH_SIZE;
183   } else if (ptype == PETSC_LONG_DOUBLE) {
184     *size = PETSC_LONG_DOUBLE_SIZE;
185   } else {
186     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
187   }
188   PetscFunctionReturn(0);
189 }
190