Merge release-4-5-patches into release-4-6
[alexxy/gromacs.git] / src / gmxlib / copyrite.c
index f4d65ab56bfd03c976b8e1496349b6276af65dea..ae32be48e89de743c9856b2f2b65f32fe07474bf 100644 (file)
@@ -1,45 +1,55 @@
 /*
- * 
- *                This source code is part of
- * 
- *                 G   R   O   M   A   C   S
- * 
- *          GROningen MAchine for Chemical Simulations
- * 
- *                        VERSION 3.2.0
- * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
+ * This file is part of the GROMACS molecular simulation package.
+ *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team,
  * check out http://www.gromacs.org for more information.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
+ * Copyright (c) 2012,2013, by the GROMACS development team, led by
+ * David van der Spoel, Berk Hess, Erik Lindahl, and including many
+ * others, as listed in the AUTHORS file in the top-level source
+ * directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
  * of the License, or (at your option) any later version.
- * 
- * If you want to redistribute modifications, please consider that
- * scientific software is very special. Version control is crucial -
- * bugs must be traceable. We will be happy to consider code for
- * inclusion in the official distribution, but derived work must not
- * be called official GROMACS. Details are found in the README & COPYING
- * files - if they are missing, get the official version at www.gromacs.org.
- * 
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
  * To help us fund GROMACS development, we humbly ask that you cite
- * the papers on the package - you can find them in the top README file.
- * 
- * For more info, check our website at http://www.gromacs.org
- * 
- * And Hey:
- * GROningen Mixture of Alchemy and Childrens' Stories
+ * the research papers on the package. Check out http://www.gromacs.org.
  */
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
-#ifdef GMX_THREADS
+#ifdef GMX_THREAD_MPI
 #include <thread_mpi.h>
 #endif
 
+#ifdef HAVE_LIBMKL
+#include <mkl.h>
+#endif
+#ifdef GMX_FFT_FFTW3
+#include <fftw3.h>
+#endif
+
 /* This file is completely threadsafe - keep it that way! */
 
 #include <string.h>
 #include "smalloc.h"
 #include "string2.h"
 #include "macros.h"
-#include "time.h"
+#include <time.h>
 #include "random.h"
 #include "statutil.h"
 #include "copyrite.h"
 #include "strdb.h"
 #include "futil.h"
+#include "vec.h"
+#include "buildinfo.h"
+#include "gmx_cpuid.h"
 
-static void pr_two(FILE *out,int c,int i)
+static void pr_two(FILE *out, int c, int i)
 {
-  if (i < 10)
-    fprintf(out,"%c0%1d",c,i);
-  else
-    fprintf(out,"%c%2d",c,i);
+    if (i < 10)
+    {
+        fprintf(out, "%c0%1d", c, i);
+    }
+    else
+    {
+        fprintf(out, "%c%2d", c, i);
+    }
 }
 
-void pr_difftime(FILE *out,double dt)
+void pr_difftime(FILE *out, double dt)
 {
-  int    ndays,nhours,nmins,nsecs;
-  gmx_bool   bPrint,bPrinted;
-
-  ndays = dt/(24*3600);
-  dt    = dt-24*3600*ndays;
-  nhours= dt/3600;
-  dt    = dt-3600*nhours;
-  nmins = dt/60;
-  dt    = dt-nmins*60;
-  nsecs = dt;
-  bPrint= (ndays > 0);
-  bPrinted=bPrint;
-  if (bPrint) 
-    fprintf(out,"%d",ndays);
-  bPrint=bPrint || (nhours > 0);
-  if (bPrint) {
-    if (bPrinted)
-      pr_two(out,'d',nhours);
-    else 
-      fprintf(out,"%d",nhours);
-  }
-  bPrinted=bPrinted || bPrint;
-  bPrint=bPrint || (nmins > 0);
-  if (bPrint) {
+    int        ndays, nhours, nmins, nsecs;
+    gmx_bool   bPrint, bPrinted;
+
+    ndays    = dt/(24*3600);
+    dt       = dt-24*3600*ndays;
+    nhours   = dt/3600;
+    dt       = dt-3600*nhours;
+    nmins    = dt/60;
+    dt       = dt-nmins*60;
+    nsecs    = dt;
+    bPrint   = (ndays > 0);
+    bPrinted = bPrint;
+    if (bPrint)
+    {
+        fprintf(out, "%d", ndays);
+    }
+    bPrint = bPrint || (nhours > 0);
+    if (bPrint)
+    {
+        if (bPrinted)
+        {
+            pr_two(out, 'd', nhours);
+        }
+        else
+        {
+            fprintf(out, "%d", nhours);
+        }
+    }
+    bPrinted = bPrinted || bPrint;
+    bPrint   = bPrint || (nmins > 0);
+    if (bPrint)
+    {
+        if (bPrinted)
+        {
+            pr_two(out, 'h', nmins);
+        }
+        else
+        {
+            fprintf(out, "%d", nmins);
+        }
+    }
+    bPrinted = bPrinted || bPrint;
     if (bPrinted)
-      pr_two(out,'h',nmins);
-    else 
-      fprintf(out,"%d",nmins);
-  }
-  bPrinted=bPrinted || bPrint;
-  if (bPrinted)
-    pr_two(out,':',nsecs);
-  else
-    fprintf(out,"%ds",nsecs);
-  fprintf(out,"\n");
+    {
+        pr_two(out, ':', nsecs);
+    }
+    else
+    {
+        fprintf(out, "%ds", nsecs);
+    }
+    fprintf(out, "\n");
 }
 
 
 gmx_bool be_cool(void)
 {
-  /* Yes, it is bad to check the environment variable every call,
-   * but we dont call this routine often, and it avoids using 
-   * a mutex for locking the variable...
-   */
-#ifdef GMX_FAHCORE
-  /*be uncool*/
-  return FALSE;
+    /* Yes, it is bad to check the environment variable every call,
+     * but we dont call this routine often, and it avoids using
+     * a mutex for locking the variable...
+     */
+#ifdef GMX_COOL_QUOTES
+    return (getenv("GMX_NO_QUOTES") == NULL);
 #else
-  return (getenv("GMX_NO_QUOTES") == NULL);
+    /*be uncool*/
+    return FALSE;
 #endif
 }
 
 void space(FILE *out, int n)
 {
-  fprintf(out,"%*s",n,"");
+    fprintf(out, "%*s", n, "");
 }
 
-static void sp_print(FILE *out,const char *s)
+static void sp_print(FILE *out, const char *s)
 {
-  int slen;
-  
-  slen=strlen(s);
-  space(out,(80-slen)/2);
-  fprintf(out,"%s\n",s);
+    int slen;
+
+    slen = strlen(s);
+    space(out, (80-slen)/2);
+    fprintf(out, "%s\n", s);
 }
 
