Actual source code: ptype.c
1: #define PETSC_DLL
2: /*
3: Provides utility routines for manipulating any type of PETSc object.
4: */
5: #include petsc.h
9: /*@C
10: PetscDataTypeToMPIDataType - Converts the PETSc name of a datatype to its MPI name.
12: Not collective
14: Input Parameter:
15: . ptype - the PETSc datatype name (for example PETSC_DOUBLE)
17: Output Parameter:
18: . mtype - the MPI datatype (for example MPI_DOUBLE, ...)
20: Level: advanced
21:
22: .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType()
23: @*/
24: PetscErrorCode PetscDataTypeToMPIDataType(PetscDataType ptype,MPI_Datatype* mtype)
25: {
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 if (ptype == PETSC_LONG_DOUBLE) {
50: *mtype = MPI_LONG_DOUBLE;
51: } else {
52: SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
53: }
54: return(0);
55: }
59: /*@C
60: PetscMPIDataTypeToPetscDataType Finds the PETSc name of a datatype from its MPI name
62: Not collective
64: Input Parameter:
65: . mtype - the MPI datatype (for example MPI_DOUBLE, ...)
67: Output Parameter:
68: . ptype - the PETSc datatype name (for example PETSC_DOUBLE)
70: Level: advanced
71:
72: .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType()
73: @*/
74: PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype mtype,PetscDataType *ptype)
75: {
77: if (mtype == MPIU_INT) {
78: *ptype = PETSC_INT;
79: } else if (mtype == MPI_INT) {
80: *ptype = PETSC_INT;
81: } else if (mtype == MPI_DOUBLE) {
82: *ptype = PETSC_DOUBLE;
83: #if defined(PETSC_USE_COMPLEX)
84: } else if (mtype == MPIU_COMPLEX) {
85: *ptype = PETSC_COMPLEX;
86: #endif
87: } else if (mtype == MPI_LONG) {
88: *ptype = PETSC_LONG;
89: } else if (mtype == MPI_SHORT) {
90: *ptype = PETSC_SHORT;
91: } else if (mtype == MPI_FLOAT) {
92: *ptype = PETSC_FLOAT;
93: } else if (mtype == MPI_CHAR) {
94: *ptype = PETSC_CHAR;
95: } else if (mtype == MPI_LONG_DOUBLE) {
96: *ptype = PETSC_LONG_DOUBLE;
97: } else {
98: SETERRQ(PETSC_ERR_SUP,"Unhandled MPI datatype");
99: }
100: return(0);
101: }
103: typedef enum {PETSC_INT_SIZE = sizeof(PetscInt),PETSC_DOUBLE_SIZE = sizeof(double),
104: PETSC_COMPLEX_SIZE = sizeof(PetscScalar),PETSC_LONG_SIZE=sizeof(long),
105: PETSC_SHORT_SIZE = sizeof(short),PETSC_FLOAT_SIZE = sizeof(float),
106: PETSC_CHAR_SIZE = sizeof(char),PETSC_LOGICAL_SIZE = sizeof(char),
107: PETSC_ENUM_SIZE = sizeof(PetscTruth), PETSC_TRUTH_SIZE = sizeof(PetscTruth),
108: PETSC_LONG_DOUBLE_SIZE = sizeof(long double)} PetscDataTypeSize;
109: #if defined(PETSC_USE_COMPLEX)
110: #define PETSC_SCALAR_SIZE PETSC_COMPLEX_SIZE
111: #else
112: #define PETSC_SCALAR_SIZE PETSC_DOUBLE_SIZE
113: #endif
114: #if defined(PETSC_USE_SINGLE)
115: #define PETSC_REAL_SIZE PETSC_FLOAT_SIZE
116: #elif defined(PETSC_USE_LONG_DOUBLE)
117: #define PETSC_REAL_SIZE PETSC_LONG_DOUBLE_SIZE
118: #elif defined(PETSC_USE_INT)
119: #define PETSC_REAL_SIZE PETSC_INT_SIZE
120: #else
121: #define PETSC_REAL_SIZE PETSC_DOUBLE_SIZE
122: #endif
123: #define PETSC_FORTRANADDR_SIZE PETSC_LONG_SIZE
128: /*@
129: PetscDataTypeGetSize - Gets the size (in bytes) of a PETSc datatype
131: Not collective
133: Input Parameter:
134: . ptype - the PETSc datatype name (for example PETSC_DOUBLE)
136: Output Parameter:
137: . size - the size in bytes (for example the size of PETSC_DOUBLE is 8)
139: Level: advanced
140:
141: .seealso: PetscDataType, PetscDataTypeToMPIDataType()
142: @*/
143: PetscErrorCode PetscDataTypeGetSize(PetscDataType ptype,size_t *size)
144: {
146: if ((int) ptype < 0) {
147: *size = -(int) ptype;
148: return(0);
149: }
151: if (ptype == PETSC_INT) {
152: *size = PETSC_INT_SIZE;
153: } else if (ptype == PETSC_DOUBLE) {
154: *size = PETSC_DOUBLE_SIZE;
155: #if defined(PETSC_USE_COMPLEX)
156: } else if (ptype == PETSC_COMPLEX) {
157: *size = PETSC_COMPLEX_SIZE;
158: #endif
159: } else if (ptype == PETSC_LONG) {
160: *size = PETSC_LONG_SIZE;
161: } else if (ptype == PETSC_SHORT) {
162: *size = PETSC_SHORT_SIZE;
163: } else if (ptype == PETSC_FLOAT) {
164: *size = PETSC_FLOAT_SIZE;
165: } else if (ptype == PETSC_CHAR) {
166: *size = PETSC_CHAR_SIZE;
167: } else if (ptype == PETSC_ENUM) {
168: *size = PETSC_ENUM_SIZE;
169: } else if (ptype == PETSC_LOGICAL) {
170: *size = PETSC_LOGICAL_SIZE;
171: } else if (ptype == PETSC_TRUTH) {
172: *size = PETSC_TRUTH_SIZE;
173: } else if (ptype == PETSC_LONG_DOUBLE) {
174: *size = PETSC_LONG_DOUBLE_SIZE;
175: } else {
176: SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
177: }
178: return(0);
179: }