Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix build and dist, add missing folder
[simgrid.git] / teshsuite / smpi / mpich3-test / datatype / typename.c
diff --git a/teshsuite/smpi/mpich3-test/datatype/typename.c b/teshsuite/smpi/mpich3-test/datatype/typename.c
new file mode 100644 (file)
index 0000000..60845c1
--- /dev/null
@@ -0,0 +1,194 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include "mpitest.h"
+#include <stdio.h>
+#include <string.h>
+
+/* Create an array with all of the MPI names in it */
+
+typedef struct mpi_names_t { MPI_Datatype dtype; const char *name; } mpi_names_t;
+
+/* The MPI standard specifies that the names must be the MPI names,
+not the related language names (e.g., MPI_CHAR, not char) */
+
+int main( int argc, char **argv )
+{
+
+mpi_names_t mpi_names[] = {
+    { MPI_CHAR, "MPI_CHAR" },
+    { MPI_SIGNED_CHAR, "MPI_SIGNED_CHAR" },
+    { MPI_UNSIGNED_CHAR, "MPI_UNSIGNED_CHAR" },
+    { MPI_BYTE, "MPI_BYTE" },
+    { MPI_WCHAR, "MPI_WCHAR" },
+    { MPI_SHORT, "MPI_SHORT" },
+    { MPI_UNSIGNED_SHORT, "MPI_UNSIGNED_SHORT" },
+    { MPI_INT, "MPI_INT" },
+    { MPI_UNSIGNED, "MPI_UNSIGNED" },
+    { MPI_LONG, "MPI_LONG" },
+    { MPI_UNSIGNED_LONG, "MPI_UNSIGNED_LONG" },
+    { MPI_FLOAT, "MPI_FLOAT" },
+    { MPI_DOUBLE, "MPI_DOUBLE" },
+#if MTEST_HAVE_MIN_MPI_VERSION(2,2)
+    /* these two types were added in MPI-2.2 */
+    { MPI_AINT, "MPI_AINT" },
+    { MPI_OFFSET, "MPI_OFFSET" },
+#endif
+
+    { MPI_PACKED, "MPI_PACKED" },
+    { MPI_LB, "MPI_LB" },
+    { MPI_UB, "MPI_UB" },
+    { MPI_FLOAT_INT, "MPI_FLOAT_INT" },
+    { MPI_DOUBLE_INT, "MPI_DOUBLE_INT" },
+    { MPI_LONG_INT, "MPI_LONG_INT" },
+    { MPI_SHORT_INT, "MPI_SHORT_INT" },
+    { MPI_2INT, "MPI_2INT" },
+    /* Fortran */
+#ifdef HAVE_FORTRAN_BINDING
+    { MPI_COMPLEX, "MPI_COMPLEX" },
+    { MPI_DOUBLE_COMPLEX, "MPI_DOUBLE_COMPLEX" },
+    { MPI_LOGICAL, "MPI_LOGICAL" },
+    { MPI_REAL, "MPI_REAL" },
+    { MPI_DOUBLE_PRECISION, "MPI_DOUBLE_PRECISION" },
+    { MPI_INTEGER, "MPI_INTEGER" },
+    { MPI_2INTEGER, "MPI_2INTEGER" },
+    /* 2COMPLEX (and the 2DOUBLE_COMPLEX) were in MPI 1.0 but not later */
+#ifdef HAVE_MPI_2COMPLEX
+    { MPI_2COMPLEX, "MPI_2COMPLEX" },
+#endif
+#ifdef HAVE_MPI_2DOUBLE_COMPLEX
+    /* MPI_2DOUBLE_COMPLEX is an extension - it is not part of MPI 2.1 */
+    { MPI_2DOUBLE_COMPLEX, "MPI_2DOUBLE_COMPLEX" },
+#endif
+    { MPI_2REAL, "MPI_2REAL" },
+    { MPI_2DOUBLE_PRECISION, "MPI_2DOUBLE_PRECISION" },
+    { MPI_CHARACTER, "MPI_CHARACTER" },
+#endif
+#if MTEST_HAVE_MIN_MPI_VERSION(2,2)
+    /* these C99 types were added in MPI-2.2 */
+    { MPI_INT8_T,   "MPI_INT8_T"   },
+    { MPI_INT16_T,  "MPI_INT16_T"  },
+    { MPI_INT32_T,  "MPI_INT32_T"  },
+    { MPI_INT64_T,  "MPI_INT64_T"  },
+    { MPI_UINT8_T,  "MPI_UINT8_T"  },
+    { MPI_UINT16_T, "MPI_UINT16_T" },
+    { MPI_UINT32_T, "MPI_UINT32_T" },
+    { MPI_UINT64_T, "MPI_UINT64_T" },
+    { MPI_C_BOOL, "MPI_C_BOOL" },
+    { MPI_C_FLOAT_COMPLEX,  "MPI_C_FLOAT_COMPLEX"  },
+    { MPI_C_DOUBLE_COMPLEX, "MPI_C_DOUBLE_COMPLEX" },
+    { MPI_AINT, "MPI_AINT" },
+    { MPI_OFFSET, "MPI_OFFSET" },
+#endif
+    /* Size-specific types */
+    /* Do not move MPI_REAL4 - this is used to indicate the very first 
+       optional type.  In addition, you must not add any required types
+       after this type */
+    /* See MPI 2.1, Section 16.2.  These are required, predefined types. 
+       If the type is not available (e.g., *only* because the Fortran
+       compiler does not support it), the value may be MPI_DATATYPE_NULL */
+    { MPI_REAL4, "MPI_REAL4" },
+    { MPI_REAL8, "MPI_REAL8" },
+    { MPI_REAL16, "MPI_REAL16" },
+    { MPI_COMPLEX8, "MPI_COMPLEX8" },
+    { MPI_COMPLEX16, "MPI_COMPLEX16" },
+    { MPI_COMPLEX32, "MPI_COMPLEX32" },
+    { MPI_INTEGER1, "MPI_INTEGER1" },
+    { MPI_INTEGER2, "MPI_INTEGER2" },
+    { MPI_INTEGER4, "MPI_INTEGER4" },
+    { MPI_INTEGER8, "MPI_INTEGER8" },
+#ifdef HAVE_MPI_INTEGER16
+    /* MPI_INTEGER16 is not included in most of the tables in MPI 2.1,
+       and some implementations omit it.  An error will be reported, but
+       this ifdef allows the test to be built and run. */
+    { MPI_INTEGER16, "MPI_INTEGER16" },
+#endif
+    /* Semi-optional types - if the compiler doesn't support long double
+       or long long, these might be MPI_DATATYPE_NULL */
+    { MPI_LONG_DOUBLE, "MPI_LONG_DOUBLE" },
+    { MPI_LONG_LONG_INT, "MPI_LONG_LONG_INT" }, 
+    { MPI_LONG_LONG, "MPI_LONG_LONG" },
+    { MPI_UNSIGNED_LONG_LONG, "MPI_UNSIGNED_LONG_LONG" }, 
+    { MPI_LONG_DOUBLE_INT, "MPI_LONG_DOUBLE_INT" },
+#if MTEST_HAVE_MIN_MPI_VERSION(2,2)
+    /* added in MPI-2.2 */
+    { MPI_C_LONG_DOUBLE_COMPLEX, "MPI_C_LONG_DOUBLE_COMPLEX" },
+    { MPI_AINT,  "MPI_AINT"  },
+    { MPI_OFFSET, "MPI_OFFSET" },
+#endif
+#if MTEST_HAVE_MIN_MPI_VERSION(3,0)
+    /* added in MPI 3 */
+    { MPI_COUNT, "MPI_COUNT" },
+#endif
+    { 0, (char *)0 },  /* Sentinal used to indicate the last element */
+};
+
+    char name[MPI_MAX_OBJECT_NAME];
+    int namelen, i, inOptional;
+    int errs = 0;
+
+    MTest_Init( &argc, &argv );
+    
+    /* Sample some datatypes */
+    /* See 8.4, "Naming Objects" in MPI-2.  The default name is the same
+       as the datatype name */
+    MPI_Type_get_name( MPI_DOUBLE, name, &namelen );
+    if (strncmp( name, "MPI_DOUBLE", MPI_MAX_OBJECT_NAME )) {
+       errs++;
+       fprintf( stderr, "Expected MPI_DOUBLE but got :%s:\n", name );
+    }
+
+    MPI_Type_get_name( MPI_INT, name, &namelen );
+    if (strncmp( name, "MPI_INT", MPI_MAX_OBJECT_NAME )) {
+       errs++;
+       fprintf( stderr, "Expected MPI_INT but got :%s:\n", name );
+    }
+
+    /* Now we try them ALL */
+    inOptional = 0;
+    for (i=0; mpi_names[i].name != 0; i++) {
+       /* Are we in the optional types? */
+       if (strcmp( mpi_names[i].name, "MPI_REAL4" ) == 0) 
+           inOptional = 1;
+       /* If this optional type is not supported, skip it */
+       if (inOptional && mpi_names[i].dtype == MPI_DATATYPE_NULL) continue;
+       if (mpi_names[i].dtype == MPI_DATATYPE_NULL) {
+           /* Report an error because all of the standard types 
+              must be supported */
+           errs++;
+           fprintf( stderr, "MPI Datatype %s is MPI_DATATYPE_NULL\n", 
+                    mpi_names[i].name );
+           continue;
+       }
+       MTestPrintfMsg( 10, "Checking type %s\n", mpi_names[i].name );
+       name[0] = 0;
+       MPI_Type_get_name( mpi_names[i].dtype, name, &namelen );
+       if (strncmp( name, mpi_names[i].name, namelen )) {
+           errs++;
+           fprintf( stderr, "Expected %s but got %s\n", 
+                    mpi_names[i].name, name );
+       }
+    }
+
+    /* Try resetting the name */
+    MPI_Type_set_name( MPI_INT, (char*)"int" );
+    name[0] = 0;
+    MPI_Type_get_name( MPI_INT, name, &namelen );
+    if (strncmp( name, "int", MPI_MAX_OBJECT_NAME )) {
+       errs++;
+       fprintf( stderr, "Expected int but got :%s:\n", name );
+    }
+
+#ifndef HAVE_MPI_INTEGER16
+    errs++;
+    fprintf( stderr, "MPI_INTEGER16 is not available\n" );
+#endif
+
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+}