Code beautification with uncrustify
[alexxy/gromacs.git] / src / tools / gmx_clustsize.c
index 15c563e05e31c737a28a8f09a510654ce946d2a8..49667edc31df7788aba25c597f679f7084ff363b 100644 (file)
@@ -1,11 +1,11 @@
 /*
- * 
+ *
  *                This source code is part of
- * 
+ *
  *                 G   R   O   M   A   C   S
- * 
+ *
  *          GROningen MAchine for Chemical Simulations
- * 
+ *
  *                        VERSION 3.3.2
  * 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:
  * Groningen Machine for Chemical Simulation
  */
 #include "gmx_ana.h"
 
 
-static void clust_size(const char *ndx,const char *trx,const char *xpm,
-                      const char *xpmw,const char *ncl,const char *acl, 
-                      const char *mcl,const char *histo,const char *tempf,
-                      const char *mcn,gmx_bool bMol,gmx_bool bPBC,const char *tpr,
-                      real cut,int nskip,int nlevels,
-                      t_rgb rmid,t_rgb rhi,int ndf,
+static void clust_size(const char *ndx, const char *trx, const char *xpm,
+                       const char *xpmw, const char *ncl, const char *acl,
+                       const char *mcl, const char *histo, const char *tempf,
+                       const char *mcn, gmx_bool bMol, gmx_bool bPBC, const char *tpr,
+                       real cut, int nskip, int nlevels,
+                       t_rgb rmid, t_rgb rhi, int ndf,
                        const output_env_t oenv)
 {
-  FILE    *fp,*gp,*hp,*tp;
-  atom_id *index=NULL;
-  int     nindex,natoms;
-  t_trxstatus *status;
-  rvec    *x=NULL,*v=NULL,dx;
-  t_pbc   pbc;
-  char    *gname;
-  char    timebuf[32];
-  gmx_bool    bSame,bTPRwarn=TRUE;
-  /* Topology stuff */
-  t_trxframe  fr;
-  t_tpxheader tpxh;
-  gmx_mtop_t *mtop=NULL;
-  int     ePBC=-1;
-  t_block *mols=NULL;
-  gmx_mtop_atomlookup_t alook;
-  t_atom  *atom;
-  int     version,generation,ii,jj,nsame;
-  real    temp,tfac;
-  /* Cluster size distribution (matrix) */
-  real    **cs_dist=NULL;
-  real    tf,dx2,cut2,*t_x=NULL,*t_y,cmid,cmax,cav,ekin;
-  int     i,j,k,ai,aj,ak,ci,cj,nframe,nclust,n_x,n_y,max_size=0;
-  int     *clust_index,*clust_size,max_clust_size,max_clust_ind,nav,nhisto;
-  t_rgb   rlo = { 1.0, 1.0, 1.0 };
-  
-  clear_trxframe(&fr,TRUE);
-  sprintf(timebuf,"Time (%s)",output_env_get_time_unit(oenv));
-  tf     = output_env_get_time_factor(oenv);
-  fp     = xvgropen(ncl,"Number of clusters",timebuf,"N",oenv);
-  gp     = xvgropen(acl,"Average cluster size",timebuf,"#molecules",oenv);
-  hp     = xvgropen(mcl,"Max cluster size",timebuf,"#molecules",oenv);
-  tp     = xvgropen(tempf,"Temperature of largest cluster",timebuf,"T (K)",
-                    oenv);
-  
-  if (!read_first_frame(oenv,&status,trx,&fr,TRX_NEED_X | TRX_READ_V))
-    gmx_file(trx);
-    
-  natoms = fr.natoms;
-  x      = fr.x;
-
-  if (tpr) {  
-    snew(mtop,1);
-    read_tpxheader(tpr,&tpxh,TRUE,&version,&generation);
-    if (tpxh.natoms != natoms) 
-      gmx_fatal(FARGS,"tpr (%d atoms) and xtc (%d atoms) do not match!",
-               tpxh.natoms,natoms);
-    ePBC = read_tpx(tpr,NULL,NULL,&natoms,NULL,NULL,NULL,mtop);
-  }
-  if (ndf <= -1)
-    tfac = 1;
-  else 
-    tfac = ndf/(3.0*natoms);
-  
-  if (bMol) {
-    if (ndx)
-      printf("Using molecules rather than atoms. Not reading index file %s\n",
-            ndx);
-    mols = &(mtop->mols);
-
-    /* Make dummy index */
-    nindex = mols->nr;
-    snew(index,nindex);
-    for(i=0; (i<nindex); i++)
-      index[i] = i;
-    gname = strdup("mols");
-  }
-  else
-    rd_index(ndx,1,&nindex,&index,&gname);
-  
-  alook = gmx_mtop_atomlookup_init(mtop);
-
-  snew(clust_index,nindex);
-  snew(clust_size,nindex);
-  cut2   = cut*cut;
-  nframe = 0;
-  n_x    = 0;
-  snew(t_y,nindex);
-  for(i=0; (i<nindex); i++) 
-    t_y[i] = i+1;
-  max_clust_size = 1;
-  max_clust_ind  = -1;
-  do {
-    if ((nskip == 0) || ((nskip > 0) && ((nframe % nskip) == 0))) {
-      if (bPBC)
-       set_pbc(&pbc,ePBC,fr.box);
-      max_clust_size = 1;
-      max_clust_ind  = -1;
-      
-      /* Put all atoms/molecules in their own cluster, with size 1 */
-      for(i=0; (i<nindex); i++) {
-       /* Cluster index is indexed with atom index number */
-       clust_index[i] = i;
-       /* Cluster size is indexed with cluster number */
-       clust_size[i]  = 1;
-      }
-      
-      /* Loop over atoms */
-      for(i=0; (i<nindex); i++) {
-       ai = index[i];
-       ci = clust_index[i];
-       
-       /* Loop over atoms (only half a matrix) */
-       for(j=i+1; (j<nindex); j++) {
-         cj = clust_index[j];
-         
-         /* If they are not in the same cluster already */
-         if (ci != cj) {
-           aj = index[j];
-           
-           /* Compute distance */
-           if (bMol) {
-             bSame = FALSE;
-             for(ii=mols->index[ai]; !bSame && (ii<mols->index[ai+1]); ii++) {
-               for(jj=mols->index[aj]; !bSame && (jj<mols->index[aj+1]); jj++) {
-                 if (bPBC)
-                   pbc_dx(&pbc,x[ii],x[jj],dx);
-                 else
-                   rvec_sub(x[ii],x[jj],dx);
-                 dx2   = iprod(dx,dx);
-                 bSame = (dx2 < cut2);
-               }
-             }
-           }
-           else {
-             if (bPBC)
-               pbc_dx(&pbc,x[ai],x[aj],dx);
-             else
-               rvec_sub(x[ai],x[aj],dx);
-             dx2 = iprod(dx,dx);
-             bSame = (dx2 < cut2);
-           }
-           /* If distance less than cut-off */
-           if (bSame) {
-             /* Merge clusters: check for all atoms whether they are in 
-              * cluster cj and if so, put them in ci
-              */
-             for(k=0; (k<nindex); k++) {
-               if (clust_index[k] == cj) {
-                 if (clust_size[cj] <= 0)
-                   gmx_fatal(FARGS,"negative cluster size %d for element %d",
-                               clust_size[cj],cj);
-                 clust_size[cj]--;
-                 clust_index[k] = ci;
-                 clust_size[ci]++;
-               }
-             }
-           }
-         }
-       }
-      }
-      n_x++;
-      srenew(t_x,n_x);
-      t_x[n_x-1] = fr.time*tf;
-      srenew(cs_dist,n_x);
-      snew(cs_dist[n_x-1],nindex);
-      nclust = 0;
-      cav    = 0;
-      nav    = 0;
-      for(i=0; (i<nindex); i++) {
-       ci = clust_size[i];
-       if (ci > max_clust_size) {
-         max_clust_size = ci;
-         max_clust_ind  = i;
-       }
-       if (ci > 0) {
-         nclust++;
-         cs_dist[n_x-1][ci-1] += 1.0;
-         max_size = max(max_size,ci);
-         if (ci > 1) {
-           cav += ci;
-           nav++;
-         }
-       }
-      }
-      fprintf(fp,"%14.6e  %10d\n",fr.time,nclust);
-      if (nav > 0)
-       fprintf(gp,"%14.6e  %10.3f\n",fr.time,cav/nav);
-      fprintf(hp, "%14.6e  %10d\n",fr.time,max_clust_size);
+    FILE                 *fp, *gp, *hp, *tp;
+    atom_id              *index = NULL;
+    int                   nindex, natoms;
+    t_trxstatus          *status;
+    rvec                 *x = NULL, *v = NULL, dx;
+    t_pbc                 pbc;
+    char                 *gname;
+    char                  timebuf[32];
+    gmx_bool              bSame, bTPRwarn = TRUE;
+    /* Topology stuff */
+    t_trxframe            fr;
+    t_tpxheader           tpxh;
+    gmx_mtop_t           *mtop = NULL;
+    int                   ePBC = -1;
+    t_block              *mols = NULL;
+    gmx_mtop_atomlookup_t alook;
+    t_atom               *atom;
+    int                   version, generation, ii, jj, nsame;
+    real                  temp, tfac;
+    /* Cluster size distribution (matrix) */
+    real                **cs_dist = NULL;
+    real                  tf, dx2, cut2, *t_x = NULL, *t_y, cmid, cmax, cav, ekin;
+    int                   i, j, k, ai, aj, ak, ci, cj, nframe, nclust, n_x, n_y, max_size = 0;
+    int                  *clust_index, *clust_size, max_clust_size, max_clust_ind, nav, nhisto;
+    t_rgb                 rlo = { 1.0, 1.0, 1.0 };
+
+    clear_trxframe(&fr, TRUE);
+    sprintf(timebuf, "Time (%s)", output_env_get_time_unit(oenv));
+    tf     = output_env_get_time_factor(oenv);
+    fp     = xvgropen(ncl, "Number of clusters", timebuf, "N", oenv);
+    gp     = xvgropen(acl, "Average cluster size", timebuf, "#molecules", oenv);
+    hp     = xvgropen(mcl, "Max cluster size", timebuf, "#molecules", oenv);
+    tp     = xvgropen(tempf, "Temperature of largest cluster", timebuf, "T (K)",
+                      oenv);
+
+    if (!read_first_frame(oenv, &status, trx, &fr, TRX_NEED_X | TRX_READ_V))
+    {
+        gmx_file(trx);
+    }
+
+    natoms = fr.natoms;
+    x      = fr.x;
+
+    if (tpr)
+    {
+        snew(mtop, 1);
+        read_tpxheader(tpr, &tpxh, TRUE, &version, &generation);
+        if (tpxh.natoms != natoms)
+        {
+            gmx_fatal(FARGS, "tpr (%d atoms) and xtc (%d atoms) do not match!",
+                      tpxh.natoms, natoms);
+        }
+        ePBC = read_tpx(tpr, NULL, NULL, &natoms, NULL, NULL, NULL, mtop);
+    }
+    if (ndf <= -1)
+    {
+        tfac = 1;
     }
-    /* Analyse velocities, if present */
-    if (fr.bV) {
-      if (!tpr) {
-       if (bTPRwarn) {
-         printf("You need a [TT].tpr[tt] file to analyse temperatures\n");
-         bTPRwarn = FALSE;
-       }
-      }
-      else {
-       v = fr.v;
-       /* Loop over clusters and for each cluster compute 1/2 m v^2 */
-       if (max_clust_ind >= 0) {
-         ekin = 0;
-         for(i=0; (i<nindex); i++) 
-           if (clust_index[i] == max_clust_ind) {
-             ai    = index[i];
-             gmx_mtop_atomnr_to_atom(alook,ai,&atom);
-             ekin += 0.5*atom->m*iprod(v[ai],v[ai]);
-           }
-         temp = (ekin*2.0)/(3.0*tfac*max_clust_size*BOLTZ);
-         fprintf(tp,"%10.3f  %10.3f\n",fr.time,temp);
-       }
-      }
+    else
+    {
+        tfac = ndf/(3.0*natoms);
     }
-    nframe++;
-  } while (read_next_frame(oenv,status,&fr));
-  close_trx(status);
-  ffclose(fp);
-  ffclose(gp);
-  ffclose(hp);
-  ffclose(tp);
-
-  gmx_mtop_atomlookup_destroy(alook);
-
-  if (max_clust_ind >= 0) {
-    fp = ffopen(mcn,"w");
-    fprintf(fp,"[ max_clust ]\n");
-    for(i=0; (i<nindex); i++) 
-      if (clust_index[i] == max_clust_ind) {
-       if (bMol) {
-         for(j=mols->index[i]; (j<mols->index[i+1]); j++)
-           fprintf(fp,"%d\n",j+1);
-       }
-       else {
-         fprintf(fp,"%d\n",index[i]+1);
-       }
-      }
+
+    if (bMol)
+    {
+        if (ndx)
+        {
+            printf("Using molecules rather than atoms. Not reading index file %s\n",
+                   ndx);
+        }
+        mols = &(mtop->mols);
+
+        /* Make dummy index */
+        nindex = mols->nr;
+        snew(index, nindex);
+        for (i = 0; (i < nindex); i++)
+        {
+            index[i] = i;
+        }
+        gname = strdup("mols");
+    }
+    else
+    {
+        rd_index(ndx, 1, &nindex, &index, &gname);
+    }
+
+    alook = gmx_mtop_atomlookup_init(mtop);
+
+    snew(clust_index, nindex);
+    snew(clust_size, nindex);
+    cut2   = cut*cut;
+    nframe = 0;
+    n_x    = 0;
+    snew(t_y, nindex);
+    for (i = 0; (i < nindex); i++)
+    {
+        t_y[i] = i+1;
+    }
+    max_clust_size = 1;
+    max_clust_ind  = -1;
+    do
+    {
+        if ((nskip == 0) || ((nskip > 0) && ((nframe % nskip) == 0)))
+        {
+            if (bPBC)
+            {
+                set_pbc(&pbc, ePBC, fr.box);
+            }
+            max_clust_size = 1;
+            max_clust_ind  = -1;
+
+            /* Put all atoms/molecules in their own cluster, with size 1 */
+            for (i = 0; (i < nindex); i++)
+            {
+                /* Cluster index is indexed with atom index number */
+                clust_index[i] = i;
+                /* Cluster size is indexed with cluster number */
+                clust_size[i]  = 1;
+            }
+
+            /* Loop over atoms */
+            for (i = 0; (i < nindex); i++)
+            {
+                ai = index[i];
+                ci = clust_index[i];
+
+                /* Loop over atoms (only half a matrix) */
+                for (j = i+1; (j < nindex); j++)
+                {
+                    cj = clust_index[j];
+
+                    /* If they are not in the same cluster already */
+                    if (ci != cj)
+                    {
+                        aj = index[j];
+
+                        /* Compute distance */
+                        if (bMol)
+                        {
+                            bSame = FALSE;
+                            for (ii = mols->index[ai]; !bSame && (ii < mols->index[ai+1]); ii++)
+                            {
+                                for (jj = mols->index[aj]; !bSame && (jj < mols->index[aj+1]); jj++)
+                                {
+                                    if (bPBC)
+                                    {
+                                        pbc_dx(&pbc, x[ii], x[jj], dx);
+                                    }
+                                    else
+                                    {
+                                        rvec_sub(x[ii], x[jj], dx);
+                                    }
+                                    dx2   = iprod(dx, dx);
+                                    bSame = (dx2 < cut2);
+                                }
+                            }
+                        }
+                        else
+                        {
+                            if (bPBC)
+                            {
+                                pbc_dx(&pbc, x[ai], x[aj], dx);
+                            }
+                            else
+                            {
+                                rvec_sub(x[ai], x[aj], dx);
+                            }
+                            dx2   = iprod(dx, dx);
+                            bSame = (dx2 < cut2);
+                        }
+                        /* If distance less than cut-off */
+                        if (bSame)
+                        {
+                            /* Merge clusters: check for all atoms whether they are in
+                             * cluster cj and if so, put them in ci
+                             */
+                            for (k = 0; (k < nindex); k++)
+                            {
+                                if (clust_index[k] == cj)
+                                {
+                                    if (clust_size[cj] <= 0)
+                                    {
+                                        gmx_fatal(FARGS, "negative cluster size %d for element %d",
+                                                  clust_size[cj], cj);
+                                    }
+                                    clust_size[cj]--;
+                                    clust_index[k] = ci;
+                                    clust_size[ci]++;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            n_x++;
+            srenew(t_x, n_x);
+            t_x[n_x-1] = fr.time*tf;
+            srenew(cs_dist, n_x);
+            snew(cs_dist[n_x-1], nindex);
+            nclust = 0;
+            cav    = 0;
+            nav    = 0;
+            for (i = 0; (i < nindex); i++)
+            {
+                ci = clust_size[i];
+                if (ci > max_clust_size)
+                {
+                    max_clust_size = ci;
+                    max_clust_ind  = i;
+                }
+                if (ci > 0)
+                {
+                    nclust++;
+                    cs_dist[n_x-1][ci-1] += 1.0;
+                    max_size              = max(max_size, ci);
+                    if (ci > 1)
+                    {
+                        cav += ci;
+                        nav++;
+                    }
+                }
+            }
+            fprintf(fp, "%14.6e  %10d\n", fr.time, nclust);
+            if (nav > 0)
+            {
+                fprintf(gp, "%14.6e  %10.3f\n", fr.time, cav/nav);
+            }
+            fprintf(hp, "%14.6e  %10d\n", fr.time, max_clust_size);
+        }
+        /* Analyse velocities, if present */
+        if (fr.bV)
+        {
+            if (!tpr)
+            {
+                if (bTPRwarn)
+                {
+                    printf("You need a [TT].tpr[tt] file to analyse temperatures\n");
+                    bTPRwarn = FALSE;
+                }
+            }
+            else
+            {
+                v = fr.v;
+                /* Loop over clusters and for each cluster compute 1/2 m v^2 */
+                if (max_clust_ind >= 0)
+                {
+                    ekin = 0;
+                    for (i = 0; (i < nindex); i++)
+                    {
+                        if (clust_index[i] == max_clust_ind)
+                        {
+                            ai    = index[i];
+                            gmx_mtop_atomnr_to_atom(alook, ai, &atom);
+                            ekin += 0.5*atom->m*iprod(v[ai], v[ai]);
+                        }
+                    }
+                    temp = (ekin*2.0)/(3.0*tfac*max_clust_size*BOLTZ);
+                    fprintf(tp, "%10.3f  %10.3f\n", fr.time, temp);
+                }
+            }
+        }
+        nframe++;
+    }
+    while (read_next_frame(oenv, status, &fr));
+    close_trx(status);
     ffclose(fp);
-  }
-  
-  /* Print the real distribution cluster-size/numer, averaged over the trajectory. */
-  fp = xvgropen(histo,"Cluster size distribution","Cluster size","()",oenv);
-  nhisto = 0;
-  fprintf(fp,"%5d  %8.3f\n",0,0.0);
-  for(j=0; (j<max_size); j++) {
-    real nelem = 0;
-    for(i=0; (i<n_x); i++)
-      nelem += cs_dist[i][j];
-    fprintf(fp,"%5d  %8.3f\n",j+1,nelem/n_x);
-    nhisto += (int)((j+1)*nelem/n_x);
-  }
-  fprintf(fp,"%5d  %8.3f\n",j+1,0.0);
-  ffclose(fp);
-
-  fprintf(stderr,"Total number of atoms in clusters =  %d\n",nhisto);
-  
-  /* Look for the smallest entry that is not zero 
-   * This will make that zero is white, and not zero is coloured.
-   */
-  cmid = 100.0;
-  cmax = 0.0;
-  for(i=0; (i<n_x); i++)
-    for(j=0; (j<max_size); j++) {
-      if ((cs_dist[i][j] > 0) && (cs_dist[i][j] < cmid))
-       cmid = cs_dist[i][j];
-      cmax = max(cs_dist[i][j],cmax);
+    ffclose(gp);
+    ffclose(hp);
+    ffclose(tp);
+
+    gmx_mtop_atomlookup_destroy(alook);
+
+    if (max_clust_ind >= 0)
+    {
+        fp = ffopen(mcn, "w");
+        fprintf(fp, "[ max_clust ]\n");
+        for (i = 0; (i < nindex); i++)
+        {
+            if (clust_index[i] == max_clust_ind)
+            {
+                if (bMol)
+                {
+                    for (j = mols->index[i]; (j < mols->index[i+1]); j++)
+                    {
+                        fprintf(fp, "%d\n", j+1);
+                    }
+                }
+                else
+                {
+                    fprintf(fp, "%d\n", index[i]+1);
+                }
+            }
+        }
+        ffclose(fp);
     }
-  fprintf(stderr,"cmid: %g, cmax: %g, max_size: %d\n",cmid,cmax,max_size);
-  cmid = 1;
-  fp = ffopen(xpm,"w");
-  write_xpm3(fp,0,"Cluster size distribution","# clusters",timebuf,"Size",
-            n_x,max_size,t_x,t_y,cs_dist,0,cmid,cmax,
-            rlo,rmid,rhi,&nlevels);
-  ffclose(fp);
-  cmid = 100.0;
-  cmax = 0.0;
-  for(i=0; (i<n_x); i++)
-    for(j=0; (j<max_size); j++) {
-      cs_dist[i][j] *= (j+1);
-      if ((cs_dist[i][j] > 0) && (cs_dist[i][j] < cmid))
-       cmid = cs_dist[i][j];
-      cmax = max(cs_dist[i][j],cmax);
+
+    /* Print the real distribution cluster-size/numer, averaged over the trajectory. */
+    fp     = xvgropen(histo, "Cluster size distribution", "Cluster size", "()", oenv);
+    nhisto = 0;
+    fprintf(fp, "%5d  %8.3f\n", 0, 0.0);
+    for (j = 0; (j < max_size); j++)
+    {
+        real nelem = 0;
+        for (i = 0; (i < n_x); i++)
+        {
+            nelem += cs_dist[i][j];
+        }
+        fprintf(fp, "%5d  %8.3f\n", j+1, nelem/n_x);
+        nhisto += (int)((j+1)*nelem/n_x);
+    }
+    fprintf(fp, "%5d  %8.3f\n", j+1, 0.0);
+    ffclose(fp);
+
+    fprintf(stderr, "Total number of atoms in clusters =  %d\n", nhisto);
+
+    /* Look for the smallest entry that is not zero
+     * This will make that zero is white, and not zero is coloured.
+     */
+    cmid = 100.0;
+    cmax = 0.0;
+    for (i = 0; (i < n_x); i++)
+    {
+        for (j = 0; (j < max_size); j++)
+        {
+            if ((cs_dist[i][j] > 0) && (cs_dist[i][j] < cmid))
+            {
+                cmid = cs_dist[i][j];
+            }
+            cmax = max(cs_dist[i][j], cmax);
+        }
     }
-  fprintf(stderr,"cmid: %g, cmax: %g, max_size: %d\n",cmid,cmax,max_size);
-  fp = ffopen(xpmw,"w");
-  write_xpm3(fp,0,"Weighted cluster size distribution","Fraction",timebuf,
-             "Size", n_x,max_size,t_x,t_y,cs_dist,0,cmid,cmax,
-            rlo,rmid,rhi,&nlevels);
-  ffclose(fp);
-
-  sfree(clust_index);
-  sfree(clust_size);
-  sfree(index);
+    fprintf(stderr, "cmid: %g, cmax: %g, max_size: %d\n", cmid, cmax, max_size);
+    cmid = 1;
+    fp   = ffopen(xpm, "w");
+    write_xpm3(fp, 0, "Cluster size distribution", "# clusters", timebuf, "Size",
+               n_x, max_size, t_x, t_y, cs_dist, 0, cmid, cmax,
+               rlo, rmid, rhi, &nlevels);
+    ffclose(fp);
+    cmid = 100.0;
+    cmax = 0.0;
+    for (i = 0; (i < n_x); i++)
+    {
+        for (j = 0; (j < max_size); j++)
+        {
+            cs_dist[i][j] *= (j+1);
+            if ((cs_dist[i][j] > 0) && (cs_dist[i][j] < cmid))
+            {
+                cmid = cs_dist[i][j];
+            }
+            cmax = max(cs_dist[i][j], cmax);
+        }
+    }
+    fprintf(stderr, "cmid: %g, cmax: %g, max_size: %d\n", cmid, cmax, max_size);
+    fp = ffopen(xpmw, "w");
+    write_xpm3(fp, 0, "Weighted cluster size distribution", "Fraction", timebuf,
+               "Size", n_x, max_size, t_x, t_y, cs_dist, 0, cmid, cmax,
+               rlo, rmid, rhi, &nlevels);
+    ffclose(fp);
+
+    sfree(clust_index);
+    sfree(clust_size);
+    sfree(index);
 }
 
-int gmx_clustsize(int argc,char *argv[])
+int gmx_clustsize(int argc, char *argv[])
 {
-  const char *desc[] = {
-    "This program computes the size distributions of molecular/atomic clusters in",
-    "the gas phase. The output is given in the form of an [TT].xpm[tt] file.",
-    "The total number of clusters is written to an [TT].xvg[tt] file.[PAR]",
-    "When the [TT]-mol[tt] option is given clusters will be made out of",
-    "molecules rather than atoms, which allows clustering of large molecules.",
-    "In this case an index file would still contain atom numbers",
-    "or your calculation will die with a SEGV.[PAR]",
-    "When velocities are present in your trajectory, the temperature of",
-    "the largest cluster will be printed in a separate [TT].xvg[tt] file assuming",
-    "that the particles are free to move. If you are using constraints,",
-    "please correct the temperature. For instance water simulated with SHAKE",
-    "or SETTLE will yield a temperature that is 1.5 times too low. You can",
-    "compensate for this with the [TT]-ndf[tt] option. Remember to take the removal",
-    "of center of mass motion into account.[PAR]",
-    "The [TT]-mc[tt] option will produce an index file containing the",
-    "atom numbers of the largest cluster."
-  };
-  
-  static real cutoff   = 0.35;
-  static int  nskip    = 0;
-  static int  nlevels  = 20;
-  static int  ndf      = -1;
-  static gmx_bool bMol     = FALSE;
-  static gmx_bool bPBC     = TRUE;
-  static rvec rlo      = { 1.0, 1.0, 0.0 };
-  static rvec rhi      = { 0.0, 0.0, 1.0 };
-
-  output_env_t oenv;
-
-  t_pargs pa[] = {
-    { "-cut",      FALSE, etREAL, {&cutoff},
-      "Largest distance (nm) to be considered in a cluster" },
-    { "-mol",      FALSE, etBOOL, {&bMol},
-      "Cluster molecules rather than atoms (needs [TT].tpr[tt] file)" },
-    { "-pbc",      FALSE, etBOOL, {&bPBC},
-      "Use periodic boundary conditions" },
-    { "-nskip",    FALSE, etINT,  {&nskip},
-      "Number of frames to skip between writing" },
-    { "-nlevels",  FALSE, etINT,  {&nlevels},
-      "Number of levels of grey in [TT].xpm[tt] output" },
-    { "-ndf",      FALSE, etINT,  {&ndf},
-      "Number of degrees of freedom of the entire system for temperature calculation. If not set, the number of atoms times three is used." },
-    { "-rgblo",    FALSE, etRVEC, {rlo},
-      "RGB values for the color of the lowest occupied cluster size" },
-    { "-rgbhi",    FALSE, etRVEC, {rhi},
-      "RGB values for the color of the highest occupied cluster size" }
-  };
+    const char     *desc[] = {
+        "This program computes the size distributions of molecular/atomic clusters in",
+        "the gas phase. The output is given in the form of an [TT].xpm[tt] file.",
+        "The total number of clusters is written to an [TT].xvg[tt] file.[PAR]",
+        "When the [TT]-mol[tt] option is given clusters will be made out of",
+        "molecules rather than atoms, which allows clustering of large molecules.",
+        "In this case an index file would still contain atom numbers",
+        "or your calculation will die with a SEGV.[PAR]",
+        "When velocities are present in your trajectory, the temperature of",
+        "the largest cluster will be printed in a separate [TT].xvg[tt] file assuming",
+        "that the particles are free to move. If you are using constraints,",
+        "please correct the temperature. For instance water simulated with SHAKE",
+        "or SETTLE will yield a temperature that is 1.5 times too low. You can",
+        "compensate for this with the [TT]-ndf[tt] option. Remember to take the removal",
+        "of center of mass motion into account.[PAR]",
+        "The [TT]-mc[tt] option will produce an index file containing the",
+        "atom numbers of the largest cluster."
+    };
+
+    static real     cutoff   = 0.35;
+    static int      nskip    = 0;
+    static int      nlevels  = 20;
+    static int      ndf      = -1;
+    static gmx_bool bMol     = FALSE;
+    static gmx_bool bPBC     = TRUE;
+    static rvec     rlo      = { 1.0, 1.0, 0.0 };
+    static rvec     rhi      = { 0.0, 0.0, 1.0 };
+
+    output_env_t    oenv;
+
+    t_pargs         pa[] = {
+        { "-cut",      FALSE, etREAL, {&cutoff},
+          "Largest distance (nm) to be considered in a cluster" },
+        { "-mol",      FALSE, etBOOL, {&bMol},
+          "Cluster molecules rather than atoms (needs [TT].tpr[tt] file)" },
+        { "-pbc",      FALSE, etBOOL, {&bPBC},
+          "Use periodic boundary conditions" },
+        { "-nskip",    FALSE, etINT,  {&nskip},
+          "Number of frames to skip between writing" },
+        { "-nlevels",  FALSE, etINT,  {&nlevels},
+          "Number of levels of grey in [TT].xpm[tt] output" },
+        { "-ndf",      FALSE, etINT,  {&ndf},
+          "Number of degrees of freedom of the entire system for temperature calculation. If not set, the number of atoms times three is used." },
+        { "-rgblo",    FALSE, etRVEC, {rlo},
+          "RGB values for the color of the lowest occupied cluster size" },
+        { "-rgbhi",    FALSE, etRVEC, {rhi},
+          "RGB values for the color of the highest occupied cluster size" }
+    };
 #define NPA asize(pa)
-  const char *fnNDX,*fnTPR;
-  gmx_bool       bSQ,bRDF;
-  t_rgb      rgblo,rgbhi;
-  
-  t_filenm   fnm[] = {
-    { efTRX, "-f",  NULL,         ffREAD  },
-    { efTPR, NULL,  NULL,         ffOPTRD },
-    { efNDX, NULL,  NULL,         ffOPTRD },
-    { efXPM, "-o", "csize",       ffWRITE },
-    { efXPM, "-ow","csizew",      ffWRITE },
-    { efXVG, "-nc","nclust",      ffWRITE },
-    { efXVG, "-mc","maxclust",    ffWRITE },
-    { efXVG, "-ac","avclust",     ffWRITE },
-    { efXVG, "-hc","histo-clust", ffWRITE },
-    { efXVG, "-temp","temp",     ffOPTWR },
-    { efNDX, "-mcn", "maxclust", ffOPTWR }
-  };
+    const char     *fnNDX, *fnTPR;
+    gmx_bool        bSQ, bRDF;
+    t_rgb           rgblo, rgbhi;
+
+    t_filenm        fnm[] = {
+        { efTRX, "-f",  NULL,         ffREAD  },
+        { efTPR, NULL,  NULL,         ffOPTRD },
+        { efNDX, NULL,  NULL,         ffOPTRD },
+        { efXPM, "-o", "csize",       ffWRITE },
+        { efXPM, "-ow", "csizew",      ffWRITE },
+        { efXVG, "-nc", "nclust",      ffWRITE },
+        { efXVG, "-mc", "maxclust",    ffWRITE },
+        { efXVG, "-ac", "avclust",     ffWRITE },
+        { efXVG, "-hc", "histo-clust", ffWRITE },
+        { efXVG, "-temp", "temp",     ffOPTWR },
+        { efNDX, "-mcn", "maxclust", ffOPTWR }
+    };
 #define NFILE asize(fnm)
-  
-  parse_common_args(&argc,argv,
-                    PCA_CAN_VIEW | PCA_CAN_TIME | PCA_TIME_UNIT | PCA_BE_NICE,
-                   NFILE,fnm,NPA,pa,asize(desc),desc,0,NULL,&oenv);
-
-  fnNDX = ftp2fn_null(efNDX,NFILE,fnm);
-  rgblo.r = rlo[XX],rgblo.g = rlo[YY],rgblo.b = rlo[ZZ];
-  rgbhi.r = rhi[XX],rgbhi.g = rhi[YY],rgbhi.b = rhi[ZZ];
-    
-  fnTPR = ftp2fn_null(efTPR,NFILE,fnm);
-  if (bMol && !fnTPR)
-    gmx_fatal(FARGS,"You need a tpr file for the -mol option");
-    
-  clust_size(fnNDX,ftp2fn(efTRX,NFILE,fnm),opt2fn("-o",NFILE,fnm),
-            opt2fn("-ow",NFILE,fnm),
-            opt2fn("-nc",NFILE,fnm),opt2fn("-ac",NFILE,fnm),
-            opt2fn("-mc",NFILE,fnm),opt2fn("-hc",NFILE,fnm),
-            opt2fn("-temp",NFILE,fnm),opt2fn("-mcn",NFILE,fnm),
-            bMol,bPBC,fnTPR,
-            cutoff,nskip,nlevels,rgblo,rgbhi,ndf,oenv);
-
-  thanx(stderr);
-  
-  return 0;
+
+    parse_common_args(&argc, argv,
+                      PCA_CAN_VIEW | PCA_CAN_TIME | PCA_TIME_UNIT | PCA_BE_NICE,
+                      NFILE, fnm, NPA, pa, asize(desc), desc, 0, NULL, &oenv);
+
+    fnNDX   = ftp2fn_null(efNDX, NFILE, fnm);
+    rgblo.r = rlo[XX], rgblo.g = rlo[YY], rgblo.b = rlo[ZZ];
+    rgbhi.r = rhi[XX], rgbhi.g = rhi[YY], rgbhi.b = rhi[ZZ];
+
+    fnTPR = ftp2fn_null(efTPR, NFILE, fnm);
+    if (bMol && !fnTPR)
+    {
+        gmx_fatal(FARGS, "You need a tpr file for the -mol option");
+    }
+
+    clust_size(fnNDX, ftp2fn(efTRX, NFILE, fnm), opt2fn("-o", NFILE, fnm),
+               opt2fn("-ow", NFILE, fnm),
+               opt2fn("-nc", NFILE, fnm), opt2fn("-ac", NFILE, fnm),
+               opt2fn("-mc", NFILE, fnm), opt2fn("-hc", NFILE, fnm),
+               opt2fn("-temp", NFILE, fnm), opt2fn("-mcn", NFILE, fnm),
+               bMol, bPBC, fnTPR,
+               cutoff, nskip, nlevels, rgblo, rgbhi, ndf, oenv);
+
+    thanx(stderr);
+
+    return 0;
 }