Actual source code: ptype.c
petsc-3.13.6 2020-09-29
Report Typos and Errors

      2: /*
      3:      Provides utility routines for manipulating any type of PETSc object.
      4: */
      5:  #include <petscsys.h>

      7: const char *const PetscDataTypes[] = {"UNKNOWN",
      8:                                       "DOUBLE","COMPLEX","LONG","SHORT","FLOAT",
      9:                                       "CHAR","LOGICAL","ENUM","BOOL","LONGDOUBLE",
     10:                                       "OBJECT","FUNCTION","STRING","FP16","STRUCT",
     11:                                       "INT","INT64",
     12:                                       "PetscDataType","PETSC_",NULL};

     14: /*@C
     15:      PetscDataTypeToMPIDataType - Converts the PETSc name of a datatype to its MPI name.

     17:    Not collective

     19:     Input Parameter:
     20: .     ptype - the PETSc datatype name (for example PETSC_DOUBLE)

     22:     Output Parameter:
     23: .     mtype - the MPI datatype (for example MPI_DOUBLE, ...)

     25:     Level: advanced

     27: .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType()
     28: @*/
     29: PetscErrorCode  PetscDataTypeToMPIDataType(PetscDataType ptype,MPI_Datatype *mtype)
     30: {
     32:   if (ptype == PETSC_INT)              *mtype = MPIU_INT;
     33:   else if (ptype == PETSC_DOUBLE)      *mtype = MPI_DOUBLE;
     34: #if defined(PETSC_HAVE_COMPLEX)
     35: #if defined(PETSC_USE_REAL_SINGLE)
     36:   else if (ptype == PETSC_COMPLEX)     *mtype = MPIU_C_COMPLEX;
     37: #elif defined(PETSC_USE_REAL___FLOAT128)
     38:   else if (ptype == PETSC_COMPLEX)     *mtype = MPIU___COMPLEX128;
     39: #else
     40:   else if (ptype == PETSC_COMPLEX)     *mtype = MPIU_C_DOUBLE_COMPLEX;
     41: #endif
     42: #endif
     43:   else if (ptype == PETSC_LONG)        *mtype = MPI_LONG;
     44:   else if (ptype == PETSC_SHORT)       *mtype = MPI_SHORT;
     45:   else if (ptype == PETSC_ENUM)        *mtype = MPI_INT;
     46:   else if (ptype == PETSC_BOOL)        *mtype = MPI_INT;
     47:   else if (ptype == PETSC_INT64)       *mtype = MPIU_INT64;
     48:   else if (ptype == PETSC_FLOAT)       *mtype = MPI_FLOAT;
     49:   else if (ptype == PETSC_CHAR)        *mtype = MPI_CHAR;
     50:   else if (ptype == PETSC_BIT_LOGICAL) *mtype = MPI_BYTE;
     51: #if defined(PETSC_USE_REAL___FLOAT128)
     52:   else if (ptype == PETSC___FLOAT128)  *mtype = MPIU___FLOAT128;
     53: #elif defined(PETSC_USE_REAL___FP16)
     54:   else if (ptype == PETSC___FP16)      *mtype = MPIU___FP16;
     55: #endif
     56:   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
     57:   return(0);
     58: }

     60: /*@C
     61:      PetscMPIDataTypeToPetscDataType Finds the PETSc name of a datatype from its MPI name

     63:    Not collective

     65:     Input Parameter:
     66: .     mtype - the MPI datatype (for example MPI_DOUBLE, ...)

     68:     Output Parameter:
     69: .     ptype - the PETSc datatype name (for example PETSC_DOUBLE)

     71:     Level: advanced

     73: .seealso: PetscDataType, PetscMPIDataTypeToPetscDataType()
     74: @*/
     75: PetscErrorCode  PetscMPIDataTypeToPetscDataType(MPI_Datatype mtype,PetscDataType *ptype)
     76: {
     78:   if (mtype == MPIU_INT)             *ptype = PETSC_INT;
     79: #if defined(PETSC_USE_64BIT_INDICES)
     80:   else if (mtype == MPI_INT)         *ptype = PETSC_ENUM;
     81: #endif
     82:   else if (mtype == MPIU_INT64)      *ptype = PETSC_INT64;
     83:   else if (mtype == MPI_DOUBLE)      *ptype = PETSC_DOUBLE;
     84: #if defined(PETSC_HAVE_COMPLEX)
     85: #if defined(PETSC_USE_REAL_SINGLE)
     86:   else if (mtype == MPIU_C_COMPLEX)  *ptype = PETSC_COMPLEX;
     87: #elif defined(PETSC_USE_REAL___FLOAT128)
     88:   else if (mtype == MPIU___COMPLEX128) *ptype = PETSC_COMPLEX;
     89: #else
     90:   else if (mtype == MPIU_C_DOUBLE_COMPLEX) *ptype = PETSC_COMPLEX;
     91: #endif
     92: #endif
     93:   else if (mtype == MPI_LONG)        *ptype = PETSC_LONG;
     94:   else if (mtype == MPI_SHORT)       *ptype = PETSC_SHORT;
     95:   else if (mtype == MPI_FLOAT)       *ptype = PETSC_FLOAT;
     96:   else if (mtype == MPI_CHAR)        *ptype = PETSC_CHAR;
     97: #if defined(PETSC_USE_REAL___FLOAT128)
     98:   else if (mtype == MPIU___FLOAT128) *ptype = PETSC___FLOAT128;
     99: #elif defined(PETSC_USE_REAL___FP16)
    100:   else if (mtype == MPIU___FP16) *ptype = PETSC___FP16;
    101: #endif
    102:   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unhandled MPI datatype");
    103:   return(0);
    104: }

    106: typedef enum {PETSC_INT_SIZE         = sizeof(PetscInt),
    107:               PETSC_DOUBLE_SIZE      = sizeof(double),
    108: #if defined(PETSC_HAVE_COMPLEX)
    109:               PETSC_COMPLEX_SIZE     = sizeof(PetscComplex),
    110: #else
    111:               PETSC_COMPLEX_SIZE     = 2*sizeof(PetscReal),
    112: #endif
    113:               PETSC_LONG_SIZE        = sizeof(long),
    114:               PETSC_SHORT_SIZE       = sizeof(short),
    115:               PETSC_FLOAT_SIZE       = sizeof(float),
    116:               PETSC_CHAR_SIZE        = sizeof(char),
    117:               PETSC_ENUM_SIZE        = sizeof(PetscEnum),
    118:               PETSC_BOOL_SIZE        = sizeof(PetscBool),
    119:               PETSC_INT64_SIZE       = sizeof(PetscInt64),
    120:               PETSC_BIT_LOGICAL_SIZE = sizeof(char)
    121: #if defined(PETSC_USE_REAL___FLOAT128)
    122:               ,PETSC___FLOAT128_SIZE  = sizeof(__float128)
    123: #elif defined(PETSC_USE_REAL___FP16)
    124:               ,PETSC___FP16_SIZE      = sizeof(__fp16)
    125: #endif
    126:              } PetscDataTypeSize;

    128: /*@C
    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

    141: .seealso: PetscDataType, PetscDataTypeToMPIDataType()
    142: @*/
    143: PetscErrorCode  PetscDataTypeGetSize(PetscDataType ptype,size_t *size)
    144: {
    146:   if ((int) ptype < 0)                 *size = -(int)ptype;
    147:   else if (ptype == PETSC_INT)         *size = PETSC_INT_SIZE;
    148:   else if (ptype == PETSC_DOUBLE)      *size = PETSC_DOUBLE_SIZE;
    149:   else if (ptype == PETSC_COMPLEX)     *size = PETSC_COMPLEX_SIZE;
    150:   else if (ptype == PETSC_LONG)        *size = PETSC_LONG_SIZE;
    151:   else if (ptype == PETSC_SHORT)       *size = PETSC_SHORT_SIZE;
    152:   else if (ptype == PETSC_FLOAT)       *size = PETSC_FLOAT_SIZE;
    153:   else if (ptype == PETSC_CHAR)        *size = PETSC_CHAR_SIZE;
    154:   else if (ptype == PETSC_ENUM)        *size = PETSC_ENUM_SIZE;
    155:   else if (ptype == PETSC_BOOL)        *size = PETSC_BOOL_SIZE;
    156:   else if (ptype == PETSC_INT64)       *size = PETSC_INT64_SIZE;
    157:   else if (ptype == PETSC_BIT_LOGICAL) *size = PETSC_BIT_LOGICAL_SIZE;
    158: #if defined(PETSC_USE_REAL___FLOAT128)
    159:   else if (ptype == PETSC___FLOAT128)  *size = PETSC___FLOAT128_SIZE;
    160: #elif defined(PETSC_USE_REAL___FP16)
    161:   else if (ptype == PETSC___FP16)      *size = PETSC___FP16_SIZE;
    162: #endif
    163:   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown PETSc datatype");
    164:   return(0);
    165: }

    167: /*@C
    168:      PetscDataTypeFromString - Gets the enum value of a PETSc datatype represented as a string

    170:    Not collective

    172:     Input Parameter:
    173: .     name - the PETSc datatype name (for example, DOUBLE or real or Scalar)

    175:     Output Parameter:
    176: +    ptype - the enum value
    177: -    found - the string matches one of the data types

    179:     Level: advanced

    181: .seealso: PetscDataType, PetscDataTypeToMPIDataType(), PetscDataTypeGetSize()
    182: @*/
    183: PetscErrorCode  PetscDataTypeFromString(const char*name, PetscDataType *ptype,PetscBool *found)
    184: {

    188:   PetscEnumFind(PetscDataTypes,name,(PetscEnum*)ptype,found);
    189:   if (!*found) {
    190:     char formatted[16];

    192:     PetscStrncpy(formatted,name,16);
    193:     PetscStrtolower(formatted);
    194:     PetscStrcmp(formatted,"scalar",found);
    195:     if (*found) {
    196:       *ptype = PETSC_SCALAR;
    197:     } else {
    198:       PetscStrcmp(formatted,"real",found);
    199:       if (*found) {
    200:         *ptype = PETSC_REAL;
    201:       }
    202:     }
    203:   }
    204:   return(0);
    205: }