-:    0:Source:/home/MPI/testing/mpich2/mpich2/src/mpi/coll/opminloc.c
        -:    0:Graph:opminloc.gcno
        -:    0:Data:opminloc.gcda
        -:    0:Runs:4382
        -:    0:Programs:1376
        -:    1:/* -*- Mode: C; c-basic-offset:4 ; -*- */
        -:    2:/*
        -:    3: *
        -:    4: *  (C) 2001 by Argonne National Laboratory.
        -:    5: *      See COPYRIGHT in top-level directory.
        -:    6: */
        -:    7:
        -:    8:#include "mpiimpl.h"
        -:    9:
        -:   10:/* MINLOC and MAXLOC structures */
        -:   11:typedef struct MPIR_2int_loctype {
        -:   12:  int  value;
        -:   13:  int  loc;
        -:   14:} MPIR_2int_loctype;
        -:   15:
        -:   16:typedef struct MPIR_floatint_loctype {
        -:   17:  float  value;
        -:   18:  int    loc;
        -:   19:} MPIR_floatint_loctype;
        -:   20:
        -:   21:typedef struct MPIR_longint_loctype {
        -:   22:  long  value;
        -:   23:  int    loc;
        -:   24:} MPIR_longint_loctype;
        -:   25:
        -:   26:typedef struct MPIR_shortint_loctype {
        -:   27:  short  value;
        -:   28:  int    loc;
        -:   29:} MPIR_shortint_loctype;
        -:   30:
        -:   31:typedef struct MPIR_doubleint_loctype {
        -:   32:  double  value;
        -:   33:  int     loc;
        -:   34:} MPIR_doubleint_loctype;
        -:   35:
        -:   36:#if defined(HAVE_LONG_DOUBLE)
        -:   37:typedef struct MPIR_longdoubleint_loctype {
        -:   38:  long double   value;
        -:   39:  int           loc;
        -:   40:} MPIR_longdoubleint_loctype;
        -:   41:#endif
        -:   42:
        -:   43:/* Note a subtlety in these two macros which avoids compiler warnings.
        -:   44:   The compiler complains about using == on floats, but the standard
        -:   45:   requires that we set loc to min of the locs if the two values are
        -:   46:   equal.  So we do "if a>b {} else if a>=b Y" which is the same as
        -:   47:   "if a>b X else if a==b Y" but avoids the warning. */
        -:   48:#define MPIR_MINLOC_C_CASE(c_type_) {                   \
        -:   49:        c_type_ *a = (c_type_ *)inoutvec;               \
        -:   50:        c_type_ *b = (c_type_ *)invec;                  \
        -:   51:        for (i=0; i<len; i++) {                         \
        -:   52:            if (a[i].value > b[i].value) {              \
        -:   53:                a[i].value = b[i].value;                \
        -:   54:                a[i].loc   = b[i].loc;                  \
        -:   55:            } else if (a[i].value >= b[i].value)        \
        -:   56:                a[i].loc = MPIR_MIN(a[i].loc,b[i].loc); \
        -:   57:        }                                               \
        -:   58:    }                                                   \
        -:   59:    break
        -:   60:
        -:   61:#define MPIR_MINLOC_F_CASE(f_type_) {                   \
        -:   62:        f_type_ *a = (f_type_ *)inoutvec;               \
        -:   63:        f_type_ *b = (f_type_ *)invec;                  \
        -:   64:        for ( i=0; i<flen; i+=2 ) {                     \
        -:   65:            if (a[i] > b[i]) {                          \
        -:   66:                a[i]   = b[i];                          \
        -:   67:                a[i+1] = b[i+1];                        \
        -:   68:            } else if (a[i] >= b[i])                    \
        -:   69:                a[i+1] = MPIR_MIN(a[i+1],b[i+1]);       \
        -:   70:        }                                               \
        -:   71:    }                                                   \
        -:   72:    break
        -:   73:
        -:   74:#undef FUNCNAME
        -:   75:#define FUNCNAME MPIR_MINLOC
        -:   76:#undef FCNAME
        -:   77:#define FCNAME MPIU_QUOTE(FUNCNAME)
        -:   78:void MPIR_MINLOC( 
        -:   79:	void *invec, 
        -:   80:	void *inoutvec, 
        -:   81:	int *Len, 
        -:   82:	MPI_Datatype *type )
     2602:   83:{
     2602:   84:    int mpi_errno = MPI_SUCCESS;
     2602:   85:    int i, len = *Len, flen;
        -:   86:    
     2602:   87:    flen = len * 2; /* used for Fortran types */
        -:   88:
     2602:   89:    switch (*type) {
        -:   90:    /* first the C types */
      443:   91:    case MPI_2INT:       MPIR_MINLOC_C_CASE(MPIR_2int_loctype);        
      443:   92:    case MPI_FLOAT_INT:  MPIR_MINLOC_C_CASE(MPIR_floatint_loctype);
      443:   93:    case MPI_LONG_INT:   MPIR_MINLOC_C_CASE(MPIR_longint_loctype);
      443:   94:    case MPI_SHORT_INT:  MPIR_MINLOC_C_CASE(MPIR_shortint_loctype);
      425:   95:    case MPI_DOUBLE_INT: MPIR_MINLOC_C_CASE(MPIR_doubleint_loctype);
        -:   96:#if defined(HAVE_LONG_DOUBLE)
      405:   97:    case MPI_LONG_DOUBLE_INT: MPIR_MINLOC_C_CASE(MPIR_longdoubleint_loctype);
        -:   98:#endif
        -:   99:
        -:  100:    /* now the Fortran types */
        -:  101:#ifdef HAVE_FORTRAN_BINDING
        -:  102:#ifndef HAVE_NO_FORTRAN_MPI_TYPES_IN_C
    #####:  103:    case MPI_2INTEGER:          MPIR_MINLOC_F_CASE(int);
    #####:  104:    case MPI_2REAL:             MPIR_MINLOC_F_CASE(float);
    #####:  105:    case MPI_2DOUBLE_PRECISION: MPIR_MINLOC_F_CASE(double);
        -:  106:#endif
        -:  107:#endif
        -:  108:	/* --BEGIN ERROR HANDLING-- */
        -:  109:    default: {
    #####:  110:	MPIU_THREADPRIV_DECL;
    #####:  111:	MPIU_THREADPRIV_GET;
    #####:  112:        MPIU_ERR_SET1(mpi_errno, MPI_ERR_OP, "**opundefined","**opundefined %s", "MPI_MINLOC" );
    #####:  113:        MPIU_THREADPRIV_FIELD(op_errno) = mpi_errno;
        -:  114:        break;
        -:  115:    }
        -:  116:	/* --END ERROR HANDLING-- */
        -:  117:    }
        -:  118:
     2602:  119:}
        -:  120:
        -:  121:
        -:  122:
        -:  123:
        -:  124:#undef FUNCNAME
        -:  125:#define FUNCNAME MPIR_MINLOC_check_dtype
        -:  126:#undef FCNAME
        -:  127:#define FCNAME MPIU_QUOTE(FUNCNAME)
        -:  128:int MPIR_MINLOC_check_dtype( MPI_Datatype type )
     4738:  129:{
     4738:  130:    int mpi_errno = MPI_SUCCESS;
        -:  131:    
     4738:  132:    switch (type) {
        -:  133:    /* first the C types */
        -:  134:    case MPI_2INT: 
        -:  135:    case MPI_FLOAT_INT: 
        -:  136:    case MPI_LONG_INT: 
        -:  137:    case MPI_SHORT_INT: 
        -:  138:    case MPI_DOUBLE_INT: 
        -:  139:#if defined(HAVE_LONG_DOUBLE)
        -:  140:    case MPI_LONG_DOUBLE_INT: 
        -:  141:#endif
        -:  142:   /* now the Fortran types */
        -:  143:#ifdef HAVE_FORTRAN_BINDING
        -:  144:#ifndef HAVE_NO_FORTRAN_MPI_TYPES_IN_C
        -:  145:    case MPI_2INTEGER: 
        -:  146:    case MPI_2REAL: 
        -:  147:    case MPI_2DOUBLE_PRECISION: 
        -:  148:#endif
        -:  149:#endif
        -:  150:        break;
        -:  151:
        6:  152:    default: MPIU_ERR_SET1(mpi_errno, MPI_ERR_OP, "**opundefined", "**opundefined %s", "MPI_MINLOC");
        -:  153:    }
        -:  154:    
     4738:  155:    return mpi_errno;
        -:  156:}