xref: /petsc/src/sys/objects/ptype.c (revision e5c89e4ece6e3231999e6896bd6dacaf81d4b32f)
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 /*@
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
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   } else if (ptype == PETSC_COMPLEX) {
33     *mtype = MPIU_COMPLEX;
34 #endif
35   } else if (ptype == PETSC_LONG) {
36     *mtype = MPI_LONG;
37   } else if (ptype == PETSC_SHORT) {
38     *mtype = MPI_SHORT;
39   } else if (ptype == PETSC_ENUM) {
40     *mtype = MPI_INT;
41   } else if (ptype == PETSC_TRUTH) {
42     *mtype = MPI_INT;
43   } else if (ptype == PETSC_FLOAT) {
44     *mtype = MPI_FLOAT;
45   } else if (ptype == PETSC_CHAR) {
46     *mtype = MPI_CHAR;
47   } else if (ptype == PETSC_LOGICAL) {
48     *mtype = MPI_BYTE;
49   } else {
50     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
51   }
52   PetscFunctionReturn(0);
53 }
54 
55 typedef enum {PETSC_INT_SIZE = sizeof(PetscInt),PETSC_DOUBLE_SIZE = sizeof(double),
56               PETSC_COMPLEX_SIZE = sizeof(PetscScalar),PETSC_LONG_SIZE=sizeof(long),
57               PETSC_SHORT_SIZE = sizeof(short),PETSC_FLOAT_SIZE = sizeof(float),
58               PETSC_CHAR_SIZE = sizeof(char),PETSC_LOGICAL_SIZE = sizeof(char),
59               PETSC_ENUM_SIZE = sizeof(PetscTruth), PETSC_TRUTH_SIZE = sizeof(PetscTruth)} PetscDataTypeSize;
60 #if defined(PETSC_USE_COMPLEX)
61 #define PETSC_SCALAR_SIZE PETSC_COMPLEX_SIZE
62 #else
63 #define PETSC_SCALAR_SIZE PETSC_DOUBLE_SIZE
64 #endif
65 #if defined(PETSC_USE_SINGLE)
66 #define PETSC_REAL_SIZE PETSC_FLOAT_SIZE
67 #else
68 #define PETSC_REAL_SIZE PETSC_DOUBLE_SIZE
69 #endif
70 #define PETSC_FORTRANADDR_SIZE PETSC_LONG_SIZE
71 
72 
73 #undef __FUNCT__
74 #define __FUNCT__ "PetscDataTypeGetSize"
75 /*@
76      PetscDataTypeGetSize - Gets the size (in bytes) of a PETSc datatype
77 
78    Not collective
79 
80     Input Parameter:
81 .     ptype - the PETSc datatype name (for example PETSC_DOUBLE)
82 
83     Output Parameter:
84 .     size - the size in bytes (for example the size of PETSC_DOUBLE is 8)
85 
86     Level: advanced
87 
88 .seealso: PetscDataType, PetscDataTypeToMPIDataType()
89 @*/
90 PetscErrorCode PETSC_DLLEXPORT PetscDataTypeGetSize(PetscDataType ptype,PetscInt *size)
91 {
92   PetscFunctionBegin;
93   if (ptype == PETSC_INT) {
94     *size = PETSC_INT_SIZE;
95   } else if (ptype == PETSC_DOUBLE) {
96     *size = PETSC_DOUBLE_SIZE;
97 #if defined(PETSC_USE_COMPLEX)
98   } else if (ptype == PETSC_COMPLEX) {
99     *size = PETSC_COMPLEX_SIZE;
100 #endif
101   } else if (ptype == PETSC_LONG) {
102     *size = PETSC_LONG_SIZE;
103   } else if (ptype == PETSC_SHORT) {
104     *size = PETSC_SHORT_SIZE;
105   } else if (ptype == PETSC_FLOAT) {
106     *size = PETSC_FLOAT_SIZE;
107   } else if (ptype == PETSC_CHAR) {
108     *size = PETSC_CHAR_SIZE;
109   } else if (ptype == PETSC_ENUM) {
110     *size = PETSC_ENUM_SIZE;
111   } else if (ptype == PETSC_LOGICAL) {
112     *size = PETSC_LOGICAL_SIZE;
113   } else if (ptype == PETSC_TRUTH) {
114     *size = PETSC_TRUTH_SIZE;
115   } else {
116     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
117   }
118   PetscFunctionReturn(0);
119 }
120