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: }