-static void ster_print(FILE *out,const char *s)
+static void ster_print(FILE *out, const char *s)
 {
-  int  slen;
-  char buf[128];
-  
-  snprintf(buf,128,":-)  %s  (-:",s);
-  slen=strlen(buf);
-  space(out,(80-slen)/2);
-  fprintf(out,"%s\n",buf);
+    int  slen;
+    char buf[128];
+
+    snprintf(buf, 128, ":-)  %s  (-:", s);
+    slen = strlen(buf);
+    space(out, (80-slen)/2);
+    fprintf(out, "%s\n", buf);
 }
 
 
-static void pukeit(const char *db,const char *defstring, char *retstring, 
-                  int retsize, int *cqnum)
+static void pukeit(const char *db, const char *defstring, char *retstring,
+                   int retsize, int *cqnum)
 {
-  FILE *fp;
-  char **help;
-  int  i,nhlp;
-  int  seed;
-  if (be_cool() && ((fp = low_libopen(db,FALSE)) != NULL)) {
-    nhlp=fget_lines(fp,&help);
-    /* for libraries we can use the low-level close routines */
-    ffclose(fp);
-    seed=time(NULL);
-    *cqnum=nhlp*rando(&seed);
-    if (strlen(help[*cqnum]) >= STRLEN)
-      help[*cqnum][STRLEN-1] = '\0';
-    strncpy(retstring,help[*cqnum],retsize);
-    for(i=0; (i<nhlp); i++)
-      sfree(help[i]);
-    sfree(help);
-  }
-  else 
-    strncpy(retstring,defstring,retsize);
+    FILE  *fp;
+    char **help;
+    int    i, nhlp;
+    int    seed;
+
+    if (be_cool() && ((fp = low_libopen(db, FALSE)) != NULL))
+    {
+        nhlp = fget_lines(fp, &help);
+        /* for libraries we can use the low-level close routines */
+        ffclose(fp);
+        seed   = time(NULL);
+        *cqnum = nhlp*rando(&seed);
+        if (strlen(help[*cqnum]) >= STRLEN)
+        {
+            help[*cqnum][STRLEN-1] = '\0';
+        }
+        strncpy(retstring, help[*cqnum], retsize);
+        for (i = 0; (i < nhlp); i++)
+        {
+            sfree(help[i]);
+        }
+        sfree(help);
+    }
+    else
+    {
+        strncpy(retstring, defstring, retsize);
+    }
 }
 
 void bromacs(char *retstring, int retsize)
 {
-  int dum;
+    int dum;
 
-  pukeit("bromacs.dat",
-        "Groningen Machine for Chemical Simulation",
-        retstring,retsize,&dum);
+    pukeit("bromacs.dat",
+           "Groningen Machine for Chemical Simulation",
+           retstring, retsize, &dum);
 }
 
 void cool_quote(char *retstring, int retsize, int *cqnum)
 {
-  char *tmpstr;
-  char *s,*ptr;
-  int tmpcq,*p;
-  
-  if (cqnum!=NULL)
-    p = cqnum;
-  else
-    p = &tmpcq;
-  
-  /* protect audience from explicit lyrics */
-  snew(tmpstr,retsize+1);
-  pukeit("gurgle.dat","Thanx for Using GROMACS - Have a Nice Day",
-        tmpstr,retsize-2,p);
-
-  if ((ptr = strchr(tmpstr,'_')) != NULL) {
-    *ptr='\0';
-    ptr++;
-    sprintf(retstring,"\"%s\" %s",tmpstr,ptr);
-  }
-  else {
-    strcpy(retstring,tmpstr);
-  }
-  sfree(tmpstr);
+    char *tmpstr;
+    char *s, *ptr;
+    int   tmpcq, *p;
+
+    if (cqnum != NULL)
+    {
+        p = cqnum;
+    }
+    else
+    {
+        p = &tmpcq;
+    }
+
+    /* protect audience from explicit lyrics */
+    snew(tmpstr, retsize+1);
+    pukeit("gurgle.dat", "Thanx for Using GROMACS - Have a Nice Day",
+           tmpstr, retsize-2, p);
+
+    if ((ptr = strchr(tmpstr, '_')) != NULL)
+    {
+        *ptr = '\0';
+        ptr++;
+        sprintf(retstring, "\"%s\" %s", tmpstr, ptr);
+    }
+    else
+    {
+        strcpy(retstring, tmpstr);
+    }
+    sfree(tmpstr);
 }
 
