Code beautification with uncrustify
[alexxy/gromacs.git] / src / programs / tpbconv / tpbconv.c
index 3ad06a03c068f9c89988fea350736d852e2ce8ad..45b113c61de408f54a1266aa98a241d5093b8875 100644 (file)
@@ -1,12 +1,12 @@
 /*   -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
  *
- * 
+ *
  *                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.
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * 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.
- * 
+ *
  * 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:
  * Gallium Rubidium Oxygen Manganese Argon Carbon Silicon
  */
 #include "random.h"
 #include "checkpoint.h"
 
-#define RANGECHK(i,n) if ((i)>=(n)) gmx_fatal(FARGS,"Your index file contains atomnumbers (e.g. %d)\nthat are larger than the number of atoms in the tpr file (%d)",(i),(n))
+#define RANGECHK(i, n) if ((i) >= (n)) gmx_fatal(FARGS, "Your index file contains atomnumbers (e.g. %d)\nthat are larger than the number of atoms in the tpr file (%d)", (i), (n))
 
-static gmx_bool *bKeepIt(int gnx,int natoms,atom_id index[])
+static gmx_bool *bKeepIt(int gnx, int natoms, atom_id index[])
 {
-  gmx_bool *b;
-  int  i;
-  
-  snew(b,natoms);
-  for(i=0; (i<gnx); i++) {
-    RANGECHK(index[i],natoms);
-    b[index[i]] = TRUE;
-  }
-  
-  return b;
+    gmx_bool *b;
+    int       i;
+
+    snew(b, natoms);
+    for (i = 0; (i < gnx); i++)
+    {
+        RANGECHK(index[i], natoms);
+        b[index[i]] = TRUE;
+    }
+
+    return b;
 }
 
-static atom_id *invind(int gnx,int natoms,atom_id index[])
+static atom_id *invind(int gnx, int natoms, atom_id index[])
 {
-  atom_id *inv;
-  int     i;
-  
-  snew(inv,natoms);
-  for(i=0; (i<gnx); i++) {
-    RANGECHK(index[i],natoms);
-    inv[index[i]] = i;
-  }
-  
-  return inv;
+    atom_id *inv;
+    int      i;
+
+    snew(inv, natoms);
+    for (i = 0; (i < gnx); i++)
+    {
+        RANGECHK(index[i], natoms);
+        inv[index[i]] = i;
+    }
+
+    return inv;
 }
 
