Actual source code: ptype.c
1: /*$Id: ptype.c,v 1.7 2001/08/06 21:14:10 bsmith Exp $*/
2: /*
3: Provides utility routines for manipulating any type of PETSc object.
4: */
5: #include petsc.h
7: int PetscDataTypeToMPIDataType(PetscDataType ptype,MPI_Datatype* mtype)
8: {
10: if (ptype == PETSC_INT) {
11: *mtype = MPI_INT;
12: } else if (ptype == PETSC_DOUBLE) {
13: *mtype = MPI_DOUBLE;
14: #if defined(PETSC_USE_COMPLEX)
15: } else if (ptype == PETSC_COMPLEX) {
16: *mtype = MPIU_COMPLEX;
17: #endif
18: } else if (ptype == PETSC_LONG) {
19: *mtype = MPI_LONG;
20: } else if (ptype == PETSC_SHORT) {
21: *mtype = MPI_SHORT;
22: } else if (ptype == PETSC_FLOAT) {
23: *mtype = MPI_FLOAT;
24: } else if (ptype == PETSC_CHAR) {
25: *mtype = MPI_CHAR;
26: } else if (ptype == PETSC_LOGICAL) {
27: *mtype = MPI_BYTE;
28: } else {
29: SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
30: }
31: return(0);
32: }
34: typedef enum {PETSC_INT_SIZE = sizeof(int),PETSC_DOUBLE_SIZE = sizeof(double),
35: PETSC_COMPLEX_SIZE = sizeof(PetscScalar),PETSC_LONG_SIZE=sizeof(long),
36: PETSC_SHORT_SIZE = sizeof(short),PETSC_FLOAT_SIZE = sizeof(float),
37: PETSC_CHAR_SIZE = sizeof(char),PETSC_LOGICAL_SIZE = 1} PetscDataTypeSize;
38: #if defined(PETSC_USE_COMPLEX)
39: #define PETSC_SCALAR_SIZE PETSC_COMPLEX_SIZE
40: #else
41: #define PETSC_SCALAR_SIZE PETSC_DOUBLE_SIZE
42: #endif
43: #if defined(PETSC_USE_SINGLE)
44: #define PETSC_REAL_SIZE PETSC_FLOAT_SIZE
45: #else
46: #define PETSC_REAL_SIZE PETSC_DOUBLE_SIZE
47: #endif
48: #define PETSC_FORTRANADDR_SIZE PETSC_LONG_SIZE
51: int PetscDataTypeGetSize(PetscDataType ptype,int *size)
52: {
54: if (ptype == PETSC_INT) {
55: *size = PETSC_INT_SIZE;
56: } else if (ptype == PETSC_DOUBLE) {
57: *size = PETSC_DOUBLE_SIZE;
58: #if defined(PETSC_USE_COMPLEX)
59: } else if (ptype == PETSC_COMPLEX) {
60: *size = PETSC_COMPLEX_SIZE;
61: #endif
62: } else if (ptype == PETSC_LONG) {
63: *size = PETSC_LONG_SIZE;
64: } else if (ptype == PETSC_SHORT) {
65: *size = PETSC_SHORT_SIZE;
66: } else if (ptype == PETSC_FLOAT) {
67: *size = PETSC_FLOAT_SIZE;
68: } else if (ptype == PETSC_CHAR) {
69: *size = PETSC_CHAR_SIZE;
70: } else if (ptype == PETSC_LOGICAL) {
71: *size = PETSC_LOGICAL_SIZE;
72: } else {
73: SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
74: }
75: return(0);
76: }
78: int PetscDataTypeGetName(PetscDataType ptype,char *name[])
79: {
81: if (ptype == PETSC_INT) {
82: *name = "int";
83: } else if (ptype == PETSC_DOUBLE) {
84: *name = "double";
85: #if defined(PETSC_USE_COMPLEX)
86: } else if (ptype == PETSC_COMPLEX) {
87: *name = "complex";
88: #endif
89: } else if (ptype == PETSC_LONG) {
90: *name = "long";
91: } else if (ptype == PETSC_SHORT) {
92: *name = "short";
93: } else if (ptype == PETSC_FLOAT) {
94: *name = "float";
95: } else if (ptype == PETSC_CHAR) {
96: *name = "char";
97: } else if (ptype == PETSC_LOGICAL) {
98: *name = "logical";
99: } else {
100: SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
101: }
102: return(0);
103: }