-void CopyRight(FILE *out,const char *szProgram)
+void CopyRight(FILE *out, const char *szProgram)
 {
-  /* Dont change szProgram arbitrarily - it must be argv[0], i.e. the 
-   * name of a file. Otherwise, we won't be able to find the library dir.
-   */
+    /* Dont change szProgram arbitrarily - it must be argv[0], i.e. the
+     * name of a file. Otherwise, we won't be able to find the library dir.
+     */
 #define NCR (int)asize(CopyrightText)
+/* TODO: Is this exception still needed? */
 #ifdef GMX_FAHCORE
-#define NGPL 0 /*FAH has an exception permission from GPL to allow digital signatures in Gromacs*/
+#define NLICENSE 0 /*FAH has an exception permission from GPL to allow digital signatures in Gromacs*/
 #else
-#define NGPL (int)asize(GPLText)
+#define NLICENSE (int)asize(LicenseText)
 #endif
 
-  char buf[256],tmpstr[1024];
-  int i;
+    char buf[256], tmpstr[1024];
+    int  i;
 
 #ifdef GMX_FAHCORE
-  set_program_name("Gromacs");
+    set_program_name("Gromacs");
 #else
-  set_program_name(szProgram);
+    set_program_name(szProgram);
 #endif
 
-  ster_print(out,"G  R  O  M  A  C  S");
-  fprintf(out,"\n");
-  
-  bromacs(tmpstr,1023);
-  sp_print(out,tmpstr); 
-  fprintf(out,"\n");
+    ster_print(out, "G  R  O  M  A  C  S");
+    fprintf(out, "\n");
 
-  ster_print(out,GromacsVersion());
-  fprintf(out,"\n");
+    bromacs(tmpstr, 1023);
+    sp_print(out, tmpstr);
+    fprintf(out, "\n");
 
-  /* fprintf(out,"\n");*/
+    ster_print(out, GromacsVersion());
+    fprintf(out, "\n");
 
-  /* sp_print(out,"PLEASE NOTE: THIS IS A BETA VERSION\n");
-  
-  fprintf(out,"\n"); */
+    /* fprintf(out,"\n");*/
 
-  for(i=0; (i<NCR); i++) 
-    sp_print(out,CopyrightText[i]);
-  for(i=0; (i<NGPL); i++)
-    sp_print(out,GPLText[i]);
+    /* sp_print(out,"PLEASE NOTE: THIS IS A BETA VERSION\n");
 
-  fprintf(out,"\n");
+       fprintf(out,"\n"); */
 
-  snprintf(buf,256,"%s",Program());
+    for (i = 0; (i < NCR); i++)
+    {
+        sp_print(out, CopyrightText[i]);
+    }
+    for (i = 0; (i < NLICENSE); i++)
+    {
+        sp_print(out, LicenseText[i]);
+    }
+
+    fprintf(out, "\n");
+
+    snprintf(buf, 256, "%s", Program());
 #ifdef GMX_DOUBLE
-  strcat(buf," (double precision)");
+    strcat(buf, " (double precision)");
 #endif
-  ster_print(out,buf);
-  fprintf(out,"\n");
+    ster_print(out, buf);
+    fprintf(out, "\n");
 }
 
 
 void thanx(FILE *fp)
 {
-  char cq[1024];
-  int  cqnum;
-
-  /* protect the audience from suggestive discussions */
-  cool_quote(cq,1023,&cqnum);
-  
-  if (be_cool()) 
-    fprintf(fp,"\ngcq#%d: %s\n\n",cqnum,cq);
-  else
-    fprintf(fp,"\n%s\n\n",cq);
+    char cq[1024];
+    int  cqnum;
+
+    /* protect the audience from suggestive discussions */
+    cool_quote(cq, 1023, &cqnum);
+
+    if (be_cool())
+    {
+        fprintf(fp, "\ngcq#%d: %s\n\n", cqnum, cq);
+    }
+    else
+    {
+        fprintf(fp, "\n%s\n\n", cq);
+    }
 }
 
 typedef struct {
-  const char *key;
-  const char *author;
-  const char *title;
-  const char *journal;
-  int volume,year;
-  const char *pages;
+    const char *key;
+    const char *author;
+    const char *title;
+    const char *journal;
+    int         volume, year;
+    const char *pages;
 } t_citerec;
 
