diff --git a/configure.ac b/configure.ac index 225796677a706183087283af4463474508a6b979..d54d3dc7efe01f4bcd67502c07e3a44a3b06a3a6 100644 --- a/configure.ac +++ b/configure.ac @@ -60,6 +60,7 @@ AC_ARG_ENABLE([mpi], good_mpi="yes" if test "$enable_mpi" = "yes"; then AX_MPI([CC="$MPICC" AC_DEFINE(HAVE_MPI, 1, [Define if you have the MPI library.]) ]) + MPI_LIBRARY="Unknown MPI" # Various MPI implementations require additional libraries when also using # threads. Use mpirun (on PATH) as that seems to be only command with @@ -83,14 +84,17 @@ if test "$enable_mpi" = "yes"; then case "$version" in *Intel*MPI*) MPI_THREAD_LIBS="-mt_mpi" + MPI_LIBRARY="Intel MPI" AC_MSG_RESULT([Intel MPI]) ;; *Platform*) MPI_THREAD_LIBS="-lmtmpi" + MPI_LIBRARY="PLATFORM MPI" AC_MSG_RESULT([PLATFORM MPI]) ;; *"Open MPI"*) MPI_THREAD_LIBS="" + MPI_LIBRARY="Open MPI" AC_MSG_RESULT([Open MPI]) # OpenMPI should be 1.8.6 or later, if not complain. # Version is last word on first line of -version output. @@ -109,6 +113,7 @@ if test "$enable_mpi" = "yes"; then esac AC_SUBST([MPI_THREAD_LIBS]) fi + AC_DEFINE_UNQUOTED([SWIFT_MPI_LIBRARY], ["$MPI_LIBRARY"], [The MPI library name, if known.]) fi AM_CONDITIONAL([HAVEMPI],[test $enable_mpi = "yes"]) diff --git a/src/version.c b/src/version.c index e49d0cda901e145132615296a37a8054fe0b3ccc..4624f036a0178f5b31b1aa24b1607507914444a7 100644 --- a/src/version.c +++ b/src/version.c @@ -18,6 +18,21 @@ * ******************************************************************************/ +/* Config parameters. */ +#include "../config.h" + +/* MPI headers. */ +#ifdef WITH_MPI +#include <mpi.h> +#ifdef HAVE_METIS +#include <metis.h> +#endif +#endif + +#ifdef HAVE_HDF5 +#include <hdf5.h> +#endif + /* Some standard headers. */ #include <stdio.h> #include <string.h> @@ -28,15 +43,17 @@ /** * @brief Return the source code git revision * - * @details The SHA of the code checked out when the library was last built. + * The SHA of the code checked out when the library was last built. * Will include -dirty if they are local modifications. + * + * @result the git version. */ const char *git_revision(void) { static char buf[256]; static int initialised = 0; static const char *revision = GIT_REVISION; - if(!initialised) { - if(strlen(revision) == 0) + if (!initialised) { + if (strlen(revision) == 0) sprintf(buf, "%s", "unknown"); else sprintf(buf, "%s", revision); @@ -48,14 +65,16 @@ const char *git_revision(void) { /** * @brief Return the source code git branch * - * @details The name of the current branch when the code was last built. + * The name of the current branch when the code was last built. + * + * @result git branch */ const char *git_branch(void) { static char buf[256]; static int initialised = 0; static const char *branch = GIT_BRANCH; - if(!initialised) { - if(strlen(branch) == 0) + if (!initialised) { + if (strlen(branch) == 0) sprintf(buf, "%s", "unknown"); else sprintf(buf, "%s", branch); @@ -66,6 +85,8 @@ const char *git_branch(void) { /** * @brief The version of SWIFT + * + * @result the package version */ const char *package_version(void) { static const char *version = PACKAGE_VERSION; @@ -74,6 +95,8 @@ const char *package_version(void) { /** * @brief A description of the package version and code status. + * + * @result description of the package version */ const char *package_description(void) { static char buf[256]; @@ -86,6 +109,11 @@ const char *package_description(void) { return buf; } +/** + * @brief return the name of the compiler used to build SWIFT. + * + * @result description of the compiler. + */ const char *compiler_name(void) { static char compiler[256] = {0}; #if defined(__INTEL_COMPILER) @@ -101,6 +129,11 @@ const char *compiler_name(void) { return compiler; } +/** + * @brief return compiler version used to build SWIFT. + * + * @result description of the compiler. + */ const char *compiler_version(void) { static char version[256] = {0}; #if defined(__INTEL_COMPILER) @@ -122,6 +155,87 @@ const char *compiler_version(void) { return version; } + +/** + * @brief return the MPI version, runtime if possible otherwise that used when + * built. + * + * @result description of the MPI version. + */ +const char *mpi_version(void) { + static char version[80] = {0}; + +#ifdef WITH_MPI + int std_version, std_subversion; + + /* Check that the library implements the version string routine */ +#ifdef MPI_MAX_LIBRARY_VERSION_STRING + static char lib_version[MPI_MAX_LIBRARY_VERSION_STRING] = {0}; + int len; + MPI_Get_library_version(lib_version, &len); + + /* Find first \n and truncate string to this length, can get many lines from + * some MPIs (MPICH). */ + char *ptr = strchr(lib_version, '\n'); + if (ptr != NULL) *ptr = '\0'; + + /* Also arbitrarily truncate to keep down to one line, Open MPI, + * check for last comma and keep to ~60 chars max. */ + strcpy(lib_version+60, "..."); + ptr = strrchr(lib_version, ','); + if (ptr != NULL) *ptr = '\0'; + +#else + /* Use autoconf guessed value. */ + static char lib_version[60] = {0}; + snprintf(lib_version, 60, "%s", SWIFT_MPI_LIBRARY); +#endif + + /* Numeric version. */ + MPI_Get_version(&std_version, &std_subversion); + snprintf(version, 80, "%s (MPI std v%i.%i)", lib_version, + std_version, std_subversion); +#else + sprintf(version, "Code was not compiled with MPI support"); +#endif + return version; +} + +/** + * @brief return the HDF5 version in use at runtime. + * + * @result description of the current HDF5 version. + */ +const char *hdf5_version(void) { + + static char version[256] = {0}; +#ifdef HAVE_HDF5 + unsigned int majnum, minnum, relnum; + H5get_libversion(&majnum, &minnum, &relnum); + sprintf(version, "%i.%i.%i", majnum, minnum, relnum); +#else + sprintf(version, "Unknown version"); +#endif + return version; +} + +/** + * @brief return the METIS version used when SWIFT was built. + * + * @result description of the METIS version. + */ +const char *metis_version(void) { + + static char version[256] = {0}; +#if defined(WITH_MPI) && defined(HAVE_METIS) + sprintf(version, "%i.%i.%i", METIS_VER_MAJOR, METIS_VER_MINOR, + METIS_VER_SUBMINOR); +#else + sprintf(version, "Unknown version"); +#endif + return version; +} + /** * @brief Prints a greeting message to the standard output containing code * version and revision number @@ -138,6 +252,16 @@ void greetings(void) { printf(" Version : %s\n", package_version()); printf(" Revision: %s, Branch: %s\n", git_revision(), git_branch()); - printf(" Webpage : www.swiftsim.com\n"); - printf(" Compiler: %s, Version: %s\n\n", compiler_name(), compiler_version()); + printf(" Webpage : www.swiftsim.com\n\n"); + printf(" Compiler: %s, Version: %s\n", compiler_name(), compiler_version()); +#ifdef HAVE_HDF5 + printf(" HDF5 library version: %s\n", hdf5_version()); +#endif +#ifdef WITH_MPI + printf(" MPI library: %s\n", mpi_version()); +#ifdef HAVE_METIS + printf(" METIS library version: %s\n", metis_version()); +#endif +#endif + printf("\n"); } diff --git a/src/version.h.in b/src/version.h.in index d29ab6d43784c0f64b37a9c0d1a99781c82770bd..7824e06b996dfbb4178b57f1b72365a1e2d24484 100644 --- a/src/version.h.in +++ b/src/version.h.in @@ -35,6 +35,9 @@ const char* git_revision(void); const char* git_branch(void); const char* compiler_name(void); const char* compiler_version(void); +const char* mpi_version(void); +const char *hdf5_version(void); +const char *metis_version(void); void greetings(void); #endif /* SWIFT_VERSION_H */