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: /*@
 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
 23: @*/
 24: PetscErrorCode PETSC_DLLEXPORT 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 {
 50:     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
 51:   }
 52:   return(0);
 53: }

 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


 75: /*@
 76:      PetscDataTypeGetSize - Gets the size (in bytes) of a PETSc datatype

 78:    Not collective

 80:     Input Parameter:
 81: .     ptype - the PETSc datatype name (for example PETSC_DOUBLE)

 83:     Output Parameter:
 84: .     size - the size in bytes (for example the size of PETSC_DOUBLE is 8)

 86:     Level: advanced
 87:    
 88: .seealso: PetscDataType, PetscDataTypeToMPIDataType()
 89: @*/
 90: PetscErrorCode PETSC_DLLEXPORT PetscDataTypeGetSize(PetscDataType ptype,PetscInt *size)
 91: {
 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:   return(0);
119: }