-void please_cite(FILE *fp,const char *key)
+void please_cite(FILE *fp, const char *key)
 {
-  static const t_citerec citedb[] = {
-    { "Allen1987a",
-      "M. P. Allen and D. J. Tildesley",
-      "Computer simulation of liquids",
-      "Oxford Science Publications",
-      1, 1987, "1" },
-    { "Berendsen95a",
-      "H. J. C. Berendsen, D. van der Spoel and R. van Drunen",
-      "GROMACS: A message-passing parallel molecular dynamics implementation",
-      "Comp. Phys. Comm.",
-      91, 1995, "43-56" },
-    { "Berendsen84a",
-      "H. J. C. Berendsen, J. P. M. Postma, A. DiNola and J. R. Haak",
-      "Molecular dynamics with coupling to an external bath",
-      "J. Chem. Phys.",
-      81, 1984, "3684-3690" },
-    { "Ryckaert77a",
-      "J. P. Ryckaert and G. Ciccotti and H. J. C. Berendsen",
-      "Numerical Integration of the Cartesian Equations of Motion of a System with Constraints; Molecular Dynamics of n-Alkanes",
-      "J. Comp. Phys.",
-      23, 1977, "327-341" },
-    { "Miyamoto92a",
-      "S. Miyamoto and P. A. Kollman",
-      "SETTLE: An Analytical Version of the SHAKE and RATTLE Algorithms for Rigid Water Models",
-      "J. Comp. Chem.",
-      13, 1992, "952-962" },
-    { "Cromer1968a",
-      "D. T. Cromer & J. B. Mann",
-      "X-ray scattering factors computed from numerical Hartree-Fock wave functions",
-      "Acta Cryst. A",
-      24, 1968, "321" },
-    { "Barth95a",
-      "E. Barth and K. Kuczera and B. Leimkuhler and R. D. Skeel",
-      "Algorithms for Constrained Molecular Dynamics",
-      "J. Comp. Chem.",
-      16, 1995, "1192-1209" },
-    { "Essmann95a",
-      "U. Essmann, L. Perera, M. L. Berkowitz, T. Darden, H. Lee and L. G. Pedersen ",
-      "A smooth particle mesh Ewald method",
-      "J. Chem. Phys.",
-      103, 1995, "8577-8592" },
-    { "Torda89a",
-      "A. E. Torda and R. M. Scheek and W. F. van Gunsteren",
-      "Time-dependent distance restraints in molecular dynamics simulations",
-      "Chem. Phys. Lett.",
-      157, 1989, "289-294" },
-    { "Tironi95a",
-      "I. G. Tironi and R. Sperb and P. E. Smith and W. F. van Gunsteren",
-      "Generalized reaction field method for molecular dynamics simulations",
-      "J. Chem. Phys",
-      102, 1995, "5451-5459" },
-    { "Hess97a",
-      "B. Hess and H. Bekker and H. J. C. Berendsen and J. G. E. M. Fraaije",
-      "LINCS: A Linear Constraint Solver for molecular simulations",
-      "J. Comp. Chem.",
-      18, 1997, "1463-1472" },
-    { "Hess2008a",
-      "B. Hess",
-      "P-LINCS: A Parallel Linear Constraint Solver for molecular simulation",
-      "J. Chem. Theory Comput.",
-      4, 2008, "116-122" },
-    { "Hess2008b",
-      "B. Hess and C. Kutzner and D. van der Spoel and E. Lindahl",
-      "GROMACS 4: Algorithms for highly efficient, load-balanced, and scalable molecular simulation",
-      "J. Chem. Theory Comput.",
-      4, 2008, "435-447" },
-    { "Hub2010",
-      "J. S. Hub, B. L. de Groot and D. van der Spoel",
-      "g_wham - A free weighted histogram analysis implementation including robust error and autocorrelation estimates",
-      "J. Chem. Theory Comput.",
-      6, 2010, "3713-3720"}, 
-    { "In-Chul99a",
-      "Y. In-Chul and M. L. Berkowitz",
-      "Ewald summation for systems with slab geometry",
-      "J. Chem. Phys.",
-      111, 1999, "3155-3162" },
-    { "DeGroot97a",
-      "B. L. de Groot and D. M. F. van Aalten and R. M. Scheek and A. Amadei and G. Vriend and H. J. C. Berendsen",
-      "Prediction of Protein Conformational Freedom From Distance Constrains",
-      "Proteins",
-      29, 1997, "240-251" },
-    { "Spoel98a",
-      "D. van der Spoel and P. J. van Maaren and H. J. C. Berendsen",
-      "A systematic study of water models for molecular simulation. Derivation of models optimized for use with a reaction-field.",
-      "J. Chem. Phys.",
-      108, 1998, "10220-10230" },
-    { "Wishart98a",
-      "D. S. Wishart and A. M. Nip",
-      "Protein Chemical Shift Analysis: A Practical Guide",
-      "Biochem. Cell Biol.",
-      76, 1998, "153-163" },
-    { "Maiorov95",
-      "V. N. Maiorov and G. M. Crippen",
-      "Size-Independent Comparison of Protein Three-Dimensional Structures",
-      "PROTEINS: Struct. Funct. Gen.",
-      22, 1995, "273-283" },
-    { "Feenstra99",
-      "K. A. Feenstra and B. Hess and H. J. C. Berendsen",
-      "Improving Efficiency of Large Time-scale Molecular Dynamics Simulations of Hydrogen-rich Systems",
-      "J. Comput. Chem.",
-      20, 1999, "786-798" },
-    { "Timneanu2004a",
-      "N. Timneanu and C. Caleman and J. Hajdu and D. van der Spoel",
-      "Auger Electron Cascades in Water and Ice",
-      "Chem. Phys.",
-      299, 2004, "277-283" },
-    { "Pascal2011a",
-      "T. A. Pascal and S. T. Lin and W. A. Goddard III",
-      "Thermodynamics of liquids: standard molar entropies and heat capacities of common solvents from 2PT molecular dynamics",
-      "Phys. Chem. Chem. Phys.",
-      13, 2011, "169-181" },
-    { "Caleman2011b",
-      "C. Caleman and M. Hong and J. S. Hub and L. T. da Costa and P. J. van Maaren and D. van der Spoel",
-      "Force Field Benchmark 1: Density, Heat of Vaporization, Heat Capacity, Surface Tension and Dielectric Constant of 152 Organic Liquids",
-      "Submitted",
-      0, 2011, "" },
-    { "Lindahl2001a",
-      "E. Lindahl and B. Hess and D. van der Spoel",
-      "GROMACS 3.0: A package for molecular simulation and trajectory analysis",
-      "J. Mol. Mod.",
-      7, 2001, "306-317" },
-    { "Wang2001a",
-      "J. Wang and W. Wang and S. Huo and M. Lee and P. A. Kollman",
-      "Solvation model based on weighted solvent accessible surface area",
-      "J. Phys. Chem. B",
-      105, 2001, "5055-5067" },
-    { "Eisenberg86a",
-      "D. Eisenberg and A. D. McLachlan",
-      "Solvation energy in protein folding and binding",
-      "Nature",
-      319, 1986, "199-203" },
-    { "Eisenhaber95",
-      "Frank Eisenhaber and Philip Lijnzaad and Patrick Argos and Chris Sander and Michael Scharf",
-      "The Double Cube Lattice Method: Efficient Approaches to Numerical Integration of Surface Area and Volume and to Dot Surface Contouring of Molecular Assemblies",
-      "J. Comp. Chem.",
-      16, 1995, "273-284" },
-    { "Hess2002",
-      "B. Hess, H. Saint-Martin and H.J.C. Berendsen",
-      "Flexible constraints: an adiabatic treatment of quantum degrees of freedom, with application to the flexible and polarizable MCDHO model for water",
-      "J. Chem. Phys.",
-      116, 2002, "9602-9610" },
-    { "Hetenyi2002b",
-      "Csaba Hetenyi and David van der Spoel",
-      "Efficient docking of peptides to proteins without prior knowledge of the binding site.",
-      "Prot. Sci.",
-      11, 2002, "1729-1737" },
-    { "Hess2003",
-      "B. Hess and R.M. Scheek",
-      "Orientation restraints in molecular dynamics simulations using time and ensemble averaging",
-      "J. Magn. Res.",
-      164, 2003, "19-27" },
-    { "Rappe1991a",
-      "A. K. Rappe and W. A. Goddard III",
-      "Charge Equillibration for Molecular Dynamics Simulations",
-      "J. Phys. Chem.",
-      95, 1991, "3358-3363" },
-    { "Mu2005a",
-      "Y. Mu, P. H. Nguyen and G. Stock",
-      "Energy landscape of a small peptide revelaed by dihedral angle principal component analysis",
-      "Prot. Struct. Funct. Bioinf.",
-      58, 2005, "45-52" },
-    { "Okabe2001a",
-      "T. Okabe and M. Kawata and Y. Okamoto and M. Mikami",
-      "Replica-exchange {M}onte {C}arlo method for the isobaric-isothermal ensemble",
-      "Chem. Phys. Lett.",
-      335, 2001, "435-439" },
-    { "Hukushima96a",
-      "K. Hukushima and K. Nemoto",
-      "Exchange Monte Carlo Method and Application to Spin Glass Simulations",
-      "J. Phys. Soc. Jpn.",
-      65, 1996, "1604-1608" },
-    { "Tropp80a",
-      "J. Tropp",
-      "Dipolar Relaxation and Nuclear Overhauser effects in nonrigid molecules: The effect of fluctuating internuclear distances",
-      "J. Chem. Phys.",
-      72, 1980, "6035-6043" },
-    { "Bultinck2002a",
-       "P. Bultinck and W. Langenaeker and P. Lahorte and F. De Proft and P. Geerlings and M. Waroquier and J. P. Tollenaere",
-      "The electronegativity equalization method I: Parametrization and validation for atomic charge calculations",
-      "J. Phys. Chem. A",
-      106, 2002, "7887-7894" },
-    { "Yang2006b",
-      "Q. Y. Yang and K. A. Sharp",
-      "Atomic charge parameters for the finite difference Poisson-Boltzmann method using electronegativity neutralization",
-      "J. Chem. Theory Comput.",
-      2, 2006, "1152-1167" },
-    { "Spoel2005a",
-      "D. van der Spoel, E. Lindahl, B. Hess, G. Groenhof, A. E. Mark and H. J. C. Berendsen",
-      "GROMACS: Fast, Flexible and Free",
-      "J. Comp. Chem.",
-      26, 2005, "1701-1719" },
-    { "Spoel2006b",
-      "D. van der Spoel, P. J. van Maaren, P. Larsson and N. Timneanu",
-      "Thermodynamics of hydrogen bonding in hydrophilic and hydrophobic media",
-      "J. Phys. Chem. B",
-      110, 2006, "4393-4398" },
-    { "Spoel2006d",
-      "D. van der Spoel and M. M. Seibert",
-      "Protein folding kinetics and thermodynamics from atomistic simulations",
-      "Phys. Rev. Letters",
-      96, 2006, "238102" },
-    { "Palmer94a",
-      "B. J. Palmer",
-      "Transverse-current autocorrelation-function calculations of the shear viscosity for molecular liquids",
-      "Phys. Rev. E",
-      49, 1994, "359-366" },
-    { "Bussi2007a",
-      "G. Bussi, D. Donadio and M. Parrinello",
-      "Canonical sampling through velocity rescaling",
-      "J. Chem. Phys.",
-      126, 2007, "014101" },
-    { "Hub2006",
-      "J. S. Hub and B. L. de Groot",
-      "Does CO2 permeate through Aquaporin-1?",
-      "Biophys. J.",
-      91, 2006, "842-848" },
-    { "Hub2008",
-      "J. S. Hub and B. L. de Groot",
-      "Mechanism of selectivity in aquaporins and aquaglyceroporins",
-      "PNAS",
-      105, 2008, "1198-1203" },
-    { "Friedrich2009",
-      "M. S. Friedrichs, P. Eastman, V. Vaidyanathan, M. Houston, S. LeGrand, A. L. Beberg, D. L. Ensign, C. M. Bruns, and V. S. Pande",
-      "Accelerating Molecular Dynamic Simulation on Graphics Processing Units",
-      "J. Comp. Chem.",
-      30, 2009, "864-872" },
-    { "Engin2010",
-      "O. Engin, A. Villa, M. Sayar and B. Hess",
-      "Driving Forces for Adsorption of Amphiphilic Peptides to Air-Water Interface",
-      "J. Phys. Chem. B",
-      0, 2010, "???" },
-    { "Wang2010",
-      "H. Wang, F. Dommert, C.Holm",
-      "Optimizing working parameters of the smooth particle mesh Ewald algorithm in terms of accuracy and efficiency",
-      "J. Chem. Phys. B",
-      133, 2010, "034117"
-    },
-    { "Sugita1999a",
-      "Y. Sugita, Y. Okamoto",
-      "Replica-exchange molecular dynamics method for protein folding",
-      "Chem. Phys. Lett.",
-      314, 1999, "141-151" },
-  };
+    static const t_citerec citedb[] = {
+        { "Allen1987a",
+          "M. P. Allen and D. J. Tildesley",
+          "Computer simulation of liquids",
+          "Oxford Science Publications",
+          1, 1987, "1" },
+        { "Berendsen95a",
+          "H. J. C. Berendsen, D. van der Spoel and R. van Drunen",
+          "GROMACS: A message-passing parallel molecular dynamics implementation",
+          "Comp. Phys. Comm.",
+          91, 1995, "43-56" },
+        { "Berendsen84a",
+          "H. J. C. Berendsen, J. P. M. Postma, A. DiNola and J. R. Haak",
+          "Molecular dynamics with coupling to an external bath",
+          "J. Chem. Phys.",
+          81, 1984, "3684-3690" },
+        { "Ryckaert77a",
+          "J. P. Ryckaert and G. Ciccotti and H. J. C. Berendsen",
+          "Numerical Integration of the Cartesian Equations of Motion of a System with Constraints; Molecular Dynamics of n-Alkanes",
+          "J. Comp. Phys.",
+          23, 1977, "327-341" },
+        { "Miyamoto92a",
+          "S. Miyamoto and P. A. Kollman",
+          "SETTLE: An Analytical Version of the SHAKE and RATTLE Algorithms for Rigid Water Models",
+          "J. Comp. Chem.",
+          13, 1992, "952-962" },
+        { "Cromer1968a",
+          "D. T. Cromer & J. B. Mann",
+          "X-ray scattering factors computed from numerical Hartree-Fock wave functions",
+          "Acta Cryst. A",
+          24, 1968, "321" },
+        { "Barth95a",
+          "E. Barth and K. Kuczera and B. Leimkuhler and R. D. Skeel",
+          "Algorithms for Constrained Molecular Dynamics",
+          "J. Comp. Chem.",
+          16, 1995, "1192-1209" },
+        { "Essmann95a",
+          "U. Essmann, L. Perera, M. L. Berkowitz, T. Darden, H. Lee and L. G. Pedersen ",
+          "A smooth particle mesh Ewald method",
+          "J. Chem. Phys.",
+          103, 1995, "8577-8592" },
+        { "Torda89a",
+          "A. E. Torda and R. M. Scheek and W. F. van Gunsteren",
+          "Time-dependent distance restraints in molecular dynamics simulations",
+          "Chem. Phys. Lett.",
+          157, 1989, "289-294" },
+        { "Tironi95a",
+          "I. G. Tironi and R. Sperb and P. E. Smith and W. F. van Gunsteren",
+          "Generalized reaction field method for molecular dynamics simulations",
+          "J. Chem. Phys",
+          102, 1995, "5451-5459" },
+        { "Hess97a",
+          "B. Hess and H. Bekker and H. J. C. Berendsen and J. G. E. M. Fraaije",
+          "LINCS: A Linear Constraint Solver for molecular simulations",
+          "J. Comp. Chem.",
+          18, 1997, "1463-1472" },
+        { "Hess2008a",
+          "B. Hess",
+          "P-LINCS: A Parallel Linear Constraint Solver for molecular simulation",
+          "J. Chem. Theory Comput.",
+          4, 2008, "116-122" },
+        { "Hess2008b",
+          "B. Hess and C. Kutzner and D. van der Spoel and E. Lindahl",
+          "GROMACS 4: Algorithms for highly efficient, load-balanced, and scalable molecular simulation",
+          "J. Chem. Theory Comput.",
+          4, 2008, "435-447" },
+        { "Hub2010",
+          "J. S. Hub, B. L. de Groot and D. van der Spoel",
+          "g_wham - A free weighted histogram analysis implementation including robust error and autocorrelation estimates",
+          "J. Chem. Theory Comput.",
+          6, 2010, "3713-3720"},
+        { "In-Chul99a",
+          "Y. In-Chul and M. L. Berkowitz",
+          "Ewald summation for systems with slab geometry",
+          "J. Chem. Phys.",
+          111, 1999, "3155-3162" },
+        { "DeGroot97a",
+          "B. L. de Groot and D. M. F. van Aalten and R. M. Scheek and A. Amadei and G. Vriend and H. J. C. Berendsen",
+          "Prediction of Protein Conformational Freedom From Distance Constrains",
+          "Proteins",
+          29, 1997, "240-251" },
+        { "Spoel98a",
+          "D. van der Spoel and P. J. van Maaren and H. J. C. Berendsen",
+          "A systematic study of water models for molecular simulation. Derivation of models optimized for use with a reaction-field.",
+          "J. Chem. Phys.",
+          108, 1998, "10220-10230" },
+        { "Wishart98a",
+          "D. S. Wishart and A. M. Nip",
+          "Protein Chemical Shift Analysis: A Practical Guide",
+          "Biochem. Cell Biol.",
+          76, 1998, "153-163" },
+        { "Maiorov95",
+          "V. N. Maiorov and G. M. Crippen",
+          "Size-Independent Comparison of Protein Three-Dimensional Structures",
+          "PROTEINS: Struct. Funct. Gen.",
+          22, 1995, "273-283" },
+        { "Feenstra99",
+          "K. A. Feenstra and B. Hess and H. J. C. Berendsen",
+          "Improving Efficiency of Large Time-scale Molecular Dynamics Simulations of Hydrogen-rich Systems",
+          "J. Comput. Chem.",
+          20, 1999, "786-798" },
+        { "Timneanu2004a",
+          "N. Timneanu and C. Caleman and J. Hajdu and D. van der Spoel",
+          "Auger Electron Cascades in Water and Ice",
+          "Chem. Phys.",
+          299, 2004, "277-283" },
+        { "Pascal2011a",
+          "T. A. Pascal and S. T. Lin and W. A. Goddard III",
+          "Thermodynamics of liquids: standard molar entropies and heat capacities of common solvents from 2PT molecular dynamics",
+          "Phys. Chem. Chem. Phys.",
+          13, 2011, "169-181" },
+        { "Caleman2011b",
+          "C. Caleman and P. J. van Maaren and M. Hong and J. S. Hub and L. T. da Costa and D. van der Spoel",
+          "Force Field Benchmark of Organic Liquids: Density, Enthalpy of Vaporization, Heat Capacities, Surface Tension, Isothermal Compressibility, Volumetric Expansion Coefficient, and Dielectric Constant",
+          "J. Chem. Theo. Comp.",
+          8, 2012, "61" },
+        { "Lindahl2001a",
+          "E. Lindahl and B. Hess and D. van der Spoel",
+          "GROMACS 3.0: A package for molecular simulation and trajectory analysis",
+          "J. Mol. Mod.",
+          7, 2001, "306-317" },
+        { "Wang2001a",
+          "J. Wang and W. Wang and S. Huo and M. Lee and P. A. Kollman",
+          "Solvation model based on weighted solvent accessible surface area",
+          "J. Phys. Chem. B",
+          105, 2001, "5055-5067" },
+        { "Eisenberg86a",
+          "D. Eisenberg and A. D. McLachlan",
+          "Solvation energy in protein folding and binding",
+          "Nature",
+          319, 1986, "199-203" },
+        { "Eisenhaber95",
+          "Frank Eisenhaber and Philip Lijnzaad and Patrick Argos and Chris Sander and Michael Scharf",
+          "The Double Cube Lattice Method: Efficient Approaches to Numerical Integration of Surface Area and Volume and to Dot Surface Contouring of Molecular Assemblies",
+          "J. Comp. Chem.",
+          16, 1995, "273-284" },
+        { "Hess2002",
+          "B. Hess, H. Saint-Martin and H.J.C. Berendsen",
+          "Flexible constraints: an adiabatic treatment of quantum degrees of freedom, with application to the flexible and polarizable MCDHO model for water",
+          "J. Chem. Phys.",
+          116, 2002, "9602-9610" },
+        { "Hetenyi2002b",
+          "Csaba Hetenyi and David van der Spoel",
+          "Efficient docking of peptides to proteins without prior knowledge of the binding site.",
+          "Prot. Sci.",
+          11, 2002, "1729-1737" },
+        { "Hess2003",
+          "B. Hess and R.M. Scheek",
+          "Orientation restraints in molecular dynamics simulations using time and ensemble averaging",
+          "J. Magn. Res.",
+          164, 2003, "19-27" },
+        { "Rappe1991a",
+          "A. K. Rappe and W. A. Goddard III",
+          "Charge Equillibration for Molecular Dynamics Simulations",
+          "J. Phys. Chem.",
+          95, 1991, "3358-3363" },
+        { "Mu2005a",
+          "Y. Mu, P. H. Nguyen and G. Stock",
+          "Energy landscape of a small peptide revelaed by dihedral angle principal component analysis",
+          "Prot. Struct. Funct. Bioinf.",
+          58, 2005, "45-52" },
+        { "Okabe2001a",
+          "T. Okabe and M. Kawata and Y. Okamoto and M. Mikami",
+          "Replica-exchange {M}onte {C}arlo method for the isobaric-isothermal ensemble",
+          "Chem. Phys. Lett.",
+          335, 2001, "435-439" },
+        { "Hukushima96a",
+          "K. Hukushima and K. Nemoto",
+          "Exchange Monte Carlo Method and Application to Spin Glass Simulations",
+          "J. Phys. Soc. Jpn.",
+          65, 1996, "1604-1608" },
+        { "Tropp80a",
+          "J. Tropp",
+          "Dipolar Relaxation and Nuclear Overhauser effects in nonrigid molecules: The effect of fluctuating internuclear distances",
+          "J. Chem. Phys.",
+          72, 1980, "6035-6043" },
+        { "Bultinck2002a",
+          "P. Bultinck and W. Langenaeker and P. Lahorte and F. De Proft and P. Geerlings and M. Waroquier and J. P. Tollenaere",
+          "The electronegativity equalization method I: Parametrization and validation for atomic charge calculations",
+          "J. Phys. Chem. A",
+          106, 2002, "7887-7894" },
+        { "Yang2006b",
+          "Q. Y. Yang and K. A. Sharp",
+          "Atomic charge parameters for the finite difference Poisson-Boltzmann method using electronegativity neutralization",
+          "J. Chem. Theory Comput.",
+          2, 2006, "1152-1167" },
+        { "Spoel2005a",
+          "D. van der Spoel, E. Lindahl, B. Hess, G. Groenhof, A. E. Mark and H. J. C. Berendsen",
+          "GROMACS: Fast, Flexible and Free",
+          "J. Comp. Chem.",
+          26, 2005, "1701-1719" },
+        { "Spoel2006b",
+          "D. van der Spoel, P. J. van Maaren, P. Larsson and N. Timneanu",
+          "Thermodynamics of hydrogen bonding in hydrophilic and hydrophobic media",
+          "J. Phys. Chem. B",
+          110, 2006, "4393-4398" },
+        { "Spoel2006d",
+          "D. van der Spoel and M. M. Seibert",
+          "Protein folding kinetics and thermodynamics from atomistic simulations",
+          "Phys. Rev. Letters",
+          96, 2006, "238102" },
+        { "Palmer94a",
+          "B. J. Palmer",
+          "Transverse-current autocorrelation-function calculations of the shear viscosity for molecular liquids",
+          "Phys. Rev. E",
+          49, 1994, "359-366" },
+        { "Bussi2007a",
+          "G. Bussi, D. Donadio and M. Parrinello",
+          "Canonical sampling through velocity rescaling",
+          "J. Chem. Phys.",
+          126, 2007, "014101" },
+        { "Hub2006",
+          "J. S. Hub and B. L. de Groot",
+          "Does CO2 permeate through Aquaporin-1?",
+          "Biophys. J.",
+          91, 2006, "842-848" },
+        { "Hub2008",
+          "J. S. Hub and B. L. de Groot",
+          "Mechanism of selectivity in aquaporins and aquaglyceroporins",
+          "PNAS",
+          105, 2008, "1198-1203" },
+        { "Friedrich2009",
+          "M. S. Friedrichs, P. Eastman, V. Vaidyanathan, M. Houston, S. LeGrand, A. L. Beberg, D. L. Ensign, C. M. Bruns, and V. S. Pande",
+          "Accelerating Molecular Dynamic Simulation on Graphics Processing Units",
+          "J. Comp. Chem.",
+          30, 2009, "864-872" },
+        { "Engin2010",
+          "O. Engin, A. Villa, M. Sayar and B. Hess",
+          "Driving Forces for Adsorption of Amphiphilic Peptides to Air-Water Interface",
+          "J. Phys. Chem. B",
+          114, 2010, "11093" },
+        { "Fritsch12",
+          "S. Fritsch, C. Junghans and K. Kremer",
+          "Adaptive molecular simulation study on structure formation of toluene around C60 using Gromacs",
+          "J. Chem. Theo. Comp.",
+          8, 2012, "398" },
+        { "Junghans10",
+          "C. Junghans and S. Poblete",
+          "A reference implementation of the adaptive resolution scheme in ESPResSo",
+          "Comp. Phys. Comm.",
+          181, 2010, "1449" },
+        { "Wang2010",
+          "H. Wang, F. Dommert, C.Holm",
+          "Optimizing working parameters of the smooth particle mesh Ewald algorithm in terms of accuracy and efficiency",
+          "J. Chem. Phys. B",
+          133, 2010, "034117" },
+        { "Sugita1999a",
+          "Y. Sugita, Y. Okamoto",
+          "Replica-exchange molecular dynamics method for protein folding",
+          "Chem. Phys. Lett.",
+          314, 1999, "141-151" },
+        { "Kutzner2011",
+          "C. Kutzner and J. Czub and H. Grubmuller",
+          "Keep it Flexible: Driving Macromolecular Rotary Motions in Atomistic Simulations with GROMACS",
+          "J. Chem. Theory Comput.",
+          7, 2011, "1381-1393" },
+        { "Hoefling2011",
+          "M. Hoefling, N. Lima, D. Haenni, C.A.M. Seidel, B. Schuler, H. Grubmuller",
+          "Structural Heterogeneity and Quantitative FRET Efficiency Distributions of Polyprolines through a Hybrid Atomistic Simulation and Monte Carlo Approach",
+          "PLoS ONE",
+          6, 2011, "e19791" },
+        { "Hockney1988",
+          "R. W. Hockney and J. W. Eastwood",
+          "Computer simulation using particles",
+          "IOP, Bristol",
+          1, 1988, "1" },
+        { "Ballenegger2012",
+          "V. Ballenegger, J.J. Cerda, and C. Holm",
+          "How to Convert SPME to P3M: Influence Functions and Error Estimates",
+          "J. Chem. Theory Comput.",
+          8, 2012, "936-947" },
+        { "Garmay2012",
+          "Garmay Yu, Shvetsov A, Karelov D, Lebedev D, Radulescu A, Petukhov M, Isaev-Ivanov V",
+          "Correlated motion of protein subdomains and large-scale conformational flexibility of RecA protein filament",
+          "Journal of Physics: Conference Series",
+          340, 2012, "012094" }
+    };
 #define NSTR (int)asize(citedb)
-  
-  int  j,index;
-  char *author;
-  char *title;
+
+    int   j, index;
+    char *author;
+    char *title;
 #define LINE_WIDTH 79
-  
-  if (fp == NULL)
-    return;
-
-  for(index=0; (index<NSTR) && (strcmp(citedb[index].key,key) != 0); index++)
-    ;
-  
-  fprintf(fp,"\n++++ PLEASE READ AND CITE THE FOLLOWING REFERENCE ++++\n");
-  if (index < NSTR) {
-    /* Insert newlines */
-    author = wrap_lines(citedb[index].author,LINE_WIDTH,0,FALSE);
-    title  = wrap_lines(citedb[index].title,LINE_WIDTH,0,FALSE);
-    fprintf(fp,"%s\n%s\n%s %d (%d) pp. %s\n",
-           author,title,citedb[index].journal,
-           citedb[index].volume,citedb[index].year,
-           citedb[index].pages);
-    sfree(author);
-    sfree(title);
-  }
-  else {
-    fprintf(fp,"Entry %s not found in citation database\n",key);
-  }
-  fprintf(fp,"-------- -------- --- Thank You --- -------- --------\n\n");
-  fflush(fp);
+
+    if (fp == NULL)
+    {
+        return;
+    }
+
+    for (index = 0; (index < NSTR) && (strcmp(citedb[index].key, key) != 0); index++)
+    {
+        ;
+    }
+
+    fprintf(fp, "\n++++ PLEASE READ AND CITE THE FOLLOWING REFERENCE ++++\n");
+    if (index < NSTR)
+    {
+        /* Insert newlines */
+        author = wrap_lines(citedb[index].author, LINE_WIDTH, 0, FALSE);
+        title  = wrap_lines(citedb[index].title, LINE_WIDTH, 0, FALSE);
+        fprintf(fp, "%s\n%s\n%s %d (%d) pp. %s\n",
+                author, title, citedb[index].journal,
+                citedb[index].volume, citedb[index].year,
+                citedb[index].pages);
+        sfree(author);
+        sfree(title);
+    }
+    else
+    {
+        fprintf(fp, "Entry %s not found in citation database\n", key);
+    }
+    fprintf(fp, "-------- -------- --- Thank You --- -------- --------\n\n");
+    fflush(fp);
 }
 
 #ifdef USE_VERSION_H
