Remove .tpa, .tpb, .tpx, .trj files. Part of #1500.
[alexxy/gromacs.git] / src / gromacs / tools / dump.c
index 06212fed7f1e62867b53e8d58d7432761e193132..c87fe831ce544f51ffb63b6af7bcde9c94218d27 100644 (file)
  * To help us fund GROMACS development, we humbly ask that you cite
  * the research papers on the package. Check out http://www.gromacs.org.
  */
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include "gmxpre.h"
+
+#include "config.h"
 
+#include <assert.h>
+#include <math.h>
 #include <stdio.h>
 #include <string.h>
-#include <math.h>
-#include <assert.h>
-#include "main.h"
-#include "macros.h"
-#include "gromacs/commandline/pargs.h"
-#include "sysstuff.h"
-#include "txtdump.h"
-#include "gmx_fatal.h"
-#include "smalloc.h"
-#include "names.h"
-#include "txtdump.h"
-#include "gromacs/gmxpreprocess/gmxcpp.h"
-#include "checkpoint.h"
-#include "mtop_util.h"
+
+#include "gromacs/legacyheaders/macros.h"
+#include "gromacs/legacyheaders/txtdump.h"
+#include "gromacs/legacyheaders/names.h"
+#include "gromacs/legacyheaders/txtdump.h"
+#include "gromacs/legacyheaders/checkpoint.h"
+#include "gromacs/topology/mtop_util.h"
 #include "gromacs/fileio/xtcio.h"
 #include "gromacs/fileio/enxio.h"
 #include "gromacs/fileio/gmxfio.h"
 #include "gromacs/fileio/tpxio.h"
 #include "gromacs/fileio/trnio.h"
-#include "gromacs/fileio/futil.h"
+#include "gromacs/utility/futil.h"
+#include "gromacs/fileio/tngio.h"
 #include "gromacs/fileio/tngio_for_tools.h"
 
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 
-#include "gromacs/linearalgebra/mtxio.h"
+#include "gromacs/commandline/pargs.h"
+#include "gromacs/fileio/mtxio.h"
+#include "gromacs/gmxpreprocess/gmxcpp.h"
 #include "gromacs/linearalgebra/sparsematrix.h"
-
+#include "gromacs/utility/fatalerror.h"
+#include "gromacs/utility/smalloc.h"
 
 static void list_tpx(const char *fn, gmx_bool bShowNumbers, const char *mdpfn,
                      gmx_bool bSysTop)
@@ -316,17 +315,17 @@ void list_xtc(const char *fn)
     close_xtc(xd);
 }
 
