Bug Summary

File:gromacs/tools/dump.c
Location:line 147, column 13
Description:Function call argument is an uninitialized value

Annotated Source Code

1/*
2 * This file is part of the GROMACS molecular simulation package.
3 *
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2013, The GROMACS development team.
6 * Copyright (c) 2013,2014, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
10 *
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
15 *
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 *
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
33 *
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
36 */
37#ifdef HAVE_CONFIG_H1
38#include <config.h>
39#endif
40
41#include <stdio.h>
42#include <string.h>
43#include <math.h>
44#include <assert.h>
45#include "macros.h"
46#include "gromacs/commandline/pargs.h"
47#include "txtdump.h"
48#include "gromacs/utility/fatalerror.h"
49#include "gromacs/utility/smalloc.h"
50#include "names.h"
51#include "txtdump.h"
52#include "gromacs/gmxpreprocess/gmxcpp.h"
53#include "checkpoint.h"
54#include "mtop_util.h"
55#include "gromacs/fileio/xtcio.h"
56#include "gromacs/fileio/enxio.h"
57#include "gromacs/fileio/gmxfio.h"
58#include "gromacs/fileio/tpxio.h"
59#include "gromacs/fileio/trnio.h"
60#include "gromacs/utility/futil.h"
61#include "gromacs/fileio/tngio.h"
62#include "gromacs/fileio/tngio_for_tools.h"
63
64#ifdef HAVE_UNISTD_H
65#include <unistd.h>
66#endif
67
68#include "gromacs/linearalgebra/mtxio.h"
69#include "gromacs/linearalgebra/sparsematrix.h"
70
71
72static void list_tpx(const char *fn, gmx_bool bShowNumbers, const char *mdpfn,
73 gmx_bool bSysTop)
74{
75 FILE *gp;
76 int fp, indent, i, j, **gcount, atot;
77 t_state state;
78 rvec *f = NULL((void*)0);
79 t_inputrec ir;
80 t_tpxheader tpx;
81 gmx_mtop_t mtop;
82 gmx_groups_t *groups;
83 t_topology top;
84
85 read_tpxheader(fn, &tpx, TRUE1, NULL((void*)0), NULL((void*)0));
86
87 read_tpx_state(fn,
88 tpx.bIr ? &ir : NULL((void*)0),
1
'?' condition is false
89 &state, tpx.bF ? f : NULL((void*)0),
2
'?' condition is false
90 tpx.bTop ? &mtop : NULL((void*)0));
3
'?' condition is false
91
92 if (mdpfn && tpx.bIr)
93 {
94 gp = gmx_fio_fopen(mdpfn, "w");
95 pr_inputrec(gp, 0, NULL((void*)0), &(ir), TRUE1);
96 gmx_fio_fclose(gp);
97 }
98
99 if (!mdpfn)
4
Taking true branch
100 {
101 if (bSysTop)
5
Assuming 'bSysTop' is 0
6
Taking false branch
102 {
103 top = gmx_mtop_t_to_t_topology(&mtop);
104 }
105
106 if (available(stdoutstdout, &tpx, 0, fn))
7
Taking false branch
107 {
108 indent = 0;
109 indent = pr_title(stdoutstdout, indent, fn);
110 pr_inputrec(stdoutstdout, 0, "inputrec", tpx.bIr ? &(ir) : NULL((void*)0), FALSE0);
111
112 indent = 0;
113 pr_header(stdoutstdout, indent, "header", &(tpx));
114
115 if (!bSysTop)
116 {
117 pr_mtop(stdoutstdout, indent, "topology", &(mtop), bShowNumbers);
118 }
119 else
120 {
121 pr_top(stdoutstdout, indent, "topology", &(top), bShowNumbers);
122 }
123
124 pr_rvecs(stdoutstdout, indent, "box", tpx.bBox ? state.box : NULL((void*)0), DIM3);
125 pr_rvecs(stdoutstdout, indent, "box_rel", tpx.bBox ? state.box_rel : NULL((void*)0), DIM3);
126 pr_rvecs(stdoutstdout, indent, "boxv", tpx.bBox ? state.boxv : NULL((void*)0), DIM3);
127 pr_rvecs(stdoutstdout, indent, "pres_prev", tpx.bBox ? state.pres_prev : NULL((void*)0), DIM3);
128 pr_rvecs(stdoutstdout, indent, "svir_prev", tpx.bBox ? state.svir_prev : NULL((void*)0), DIM3);
129 pr_rvecs(stdoutstdout, indent, "fvir_prev", tpx.bBox ? state.fvir_prev : NULL((void*)0), DIM3);
130 /* leave nosehoover_xi in for now to match the tpr version */
131 pr_doubles(stdoutstdout, indent, "nosehoover_xi", state.nosehoover_xi, state.ngtc);
132 /*pr_doubles(stdout,indent,"nosehoover_vxi",state.nosehoover_vxi,state.ngtc);*/
133 /*pr_doubles(stdout,indent,"therm_integral",state.therm_integral,state.ngtc);*/
134 pr_rvecs(stdoutstdout, indent, "x", tpx.bX ? state.x : NULL((void*)0), state.natoms);
135 pr_rvecs(stdoutstdout, indent, "v", tpx.bV ? state.v : NULL((void*)0), state.natoms);
136 if (tpx.bF)
137 {
138 pr_rvecs(stdoutstdout, indent, "f", f, state.natoms);
139 }
140 }
141
142 groups = &mtop.groups;
143
144 snew(gcount, egcNR)(gcount) = save_calloc("gcount", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 144, (egcNR), sizeof(*(gcount)))
;
145 for (i = 0; (i < egcNR); i++)
8
Loop condition is true. Entering loop body
146 {
147 snew(gcount[i], groups->grps[i].nr)(gcount[i]) = save_calloc("gcount[i]", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 147, (groups->grps[i].nr), sizeof(*(gcount[i])))
;
9
Within the expansion of the macro 'snew':
a
Function call argument is an uninitialized value
148 }
149
150 for (i = 0; (i < mtop.natoms); i++)
151 {
152 for (j = 0; (j < egcNR); j++)
153 {
154 gcount[j][ggrpnr(groups, j, i)((groups)->grpnr[j] ? (groups)->grpnr[j][i] : 0)]++;
155 }
156 }
157 printf("Group statistics\n");
158 for (i = 0; (i < egcNR); i++)
159 {
160 atot = 0;
161 printf("%-12s: ", gtypes[i]);
162 for (j = 0; (j < groups->grps[i].nr); j++)
163 {
164 printf(" %5d", gcount[i][j]);
165 atot += gcount[i][j];
166 }
167 printf(" (total %d atoms)\n", atot);
168 sfree(gcount[i])save_free("gcount[i]", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 168, (gcount[i]))
;
169 }
170 sfree(gcount)save_free("gcount", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 170, (gcount))
;
171 }
172 done_state(&state);
173 sfree(f)save_free("f", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 173, (f))
;
174}
175
176static void list_top(const char *fn)
177{
178 int status, done;
179#define BUFLEN256 256
180 char buf[BUFLEN256];
181 gmx_cpp_t handle;
182 char *cppopts[] = { NULL((void*)0) };
183
184 status = cpp_open_file(fn, &handle, cppopts);
185 if (status != 0)
186 {
187 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c", 187, cpp_error(&handle, status));
188 }
189 do
190 {
191 status = cpp_read_line(&handle, BUFLEN256, buf);
192 done = (status == eCPP_EOF);
193 if (!done)
194 {
195 if (status != eCPP_OK)
196 {
197 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c", 197, cpp_error(&handle, status));
198 }
199 else
200 {
201 printf("%s\n", buf);
202 }
203 }
204 }
205 while (!done);
206 status = cpp_close_file(&handle);
207 if (status != eCPP_OK)
208 {
209 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c", 209, cpp_error(&handle, status));
210 }
211}
212
213static void list_trn(const char *fn)
214{
215 t_fileio *fpread, *fpwrite;
216 int nframe, indent;
217 char buf[256];
218 rvec *x, *v, *f;
219 matrix box;
220 t_trnheader trn;
221 gmx_bool bOK;
222
223 fpread = open_trn(fn, "r");
224 fpwrite = open_tpx(NULL((void*)0), "w");
225 gmx_fio_setdebug(fpwrite, TRUE1);
226
227 nframe = 0;
228 while (fread_trnheader(fpread, &trn, &bOK))
229 {
230 snew(x, trn.natoms)(x) = save_calloc("x", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 230, (trn.natoms), sizeof(*(x)))
;
231 snew(v, trn.natoms)(v) = save_calloc("v", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 231, (trn.natoms), sizeof(*(v)))
;
232 snew(f, trn.natoms)(f) = save_calloc("f", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 232, (trn.natoms), sizeof(*(f)))
;
233 if (fread_htrn(fpread, &trn,
234 trn.box_size ? box : NULL((void*)0),
235 trn.x_size ? x : NULL((void*)0),
236 trn.v_size ? v : NULL((void*)0),
237 trn.f_size ? f : NULL((void*)0)))
238 {
239 sprintf(buf, "%s frame %d", fn, nframe);
240 indent = 0;
241 indent = pr_title(stdoutstdout, indent, buf);
242 pr_indent(stdoutstdout, indent);
243 fprintf(stdoutstdout, "natoms=%10d step=%10d time=%12.7e lambda=%10g\n",
244 trn.natoms, trn.step, trn.t, trn.lambda);
245 if (trn.box_size)
246 {
247 pr_rvecs(stdoutstdout, indent, "box", box, DIM3);
248 }
249 if (trn.x_size)
250 {
251 pr_rvecs(stdoutstdout, indent, "x", x, trn.natoms);
252 }
253 if (trn.v_size)
254 {
255 pr_rvecs(stdoutstdout, indent, "v", v, trn.natoms);
256 }
257 if (trn.f_size)
258 {
259 pr_rvecs(stdoutstdout, indent, "f", f, trn.natoms);
260 }
261 }
262 else
263 {
264 fprintf(stderrstderr, "\nWARNING: Incomplete frame: nr %d, t=%g\n",
265 nframe, trn.t);
266 }
267
268 sfree(x)save_free("x", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 268, (x))
;
269 sfree(v)save_free("v", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 269, (v))
;
270 sfree(f)save_free("f", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 270, (f))
;
271 nframe++;
272 }
273 if (!bOK)
274 {
275 fprintf(stderrstderr, "\nWARNING: Incomplete frame header: nr %d, t=%g\n",
276 nframe, trn.t);
277 }
278 close_tpx(fpwrite);
279 close_trn(fpread);
280}
281
282void list_xtc(const char *fn)
283{
284 t_fileio *xd;
285 int indent;
286 char buf[256];
287 rvec *x;
288 matrix box;
289 int nframe, natoms, step;
290 real prec, time;
291 gmx_bool bOK;
292
293 xd = open_xtc(fn, "r");
294 read_first_xtc(xd, &natoms, &step, &time, box, &x, &prec, &bOK);
295
296 nframe = 0;
297 do
298 {
299 sprintf(buf, "%s frame %d", fn, nframe);
300 indent = 0;
301 indent = pr_title(stdoutstdout, indent, buf);
302 pr_indent(stdoutstdout, indent);
303 fprintf(stdoutstdout, "natoms=%10d step=%10d time=%12.7e prec=%10g\n",
304 natoms, step, time, prec);
305 pr_rvecs(stdoutstdout, indent, "box", box, DIM3);
306 pr_rvecs(stdoutstdout, indent, "x", x, natoms);
307 nframe++;
308 }
309 while (read_next_xtc(xd, natoms, &step, &time, box, x, &prec, &bOK));
310 if (!bOK)
311 {
312 fprintf(stderrstderr, "\nWARNING: Incomplete frame at time %g\n", time);
313 }
314 sfree(x)save_free("x", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 314, (x))
;
315 close_xtc(xd);
316}
317
318/*! \brief Callback used by list_tng_for_gmx_dump. */
319static void list_tng_inner(const char *fn,
320 gmx_bool bFirstFrame,
321 real *values,
322 gmx_int64_t step,
323 double frame_time,
324 gmx_int64_t n_values_per_frame,
325 gmx_int64_t n_atoms,
326 real prec,
327 gmx_int64_t nframe,
328 char *block_name)
329{
330 char buf[256];
331 int indent = 0;
332
333 if (bFirstFrame)
334 {
335 sprintf(buf, "%s frame %" GMX_PRId64"l" "d", fn, nframe);
336 indent = 0;
337 indent = pr_title(stdoutstdout, indent, buf);
338 pr_indent(stdoutstdout, indent);
339 fprintf(stdoutstdout, "natoms=%10" GMX_PRId64"l" "d" " step=%10" GMX_PRId64"l" "d" " time=%12.7e",
340 n_atoms, step, frame_time);
341 if (prec > 0)
342 {
343 fprintf(stdoutstdout, " prec=%10g", prec);
344 }
345 fprintf(stdoutstdout, "\n");
346 }
347 pr_reals_of_dim(stdoutstdout, indent, block_name, values, n_atoms, n_values_per_frame);
348}
349
350static void list_tng(const char gmx_unused__attribute__ ((unused)) *fn)
351{
352#ifdef GMX_USE_TNG
353 tng_trajectory_t tng;
354 gmx_int64_t nframe = 0;
355 gmx_int64_t i, *block_ids = NULL((void*)0), step, ndatablocks;
356 gmx_bool bOK;
357
358 gmx_tng_open(fn, 'r', &tng);
359 gmx_print_tng_molecule_system(tng, stdoutstdout);
360
361 bOK = gmx_get_tng_data_block_types_of_next_frame(tng, -1,
362 0,
363 NULL((void*)0),
364 &step, &ndatablocks,
365 &block_ids);
366 do
367 {
368 for (i = 0; i < ndatablocks; i++)
369 {
370 double frame_time;
371 real prec, *values = NULL((void*)0);
372 gmx_int64_t n_values_per_frame, n_atoms;
373 char block_name[STRLEN4096];
374
375 gmx_get_tng_data_next_frame_of_block_type(tng, block_ids[i], &values,
376 &step, &frame_time,
377 &n_values_per_frame, &n_atoms,
378 &prec,
379 block_name, STRLEN4096, &bOK);
380 if (!bOK)
381 {
382 /* Can't write any output because we don't know what
383 arrays are valid. */
384 fprintf(stderrstderr, "\nWARNING: Incomplete frame at time %g, will not write output\n", frame_time);
385 list_tng_inner(fn, (0 == i), values, step, frame_time,
386 n_values_per_frame, n_atoms, prec, nframe, block_name);
387 }
388 }
389 nframe++;
390 }
391 while (gmx_get_tng_data_block_types_of_next_frame(tng, step,
392 0,
393 NULL((void*)0),
394 &step,
395 &ndatablocks,
396 &block_ids));
397
398 if (block_ids)
399 {
400 sfree(block_ids)save_free("block_ids", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 400, (block_ids))
;
401 }
402
403 gmx_tng_close(&tng);
404#endif
405}
406
407void list_trx(const char *fn)
408{
409 int ftp;
410
411 ftp = fn2ftp(fn);
412 if (ftp == efXTC)
413 {
414 list_xtc(fn);
415 }
416 else if ((ftp == efTRR) || (ftp == efTRJ))
417 {
418 list_trn(fn);
419 }
420 else if (ftp == efTNG)
421 {
422 list_tng(fn);
423 }
424 else
425 {
426 fprintf(stderrstderr, "File %s is of an unsupported type. Try using the command\n 'less %s'\n",
427 fn, fn);
428 }
429}
430
431void list_ene(const char *fn)
432{
433 int ndr;
434 ener_file_t in;
435 gmx_bool bCont;
436 gmx_enxnm_t *enm = NULL((void*)0);
437 t_enxframe *fr;
438 int i, j, nre, b;
439 real rav, minthird;
440 char buf[22];
441
442 printf("gmx dump: %s\n", fn);
443 in = open_enx(fn, "r");
444 do_enxnms(in, &nre, &enm);
445 assert(enm)((void) (0));
446
447 printf("energy components:\n");
448 for (i = 0; (i < nre); i++)
449 {
450 printf("%5d %-24s (%s)\n", i, enm[i].name, enm[i].unit);
451 }
452
453 minthird = -1.0/3.0;
454 snew(fr, 1)(fr) = save_calloc("fr", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 454, (1), sizeof(*(fr)))
;
455 do
456 {
457 bCont = do_enx(in, fr);
458
459 if (bCont)
460 {
461 printf("\n%24s %12.5e %12s %12s\n", "time:",
462 fr->t, "step:", gmx_step_str(fr->step, buf));
463 printf("%24s %12s %12s %12s\n",
464 "", "", "nsteps:", gmx_step_str(fr->nsteps, buf));
465 printf("%24s %12.5e %12s %12s\n",
466 "delta_t:", fr->dt, "sum steps:", gmx_step_str(fr->nsum, buf));
467 if (fr->nre == nre)
468 {
469 printf("%24s %12s %12s %12s\n",
470 "Component", "Energy", "Av. Energy", "Sum Energy");
471 if (fr->nsum > 0)
472 {
473 for (i = 0; (i < nre); i++)
474 {
475 printf("%24s %12.5e %12.5e %12.5e\n",
476 enm[i].name, fr->ener[i].e, fr->ener[i].eav,
477 fr->ener[i].esum);
478 }
479 }
480 else
481 {
482 for (i = 0; (i < nre); i++)
483 {
484 printf("%24s %12.5e\n",
485 enm[i].name, fr->ener[i].e);
486 }
487 }
488 }
489 for (b = 0; b < fr->nblock; b++)
490 {
491 const char *typestr = "";
492
493 t_enxblock *eb = &(fr->block[b]);
494 printf("Block data %2d (%3d subblocks, id=%d)\n",
495 b, eb->nsub, eb->id);
496
497 if (eb->id < enxNR)
498 {
499 typestr = enx_block_id_name[eb->id];
500 }
501 printf(" id='%s'\n", typestr);
502 for (i = 0; i < eb->nsub; i++)
503 {
504 t_enxsubblock *sb = &(eb->sub[i]);
505 printf(" Sub block %3d (%5d elems, type=%s) values:\n",
506 i, sb->nr, xdr_datatype_names[sb->type]);
507
508 switch (sb->type)
509 {
510 case xdr_datatype_float:
511 for (j = 0; j < sb->nr; j++)
512 {
513 printf("%14d %8.4f\n", j, sb->fval[j]);
514 }
515 break;
516 case xdr_datatype_double:
517 for (j = 0; j < sb->nr; j++)
518 {
519 printf("%14d %10.6f\n", j, sb->dval[j]);
520 }
521 break;
522 case xdr_datatype_int:
523 for (j = 0; j < sb->nr; j++)
524 {
525 printf("%14d %10d\n", j, sb->ival[j]);
526 }
527 break;
528 case xdr_datatype_int64:
529 for (j = 0; j < sb->nr; j++)
530 {
531 printf("%14d %s\n",
532 j, gmx_step_str(sb->lval[j], buf));
533 }
534 break;
535 case xdr_datatype_char:
536 for (j = 0; j < sb->nr; j++)
537 {
538 printf("%14d %1c\n", j, sb->cval[j]);
539 }
540 break;
541 case xdr_datatype_string:
542 for (j = 0; j < sb->nr; j++)
543 {
544 printf("%14d %80s\n", j, sb->sval[j]);
545 }
546 break;
547 default:
548 gmx_incons("Unknown subblock type")_gmx_error("incons", "Unknown subblock type", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 548)
;
549 }
550 }
551 }
552 }
553 }
554 while (bCont);
555
556 close_enx(in);
557
558 free_enxframe(fr);
559 sfree(fr)save_free("fr", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 559, (fr))
;
560 sfree(enm)save_free("enm", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 560, (enm))
;
561}
562
563static void list_mtx(const char *fn)
564{
565 int nrow, ncol, i, j, k;
566 real *full = NULL((void*)0), value;
567 gmx_sparsematrix_t * sparse = NULL((void*)0);
568
569 gmx_mtxio_read(fn, &nrow, &ncol, &full, &sparse);
570
571 if (full == NULL((void*)0))
572 {
573 snew(full, nrow*ncol)(full) = save_calloc("full", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 573, (nrow*ncol), sizeof(*(full)))
;
574 for (i = 0; i < nrow*ncol; i++)
575 {
576 full[i] = 0;
577 }
578
579 for (i = 0; i < sparse->nrow; i++)
580 {
581 for (j = 0; j < sparse->ndata[i]; j++)
582 {
583 k = sparse->data[i][j].col;
584 value = sparse->data[i][j].value;
585 full[i*ncol+k] = value;
586 full[k*ncol+i] = value;
587 }
588 }
589 gmx_sparsematrix_destroy(sparse);
590 }
591
592 printf("%d %d\n", nrow, ncol);
593 for (i = 0; i < nrow; i++)
594 {
595 for (j = 0; j < ncol; j++)
596 {
597 printf(" %g", full[i*ncol+j]);
598 }
599 printf("\n");
600 }
601
602 sfree(full)save_free("full", "/home/alexxy/Develop/gromacs/src/gromacs/tools/dump.c"
, 602, (full))
;
603}
604
605int gmx_dump(int argc, char *argv[])
606{
607 const char *desc[] = {
608 "[THISMODULE] reads a run input file ([TT].tpa[tt]/[TT].tpr[tt]/[TT].tpb[tt]),",
609 "a trajectory ([TT].trj[tt]/[TT].trr[tt]/[TT].xtc[tt]), an energy",
610 "file ([TT].ene[tt]/[TT].edr[tt]), or a checkpoint file ([TT].cpt[tt])",
611 "and prints that to standard output in a readable format.",
612 "This program is essential for checking your run input file in case of",
613 "problems.[PAR]",
614 "The program can also preprocess a topology to help finding problems.",
615 "Note that currently setting [TT]GMXLIB[tt] is the only way to customize",
616 "directories used for searching include files.",
617 };
618 const char *bugs[] = {
619 "Position restraint output from -sys -s is broken"
620 };
621 t_filenm fnm[] = {
622 { efTPX, "-s", NULL((void*)0), ffOPTRD(1<<1 | 1<<3) },
623 { efTRX, "-f", NULL((void*)0), ffOPTRD(1<<1 | 1<<3) },
624 { efEDR, "-e", NULL((void*)0), ffOPTRD(1<<1 | 1<<3) },
625 { efCPT, NULL((void*)0), NULL((void*)0), ffOPTRD(1<<1 | 1<<3) },
626 { efTOP, "-p", NULL((void*)0), ffOPTRD(1<<1 | 1<<3) },
627 { efMTX, "-mtx", "hessian", ffOPTRD(1<<1 | 1<<3) },
628 { efMDP, "-om", NULL((void*)0), ffOPTWR(1<<2| 1<<3) }
629 };
630#define NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))) asize(fnm)((int)(sizeof(fnm)/sizeof((fnm)[0])))
631
632 output_env_t oenv;
633 /* Command line options */
634 static gmx_bool bShowNumbers = TRUE1;
635 static gmx_bool bSysTop = FALSE0;
636 t_pargs pa[] = {
637 { "-nr", FALSE0, etBOOL, {&bShowNumbers}, "Show index numbers in output (leaving them out makes comparison easier, but creates a useless topology)" },
638 { "-sys", FALSE0, etBOOL, {&bSysTop}, "List the atoms and bonded interactions for the whole system instead of for each molecule type" }
639 };
640
641 if (!parse_common_args(&argc, argv, 0, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm, asize(pa)((int)(sizeof(pa)/sizeof((pa)[0]))), pa,
642 asize(desc)((int)(sizeof(desc)/sizeof((desc)[0]))), desc, asize(bugs)((int)(sizeof(bugs)/sizeof((bugs)[0]))), bugs, &oenv))
643 {
644 return 0;
645 }
646
647
648 if (ftp2bSet(efTPX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm))
649 {
650 list_tpx(ftp2fn(efTPX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), bShowNumbers,
651 ftp2fn_null(efMDP, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), bSysTop);
652 }
653 else if (ftp2bSet(efTRX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm))
654 {
655 list_trx(ftp2fn(efTRX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm));
656 }
657 else if (ftp2bSet(efEDR, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm))
658 {
659 list_ene(ftp2fn(efEDR, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm));
660 }
661 else if (ftp2bSet(efCPT, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm))
662 {
663 list_checkpoint(ftp2fn(efCPT, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), stdoutstdout);
664 }
665 else if (ftp2bSet(efTOP, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm))
666 {
667 list_top(ftp2fn(efTOP, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm));
668 }
669 else if (ftp2bSet(efMTX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm))
670 {
671 list_mtx(ftp2fn(efMTX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm));
672 }
673
674 return 0;
675}