@@ -562,58 +657,111 @@ void please_cite(FILE *fp,const char *key)
 #include "version.h"
 #else
 /* Fall back to statically defined version. */
-static const char _gmx_ver_string[]="VERSION " VERSION;
+static const char _gmx_ver_string[] = "VERSION " VERSION;
 #endif
 
-/* This routine only returns a static (constant) string, so we use a 
- * mutex to initialize it. Since the string is only written to the
- * first time, there is no risk with multiple calls overwriting the
- * output for each other.
- */
 const char *GromacsVersion()
 {
-  return _gmx_ver_string;
+    return _gmx_ver_string;
 }
 
+void gmx_print_version_info_gpu(FILE *fp);
 
 void gmx_print_version_info(FILE *fp)
 {
-    fprintf(fp, "Version:          %s\n", _gmx_ver_string);
+    fprintf(fp, "Gromacs version:    %s\n", _gmx_ver_string);
 #ifdef USE_VERSION_H
-    fprintf(fp, "GIT SHA1 hash:    %s\n", _gmx_full_git_hash);
+    fprintf(fp, "GIT SHA1 hash:      %s\n", _gmx_full_git_hash);
     /* Only print out the branch information if present.
      * The generating script checks whether the branch point actually
      * coincides with the hash reported above, and produces an empty string
      * in such cases. */
     if (_gmx_central_base_hash[0] != 0)
     {
-        fprintf(fp, "Branched from:    %s\n", _gmx_central_base_hash);
+        fprintf(fp, "Branched from:      %s\n", _gmx_central_base_hash);
     }
 #endif
 
 #ifdef GMX_DOUBLE
-    fprintf(fp, "Precision:        double\n");
+    fprintf(fp, "Precision:          double\n");
 #else
-    fprintf(fp, "Precision:        single\n");
+    fprintf(fp, "Precision:          single\n");
 #endif
+    fprintf(fp, "Memory model:       %lu bit\n", 8*sizeof(void *));
 
-#ifdef GMX_THREADS
-    fprintf(fp, "Parallellization: thread_mpi\n");
+#ifdef GMX_THREAD_MPI
+    fprintf(fp, "MPI library:        thread_mpi\n");
 #elif defined(GMX_MPI)
-    fprintf(fp, "Parallellization: MPI\n");
+    fprintf(fp, "MPI library:        MPI\n");
 #else
-    fprintf(fp, "Parallellization: none\n");
+    fprintf(fp, "MPI library:        none\n");
 #endif
-
+#ifdef GMX_OPENMP
+    fprintf(fp, "OpenMP support:     enabled\n");
+#else
+    fprintf(fp, "OpenMP support:     disabled\n");
+#endif
+#ifdef GMX_GPU
+    fprintf(fp, "GPU support:        enabled\n");
+#else
+    fprintf(fp, "GPU support:        disabled\n");
+#endif
+    /* A preprocessor trick to avoid duplicating logic from vec.h */
+#define gmx_stringify2(x) #x
+#define gmx_stringify(x) gmx_stringify2(x)
+    fprintf(fp, "invsqrt routine:    %s\n", gmx_stringify(gmx_invsqrt(x)));
+    fprintf(fp, "CPU acceleration:   %s\n", GMX_CPU_ACCELERATION_STRING);
+
+    /* TODO: Would be nicer to wrap this in a gmx_fft_version() call, but
+     * since that is currently in mdlib, can wait for master. */
 #ifdef GMX_FFT_FFTPACK
-    fprintf(fp, "FFT Library:      fftpack\n");
-#elif defined(GMX_FFT_FFTW2)
-    fprintf(fp, "FFT Library:      fftw2\n");
+    fprintf(fp, "FFT library:        fftpack (built-in)\n");
+#elif defined(GMX_FFT_FFTW3) && defined(GMX_NATIVE_WINDOWS)
+    fprintf(fp, "FFT library:        %s\n", "fftw3");
+#elif defined(GMX_FFT_FFTW3) && defined(GMX_DOUBLE)
+    fprintf(fp, "FFT library:        %s\n", fftw_version);
 #elif defined(GMX_FFT_FFTW3)
-    fprintf(fp, "FFT Library:      fftw3\n");
+    fprintf(fp, "FFT library:        %s\n", fftwf_version);
 #elif defined(GMX_FFT_MKL)
-    fprintf(fp, "FFT Library:      MKL\n");
+    fprintf(fp, "FFT library:        MKL\n");
 #else
-    fprintf(fp, "FFT Library:      unknown\n");
+    fprintf(fp, "FFT library:        unknown\n");
+#endif
+#ifdef GMX_LARGEFILES
+    fprintf(fp, "Large file support: enabled\n");
+#else
+    fprintf(fp, "Large file support: disabled\n");
+#endif
+#ifdef HAVE_RDTSCP
+    fprintf(fp, "RDTSCP usage:       enabled\n");
+#else
+    fprintf(fp, "RDTSCP usage:       disabled\n");
+#endif
+
+    fprintf(fp, "Built on:           %s\n", BUILD_TIME);
+    fprintf(fp, "Built by:           %s\n", BUILD_USER);
+    fprintf(fp, "Build OS/arch:      %s\n", BUILD_HOST);
+    fprintf(fp, "Build CPU vendor:   %s\n", BUILD_CPU_VENDOR);
+    fprintf(fp, "Build CPU brand:    %s\n", BUILD_CPU_BRAND);
+    fprintf(fp, "Build CPU family:   %d   Model: %d   Stepping: %d\n",
+            BUILD_CPU_FAMILY, BUILD_CPU_MODEL, BUILD_CPU_STEPPING);
+    /* TODO: The below strings can be quite long, so it would be nice to wrap
+     * them. Can wait for later, as the master branch has ready code to do all
+     * that. */
+    fprintf(fp, "Build CPU features: %s\n", BUILD_CPU_FEATURES);
+    fprintf(fp, "C compiler:         %s\n", BUILD_C_COMPILER);
+    fprintf(fp, "C compiler flags:   %s\n", BUILD_CFLAGS);
+    if (BUILD_CXX_COMPILER[0] != '\0')
+    {
+        fprintf(fp, "C++ compiler:       %s\n", BUILD_CXX_COMPILER);
+        fprintf(fp, "C++ compiler flags: %s\n", BUILD_CXXFLAGS);
+    }
+#ifdef HAVE_LIBMKL
+    /* MKL might be used for LAPACK/BLAS even if FFTs use FFTW, so keep it separate */
+    fprintf(fp, "Linked with Intel MKL version %s.%s.%s.\n",
+            __INTEL_MKL__, __INTEL_MKL_MINOR__, __INTEL_MKL_UPDATE__);
+#endif
+#ifdef GMX_GPU
+    gmx_print_version_info_gpu(fp);
 #endif
 }