-/* Callback used by list_tng_for_gmx_dump. */
-void list_tng_inner(const char *fn,
-                    gmx_bool bFirstFrame,
-                    real *values,
-                    gmx_int64_t step, 
-                    double frame_time,
-                    gmx_int64_t n_values_per_frame,
-                    gmx_int64_t n_atoms,
-                    real prec,
-                    gmx_int64_t nframe,
-                    char *block_name)
+/*! \brief Callback used by list_tng_for_gmx_dump. */
+static void list_tng_inner(const char *fn,
+                           gmx_bool    bFirstFrame,
+                           real       *values,
+                           gmx_int64_t step,
+                           double      frame_time,
+                           gmx_int64_t n_values_per_frame,
+                           gmx_int64_t n_atoms,
+                           real        prec,
+                           gmx_int64_t nframe,
+                           char       *block_name)
 {
     char                 buf[256];
     int                  indent = 0;
@@ -348,27 +347,82 @@ void list_tng_inner(const char *fn,
     pr_reals_of_dim(stdout, indent, block_name, values, n_atoms, n_values_per_frame);
 }
 
-void list_trx(const char *fn)
+static void list_tng(const char gmx_unused *fn)
 {
-    int ftp;
-
-    ftp = fn2ftp(fn);
-    if (ftp == efXTC)
-    {
-        list_xtc(fn);
-    }
-    else if ((ftp == efTRR) || (ftp == efTRJ))
+#ifdef GMX_USE_TNG
+    tng_trajectory_t     tng;
+    gmx_int64_t          nframe = 0;
+    gmx_int64_t          i, *block_ids = NULL, step, ndatablocks;
+    gmx_bool             bOK;
+
+    gmx_tng_open(fn, 'r', &tng);
+    gmx_print_tng_molecule_system(tng, stdout);
+
+    bOK    = gmx_get_tng_data_block_types_of_next_frame(tng, -1,
+                                                        0,
+                                                        NULL,
+                                                        &step, &ndatablocks,
+                                                        &block_ids);
+    do
     {
-        list_trn(fn);
+        for (i = 0; i < ndatablocks; i++)
+        {
+            double               frame_time;
+            real                 prec, *values = NULL;
+            gmx_int64_t          n_values_per_frame, n_atoms;
+            char                 block_name[STRLEN];
+
+            gmx_get_tng_data_next_frame_of_block_type(tng, block_ids[i], &values,
+                                                      &step, &frame_time,
+                                                      &n_values_per_frame, &n_atoms,
+                                                      &prec,
+                                                      block_name, STRLEN, &bOK);
+            if (!bOK)
+            {
+                /* Can't write any output because we don't know what
+                   arrays are valid. */
+                fprintf(stderr, "\nWARNING: Incomplete frame at time %g, will not write output\n", frame_time);
+            }
+            else
+            {
+                list_tng_inner(fn, (0 == i), values, step, frame_time,
+                               n_values_per_frame, n_atoms, prec, nframe, block_name);
+            }
+        }
+        nframe++;
     }
-    else if (ftp == efTNG)
+    while (gmx_get_tng_data_block_types_of_next_frame(tng, step,
+                                                      0,
+                                                      NULL,
+                                                      &step,
+                                                      &ndatablocks,
+                                                      &block_ids));
+
+    if (block_ids)
     {
-        list_tng_for_gmx_dump(fn);
+        sfree(block_ids);
     }
-    else
+
+    gmx_tng_close(&tng);
+#endif
+}
+
+void list_trx(const char *fn)
+{
+    switch (fn2ftp(fn))
     {
-        fprintf(stderr, "File %s is of an unsupported type. Try using the command\n 'less %s'\n",
-                fn, fn);
+        case efXTC:
+            list_xtc(fn);
+            break;
+        case efTRR:
+            list_trn(fn);
+            break;
+        case efTNG:
+            list_tng(fn);
+            break;
+        default:
+            fprintf(stderr, "File %s is of an unsupported type. Try using the command\n 'less %s'\n",
+                    fn, fn);
     }
 }
 
@@ -549,9 +603,9 @@ static void list_mtx(const char *fn)
 int gmx_dump(int argc, char *argv[])
 {
     const char *desc[] = {
-        "[THISMODULE] reads a run input file ([TT].tpa[tt]/[TT].tpr[tt]/[TT].tpb[tt]),",
-        "a trajectory ([TT].trj[tt]/[TT].trr[tt]/[TT].xtc[tt]), an energy",
-        "file ([TT].ene[tt]/[TT].edr[tt]), or a checkpoint file ([TT].cpt[tt])",
+        "[THISMODULE] reads a run input file ([TT].tpr[tt]),",
+        "a trajectory ([TT].trr[tt]/[TT].xtc[tt]/[TT]/tng[tt]), an energy",
+        "file ([TT].edr[tt]) or a checkpoint file ([TT].cpt[tt])",
         "and prints that to standard output in a readable format.",
         "This program is essential for checking your run input file in case of",
         "problems.[PAR]",
@@ -563,7 +617,7 @@ int gmx_dump(int argc, char *argv[])
         "Position restraint output from -sys -s is broken"
     };
     t_filenm    fnm[] = {
-        { efTPX, "-s", NULL, ffOPTRD },
+        { efTPR, "-s", NULL, ffOPTRD },
         { efTRX, "-f", NULL, ffOPTRD },
         { efEDR, "-e", NULL, ffOPTRD },
         { efCPT, NULL, NULL, ffOPTRD },
@@ -589,9 +643,9 @@ int gmx_dump(int argc, char *argv[])
     }
 
 
-    if (ftp2bSet(efTPX, NFILE, fnm))
+    if (ftp2bSet(efTPR, NFILE, fnm))
     {
-        list_tpx(ftp2fn(efTPX, NFILE, fnm), bShowNumbers,
+        list_tpx(ftp2fn(efTPR, NFILE, fnm), bShowNumbers,
                  ftp2fn_null(efMDP, NFILE, fnm), bSysTop);
     }
     else if (ftp2bSet(efTRX, NFILE, fnm))