-static void reduce_block(gmx_bool bKeep[],t_block *block,
-                        const char *name)
+static void reduce_block(gmx_bool bKeep[], t_block *block,
+                         const char *name)
 {
-  atom_id *index;
-  int i,j,newi,newj;
-  
-  snew(index,block->nr);
-  
-  newi = newj = 0;
-  for(i=0; (i<block->nr); i++) {
-    for(j=block->index[i]; (j<block->index[i+1]); j++) {
-      if (bKeep[j]) {
-       newj++;
-      }
-    }
-    if (newj > index[newi]) {
-      newi++;
-      index[newi] = newj;
+    atom_id *index;
+    int      i, j, newi, newj;
+
+    snew(index, block->nr);
+
+    newi = newj = 0;
+    for (i = 0; (i < block->nr); i++)
+    {
+        for (j = block->index[i]; (j < block->index[i+1]); j++)
+        {
+            if (bKeep[j])
+            {
+                newj++;
+            }
+        }
+        if (newj > index[newi])
+        {
+            newi++;
+            index[newi] = newj;
+        }
     }
-  }
-  
-  fprintf(stderr,"Reduced block %8s from %6d to %6d index-, %6d to %6d a-entries\n",
-         name,block->nr,newi,block->index[block->nr],newj);
-  block->index = index;
-  block->nr    = newi;
+
+    fprintf(stderr, "Reduced block %8s from %6d to %6d index-, %6d to %6d a-entries\n",
+            name, block->nr, newi, block->index[block->nr], newj);
+    block->index = index;
+    block->nr    = newi;
 }
 
-static void reduce_blocka(atom_id invindex[],gmx_bool bKeep[],t_blocka *block,
-                         const char *name)
+static void reduce_blocka(atom_id invindex[], gmx_bool bKeep[], t_blocka *block,
+                          const char *name)
 {
-  atom_id *index,*a;
-  int i,j,k,newi,newj;
-  
-  snew(index,block->nr);
-  snew(a,block->nra);
-  
-  newi = newj = 0;
-  for(i=0; (i<block->nr); i++) {
-    for(j=block->index[i]; (j<block->index[i+1]); j++) {
-      k = block->a[j];
-      if (bKeep[k]) {
-       a[newj] = invindex[k];
-       newj++;
-      }
-    }
-    if (newj > index[newi]) {
-      newi++;
-      index[newi] = newj;
+    atom_id *index, *a;
+    int      i, j, k, newi, newj;
+
+    snew(index, block->nr);
+    snew(a, block->nra);
+
+    newi = newj = 0;
+    for (i = 0; (i < block->nr); i++)
+    {
+        for (j = block->index[i]; (j < block->index[i+1]); j++)
+        {
+            k = block->a[j];
+            if (bKeep[k])
+            {
+                a[newj] = invindex[k];
+                newj++;
+            }
+        }
+        if (newj > index[newi])
+        {
+            newi++;
+            index[newi] = newj;
+        }
     }
-  }
-  
-  fprintf(stderr,"Reduced block %8s from %6d to %6d index-, %6d to %6d a-entries\n",
-         name,block->nr,newi,block->nra,newj);
-  block->index = index;
-  block->a     = a;
-  block->nr    = newi;
-  block->nra   = newj;
+
+    fprintf(stderr, "Reduced block %8s from %6d to %6d index-, %6d to %6d a-entries\n",
+            name, block->nr, newi, block->nra, newj);
+    block->index = index;
+    block->a     = a;
+    block->nr    = newi;
+    block->nra   = newj;
 }
 
-static void reduce_rvec(int gnx,atom_id index[],rvec vv[])
+static void reduce_rvec(int gnx, atom_id index[], rvec vv[])
 {
-  rvec *ptr;
-  int  i;
-  
-  snew(ptr,gnx);
-  for(i=0; (i<gnx); i++)
-    copy_rvec(vv[index[i]],ptr[i]);
-  for(i=0; (i<gnx); i++)
-    copy_rvec(ptr[i],vv[i]);
-  sfree(ptr);
+    rvec *ptr;
+    int   i;
+
+    snew(ptr, gnx);
+    for (i = 0; (i < gnx); i++)
+    {
+        copy_rvec(vv[index[i]], ptr[i]);
+    }
+    for (i = 0; (i < gnx); i++)
+    {
+        copy_rvec(ptr[i], vv[i]);
+    }
+    sfree(ptr);
 }
 
-static void reduce_atom(int gnx,atom_id index[],t_atom atom[],char ***atomname,
-                       int *nres,t_resinfo *resinfo)
+static void reduce_atom(int gnx, atom_id index[], t_atom atom[], char ***atomname,
+                        int *nres, t_resinfo *resinfo)
 {
-  t_atom *ptr;
-  char   ***aname;
-  t_resinfo *rinfo;
-  int    i,nr;
-  
-  snew(ptr,gnx);
-  snew(aname,gnx);
-  snew(rinfo,atom[index[gnx-1]].resind+1);
-  for(i=0; (i<gnx); i++) {
-    ptr[i]   = atom[index[i]];
-    aname[i] = atomname[index[i]];
-  }
-  nr=-1;   
-  for(i=0; (i<gnx); i++) {
-    atom[i]     = ptr[i];
-    atomname[i] = aname[i];
-    if ((i==0) || (atom[i].resind != atom[i-1].resind)) {
-      nr++;
-      rinfo[nr] = resinfo[atom[i].resind];
+    t_atom    *ptr;
+    char    ***aname;
+    t_resinfo *rinfo;
+    int        i, nr;
+
+    snew(ptr, gnx);
+    snew(aname, gnx);
+    snew(rinfo, atom[index[gnx-1]].resind+1);
+    for (i = 0; (i < gnx); i++)
+    {
+        ptr[i]   = atom[index[i]];
+        aname[i] = atomname[index[i]];
+    }
+    nr = -1;
+    for (i = 0; (i < gnx); i++)
+    {
+        atom[i]     = ptr[i];
+        atomname[i] = aname[i];
+        if ((i == 0) || (atom[i].resind != atom[i-1].resind))
+        {
+            nr++;
+            rinfo[nr] = resinfo[atom[i].resind];
+        }
+        atom[i].resind = nr;
     }
-    atom[i].resind = nr;
-  }
-  nr++;
-  for(i=0; (i<nr); i++) {
-    resinfo[i] = rinfo[i];
-  }
-  *nres=nr;
-
-  sfree(aname);
-  sfree(ptr);
-  sfree(rinfo);
+    nr++;
+    for (i = 0; (i < nr); i++)
+    {
+        resinfo[i] = rinfo[i];
+    }
+    *nres = nr;
+
+    sfree(aname);
+    sfree(ptr);
+    sfree(rinfo);
 }
 
-static void reduce_ilist(atom_id invindex[],gmx_bool bKeep[],
-                        t_ilist *il,int nratoms,const char *name)
+static void reduce_ilist(atom_id invindex[], gmx_bool bKeep[],
+                         t_ilist *il, int nratoms, const char *name)
 {
-  t_iatom *ia;
-  int i,j,newnr;
-  gmx_bool bB;
-
-  if (il->nr) {  
-    snew(ia,il->nr);
-    newnr=0;
-    for(i=0; (i<il->nr); i+=nratoms+1) {
-      bB = TRUE;
-      for(j=1; (j<=nratoms); j++) {
-       bB = bB && bKeep[il->iatoms[i+j]];
-      }
-      if (bB) {
-       ia[newnr++] = il->iatoms[i];
-       for(j=1; (j<=nratoms); j++)
-         ia[newnr++] = invindex[il->iatoms[i+j]];
-      }
+    t_iatom *ia;
+    int      i, j, newnr;
+    gmx_bool bB;
+
+    if (il->nr)
+    {
+        snew(ia, il->nr);
+        newnr = 0;
+        for (i = 0; (i < il->nr); i += nratoms+1)
+        {
+            bB = TRUE;
+            for (j = 1; (j <= nratoms); j++)
+            {
+                bB = bB && bKeep[il->iatoms[i+j]];
+            }
+            if (bB)
+            {
+                ia[newnr++] = il->iatoms[i];
+                for (j = 1; (j <= nratoms); j++)
+                {
+                    ia[newnr++] = invindex[il->iatoms[i+j]];
+                }
+            }
+        }
+        fprintf(stderr, "Reduced ilist %8s from %6d to %6d entries\n",
+                name, il->nr/(nratoms+1),
+                newnr/(nratoms+1));
+
+        il->nr = newnr;
+        for (i = 0; (i < newnr); i++)
+        {
+            il->iatoms[i] = ia[i];
+        }
+
+        sfree(ia);
     }
-    fprintf(stderr,"Reduced ilist %8s from %6d to %6d entries\n",
-           name,il->nr/(nratoms+1),
-         newnr/(nratoms+1));
-    
-    il->nr = newnr;
-    for(i=0; (i<newnr); i++)
-      il->iatoms[i] = ia[i];
-    
-    sfree(ia);
-  }
 }
 
-static void reduce_topology_x(int gnx,atom_id index[],
-                             gmx_mtop_t *mtop,rvec x[],rvec v[])
+static void reduce_topology_x(int gnx, atom_id index[],
+                              gmx_mtop_t *mtop, rvec x[], rvec v[])
 {
-  t_topology top;
-  gmx_bool    *bKeep;
-  atom_id *invindex;
-  int     i;
-  
-  top = gmx_mtop_t_to_t_topology(mtop); 
-  bKeep    = bKeepIt(gnx,top.atoms.nr,index);
-  invindex = invind(gnx,top.atoms.nr,index);
-  
-  reduce_block(bKeep,&(top.cgs),"cgs");
-  reduce_block(bKeep,&(top.mols),"mols");
-  reduce_blocka(invindex,bKeep,&(top.excls),"excls");
-  reduce_rvec(gnx,index,x);
-  reduce_rvec(gnx,index,v);
-  reduce_atom(gnx,index,top.atoms.atom,top.atoms.atomname,
-             &(top.atoms.nres),top.atoms.resinfo);
-
-  for(i=0; (i<F_NRE); i++) {
-    reduce_ilist(invindex,bKeep,&(top.idef.il[i]),
-                interaction_function[i].nratoms,
-                interaction_function[i].name);
-  }
-    
-  top.atoms.nr = gnx;
-
-  mtop->nmoltype = 1;
-  snew(mtop->moltype,mtop->nmoltype);
-  mtop->moltype[0].name  = mtop->name;
-  mtop->moltype[0].atoms = top.atoms;
-  for(i=0; i<F_NRE; i++) {
-    mtop->moltype[0].ilist[i] = top.idef.il[i];
-  }
-  mtop->moltype[0].atoms = top.atoms;
-  mtop->moltype[0].cgs   = top.cgs;
-  mtop->moltype[0].excls = top.excls;
-
-  mtop->nmolblock = 1;
-  snew(mtop->molblock,mtop->nmolblock);
-  mtop->molblock[0].type       = 0;
-  mtop->molblock[0].nmol       = 1;
-  mtop->molblock[0].natoms_mol = top.atoms.nr;
-  mtop->molblock[0].nposres_xA = 0;
-  mtop->molblock[0].nposres_xB = 0;
-  
-  mtop->natoms                 = top.atoms.nr;
+    t_topology   top;
+    gmx_bool    *bKeep;
+    atom_id     *invindex;
+    int          i;
+
+    top      = gmx_mtop_t_to_t_topology(mtop);
+    bKeep    = bKeepIt(gnx, top.atoms.nr, index);
+    invindex = invind(gnx, top.atoms.nr, index);
+
+    reduce_block(bKeep, &(top.cgs), "cgs");
+    reduce_block(bKeep, &(top.mols), "mols");
+    reduce_blocka(invindex, bKeep, &(top.excls), "excls");
+    reduce_rvec(gnx, index, x);
+    reduce_rvec(gnx, index, v);
+    reduce_atom(gnx, index, top.atoms.atom, top.atoms.atomname,
+                &(top.atoms.nres), top.atoms.resinfo);
+
+    for (i = 0; (i < F_NRE); i++)
+    {
+        reduce_ilist(invindex, bKeep, &(top.idef.il[i]),
+                     interaction_function[i].nratoms,
+                     interaction_function[i].name);
+    }
+
+    top.atoms.nr = gnx;
+
+    mtop->nmoltype = 1;
+    snew(mtop->moltype, mtop->nmoltype);
+    mtop->moltype[0].name  = mtop->name;
+    mtop->moltype[0].atoms = top.atoms;
+    for (i = 0; i < F_NRE; i++)
+    {
+        mtop->moltype[0].ilist[i] = top.idef.il[i];
+    }
+    mtop->moltype[0].atoms = top.atoms;
+    mtop->moltype[0].cgs   = top.cgs;
+    mtop->moltype[0].excls = top.excls;
+
+    mtop->nmolblock = 1;
+    snew(mtop->molblock, mtop->nmolblock);
+    mtop->molblock[0].type       = 0;
+    mtop->molblock[0].nmol       = 1;
+    mtop->molblock[0].natoms_mol = top.atoms.nr;
+    mtop->molblock[0].nposres_xA = 0;
+    mtop->molblock[0].nposres_xB = 0;
+
+    mtop->natoms                 = top.atoms.nr;
 }
 
-static void zeroq(int n,atom_id index[],gmx_mtop_t *mtop)
+static void zeroq(int n, atom_id index[], gmx_mtop_t *mtop)
 {
-  int mt,i;
-  
-  for(mt=0; mt<mtop->nmoltype; mt++) {
-    for(i=0; (i<mtop->moltype[mt].atoms.nr); i++) {
-      mtop->moltype[mt].atoms.atom[index[i]].q = 0;
-      mtop->moltype[mt].atoms.atom[index[i]].qB = 0;
+    int mt, i;
+
+    for (mt = 0; mt < mtop->nmoltype; mt++)
+    {
+        for (i = 0; (i < mtop->moltype[mt].atoms.nr); i++)
+        {
+            mtop->moltype[mt].atoms.atom[index[i]].q  = 0;
+            mtop->moltype[mt].atoms.atom[index[i]].qB = 0;
+        }
     }
-  }
 }
 
 int cmain (int argc, char *argv[])
 {
-  const char *desc[] = {
-    "tpbconv can edit run input files in four ways.[PAR]",
-    "[BB]1.[bb] by modifying the number of steps in a run input file",
-    "with options [TT]-extend[tt], [TT]-until[tt] or [TT]-nsteps[tt]",
-    "(nsteps=-1 means unlimited number of steps)[PAR]",
-    "[BB]2.[bb] (OBSOLETE) by creating a run input file",
-    "for a continuation run when your simulation has crashed due to e.g.",
-    "a full disk, or by making a continuation run input file.",
-    "This option is obsolete, since mdrun now writes and reads",
-    "checkpoint files.",
-    "[BB]Note[bb] that a frame with coordinates and velocities is needed.",
-    "When pressure and/or Nose-Hoover temperature coupling is used",
-    "an energy file can be supplied to get an exact continuation",
-    "of the original run.[PAR]",
-    "[BB]3.[bb] by creating a [TT].tpx[tt] file for a subset of your original",
-    "tpx file, which is useful when you want to remove the solvent from",
-    "your [TT].tpx[tt] file, or when you want to make e.g. a pure C[GRK]alpha[grk] [TT].tpx[tt] file.",
-    "Note that you may need to use [TT]-nsteps -1[tt] (or similar) to get",
-    "this to work.",
-    "[BB]WARNING: this [TT].tpx[tt] file is not fully functional[bb].[PAR]",
-    "[BB]4.[bb] by setting the charges of a specified group",
-    "to zero. This is useful when doing free energy estimates",
-    "using the LIE (Linear Interaction Energy) method."
-  };
-
-  const char   *top_fn,*frame_fn;
-  t_fileio     *fp;
-  ener_file_t  fp_ener=NULL;
-  t_trnheader head;
-  int          i;
-  gmx_large_int_t   nsteps_req,run_step,frame;
-  double       run_t,state_t;
-  gmx_bool     bOK,bNsteps,bExtend,bUntil,bTime,bTraj;
-  gmx_bool     bFrame,bUse,bSel,bNeedEner,bReadEner,bScanEner,bFepState;
-  gmx_mtop_t   mtop;
-  t_atoms      atoms;
-  t_inputrec   *ir,*irnew=NULL;
-  t_gromppopts *gopts;
-  t_state      state;
-  rvec         *newx=NULL,*newv=NULL,*tmpx,*tmpv;
-  matrix       newbox;
-  int          gnx;
-  char         *grpname;
-  atom_id      *index=NULL;
-  int          nre;
-  gmx_enxnm_t  *enm=NULL;
-  t_enxframe   *fr_ener=NULL;
-  char         buf[200],buf2[200];
-  output_env_t oenv;
-  t_filenm fnm[] = {
-    { efTPX, NULL,  NULL,    ffREAD  },
-    { efTRN, "-f",  NULL,    ffOPTRD },
-    { efEDR, "-e",  NULL,    ffOPTRD },
-    { efNDX, NULL,  NULL,    ffOPTRD },
-    { efTPX, "-o",  "tpxout",ffWRITE }
-  };
+    const char       *desc[] = {
+        "tpbconv can edit run input files in four ways.[PAR]",
+        "[BB]1.[bb] by modifying the number of steps in a run input file",
+        "with options [TT]-extend[tt], [TT]-until[tt] or [TT]-nsteps[tt]",
+        "(nsteps=-1 means unlimited number of steps)[PAR]",
+        "[BB]2.[bb] (OBSOLETE) by creating a run input file",
+        "for a continuation run when your simulation has crashed due to e.g.",
+        "a full disk, or by making a continuation run input file.",
+        "This option is obsolete, since mdrun now writes and reads",
+        "checkpoint files.",
+        "[BB]Note[bb] that a frame with coordinates and velocities is needed.",
+        "When pressure and/or Nose-Hoover temperature coupling is used",
+        "an energy file can be supplied to get an exact continuation",
+        "of the original run.[PAR]",
+        "[BB]3.[bb] by creating a [TT].tpx[tt] file for a subset of your original",
+        "tpx file, which is useful when you want to remove the solvent from",
+        "your [TT].tpx[tt] file, or when you want to make e.g. a pure C[GRK]alpha[grk] [TT].tpx[tt] file.",
+        "Note that you may need to use [TT]-nsteps -1[tt] (or similar) to get",
+        "this to work.",
+        "[BB]WARNING: this [TT].tpx[tt] file is not fully functional[bb].[PAR]",
+        "[BB]4.[bb] by setting the charges of a specified group",
+        "to zero. This is useful when doing free energy estimates",
+        "using the LIE (Linear Interaction Energy) method."
+    };
+
+    const char       *top_fn, *frame_fn;
+    t_fileio         *fp;
+    ener_file_t       fp_ener = NULL;
+    t_trnheader       head;
+    int               i;
+    gmx_large_int_t   nsteps_req, run_step, frame;
+    double            run_t, state_t;
+    gmx_bool          bOK, bNsteps, bExtend, bUntil, bTime, bTraj;
+    gmx_bool          bFrame, bUse, bSel, bNeedEner, bReadEner, bScanEner, bFepState;
+    gmx_mtop_t        mtop;
+    t_atoms           atoms;
+    t_inputrec       *ir, *irnew = NULL;
+    t_gromppopts     *gopts;
+    t_state           state;
+    rvec             *newx = NULL, *newv = NULL, *tmpx, *tmpv;
+    matrix            newbox;
+    int               gnx;
+    char             *grpname;
+    atom_id          *index = NULL;
+    int               nre;
+    gmx_enxnm_t      *enm     = NULL;
+    t_enxframe       *fr_ener = NULL;
+    char              buf[200], buf2[200];
+    output_env_t      oenv;
+    t_filenm          fnm[] = {
+        { efTPX, NULL,  NULL,    ffREAD  },
+        { efTRN, "-f",  NULL,    ffOPTRD },
+        { efEDR, "-e",  NULL,    ffOPTRD },
+        { efNDX, NULL,  NULL,    ffOPTRD },
+        { efTPX, "-o",  "tpxout", ffWRITE }
+    };
 #define NFILE asize(fnm)
 
-  /* Command line options */
-  static int  nsteps_req_int = 0;
-  static real start_t = -1.0, extend_t = 0.0, until_t = 0.0;
-  static int init_fep_state = 0;
-  static gmx_bool bContinuation = TRUE,bZeroQ = FALSE,bVel=TRUE;
-  static t_pargs pa[] = {
-    { "-extend",        FALSE, etREAL, {&extend_t}, 
-      "Extend runtime by this amount (ps)" },
-    { "-until",         FALSE, etREAL, {&until_t}, 
-      "Extend runtime until this ending time (ps)" },
-    { "-nsteps",        FALSE, etINT,  {&nsteps_req_int},
-      "Change the number of steps" },
-    { "-time",          FALSE, etREAL, {&start_t}, 
-      "Continue from frame at this time (ps) instead of the last frame" },
-    { "-zeroq",         FALSE, etBOOL, {&bZeroQ},
-      "Set the charges of a group (from the index) to zero" },
-    { "-vel",           FALSE, etBOOL, {&bVel},
-      "Require velocities from trajectory" },
-    { "-cont",          FALSE, etBOOL, {&bContinuation},
-      "For exact continuation, the constraints should not be applied before the first step" },
-    { "-init_fep_state",FALSE, etINT, {&init_fep_state},
-      "fep state to initialize from" },
-  };
-  int nerror = 0;
-  
-  CopyRight(stderr,argv[0]);
-  
-  /* Parse the command line */
-  parse_common_args(&argc,argv,0,NFILE,fnm,asize(pa),pa,
-                   asize(desc),desc,0,NULL,&oenv);
-
-  /* Convert int to gmx_large_int_t */
-  nsteps_req = nsteps_req_int;
-  bNsteps   = opt2parg_bSet("-nsteps",asize(pa),pa);
-  bExtend   = opt2parg_bSet("-extend",asize(pa),pa);
-  bUntil    = opt2parg_bSet("-until",asize(pa),pa);
-  bFepState = opt2parg_bSet("-init_fep_state",asize(pa),pa);
-  bTime     = opt2parg_bSet("-time",asize(pa),pa);
-  bTraj     = (opt2bSet("-f",NFILE,fnm) || bTime);
-
-  top_fn = ftp2fn(efTPX,NFILE,fnm);
-  fprintf(stderr,"Reading toplogy and stuff from %s\n",top_fn);
-  
-  snew(ir,1);
-  read_tpx_state(top_fn,ir,&state,NULL,&mtop);
-  run_step = ir->init_step;
-  run_t    = ir->init_step*ir->delta_t + ir->init_t;
-  
-  if (!EI_STATE_VELOCITY(ir->eI)) {
-    bVel = FALSE;
-  }
-
-  if (bTraj) {
-    fprintf(stderr,"\n"
-           "NOTE: Reading the state from trajectory is an obsolete feature of tpbconv.\n"
-           "      Continuation should be done by loading a checkpoint file with mdrun -cpi\n"
-           "      This guarantees that all state variables are transferred.\n"
-           "      tpbconv is now only useful for increasing nsteps,\n"
-           "      but even that can often be avoided by using mdrun -maxh\n"
-           "\n");
-
-    if (ir->bContinuation != bContinuation)
-      fprintf(stderr,"Modifying ir->bContinuation to %s\n",
-             bool_names[bContinuation]);
-    ir->bContinuation = bContinuation;
-    
-
-    bNeedEner = (ir->epc == epcPARRINELLORAHMAN || ir->etc == etcNOSEHOOVER);
-    bReadEner = (bNeedEner && ftp2bSet(efEDR,NFILE,fnm));
-    bScanEner = (bReadEner && !bTime);
-    
-    if (ir->epc != epcNO || EI_SD(ir->eI) || ir->eI == eiBD) {
-      fprintf(stderr,"NOTE: The simulation uses pressure coupling and/or stochastic dynamics.\n"
-             "tpbconv can not provide binary identical continuation.\n"
-             "If you want that, supply a checkpoint file to mdrun\n\n");
-    }
-
-    if (EI_SD(ir->eI) || ir->eI == eiBD) {
-      fprintf(stderr,"\nChanging ld-seed from %d ",ir->ld_seed);
-      ir->ld_seed = make_seed();
-      fprintf(stderr,"to %d\n\n",ir->ld_seed);
+    /* Command line options */
+    static int      nsteps_req_int = 0;
+    static real     start_t        = -1.0, extend_t = 0.0, until_t = 0.0;
+    static int      init_fep_state = 0;
+    static gmx_bool bContinuation  = TRUE, bZeroQ = FALSE, bVel = TRUE;
+    static t_pargs  pa[]           = {
+        { "-extend",        FALSE, etREAL, {&extend_t},
+          "Extend runtime by this amount (ps)" },
+        { "-until",         FALSE, etREAL, {&until_t},
+          "Extend runtime until this ending time (ps)" },
+        { "-nsteps",        FALSE, etINT,  {&nsteps_req_int},
+          "Change the number of steps" },
+        { "-time",          FALSE, etREAL, {&start_t},
+          "Continue from frame at this time (ps) instead of the last frame" },
+        { "-zeroq",         FALSE, etBOOL, {&bZeroQ},
+          "Set the charges of a group (from the index) to zero" },
+        { "-vel",           FALSE, etBOOL, {&bVel},
+          "Require velocities from trajectory" },
+        { "-cont",          FALSE, etBOOL, {&bContinuation},
+          "For exact continuation, the constraints should not be applied before the first step" },
+        { "-init_fep_state", FALSE, etINT, {&init_fep_state},
+          "fep state to initialize from" },
+    };
+    int             nerror = 0;
+
+    CopyRight(stderr, argv[0]);
+
+    /* Parse the command line */
+    parse_common_args(&argc, argv, 0, NFILE, fnm, asize(pa), pa,
+                      asize(desc), desc, 0, NULL, &oenv);
+
+    /* Convert int to gmx_large_int_t */
+    nsteps_req = nsteps_req_int;
+    bNsteps    = opt2parg_bSet("-nsteps", asize(pa), pa);
+    bExtend    = opt2parg_bSet("-extend", asize(pa), pa);
+    bUntil     = opt2parg_bSet("-until", asize(pa), pa);
+    bFepState  = opt2parg_bSet("-init_fep_state", asize(pa), pa);
+    bTime      = opt2parg_bSet("-time", asize(pa), pa);
+    bTraj      = (opt2bSet("-f", NFILE, fnm) || bTime);
+
+    top_fn = ftp2fn(efTPX, NFILE, fnm);
+    fprintf(stderr, "Reading toplogy and stuff from %s\n", top_fn);
+
+    snew(ir, 1);
+    read_tpx_state(top_fn, ir, &state, NULL, &mtop);
+    run_step = ir->init_step;
+    run_t    = ir->init_step*ir->delta_t + ir->init_t;
+
+    if (!EI_STATE_VELOCITY(ir->eI))
+    {
+        bVel = FALSE;
     }
 
-    frame_fn = ftp2fn(efTRN,NFILE,fnm);
-
-    if (fn2ftp(frame_fn) == efCPT)
+    if (bTraj)
     {
-        int sim_part;
+        fprintf(stderr, "\n"
+                "NOTE: Reading the state from trajectory is an obsolete feature of tpbconv.\n"
+                "      Continuation should be done by loading a checkpoint file with mdrun -cpi\n"
+                "      This guarantees that all state variables are transferred.\n"
+                "      tpbconv is now only useful for increasing nsteps,\n"
+                "      but even that can often be avoided by using mdrun -maxh\n"
+                "\n");
+
+        if (ir->bContinuation != bContinuation)
+        {
+            fprintf(stderr, "Modifying ir->bContinuation to %s\n",
+                    bool_names[bContinuation]);
+        }
+        ir->bContinuation = bContinuation;
 
-        fprintf(stderr,
-                "\nREADING STATE FROM CHECKPOINT %s...\n\n",
-                frame_fn);
 
-        read_checkpoint_state(frame_fn,&sim_part,
-                              &run_step,&run_t,&state);
-    }
-    else
-    {
-        fprintf(stderr,
-                "\nREADING COORDS, VELS AND BOX FROM TRAJECTORY %s...\n\n",
-                frame_fn);
+        bNeedEner = (ir->epc == epcPARRINELLORAHMAN || ir->etc == etcNOSEHOOVER);
+        bReadEner = (bNeedEner && ftp2bSet(efEDR, NFILE, fnm));
+        bScanEner = (bReadEner && !bTime);
 
-        fp = open_trn(frame_fn,"r");
-        if (bScanEner)
+        if (ir->epc != epcNO || EI_SD(ir->eI) || ir->eI == eiBD)
         {
-            fp_ener = open_enx(ftp2fn(efEDR,NFILE,fnm),"r");
-            do_enxnms(fp_ener,&nre,&enm);
-            snew(fr_ener,1);
-            fr_ener->t = -1e-12;
+            fprintf(stderr, "NOTE: The simulation uses pressure coupling and/or stochastic dynamics.\n"
+                    "tpbconv can not provide binary identical continuation.\n"
+                    "If you want that, supply a checkpoint file to mdrun\n\n");
         }
 
-        /* Now scan until the last set of x and v (step == 0)
-         * or the ones at step step.
-         */
-        bFrame = TRUE;
-        frame  = 0;
-        while (bFrame)
+        if (EI_SD(ir->eI) || ir->eI == eiBD)
         {
-            bFrame = fread_trnheader(fp,&head,&bOK);
-            if (bOK && frame == 0)
-            {
-                if (mtop.natoms != head.natoms)
-                    gmx_fatal(FARGS,"Number of atoms in Topology (%d) "
-                              "is not the same as in Trajectory (%d)\n",
-                              mtop.natoms,head.natoms);
-                snew(newx,head.natoms);
-                snew(newv,head.natoms);
-            }
-            bFrame = bFrame && bOK;
-            if (bFrame)
+            fprintf(stderr, "\nChanging ld-seed from %d ", ir->ld_seed);
+            ir->ld_seed = make_seed();
+            fprintf(stderr, "to %d\n\n", ir->ld_seed);
+        }
+
+        frame_fn = ftp2fn(efTRN, NFILE, fnm);
+
+        if (fn2ftp(frame_fn) == efCPT)
+        {
+            int sim_part;
+
+            fprintf(stderr,
+                    "\nREADING STATE FROM CHECKPOINT %s...\n\n",
+                    frame_fn);
+
+            read_checkpoint_state(frame_fn, &sim_part,
+                                  &run_step, &run_t, &state);
+        }
+        else
+        {
+            fprintf(stderr,
+                    "\nREADING COORDS, VELS AND BOX FROM TRAJECTORY %s...\n\n",
+                    frame_fn);
+
+            fp = open_trn(frame_fn, "r");
+            if (bScanEner)
             {
-                bOK = fread_htrn(fp,&head,newbox,newx,newv,NULL);
+                fp_ener = open_enx(ftp2fn(efEDR, NFILE, fnm), "r");
+                do_enxnms(fp_ener, &nre, &enm);
+                snew(fr_ener, 1);
+                fr_ener->t = -1e-12;
             }
-            bFrame = bFrame && bOK;
-            bUse = FALSE;
-            if (bFrame &&
-                (head.x_size) && (head.v_size || !bVel))
+
+            /* Now scan until the last set of x and v (step == 0)
+             * or the ones at step step.
+             */
+            bFrame = TRUE;
+            frame  = 0;
+            while (bFrame)
             {
-                bUse = TRUE;
-                if (bScanEner)
+                bFrame = fread_trnheader(fp, &head, &bOK);
+                if (bOK && frame == 0)
+                {
+                    if (mtop.natoms != head.natoms)
+                    {
+                        gmx_fatal(FARGS, "Number of atoms in Topology (%d) "
+                                  "is not the same as in Trajectory (%d)\n",
+                                  mtop.natoms, head.natoms);
+                    }
+                    snew(newx, head.natoms);
+                    snew(newv, head.natoms);
+                }
+                bFrame = bFrame && bOK;
+                if (bFrame)
                 {
-                    /* Read until the energy time is >= the trajectory time */
-                    while (fr_ener->t < head.t && do_enx(fp_ener,fr_ener));
-                    bUse = (fr_ener->t == head.t);
+                    bOK = fread_htrn(fp, &head, newbox, newx, newv, NULL);
                 }
-                if (bUse)
+                bFrame = bFrame && bOK;
+                bUse   = FALSE;
+                if (bFrame &&
+                    (head.x_size) && (head.v_size || !bVel))
                 {
-                    tmpx    = newx;
-                    newx    = state.x;
-                    state.x = tmpx;
-                    tmpv    = newv;
-                    newv    = state.v;
-                    state.v = tmpv;
-                    run_t        = head.t;
-                    run_step     = head.step;
-                    state.fep_state = head.fep_state;
-                    state.lambda[efptFEP] = head.lambda;
-                    copy_mat(newbox,state.box);
+                    bUse = TRUE;
+                    if (bScanEner)
+                    {
+                        /* Read until the energy time is >= the trajectory time */
+                        while (fr_ener->t < head.t && do_enx(fp_ener, fr_ener))
+                        {
+                            ;
+                        }
+                        bUse = (fr_ener->t == head.t);
+                    }
+                    if (bUse)
+                    {
+                        tmpx                  = newx;
+                        newx                  = state.x;
+                        state.x               = tmpx;
+                        tmpv                  = newv;
+                        newv                  = state.v;
+                        state.v               = tmpv;
+                        run_t                 = head.t;
+                        run_step              = head.step;
+                        state.fep_state       = head.fep_state;
+                        state.lambda[efptFEP] = head.lambda;
+                        copy_mat(newbox, state.box);
+                    }
+                }
+                if (bFrame || !bOK)
+                {
+                    sprintf(buf, "\r%s %s frame %s%s: step %s%s time %s",
+                            "%s", "%s", "%6", gmx_large_int_fmt, "%6", gmx_large_int_fmt, " %8.3f");
+                    fprintf(stderr, buf,
+                            bUse ? "Read   " : "Skipped", ftp2ext(fn2ftp(frame_fn)),
+                            frame, head.step, head.t);
+                    frame++;
+                    if (bTime && (head.t >= start_t))
+                    {
+                        bFrame = FALSE;
+                    }
                 }
             }
-            if (bFrame || !bOK)
+            if (bScanEner)
             {
-                sprintf(buf,"\r%s %s frame %s%s: step %s%s time %s",
-                        "%s","%s","%6",gmx_large_int_fmt,"%6",gmx_large_int_fmt," %8.3f");
-                fprintf(stderr,buf,
-                        bUse ? "Read   " : "Skipped",ftp2ext(fn2ftp(frame_fn)),
-                        frame,head.step,head.t);
-                frame++;
-                if (bTime && (head.t >= start_t))
-                    bFrame = FALSE;
+                close_enx(fp_ener);
+                free_enxframe(fr_ener);
+                free_enxnms(nre, enm);
             }
-        }
-        if (bScanEner)
-        {
-            close_enx(fp_ener);
-            free_enxframe(fr_ener);
-            free_enxnms(nre,enm);
-        }
-        close_trn(fp);
-        fprintf(stderr,"\n");
+            close_trn(fp);
+            fprintf(stderr, "\n");
 
-        if (!bOK)
-        {
-            fprintf(stderr,"%s frame %s (step %s, time %g) is incomplete\n",
-                    ftp2ext(fn2ftp(frame_fn)),gmx_step_str(frame-1,buf2),
-                    gmx_step_str(head.step,buf),head.t);
-        }
-        fprintf(stderr,"\nUsing frame of step %s time %g\n",
-                gmx_step_str(run_step,buf),run_t);
+            if (!bOK)
+            {
+                fprintf(stderr, "%s frame %s (step %s, time %g) is incomplete\n",
+                        ftp2ext(fn2ftp(frame_fn)), gmx_step_str(frame-1, buf2),
+                        gmx_step_str(head.step, buf), head.t);
+            }
+            fprintf(stderr, "\nUsing frame of step %s time %g\n",
+                    gmx_step_str(run_step, buf), run_t);
 
-        if (bNeedEner)
-        {
-            if (bReadEner)
+            if (bNeedEner)
             {
-                get_enx_state(ftp2fn(efEDR,NFILE,fnm),run_t,&mtop.groups,ir,&state);
+                if (bReadEner)
+                {
+                    get_enx_state(ftp2fn(efEDR, NFILE, fnm), run_t, &mtop.groups, ir, &state);
+                }
+                else
+                {
+                    fprintf(stderr, "\nWARNING: The simulation uses %s temperature and/or %s pressure coupling,\n"
+                            "         the continuation will only be exact when an energy file is supplied\n\n",
+                            ETCOUPLTYPE(etcNOSEHOOVER),
+                            EPCOUPLTYPE(epcPARRINELLORAHMAN));
+                }
             }
-            else
+            if (bFepState)
             {
-                fprintf(stderr,"\nWARNING: The simulation uses %s temperature and/or %s pressure coupling,\n"
-                        "         the continuation will only be exact when an energy file is supplied\n\n",
-                        ETCOUPLTYPE(etcNOSEHOOVER),
-                        EPCOUPLTYPE(epcPARRINELLORAHMAN));
+                ir->fepvals->init_fep_state = init_fep_state;
             }
         }
-        if (bFepState)
-        {
-            ir->fepvals->init_fep_state = init_fep_state;
-        }
     }
-  }
-
-  if (bNsteps) {
-    fprintf(stderr,"Setting nsteps to %s\n",gmx_step_str(nsteps_req,buf));
-    ir->nsteps = nsteps_req;
-  } else {
-      /* Determine total number of steps remaining */
-      if (bExtend)
-      {
-          ir->nsteps = ir->nsteps - (run_step - ir->init_step) + (gmx_large_int_t)(extend_t/ir->delta_t + 0.5);
-          printf("Extending remaining runtime of by %g ps (now %s steps)\n",
-                 extend_t,gmx_step_str(ir->nsteps,buf));
-      }
-      else if (bUntil)
-      {
-          printf("nsteps = %s, run_step = %s, current_t = %g, until = %g\n",
-                 gmx_step_str(ir->nsteps,buf),
-                 gmx_step_str(run_step,buf2),
-                 run_t,until_t);
-          ir->nsteps = (gmx_large_int_t)((until_t - run_t)/ir->delta_t + 0.5);
-          printf("Extending remaining runtime until %g ps (now %s steps)\n",
-                 until_t,gmx_step_str(ir->nsteps,buf));
-      }
-      else
-      {
-          ir->nsteps -= run_step - ir->init_step;
-          /* Print message */
-          printf("%s steps (%g ps) remaining from first run.\n",
-                 gmx_step_str(ir->nsteps,buf),ir->nsteps*ir->delta_t);
-      }
-  }
-
-  if (bNsteps || bZeroQ || (ir->nsteps > 0))
-  {
-      ir->init_step = run_step;
-
-    if (ftp2bSet(efNDX,NFILE,fnm) ||
-        !(bNsteps || bExtend || bUntil || bTraj))
+
+    if (bNsteps)
     {
-        atoms = gmx_mtop_global_atoms(&mtop);
-        get_index(&atoms,ftp2fn_null(efNDX,NFILE,fnm),1,
-                  &gnx,&index,&grpname);
-        if (!bZeroQ)
-        {
-            bSel = (gnx != state.natoms);
-            for (i=0; ((i<gnx) && (!bSel)); i++)
-            {
-                bSel = (i!=index[i]);
-            }
-        }
-        else
+        fprintf(stderr, "Setting nsteps to %s\n", gmx_step_str(nsteps_req, buf));
+        ir->nsteps = nsteps_req;
+    }
+    else
+    {
+        /* Determine total number of steps remaining */
+        if (bExtend)
         {
-            bSel = FALSE;
+            ir->nsteps = ir->nsteps - (run_step - ir->init_step) + (gmx_large_int_t)(extend_t/ir->delta_t + 0.5);
+            printf("Extending remaining runtime of by %g ps (now %s steps)\n",
+                   extend_t, gmx_step_str(ir->nsteps, buf));
         }
-        if (bSel)
+        else if (bUntil)
         {
-            fprintf(stderr,"Will write subset %s of original tpx containing %d "
-                    "atoms\n",grpname,gnx);
-            reduce_topology_x(gnx,index,&mtop,state.x,state.v);
-            state.natoms = gnx;
+            printf("nsteps = %s, run_step = %s, current_t = %g, until = %g\n",
+                   gmx_step_str(ir->nsteps, buf),
+                   gmx_step_str(run_step, buf2),
+                   run_t, until_t);
+            ir->nsteps = (gmx_large_int_t)((until_t - run_t)/ir->delta_t + 0.5);
+            printf("Extending remaining runtime until %g ps (now %s steps)\n",
+                   until_t, gmx_step_str(ir->nsteps, buf));
         }
-        else if (bZeroQ)
+        else
         {
-            zeroq(gnx,index,&mtop);
-            fprintf(stderr,"Zero-ing charges for group %s\n",grpname);
+            ir->nsteps -= run_step - ir->init_step;
+            /* Print message */
+            printf("%s steps (%g ps) remaining from first run.\n",
+                   gmx_step_str(ir->nsteps, buf), ir->nsteps*ir->delta_t);
         }
-        else
+    }
+
+    if (bNsteps || bZeroQ || (ir->nsteps > 0))
+    {
+        ir->init_step = run_step;
+
+        if (ftp2bSet(efNDX, NFILE, fnm) ||
+            !(bNsteps || bExtend || bUntil || bTraj))
         {
-            fprintf(stderr,"Will write full tpx file (no selection)\n");
+            atoms = gmx_mtop_global_atoms(&mtop);
+            get_index(&atoms, ftp2fn_null(efNDX, NFILE, fnm), 1,
+                      &gnx, &index, &grpname);
+            if (!bZeroQ)
+            {
+                bSel = (gnx != state.natoms);
+                for (i = 0; ((i < gnx) && (!bSel)); i++)
+                {
+                    bSel = (i != index[i]);
+                }
+            }
+            else
+            {
+                bSel = FALSE;
+            }
+            if (bSel)
+            {
+                fprintf(stderr, "Will write subset %s of original tpx containing %d "
+                        "atoms\n", grpname, gnx);
+                reduce_topology_x(gnx, index, &mtop, state.x, state.v);
+                state.natoms = gnx;
+            }
+            else if (bZeroQ)
+            {
+                zeroq(gnx, index, &mtop);
+                fprintf(stderr, "Zero-ing charges for group %s\n", grpname);
+            }
+            else
+            {
+                fprintf(stderr, "Will write full tpx file (no selection)\n");
+            }
         }
+
+        state_t = ir->init_t + ir->init_step*ir->delta_t;
+        sprintf(buf,   "Writing statusfile with starting step %s%s and length %s%s steps...\n", "%10", gmx_large_int_fmt, "%10", gmx_large_int_fmt);
+        fprintf(stderr, buf, ir->init_step, ir->nsteps);
+        fprintf(stderr, "                                 time %10.3f and length %10.3f ps\n",
+                state_t, ir->nsteps*ir->delta_t);
+        write_tpx_state(opt2fn("-o", NFILE, fnm), ir, &state, &mtop);
+    }
+    else
+    {
+        printf("You've simulated long enough. Not writing tpr file\n");
     }
+    thanx(stderr);
 
-    state_t = ir->init_t + ir->init_step*ir->delta_t;
-    sprintf(buf,   "Writing statusfile with starting step %s%s and length %s%s steps...\n","%10",gmx_large_int_fmt,"%10",gmx_large_int_fmt);
-    fprintf(stderr,buf,ir->init_step,ir->nsteps);
-    fprintf(stderr,"                                 time %10.3f and length %10.3f ps\n",
-            state_t,ir->nsteps*ir->delta_t);
-    write_tpx_state(opt2fn("-o",NFILE,fnm),ir,&state,&mtop);
-  }
-  else
-  {
-      printf("You've simulated long enough. Not writing tpr file\n");
-  }
-  thanx(stderr);
-
-  return 0;
+    return 0;
 }