2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, 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.
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.
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.
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.
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.
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.
43 #include "gromacs/commandline/pargs.h"
44 #include "gromacs/fileio/confio.h"
45 #include "gromacs/fileio/tpxio.h"
46 #include "gromacs/fileio/trxio.h"
47 #include "gromacs/fileio/xvgr.h"
48 #include "gromacs/gmxana/gmx_ana.h"
49 #include "gromacs/legacyheaders/macros.h"
50 #include "gromacs/legacyheaders/typedefs.h"
51 #include "gromacs/legacyheaders/viewit.h"
52 #include "gromacs/linearalgebra/nrjac.h"
53 #include "gromacs/math/units.h"
54 #include "gromacs/math/vec.h"
55 #include "gromacs/pbcutil/rmpbc.h"
56 #include "gromacs/topology/index.h"
57 #include "gromacs/utility/fatalerror.h"
58 #include "gromacs/utility/futil.h"
59 #include "gromacs/utility/smalloc.h"
61 static void low_print_data(FILE *fp, real time, rvec x[], int n, atom_id *index,
62 gmx_bool bDim[], const char *sffmt)
66 fprintf(fp, " %g", time);
67 for (i = 0; i < n; i++)
77 for (d = 0; d < DIM; d++)
81 fprintf(fp, sffmt, x[ii][d]);
86 fprintf(fp, sffmt, norm(x[ii]));
92 static void average_data(rvec x[], rvec xav[], real *mass,
93 int ngrps, int isize[], atom_id **index)
98 double sum[DIM], mtot;
100 for (g = 0; g < ngrps; g++)
105 for (i = 0; i < isize[g]; i++)
111 svmul(m, x[ind], tmp);
112 for (d = 0; d < DIM; d++)
120 for (d = 0; d < DIM; d++)
128 for (d = 0; d < DIM; d++)
130 xav[g][d] = sum[d]/mtot;
135 /* mass=NULL, so these are forces: sum only (do not average) */
136 for (d = 0; d < DIM; d++)
144 static void print_data(FILE *fp, real time, rvec x[], real *mass, gmx_bool bCom,
145 int ngrps, int isize[], atom_id **index, gmx_bool bDim[],
148 static rvec *xav = NULL;
156 average_data(x, xav, mass, ngrps, isize, index);
157 low_print_data(fp, time, xav, ngrps, NULL, bDim, sffmt);
161 low_print_data(fp, time, x, isize[0], index[0], bDim, sffmt);
165 static void write_trx_x(t_trxstatus *status, t_trxframe *fr, real *mass, gmx_bool bCom,
166 int ngrps, int isize[], atom_id **index)
168 static rvec *xav = NULL;
169 static t_atoms *atoms = NULL;
182 snew(atoms->atom, ngrps);
184 /* Note that atom and residue names will be the ones
185 * of the first atom in each group.
187 for (i = 0; i < ngrps; i++)
189 atoms->atom[i] = fr->atoms->atom[index[i][0]];
190 atoms->atomname[i] = fr->atoms->atomname[index[i][0]];
193 average_data(fr->x, xav, mass, ngrps, isize, index);
195 fr_av.natoms = ngrps;
198 write_trxframe(status, &fr_av, NULL);
202 write_trxframe_indexed(status, fr, isize[0], index[0], NULL);
206 static void make_legend(FILE *fp, int ngrps, int isize, atom_id index[],
207 char **name, gmx_bool bCom, gmx_bool bMol, gmx_bool bDim[],
208 const output_env_t oenv)
211 const char *dimtxt[] = { " X", " Y", " Z", "" };
225 for (i = 0; i < n; i++)
227 for (d = 0; d <= DIM; d++)
231 snew(leg[j], STRLEN);
234 sprintf(leg[j], "mol %d%s", index[i]+1, dimtxt[d]);
238 sprintf(leg[j], "%s%s", name[i], dimtxt[d]);
242 sprintf(leg[j], "atom %d%s", index[i]+1, dimtxt[d]);
248 xvgr_legend(fp, j, (const char**)leg, oenv);
250 for (i = 0; i < j; i++)
257 static real ekrot(rvec x[], rvec v[], real mass[], int isize, atom_id index[])
259 static real **TCM = NULL, **L;
260 double tm, m0, lxx, lxy, lxz, lyy, lyz, lzz, ekrot;
269 for (i = 0; i < DIM; i++)
274 for (i = 0; i < DIM; i++)
284 for (i = 0; i < isize; i++)
289 cprod(x[j], v[j], a0);
290 for (m = 0; (m < DIM); m++)
292 xcm[m] += m0*x[j][m]; /* c.o.m. position */
293 vcm[m] += m0*v[j][m]; /* c.o.m. velocity */
294 acm[m] += m0*a0[m]; /* rotational velocity around c.o.m. */
297 dcprod(xcm, vcm, b0);
298 for (m = 0; (m < DIM); m++)
305 lxx = lxy = lxz = lyy = lyz = lzz = 0.0;
306 for (i = 0; i < isize; i++)
310 for (m = 0; m < DIM; m++)
312 dx[m] = x[j][m] - xcm[m];
314 lxx += dx[XX]*dx[XX]*m0;
315 lxy += dx[XX]*dx[YY]*m0;
316 lxz += dx[XX]*dx[ZZ]*m0;
317 lyy += dx[YY]*dx[YY]*m0;
318 lyz += dx[YY]*dx[ZZ]*m0;
319 lzz += dx[ZZ]*dx[ZZ]*m0;
322 L[XX][XX] = lyy + lzz;
326 L[YY][YY] = lxx + lzz;
330 L[ZZ][ZZ] = lxx + lyy;
332 m_inv_gen(L, DIM, TCM);
334 /* Compute omega (hoeksnelheid) */
337 for (m = 0; m < DIM; m++)
339 for (n = 0; n < DIM; n++)
341 ocm[m] += TCM[m][n]*acm[n];
343 ekrot += 0.5*ocm[m]*acm[m];
349 static real ektrans(rvec v[], real mass[], int isize, atom_id index[])
357 for (i = 0; i < isize; i++)
360 for (d = 0; d < DIM; d++)
362 mvcom[d] += mass[j]*v[j][d];
367 return dnorm2(mvcom)/(mtot*2);
370 static real temp(rvec v[], real mass[], int isize, atom_id index[])
376 for (i = 0; i < isize; i++)
379 ekin2 += mass[j]*norm2(v[j]);
382 return ekin2/(3*isize*BOLTZ);
385 static void remove_jump(matrix box, int natoms, rvec xp[], rvec x[])
390 for (d = 0; d < DIM; d++)
392 hbox[d] = 0.5*box[d][d];
394 for (i = 0; i < natoms; i++)
396 for (m = DIM-1; m >= 0; m--)
398 while (x[i][m]-xp[i][m] <= -hbox[m])
400 for (d = 0; d <= m; d++)
402 x[i][d] += box[m][d];
405 while (x[i][m]-xp[i][m] > hbox[m])
407 for (d = 0; d <= m; d++)
409 x[i][d] -= box[m][d];
416 static void write_pdb_bfac(const char *fname, const char *xname,
417 const char *title, t_atoms *atoms, int ePBC, matrix box,
418 int isize, atom_id *index, int nfr_x, rvec *x,
419 int nfr_v, rvec *sum,
420 gmx_bool bDim[], real scale_factor,
421 const output_env_t oenv)
424 real max, len2, scale;
429 if ((nfr_x == 0) || (nfr_v == 0))
431 fprintf(stderr, "No frames found for %s, will not write %s\n",
436 fprintf(stderr, "Used %d frames for %s\n", nfr_x, "coordinates");
437 fprintf(stderr, "Used %d frames for %s\n", nfr_v, title);
442 for (i = 0; i < DIM; i++)
456 for (i = 0; i < isize; i++)
458 svmul(scale, sum[index[i]], sum[index[i]]);
461 fp = xvgropen(xname, title, "Atom", "", oenv);
462 for (i = 0; i < isize; i++)
464 fprintf(fp, "%-5d %10.3f %10.3f %10.3f\n", 1+i,
465 sum[index[i]][XX], sum[index[i]][YY], sum[index[i]][ZZ]);
470 for (i = 0; i < isize; i++)
473 for (m = 0; m < DIM; m++)
475 if (bDim[m] || bDim[DIM])
477 len2 += sqr(sum[index[i]][m]);
486 if (scale_factor != 0)
488 scale = scale_factor;
498 scale = 10.0/sqrt(max);
502 printf("Maximum %s is %g on atom %d %s, res. %s %d\n",
503 title, sqrt(max), maxi+1, *(atoms->atomname[maxi]),
504 *(atoms->resinfo[atoms->atom[maxi].resind].name),
505 atoms->resinfo[atoms->atom[maxi].resind].nr);
507 if (atoms->pdbinfo == NULL)
509 snew(atoms->pdbinfo, atoms->nr);
513 for (i = 0; i < isize; i++)
516 for (m = 0; m < DIM; m++)
518 if (bDim[m] || bDim[DIM])
520 len2 += sqr(sum[index[i]][m]);
523 atoms->pdbinfo[index[i]].bfac = sqrt(len2)*scale;
528 for (i = 0; i < isize; i++)
530 atoms->pdbinfo[index[i]].bfac = sum[index[i]][onedim]*scale;
533 write_sto_conf_indexed(fname, title, atoms, x, NULL, ePBC, box, isize, index);
537 static void update_histo(int gnx, atom_id index[], rvec v[],
538 int *nhisto, int **histo, real binwidth)
546 for (i = 0; (i < gnx); i++)
548 vn = norm(v[index[i]]);
549 vnmax = max(vn, vnmax);
552 *nhisto = 1+(vnmax/binwidth);
553 snew(*histo, *nhisto);
555 for (i = 0; (i < gnx); i++)
557 vn = norm(v[index[i]]);
562 fprintf(stderr, "Extending histogram from %d to %d\n", *nhisto, nnn);
565 for (m = *nhisto; (m < nnn); m++)
575 static void print_histo(const char *fn, int nhisto, int histo[], real binwidth,
576 const output_env_t oenv)
581 fp = xvgropen(fn, "Velocity distribution", "V (nm/ps)", "arbitrary units",
583 for (i = 0; (i < nhisto); i++)
585 fprintf(fp, "%10.3e %10d\n", i*binwidth, histo[i]);
590 int gmx_traj(int argc, char *argv[])
592 const char *desc[] = {
593 "[THISMODULE] plots coordinates, velocities, forces and/or the box.",
594 "With [TT]-com[tt] the coordinates, velocities and forces are",
595 "calculated for the center of mass of each group.",
596 "When [TT]-mol[tt] is set, the numbers in the index file are",
597 "interpreted as molecule numbers and the same procedure as with",
598 "[TT]-com[tt] is used for each molecule.[PAR]",
599 "Option [TT]-ot[tt] plots the temperature of each group,",
600 "provided velocities are present in the trajectory file.",
601 "No corrections are made for constrained degrees of freedom!",
602 "This implies [TT]-com[tt].[PAR]",
603 "Options [TT]-ekt[tt] and [TT]-ekr[tt] plot the translational and",
604 "rotational kinetic energy of each group,",
605 "provided velocities are present in the trajectory file.",
606 "This implies [TT]-com[tt].[PAR]",
607 "Options [TT]-cv[tt] and [TT]-cf[tt] write the average velocities",
608 "and average forces as temperature factors to a [TT].pdb[tt] file with",
609 "the average coordinates or the coordinates at [TT]-ctime[tt].",
610 "The temperature factors are scaled such that the maximum is 10.",
611 "The scaling can be changed with the option [TT]-scale[tt].",
612 "To get the velocities or forces of one",
613 "frame set both [TT]-b[tt] and [TT]-e[tt] to the time of",
614 "desired frame. When averaging over frames you might need to use",
615 "the [TT]-nojump[tt] option to obtain the correct average coordinates.",
616 "If you select either of these option the average force and velocity",
617 "for each atom are written to an [TT].xvg[tt] file as well",
618 "(specified with [TT]-av[tt] or [TT]-af[tt]).[PAR]",
619 "Option [TT]-vd[tt] computes a velocity distribution, i.e. the",
620 "norm of the vector is plotted. In addition in the same graph",
621 "the kinetic energy distribution is given."
623 static gmx_bool bMol = FALSE, bCom = FALSE, bPBC = TRUE, bNoJump = FALSE;
624 static gmx_bool bX = TRUE, bY = TRUE, bZ = TRUE, bNorm = FALSE, bFP = FALSE;
625 static int ngroups = 1;
626 static real ctime = -1, scale = 0, binwidth = 1;
628 { "-com", FALSE, etBOOL, {&bCom},
629 "Plot data for the com of each group" },
630 { "-pbc", FALSE, etBOOL, {&bPBC},
631 "Make molecules whole for COM" },
632 { "-mol", FALSE, etBOOL, {&bMol},
633 "Index contains molecule numbers iso atom numbers" },
634 { "-nojump", FALSE, etBOOL, {&bNoJump},
635 "Remove jumps of atoms across the box" },
636 { "-x", FALSE, etBOOL, {&bX},
637 "Plot X-component" },
638 { "-y", FALSE, etBOOL, {&bY},
639 "Plot Y-component" },
640 { "-z", FALSE, etBOOL, {&bZ},
641 "Plot Z-component" },
642 { "-ng", FALSE, etINT, {&ngroups},
643 "Number of groups to consider" },
644 { "-len", FALSE, etBOOL, {&bNorm},
645 "Plot vector length" },
646 { "-fp", FALSE, etBOOL, {&bFP},
647 "Full precision output" },
648 { "-bin", FALSE, etREAL, {&binwidth},
649 "Binwidth for velocity histogram (nm/ps)" },
650 { "-ctime", FALSE, etREAL, {&ctime},
651 "Use frame at this time for x in [TT]-cv[tt] and [TT]-cf[tt] instead of the average x" },
652 { "-scale", FALSE, etREAL, {&scale},
653 "Scale factor for [TT].pdb[tt] output, 0 is autoscale" }
655 FILE *outx = NULL, *outv = NULL, *outf = NULL, *outb = NULL, *outt = NULL;
656 FILE *outekt = NULL, *outekr = NULL;
662 t_trxframe fr, frout;
663 int flags, nvhisto = 0, *vhisto = NULL;
664 rvec *xtop, *xp = NULL;
665 rvec *sumx = NULL, *sumv = NULL, *sumf = NULL;
668 t_trxstatus *status_out = NULL;
669 gmx_rmpbc_t gpbc = NULL;
671 int nr_xfr, nr_vfr, nr_ffr;
674 atom_id **index0, **index;
677 gmx_bool bTop, bOX, bOXT, bOV, bOF, bOB, bOT, bEKT, bEKR, bCV, bCF;
678 gmx_bool bDim[4], bDum[4], bVD;
679 char *sffmt, sffmt6[1024];
680 const char *box_leg[6] = { "XX", "YY", "ZZ", "YX", "ZX", "ZY" };
684 { efTRX, "-f", NULL, ffREAD },
685 { efTPS, NULL, NULL, ffREAD },
686 { efNDX, NULL, NULL, ffOPTRD },
687 { efXVG, "-ox", "coord", ffOPTWR },
688 { efTRX, "-oxt", "coord", ffOPTWR },
689 { efXVG, "-ov", "veloc", ffOPTWR },
690 { efXVG, "-of", "force", ffOPTWR },
691 { efXVG, "-ob", "box", ffOPTWR },
692 { efXVG, "-ot", "temp", ffOPTWR },
693 { efXVG, "-ekt", "ektrans", ffOPTWR },
694 { efXVG, "-ekr", "ekrot", ffOPTWR },
695 { efXVG, "-vd", "veldist", ffOPTWR },
696 { efPDB, "-cv", "veloc", ffOPTWR },
697 { efPDB, "-cf", "force", ffOPTWR },
698 { efXVG, "-av", "all_veloc", ffOPTWR },
699 { efXVG, "-af", "all_force", ffOPTWR }
701 #define NFILE asize(fnm)
703 if (!parse_common_args(&argc, argv,
704 PCA_CAN_TIME | PCA_TIME_UNIT | PCA_CAN_VIEW,
705 NFILE, fnm, asize(pa), pa, asize(desc), desc, 0, NULL, &oenv))
712 fprintf(stderr, "Interpreting indexfile entries as molecules.\n"
713 "Using center of mass.\n");
716 bOX = opt2bSet("-ox", NFILE, fnm);
717 bOXT = opt2bSet("-oxt", NFILE, fnm);
718 bOV = opt2bSet("-ov", NFILE, fnm);
719 bOF = opt2bSet("-of", NFILE, fnm);
720 bOB = opt2bSet("-ob", NFILE, fnm);
721 bOT = opt2bSet("-ot", NFILE, fnm);
722 bEKT = opt2bSet("-ekt", NFILE, fnm);
723 bEKR = opt2bSet("-ekr", NFILE, fnm);
724 bCV = opt2bSet("-cv", NFILE, fnm) || opt2bSet("-av", NFILE, fnm);
725 bCF = opt2bSet("-cf", NFILE, fnm) || opt2bSet("-af", NFILE, fnm);
726 bVD = opt2bSet("-vd", NFILE, fnm) || opt2parg_bSet("-bin", asize(pa), pa);
727 if (bMol || bOT || bEKT || bEKR)
739 sffmt = "\t" gmx_real_fullprecision_pfmt;
745 sprintf(sffmt6, "%s%s%s%s%s%s", sffmt, sffmt, sffmt, sffmt, sffmt, sffmt);
747 bTop = read_tps_conf(ftp2fn(efTPS, NFILE, fnm), title, &top, &ePBC,
749 bCom && (bOX || bOXT || bOV || bOT || bEKT || bEKR));
751 if ((bMol || bCV || bCF) && !bTop)
753 gmx_fatal(FARGS, "Need a run input file for option -mol, -cv or -cf");
758 indexfn = ftp2fn(efNDX, NFILE, fnm);
762 indexfn = ftp2fn_null(efNDX, NFILE, fnm);
765 if (!(bCom && !bMol))
769 snew(grpname, ngroups);
770 snew(isize0, ngroups);
771 snew(index0, ngroups);
772 get_index(&(top.atoms), indexfn, ngroups, isize0, index0, grpname);
779 snew(isize, ngroups);
780 snew(index, ngroups);
781 for (i = 0; i < ngroups; i++)
783 if (index0[0][i] < 0 || index0[0][i] >= mols->nr)
785 gmx_fatal(FARGS, "Molecule index (%d) is out of range (%d-%d)",
786 index0[0][i]+1, 1, mols->nr);
788 isize[i] = atndx[index0[0][i]+1] - atndx[index0[0][i]];
789 snew(index[i], isize[i]);
790 for (j = 0; j < isize[i]; j++)
792 index[i][j] = atndx[index0[0][i]] + j;
803 snew(mass, top.atoms.nr);
804 for (i = 0; i < top.atoms.nr; i++)
806 mass[i] = top.atoms.atom[i].m;
817 flags = flags | TRX_READ_X;
818 outx = xvgropen(opt2fn("-ox", NFILE, fnm),
819 bCom ? "Center of mass" : "Coordinate",
820 output_env_get_xvgr_tlabel(oenv), "Coordinate (nm)", oenv);
821 make_legend(outx, ngroups, isize0[0], index0[0], grpname, bCom, bMol, bDim, oenv);
825 flags = flags | TRX_READ_X;
826 status_out = open_trx(opt2fn("-oxt", NFILE, fnm), "w");
830 flags = flags | TRX_READ_V;
831 outv = xvgropen(opt2fn("-ov", NFILE, fnm),
832 bCom ? "Center of mass velocity" : "Velocity",
833 output_env_get_xvgr_tlabel(oenv), "Velocity (nm/ps)", oenv);
834 make_legend(outv, ngroups, isize0[0], index0[0], grpname, bCom, bMol, bDim, oenv);
838 flags = flags | TRX_READ_F;
839 outf = xvgropen(opt2fn("-of", NFILE, fnm), "Force",
840 output_env_get_xvgr_tlabel(oenv), "Force (kJ mol\\S-1\\N nm\\S-1\\N)",
842 make_legend(outf, ngroups, isize0[0], index0[0], grpname, bCom, bMol, bDim, oenv);
846 outb = xvgropen(opt2fn("-ob", NFILE, fnm), "Box vector elements",
847 output_env_get_xvgr_tlabel(oenv), "(nm)", oenv);
849 xvgr_legend(outb, 6, box_leg, oenv);
857 flags = flags | TRX_READ_V;
858 outt = xvgropen(opt2fn("-ot", NFILE, fnm), "Temperature",
859 output_env_get_xvgr_tlabel(oenv), "(K)", oenv);
860 make_legend(outt, ngroups, isize[0], index[0], grpname, bCom, bMol, bDum, oenv);
868 flags = flags | TRX_READ_V;
869 outekt = xvgropen(opt2fn("-ekt", NFILE, fnm), "Center of mass translation",
870 output_env_get_xvgr_tlabel(oenv), "Energy (kJ mol\\S-1\\N)", oenv);
871 make_legend(outekt, ngroups, isize[0], index[0], grpname, bCom, bMol, bDum, oenv);
879 flags = flags | TRX_READ_X | TRX_READ_V;
880 outekr = xvgropen(opt2fn("-ekr", NFILE, fnm), "Center of mass rotation",
881 output_env_get_xvgr_tlabel(oenv), "Energy (kJ mol\\S-1\\N)", oenv);
882 make_legend(outekr, ngroups, isize[0], index[0], grpname, bCom, bMol, bDum, oenv);
886 flags = flags | TRX_READ_V;
890 flags = flags | TRX_READ_X | TRX_READ_V;
894 flags = flags | TRX_READ_X | TRX_READ_F;
896 if ((flags == 0) && !bOB)
898 fprintf(stderr, "Please select one or more output file options\n");
902 read_first_frame(oenv, &status, ftp2fn(efTRX, NFILE, fnm), &fr, flags);
905 if ((bOV || bOF) && fn2ftp(ftp2fn(efTRX, NFILE, fnm)) == efXTC)
907 gmx_fatal(FARGS, "Cannot extract velocities or forces since your input XTC file does not contain them.");
912 snew(sumx, fr.natoms);
916 snew(sumv, fr.natoms);
920 snew(sumf, fr.natoms);
928 gpbc = gmx_rmpbc_init(&top.idef, ePBC, fr.natoms);
933 time = output_env_conv_time(oenv, fr.time);
935 if (fr.bX && bNoJump && fr.bBox)
939 remove_jump(fr.box, fr.natoms, xp, fr.x);
945 for (i = 0; i < fr.natoms; i++)
947 copy_rvec(fr.x[i], xp[i]);
951 if (fr.bX && bCom && bPBC)
953 gmx_rmpbc_trxfr(gpbc, &fr);
958 update_histo(isize[0], index[0], fr.v, &nvhisto, &vhisto, binwidth);
963 print_data(outx, time, fr.x, mass, bCom, ngroups, isize, index, bDim, sffmt);
970 frout.atoms = &top.atoms;
973 write_trx_x(status_out, &frout, mass, bCom, ngroups, isize, index);
977 print_data(outv, time, fr.v, mass, bCom, ngroups, isize, index, bDim, sffmt);
981 print_data(outf, time, fr.f, NULL, bCom, ngroups, isize, index, bDim, sffmt);
985 fprintf(outb, "\t%g", fr.time);
986 fprintf(outb, sffmt6,
987 fr.box[XX][XX], fr.box[YY][YY], fr.box[ZZ][ZZ],
988 fr.box[YY][XX], fr.box[ZZ][XX], fr.box[ZZ][YY]);
993 fprintf(outt, " %g", time);
994 for (i = 0; i < ngroups; i++)
996 fprintf(outt, sffmt, temp(fr.v, mass, isize[i], index[i]));
1002 fprintf(outekt, " %g", time);
1003 for (i = 0; i < ngroups; i++)
1005 fprintf(outekt, sffmt, ektrans(fr.v, mass, isize[i], index[i]));
1007 fprintf(outekt, "\n");
1009 if (bEKR && fr.bX && fr.bV)
1011 fprintf(outekr, " %g", time);
1012 for (i = 0; i < ngroups; i++)
1014 fprintf(outekr, sffmt, ekrot(fr.x, fr.v, mass, isize[i], index[i]));
1016 fprintf(outekr, "\n");
1018 if ((bCV || bCF) && fr.bX &&
1019 (ctime < 0 || (fr.time >= ctime*0.999999 &&
1020 fr.time <= ctime*1.000001)))
1022 for (i = 0; i < fr.natoms; i++)
1024 rvec_inc(sumx[i], fr.x[i]);
1030 for (i = 0; i < fr.natoms; i++)
1032 rvec_inc(sumv[i], fr.v[i]);
1038 for (i = 0; i < fr.natoms; i++)
1040 rvec_inc(sumf[i], fr.f[i]);
1046 while (read_next_frame(oenv, status, &fr));
1050 gmx_rmpbc_done(gpbc);
1053 /* clean up a bit */
1062 close_trx(status_out);
1082 gmx_ffclose(outekt);
1086 gmx_ffclose(outekr);
1091 print_histo(opt2fn("-vd", NFILE, fnm), nvhisto, vhisto, binwidth, oenv);
1098 if (ePBC != epbcNONE && !bNoJump)
1100 fprintf(stderr, "\nWARNING: More than one frame was used for option -cv or -cf\n"
1101 "If atoms jump across the box you should use the -nojump or -ctime option\n\n");
1103 for (i = 0; i < isize[0]; i++)
1105 svmul(1.0/nr_xfr, sumx[index[0][i]], sumx[index[0][i]]);
1108 else if (nr_xfr == 0)
1110 fprintf(stderr, "\nWARNING: No coordinate frames found for option -cv or -cf\n\n");
1115 write_pdb_bfac(opt2fn("-cv", NFILE, fnm),
1116 opt2fn("-av", NFILE, fnm), "average velocity", &(top.atoms),
1117 ePBC, topbox, isize[0], index[0], nr_xfr, sumx,
1118 nr_vfr, sumv, bDim, scale, oenv);
1122 write_pdb_bfac(opt2fn("-cf", NFILE, fnm),
1123 opt2fn("-af", NFILE, fnm), "average force", &(top.atoms),
1124 ePBC, topbox, isize[0], index[0], nr_xfr, sumx,
1125 nr_ffr, sumf, bDim, scale, oenv);
1129 view_all(oenv, NFILE, fnm);