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 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
65 static void low_print_data(FILE *fp,real time,rvec x[],int n,atom_id *index,
66 gmx_bool bDim[],const char *sffmt)
70 fprintf(fp," %g",time);
85 fprintf(fp,sffmt,x[ii][d]);
90 fprintf(fp,sffmt,norm(x[ii]));
96 static void average_data(rvec x[],rvec xav[],real *mass,
97 int ngrps,int isize[],atom_id **index)
102 double sum[DIM],mtot;
104 for(g=0; g<ngrps; g++)
109 for(i=0; i<isize[g]; i++)
134 xav[g][d] = sum[d]/mtot;
139 /* mass=NULL, so these are forces: sum only (do not average) */
148 static void print_data(FILE *fp,real time,rvec x[],real *mass,gmx_bool bCom,
149 int ngrps,int isize[],atom_id **index,gmx_bool bDim[],
152 static rvec *xav=NULL;
160 average_data(x,xav,mass,ngrps,isize,index);
161 low_print_data(fp,time,xav,ngrps,NULL,bDim,sffmt);
165 low_print_data(fp,time,x,isize[0],index[0],bDim,sffmt);
169 static void write_trx_x(t_trxstatus *status,t_trxframe *fr,real *mass,gmx_bool bCom,
170 int ngrps,int isize[],atom_id **index)
172 static rvec *xav=NULL;
173 static t_atoms *atoms=NULL;
186 snew(atoms->atom,ngrps);
188 /* Note that atom and residue names will be the ones
189 * of the first atom in each group.
191 for(i=0; i<ngrps; i++)
193 atoms->atom[i] = fr->atoms->atom[index[i][0]];
194 atoms->atomname[i] = fr->atoms->atomname[index[i][0]];
197 average_data(fr->x,xav,mass,ngrps,isize,index);
199 fr_av.natoms = ngrps;
202 write_trxframe(status,&fr_av,NULL);
206 write_trxframe_indexed(status,fr,isize[0],index[0],NULL);
210 static void make_legend(FILE *fp,int ngrps,int isize,atom_id index[],
211 char **name,gmx_bool bCom,gmx_bool bMol,gmx_bool bDim[],
212 const output_env_t oenv)
215 const char *dimtxt[] = { " X", " Y", " Z", "" };
231 for(d=0; d<=DIM; d++)
238 sprintf(leg[j],"mol %d%s",index[i]+1,dimtxt[d]);
242 sprintf(leg[j],"%s%s",name[i],dimtxt[d]);
246 sprintf(leg[j],"atom %d%s",index[i]+1,dimtxt[d]);
252 xvgr_legend(fp,j,(const char**)leg,oenv);
261 static real ekrot(rvec x[],rvec v[],real mass[],int isize,atom_id index[])
263 static real **TCM=NULL,**L;
264 double tm,m0,lxx,lxy,lxz,lyy,lyz,lzz,ekrot;
288 for(i=0; i<isize; i++)
294 for(m=0; (m<DIM); m++)
296 xcm[m] += m0*x[j][m]; /* c.o.m. position */
297 vcm[m] += m0*v[j][m]; /* c.o.m. velocity */
298 acm[m] += m0*a0[m]; /* rotational velocity around c.o.m. */
302 for(m=0; (m<DIM); m++)
309 lxx=lxy=lxz=lyy=lyz=lzz=0.0;
310 for(i=0; i<isize; i++)
316 dx[m] = x[j][m] - xcm[m];
318 lxx += dx[XX]*dx[XX]*m0;
319 lxy += dx[XX]*dx[YY]*m0;
320 lxz += dx[XX]*dx[ZZ]*m0;
321 lyy += dx[YY]*dx[YY]*m0;
322 lyz += dx[YY]*dx[ZZ]*m0;
323 lzz += dx[ZZ]*dx[ZZ]*m0;
326 L[XX][XX] = lyy + lzz;
330 L[YY][YY] = lxx + lzz;
334 L[ZZ][ZZ] = lxx + lyy;
336 m_inv_gen(L,DIM,TCM);
338 /* Compute omega (hoeksnelheid) */
345 ocm[m] += TCM[m][n]*acm[n];
347 ekrot += 0.5*ocm[m]*acm[m];
353 static real ektrans(rvec v[],real mass[],int isize,atom_id index[])
361 for(i=0; i<isize; i++)
366 mvcom[d] += mass[j]*v[j][d];
371 return dnorm2(mvcom)/(mtot*2);
374 static real temp(rvec v[],real mass[],int isize,atom_id index[])
380 for(i=0; i<isize; i++)
383 ekin2 += mass[j]*norm2(v[j]);
386 return ekin2/(3*isize*BOLTZ);
389 static void remove_jump(matrix box,int natoms,rvec xp[],rvec x[])
396 hbox[d] = 0.5*box[d][d];
398 for(i=0; i<natoms; i++)
400 for(m=DIM-1; m>=0; m--)
402 while (x[i][m]-xp[i][m] <= -hbox[m])
406 x[i][d] += box[m][d];
409 while (x[i][m]-xp[i][m] > hbox[m])
413 x[i][d] -= box[m][d];
420 static void write_pdb_bfac(const char *fname,const char *xname,
421 const char *title,t_atoms *atoms,int ePBC,matrix box,
422 int isize,atom_id *index,int nfr_x,rvec *x,
424 gmx_bool bDim[],real scale_factor,
425 const output_env_t oenv)
433 if ((nfr_x == 0) || (nfr_v == 0))
435 fprintf(stderr,"No frames found for %s, will not write %s\n",
440 fprintf(stderr,"Used %d frames for %s\n",nfr_x,"coordinates");
441 fprintf(stderr,"Used %d frames for %s\n",nfr_v,title);
460 for(i=0; i<isize; i++)
462 svmul(scale,sum[index[i]],sum[index[i]]);
465 fp=xvgropen(xname,title,"Atom","",oenv);
466 for(i=0; i<isize; i++)
468 fprintf(fp,"%-5d %10.3f %10.3f %10.3f\n",1+i,
469 sum[index[i]][XX],sum[index[i]][YY],sum[index[i]][ZZ]);
474 for(i=0; i<isize; i++)
479 if (bDim[m] || bDim[DIM])
481 len2 += sqr(sum[index[i]][m]);
490 if (scale_factor != 0)
492 scale = scale_factor;
502 scale = 10.0/sqrt(max);
506 printf("Maximum %s is %g on atom %d %s, res. %s %d\n",
507 title,sqrt(max),maxi+1,*(atoms->atomname[maxi]),
508 *(atoms->resinfo[atoms->atom[maxi].resind].name),
509 atoms->resinfo[atoms->atom[maxi].resind].nr);
511 if (atoms->pdbinfo == NULL)
513 snew(atoms->pdbinfo,atoms->nr);
517 for(i=0; i<isize; i++)
522 if (bDim[m] || bDim[DIM])
524 len2 += sqr(sum[index[i]][m]);
527 atoms->pdbinfo[index[i]].bfac = sqrt(len2)*scale;
532 for(i=0; i<isize; i++)
534 atoms->pdbinfo[index[i]].bfac = sum[index[i]][onedim]*scale;
537 write_sto_conf_indexed(fname,title,atoms,x,NULL,ePBC,box,isize,index);
541 static void update_histo(int gnx,atom_id index[],rvec v[],
542 int *nhisto,int **histo,real binwidth)
550 for(i=0; (i<gnx); i++)
552 vn = norm(v[index[i]]);
553 vnmax = max(vn,vnmax);
556 *nhisto = 1+(vnmax/binwidth);
557 snew(*histo,*nhisto);
559 for(i=0; (i<gnx); i++)
561 vn = norm(v[index[i]]);
566 fprintf(stderr,"Extending histogram from %d to %d\n",*nhisto,nnn);
569 for(m=*nhisto; (m<nnn); m++)
579 static void print_histo(const char *fn,int nhisto,int histo[],real binwidth,
580 const output_env_t oenv)
585 fp = xvgropen(fn,"Velocity distribution","V (nm/ps)","arbitrary units",
587 for(i=0; (i<nhisto); i++)
589 fprintf(fp,"%10.3e %10d\n",i*binwidth,histo[i]);
594 int gmx_traj(int argc,char *argv[])
596 const char *desc[] = {
597 "[TT]g_traj[tt] plots coordinates, velocities, forces and/or the box.",
598 "With [TT]-com[tt] the coordinates, velocities and forces are",
599 "calculated for the center of mass of each group.",
600 "When [TT]-mol[tt] is set, the numbers in the index file are",
601 "interpreted as molecule numbers and the same procedure as with",
602 "[TT]-com[tt] is used for each molecule.[PAR]",
603 "Option [TT]-ot[tt] plots the temperature of each group,",
604 "provided velocities are present in the trajectory file.",
605 "No corrections are made for constrained degrees of freedom!",
606 "This implies [TT]-com[tt].[PAR]",
607 "Options [TT]-ekt[tt] and [TT]-ekr[tt] plot the translational and",
608 "rotational kinetic energy of each group,",
609 "provided velocities are present in the trajectory file.",
610 "This implies [TT]-com[tt].[PAR]",
611 "Options [TT]-cv[tt] and [TT]-cf[tt] write the average velocities",
612 "and average forces as temperature factors to a [TT].pdb[tt] file with",
613 "the average coordinates or the coordinates at [TT]-ctime[tt].",
614 "The temperature factors are scaled such that the maximum is 10.",
615 "The scaling can be changed with the option [TT]-scale[tt].",
616 "To get the velocities or forces of one",
617 "frame set both [TT]-b[tt] and [TT]-e[tt] to the time of",
618 "desired frame. When averaging over frames you might need to use",
619 "the [TT]-nojump[tt] option to obtain the correct average coordinates.",
620 "If you select either of these option the average force and velocity",
621 "for each atom are written to an [TT].xvg[tt] file as well",
622 "(specified with [TT]-av[tt] or [TT]-af[tt]).[PAR]",
623 "Option [TT]-vd[tt] computes a velocity distribution, i.e. the",
624 "norm of the vector is plotted. In addition in the same graph",
625 "the kinetic energy distribution is given."
627 static gmx_bool bMol=FALSE,bCom=FALSE,bPBC=TRUE,bNoJump=FALSE;
628 static gmx_bool bX=TRUE,bY=TRUE,bZ=TRUE,bNorm=FALSE,bFP=FALSE;
629 static int ngroups=1;
630 static real ctime=-1,scale=0,binwidth=1;
632 { "-com", FALSE, etBOOL, {&bCom},
633 "Plot data for the com of each group" },
634 { "-pbc", FALSE, etBOOL, {&bPBC},
635 "Make molecules whole for COM" },
636 { "-mol", FALSE, etBOOL, {&bMol},
637 "Index contains molecule numbers iso atom numbers" },
638 { "-nojump", FALSE, etBOOL, {&bNoJump},
639 "Remove jumps of atoms across the box" },
640 { "-x", FALSE, etBOOL, {&bX},
641 "Plot X-component" },
642 { "-y", FALSE, etBOOL, {&bY},
643 "Plot Y-component" },
644 { "-z", FALSE, etBOOL, {&bZ},
645 "Plot Z-component" },
646 { "-ng", FALSE, etINT, {&ngroups},
647 "Number of groups to consider" },
648 { "-len", FALSE, etBOOL, {&bNorm},
649 "Plot vector length" },
650 { "-fp", FALSE, etBOOL, {&bFP},
651 "Full precision output" },
652 { "-bin", FALSE, etREAL, {&binwidth},
653 "Binwidth for velocity histogram (nm/ps)" },
654 { "-ctime", FALSE, etREAL, {&ctime},
655 "Use frame at this time for x in [TT]-cv[tt] and [TT]-cf[tt] instead of the average x" },
656 { "-scale", FALSE, etREAL, {&scale},
657 "Scale factor for [TT].pdb[tt] output, 0 is autoscale" }
659 FILE *outx=NULL,*outv=NULL,*outf=NULL,*outb=NULL,*outt=NULL;
660 FILE *outekt=NULL,*outekr=NULL;
667 int flags,nvhisto=0,*vhisto=NULL;
669 rvec *sumx=NULL,*sumv=NULL,*sumf=NULL;
672 t_trxstatus *status_out=NULL;
673 gmx_rmpbc_t gpbc=NULL;
675 int nr_xfr,nr_vfr,nr_ffr;
678 atom_id **index0,**index;
681 gmx_bool bTop,bOX,bOXT,bOV,bOF,bOB,bOT,bEKT,bEKR,bCV,bCF;
682 gmx_bool bDim[4],bDum[4],bVD;
683 char *sffmt,sffmt6[1024];
684 const char *box_leg[6] = { "XX", "YY", "ZZ", "YX", "ZX", "ZY" };
688 { efTRX, "-f", NULL, ffREAD },
689 { efTPS, NULL, NULL, ffREAD },
690 { efNDX, NULL, NULL, ffOPTRD },
691 { efXVG, "-ox", "coord.xvg", ffOPTWR },
692 { efTRX, "-oxt","coord.xtc", ffOPTWR },
693 { efXVG, "-ov", "veloc.xvg", ffOPTWR },
694 { efXVG, "-of", "force.xvg", ffOPTWR },
695 { efXVG, "-ob", "box.xvg", ffOPTWR },
696 { efXVG, "-ot", "temp.xvg", ffOPTWR },
697 { efXVG, "-ekt","ektrans.xvg", ffOPTWR },
698 { efXVG, "-ekr","ekrot.xvg", ffOPTWR },
699 { efXVG, "-vd", "veldist.xvg", ffOPTWR },
700 { efPDB, "-cv", "veloc.pdb", ffOPTWR },
701 { efPDB, "-cf", "force.pdb", ffOPTWR },
702 { efXVG, "-av", "all_veloc.xvg", ffOPTWR },
703 { efXVG, "-af", "all_force.xvg", ffOPTWR }
705 #define NFILE asize(fnm)
707 CopyRight(stderr,argv[0]);
708 parse_common_args(&argc,argv,
709 PCA_CAN_TIME | PCA_TIME_UNIT | PCA_CAN_VIEW | PCA_BE_NICE,
710 NFILE,fnm,asize(pa),pa,asize(desc),desc,0,NULL,&oenv);
714 fprintf(stderr,"Interpreting indexfile entries as molecules.\n"
715 "Using center of mass.\n");
718 bOX = opt2bSet("-ox",NFILE,fnm);
719 bOXT = opt2bSet("-oxt",NFILE,fnm);
720 bOV = opt2bSet("-ov",NFILE,fnm);
721 bOF = opt2bSet("-of",NFILE,fnm);
722 bOB = opt2bSet("-ob",NFILE,fnm);
723 bOT = opt2bSet("-ot",NFILE,fnm);
724 bEKT = opt2bSet("-ekt",NFILE,fnm);
725 bEKR = opt2bSet("-ekr",NFILE,fnm);
726 bCV = opt2bSet("-cv",NFILE,fnm) || opt2bSet("-av",NFILE,fnm);
727 bCF = opt2bSet("-cf",NFILE,fnm) || opt2bSet("-af",NFILE,fnm);
728 bVD = opt2bSet("-vd",NFILE,fnm) || opt2parg_bSet("-bin",asize(pa),pa);
729 if (bMol || bOT || bEKT || bEKR)
741 sffmt = "\t" gmx_real_fullprecision_pfmt;
747 sprintf(sffmt6,"%s%s%s%s%s%s",sffmt,sffmt,sffmt,sffmt,sffmt,sffmt);
749 bTop = read_tps_conf(ftp2fn(efTPS,NFILE,fnm),title,&top,&ePBC,
751 bCom && (bOX || bOXT || bOV || bOT || bEKT || bEKR));
753 if ((bMol || bCV || bCF) && !bTop)
755 gmx_fatal(FARGS,"Need a run input file for option -mol, -cv or -cf");
760 indexfn = ftp2fn(efNDX,NFILE,fnm);
764 indexfn = ftp2fn_null(efNDX,NFILE,fnm);
767 if (!(bCom && !bMol))
771 snew(grpname,ngroups);
772 snew(isize0,ngroups);
773 snew(index0,ngroups);
774 get_index(&(top.atoms),indexfn,ngroups,isize0,index0,grpname);
783 for (i=0; i<ngroups; i++)
785 if (index0[0][i] < 0 || index0[0][i] >= mols->nr)
787 gmx_fatal(FARGS,"Molecule index (%d) is out of range (%d-%d)",
788 index0[0][i]+1,1,mols->nr);
790 isize[i] = atndx[index0[0][i]+1] - atndx[index0[0][i]];
791 snew(index[i],isize[i]);
792 for(j=0; j<isize[i]; j++)
794 index[i][j] = atndx[index0[0][i]] + j;
805 snew(mass,top.atoms.nr);
806 for(i=0; i<top.atoms.nr; i++)
808 mass[i] = top.atoms.atom[i].m;
819 flags = flags | TRX_READ_X;
820 outx = xvgropen(opt2fn("-ox",NFILE,fnm),
821 bCom ? "Center of mass" : "Coordinate",
822 output_env_get_xvgr_tlabel(oenv),"Coordinate (nm)",oenv);
823 make_legend(outx,ngroups,isize0[0],index0[0],grpname,bCom,bMol,bDim,oenv);
827 flags = flags | TRX_READ_X;
828 status_out = open_trx(opt2fn("-oxt",NFILE,fnm),"w");
832 flags = flags | TRX_READ_V;
833 outv = xvgropen(opt2fn("-ov",NFILE,fnm),
834 bCom ? "Center of mass velocity" : "Velocity",
835 output_env_get_xvgr_tlabel(oenv),"Velocity (nm/ps)",oenv);
836 make_legend(outv,ngroups,isize0[0],index0[0],grpname,bCom,bMol,bDim,oenv);
839 flags = flags | TRX_READ_F;
840 outf = xvgropen(opt2fn("-of",NFILE,fnm),"Force",
841 output_env_get_xvgr_tlabel(oenv),"Force (kJ mol\\S-1\\N nm\\S-1\\N)",
843 make_legend(outf,ngroups,isize0[0],index0[0],grpname,bCom,bMol,bDim,oenv);
847 outb = xvgropen(opt2fn("-ob",NFILE,fnm),"Box vector elements",
848 output_env_get_xvgr_tlabel(oenv),"(nm)",oenv);
850 xvgr_legend(outb,6,box_leg,oenv);
858 flags = flags | TRX_READ_V;
859 outt = xvgropen(opt2fn("-ot",NFILE,fnm),"Temperature",
860 output_env_get_xvgr_tlabel(oenv),"(K)", oenv);
861 make_legend(outt,ngroups,isize[0],index[0],grpname,bCom,bMol,bDum,oenv);
869 flags = flags | TRX_READ_V;
870 outekt = xvgropen(opt2fn("-ekt",NFILE,fnm),"Center of mass translation",
871 output_env_get_xvgr_tlabel(oenv),"Energy (kJ mol\\S-1\\N)",oenv);
872 make_legend(outekt,ngroups,isize[0],index[0],grpname,bCom,bMol,bDum,oenv);
880 flags = flags | TRX_READ_X | TRX_READ_V;
881 outekr = xvgropen(opt2fn("-ekr",NFILE,fnm),"Center of mass rotation",
882 output_env_get_xvgr_tlabel(oenv),"Energy (kJ mol\\S-1\\N)",oenv);
883 make_legend(outekr,ngroups,isize[0],index[0],grpname,bCom,bMol,bDum,oenv);
887 flags = flags | TRX_READ_V;
891 flags = flags | TRX_READ_X | TRX_READ_V;
895 flags = flags | TRX_READ_X | TRX_READ_F;
897 if ((flags == 0) && !bOB)
899 fprintf(stderr,"Please select one or more output file options\n");
903 read_first_frame(oenv,&status,ftp2fn(efTRX,NFILE,fnm),&fr,flags);
907 snew(sumx,fr.natoms);
911 snew(sumv,fr.natoms);
915 snew(sumf,fr.natoms);
923 gpbc = gmx_rmpbc_init(&top.idef,ePBC,fr.natoms,fr.box);
928 time = output_env_conv_time(oenv,fr.time);
930 if (fr.bX && bNoJump && fr.bBox)
934 remove_jump(fr.box,fr.natoms,xp,fr.x);
940 for(i=0; i<fr.natoms; i++)
942 copy_rvec(fr.x[i],xp[i]);
946 if (fr.bX && bCom && bPBC)
948 gmx_rmpbc_trxfr(gpbc,&fr);
953 update_histo(isize[0],index[0],fr.v,&nvhisto,&vhisto,binwidth);
958 print_data(outx,time,fr.x,mass,bCom,ngroups,isize,index,bDim,sffmt);
965 frout.atoms = &top.atoms;
968 write_trx_x(status_out,&frout,mass,bCom,ngroups,isize,index);
972 print_data(outv,time,fr.v,mass,bCom,ngroups,isize,index,bDim,sffmt);
976 print_data(outf,time,fr.f,NULL,bCom,ngroups,isize,index,bDim,sffmt);
980 fprintf(outb,"\t%g",fr.time);
982 fr.box[XX][XX],fr.box[YY][YY],fr.box[ZZ][ZZ],
983 fr.box[YY][XX],fr.box[ZZ][XX],fr.box[ZZ][YY]);
988 fprintf(outt," %g",time);
989 for(i=0; i<ngroups; i++)
991 fprintf(outt,sffmt,temp(fr.v,mass,isize[i],index[i]));
997 fprintf(outekt," %g",time);
998 for(i=0; i<ngroups; i++)
1000 fprintf(outekt,sffmt,ektrans(fr.v,mass,isize[i],index[i]));
1002 fprintf(outekt,"\n");
1004 if (bEKR && fr.bX && fr.bV)
1006 fprintf(outekr," %g",time);
1007 for(i=0; i<ngroups; i++)
1009 fprintf(outekr,sffmt,ekrot(fr.x,fr.v,mass,isize[i],index[i]));
1011 fprintf(outekr,"\n");
1013 if ((bCV || bCF) && fr.bX &&
1014 (ctime < 0 || (fr.time >= ctime*0.999999 &&
1015 fr.time <= ctime*1.000001)))
1017 for(i=0; i<fr.natoms; i++)
1019 rvec_inc(sumx[i],fr.x[i]);
1025 for(i=0; i<fr.natoms; i++)
1027 rvec_inc(sumv[i],fr.v[i]);
1033 for(i=0; i<fr.natoms; i++)
1035 rvec_inc(sumf[i],fr.f[i]);
1040 } while(read_next_frame(oenv,status,&fr));
1044 gmx_rmpbc_done(gpbc);
1047 /* clean up a bit */
1050 if (bOX) ffclose(outx);
1051 if (bOXT) close_trx(status_out);
1052 if (bOV) ffclose(outv);
1053 if (bOF) ffclose(outf);
1054 if (bOB) ffclose(outb);
1055 if (bOT) ffclose(outt);
1056 if (bEKT) ffclose(outekt);
1057 if (bEKR) ffclose(outekr);
1061 print_histo(opt2fn("-vd",NFILE,fnm),nvhisto,vhisto,binwidth,oenv);
1068 if (ePBC != epbcNONE && !bNoJump)
1070 fprintf(stderr,"\nWARNING: More than one frame was used for option -cv or -cf\n"
1071 "If atoms jump across the box you should use the -nojump or -ctime option\n\n");
1073 for(i=0; i<isize[0]; i++)
1075 svmul(1.0/nr_xfr,sumx[index[0][i]],sumx[index[0][i]]);
1078 else if (nr_xfr == 0)
1080 fprintf(stderr,"\nWARNING: No coordinate frames found for option -cv or -cf\n\n");
1085 write_pdb_bfac(opt2fn("-cv",NFILE,fnm),
1086 opt2fn("-av",NFILE,fnm),"average velocity",&(top.atoms),
1087 ePBC,topbox,isize[0],index[0],nr_xfr,sumx,
1088 nr_vfr,sumv,bDim,scale,oenv);
1092 write_pdb_bfac(opt2fn("-cf",NFILE,fnm),
1093 opt2fn("-af",NFILE,fnm),"average force",&(top.atoms),
1094 ePBC,topbox,isize[0],index[0],nr_xfr,sumx,
1095 nr_ffr,sumf,bDim,scale,oenv);
1099 view_all(oenv,NFILE, fnm);