[gmx-users] g_rdf on Mac OS X 10.3, 10.4

Sukit Leekumjorn leekumjo at vt.edu
Fri May 5 18:30:46 CEST 2006


Hi

I also have the exact same problem with g_rdf in Gromacs 3.3 and 3.3.1 
on OS X 10.3.9 (segmentation fault problem).  Everything else seems to 
work fine.  I was wandering if anyone encountered the same problem using 
the same OS and how to overcome it?

Any help would be greatly appreciated
Sukit

Kay Gottschalk wrote:
> I think we somehow fixed it in the attached version based on some 
> advise we found in the user list, but can't really remember the change 
> we made. Bad documentation. Try it out and see if it works.
> Good luck,
> Kay.
>
>
> ------------------------------------------------------------------------
>
> /*
>  * $Id: gmx_rdf.c,v 1.1 2004/01/25 20:37:36 lindahl Exp $
>  * 
>  *                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.
>  * Copyright (c) 2001-2004, The GROMACS development team,
>  * check out http://www.gromacs.org for more information.
>
>  * This program is free software; you can redistribute it and/or
>  * 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:
>  * Green Red Orange Magenta Azure Cyan Skyblue
>  */
> #ifdef HAVE_CONFIG_H
> #include <config.h>
> #endif
>
> #include <math.h>
> #include <ctype.h>
> #include "string2.h"
> #include "sysstuff.h"
> #include "typedefs.h"
> #include "macros.h"
> #include "vec.h"
> #include "pbc.h"
> #include "rmpbc.h"
> #include "xvgr.h"
> #include "copyrite.h"
> #include "futil.h"
> #include "statutil.h"
> #include "tpxio.h"
> #include "index.h"
> #include "smalloc.h"
> #include "fftgrid.h"
> #include "calcgrid.h"
> #include "nrnb.h"
> #include "shift_util.h"
> #include "pme.h"
> #include "gstat.h"
> #include "matio.h"
>
> typedef struct
> {
>   const char   *Label;
>   real        a[4], b[4], c;
> } t_CM_table;
>
> /*
>  * 
>  * f0[k] = c + [SUM a_i*EXP(-b_i*(k^2)) ]
>  *             i=1,4
>  */
>
> const t_CM_table CM_t[] =
> {
>
>   { "H",    { 0.489918, 0.262003, 0.196767, 0.049879 },
>     { 20.6593, 7.74039, 49.5519, 2.20159 },
>     0.001305 },
>  { "HO",    { 0.489918, 0.262003, 0.196767, 0.049879 },
>    { 20.6593, 7.74039, 49.5519, 2.20159 },
>    0.001305 },
>   { "HW",    { 0.489918, 0.262003, 0.196767, 0.049879 },
>     { 20.6593, 7.74039, 49.5519, 2.20159 },
>     0.001305 },
>   { "C",  { 2.26069, 1.56165, 1.05075, 0.839259 },
>     { 22.6907, 0.656665, 9.75618, 55.5949 },
>     0.286977 },
>   { "CB",  { 2.26069, 1.56165, 1.05075, 0.839259 },
>     { 22.6907, 0.656665, 9.75618, 55.5949 },
>     0.286977 },
>   { "CS1", { 0., 0., 0., 0.},{ 0., 0., 0., 0.}, 0.}, 
>   { "CS2", { 0., 0., 0., 0.},{ 0., 0., 0., 0.}, 0.},
>   { "N",     { 12.2126, 3.13220, 2.01250, 1.16630 },     
>     { 0.005700, 9.89330, 28.9975, 0.582600 },
>     -11.529 },
>   { "O",      { 3.04850, 2.28680, 1.54630, 0.867000 },  
>     { 13.2771, 5.70110, 0.323900, 32.9089 },
>     0.250800 },
>   { "OW",     { 3.04850, 2.28680, 1.54630, 0.867000 }, 
>     { 13.2771, 5.70110, 0.323900, 32.9089 },
>     0.250800 },
>   { "OWT3",   { 3.04850, 2.28680, 1.54630, 0.867000 },   
>     { 13.2771, 5.70110, 0.323900, 32.9089 },
>     0.250800 },
>   { "OA",     { 3.04850, 2.28680, 1.54630, 0.867000 },  
>     { 13.2771, 5.70110, 0.323900, 32.9089 },
>     0.250800 },
>   { "OS",     { 3.04850, 2.28680, 1.54630, 0.867000 }, 
>     { 13.2771, 5.70110, 0.323900, 32.9089 },
>     0.250800 },
>   { "OSE",    { 3.04850, 2.28680, 1.54630, 0.867000 },
>     { 13.2771, 5.70110, 0.323900, 32.9089 },
>     0.250800 },
>   { "Na",  { 3.25650, 3.93620, 1.39980, 1.00320 },       /*  Na 1+ */
>     { 2.66710, 6.11530, 0.200100, 14.0390 }, 
>     0.404000 },
>   { "CH3", { 0., 0., 0., 0.},{ 0., 0., 0., 0.}, 0.},    
>   { "CH2", { 0., 0., 0., 0.},{ 0., 0., 0., 0.}, 0.},    
>   { "CH1", { 0., 0., 0., 0.},{ 0., 0., 0., 0.}, 0.},   
> };
>
> typedef struct
> {
>   int     n_angles;
>   int     n_groups;
>   double  lambda;
>   double  energy;
>   double  momentum;
>   double  ref_k;
>   double  **F;
>   int     nSteps;
>   int     total_n_atoms;
> } structure_factor;
>
> typedef struct
> {
>   rvec x;
>   int  t;
> } reduced_atom;
>
> real ** sf_table;
>
>
> static void do_rdf(char *fnNDX,char *fnTPS,char *fnTRX,
> 		   char *fnRDF,char *fnCNRDF, char *fnHQ,
> 		   bool bCM,real cutoff,real binwidth,real fade)
> {
>   FILE       *fp;
>   int        status;
>   char       outf1[STRLEN],outf2[STRLEN];
>   char       title[STRLEN];
>   int        g,ng,natoms,i,j,k,nbin,j0,j1,n,nframes;
>   int        **count;
>   char       **grpname;
>   int        *isize,isize_cm=0,nrdf=0,max_i;
>   atom_id    **index,*index_cm=NULL;
>   unsigned long int *sum;
>   real       t,boxmin,hbox,hbox2,cut2,r,r2,invbinw,normfac;
>   real       segvol,spherevol,prev_spherevol,**rdf;
>   rvec       *x,xcom,dx,*x_i1,xi;
>   real       *inv_segvol,vol,vol_sum,rho;
>   bool       *bExcl,bTop,bNonSelfExcl;
>   matrix     box;
>   int        **npairs;
>   atom_id    ix,jx,***pairs;
>   t_topology top;
>   t_block    *excl;
>   excl=NULL;
>   
>   if (fnTPS) {
>     bTop=read_tps_conf(fnTPS,title,&top,&x,NULL,box,TRUE);
>     mk_single_top(&top);
>     if (bTop && !bCM)
>       /* get exclusions from topology */
>       excl=&(top.atoms.excl);
>   }
>   fprintf(stderr,"\nHow many groups do you want to calculate the RDF of?\n");
>   do {
>     scanf("%d",&ng);
>   } while (ng < 1);
>   snew(grpname,ng+1);
>   snew(isize,ng+1);
>   snew(index,ng+1);
>   fprintf(stderr,"\nSelect a reference group and %d group%s\n",
> 	  ng,ng==1?"":"s");
>   if (fnTPS)
>     get_index(&top.atoms,fnNDX,ng+1,isize,index,grpname);
>   else
>     rd_index(fnNDX,ng+1,isize,index,grpname);
>   
>   natoms=read_first_x(&status,fnTRX,&t,&x,box);
>   if ( !natoms )
>     fatal_error(0,"Could not read coordinates from statusfile\n");
>   if (fnTPS)
>     /* check with topology */
>     if ( natoms > top.atoms.nr ) 
>       fatal_error(0,"Trajectory (%d atoms) does not match topology (%d atoms)",
> 		  natoms,top.atoms.nr);
>   /* check with index groups */
>   for (i=0; i<=ng; i++)
>     for (j=0; j<isize[i]; j++)
>       if ( index[i][j] >= natoms )
> 	fatal_error(0,"Atom index (%d) in index group %s (%d atoms) larger "
> 		    "than number of atoms in trajectory (%d atoms)",
> 		    index[i][j],grpname[i],isize[i],natoms);
>   
>   if (bCM) {
>     /* move index[0] to index_cm and make 'dummy' index[0] */
>     isize_cm=isize[0];
>     snew(index_cm,isize_cm);
>     for(i=0; i<isize[0]; i++)
>       index_cm[i]=index[0][i];
>     isize[0]=1;
>     index[0][0]=natoms;
>     srenew(index[0],isize[0]);
>     /* make space for center of mass */
>     srenew(x,natoms+1);
>   }
>   
>   /* initialize some handy things */
>   boxmin = min( norm(box[XX]), min( norm(box[YY]), norm(box[ZZ]) ) );
>   hbox   = boxmin / 2.0;
>   nbin   = (int)(hbox / binwidth) + 1;
>   invbinw = 1.0 / binwidth;
>   hbox2  = sqr(hbox);
>   cut2   = sqr(cutoff);
>
>   snew(count,ng);
>   snew(pairs,ng);
>   snew(npairs,ng);
>
>   snew(bExcl,natoms);
>   max_i = 0;
>   for(g=0; g<ng; g++) {
>     if (isize[g+1] > max_i)
>       max_i = isize[g+1];
>
>     /* this is THE array */
>     snew(count[g],nbin+1);
>   
>     /* make pairlist array for groups and exclusions */
>     snew(pairs[g],isize[0]);
>     snew(npairs[g],isize[0]);
>     for(i=0; i<isize[0]; i++) {
>       ix = index[0][i];
>       for(j=0; j < natoms; j++)
> 	bExcl[j] = FALSE;
>       /* exclusions? */
>       if (excl)
> 	for( j = excl->index[ix]; j < excl->index[ix+1]; j++)
> 	  bExcl[excl->a[j]]=TRUE;
>       k = 0;
>       snew(pairs[g][i], isize[g+1]);
>       bNonSelfExcl = FALSE;
>       for(j=0; j<isize[g+1]; j++) {
> 	jx = index[g+1][j];
> 	if (!bExcl[jx])
> 	  pairs[g][i][k++]=jx;
> 	else
> 	  /* Check if we have exclusions other than self exclusions */
> 	  bNonSelfExcl = bNonSelfExcl || (ix != jx);
>       }
>       if (bNonSelfExcl) {
> 	npairs[g][i]=k;
> 	srenew(pairs[g][i],npairs[g][i]);
>       } else {
> 	/* Save a LOT of memory and some cpu cycles */
> 	npairs[g][i]=-1;
> 	sfree(pairs[g][i]);
>       }
>     }
>   }
>   sfree(bExcl);
>
>   snew(x_i1,max_i);
>   nframes = 0;
>   vol_sum = 0;
>   do {
>     /* Must init pbc every step because of pressure coupling */
>     init_pbc(box);
>     rm_pbc(&top.idef,natoms,box,x,x);
>     
>     vol = det(box);
>     vol_sum += vol;
>     
>     if (bCM) {
>       /* calculate centre of mass */
>       clear_rvec(xcom);
>       for(i=0; (i < isize_cm); i++) {
> 	ix = index_cm[i];
> 	rvec_inc(xcom,x[ix]);
>       }
>       /* store it in the first 'group' */
>       for(j=0; (j<DIM); j++)
> 	x[index[0][0]][j] = xcom[j] / isize_cm;
>     }
>
>     for(g=0; g<ng; g++) {
>       /* Copy the indexed coordinates to a continuous array */
>       for(i=0; i<isize[g+1]; i++)
> 	copy_rvec(x[index[g+1][i]],x_i1[i]);
>     
>       for(i=0; i<isize[0]; i++) {
> 	copy_rvec(x[index[0][i]],xi);
> 	if (npairs[g][i] >= 0)
> 	  /* Expensive loop, because of indexing */
> 	  for(j=0; j<npairs[g][i]; j++) {
> 	    jx=pairs[g][i][j];
> 	    pbc_dx(xi,x[jx],dx);
> 	    r2=iprod(dx,dx);
> 	    if (r2>cut2 && r2<=hbox2)
> 	      count[g][(int)(sqrt(r2)*invbinw)]++;
> 	  }
> 	else
> 	  /* Cheaper loop, no exclusions */
> 	  for(j=0; j<isize[g+1]; j++) {
> 	    pbc_dx(xi,x_i1[j],dx);
> 	    r2=iprod(dx,dx);
> 	    if (r2>cut2 && r2<=hbox2)
> 	      count[g][(int)(sqrt(r2)*invbinw)]++;
> 	  }
>       }
>     }
>     nframes++;
>   } while (read_next_x(status,&t,natoms,x,box));
>   fprintf(stderr,"\n");
>   
>   close_trj(status);
>   
>   sfree(x);
>   
>   /* Average volume */
>   vol = vol_sum/nframes;
>   
>   /* Calculate volume of sphere segments */
>   snew(inv_segvol,nbin);
>   prev_spherevol=0;
>   for(i=0; (i<nbin); i++) {
>     r = (i+1)*binwidth;
>     spherevol=(4.0/3.0)*M_PI*r*r*r;
>     segvol=spherevol-prev_spherevol;
>     inv_segvol[i]=1.0/segvol;
>     prev_spherevol=spherevol;
>   }
>   
>   snew(rdf,ng);
>   for(g=0; g<ng; g++) {
>     /* We have to normalize by dividing by the number of frames */
>     rho     = isize[g+1]/vol;
>     printf(""): /* DLB -- indicates a memory problem */
>     normfac = 1.0/((rho*nframes)*isize[0]);
>     
>     /* Do the normalization */
>     nrdf = max(nbin-1,1+(2*fade/binwidth));
>     snew(rdf[g],nrdf);
>     for(i=0; (i<nbin-1); i++) {
>       r = (i+0.5)*binwidth;
>       if ((fade > 0) && (r >= fade))
> 	rdf[g][i] = 1+(count[g][i]*inv_segvol[i]*normfac-1)*exp(-16*sqr(r/fade-1));
>       else
> 	rdf[g][i] = count[g][i]*inv_segvol[i]*normfac;
>     }
>     for( ; (i<nrdf); i++)
>       rdf[g][i] = 1.0;
>   }
>     
>   fp=xvgropen(fnRDF,"Radial Distribution","r","");
>   if (ng==1)
>     fprintf(fp,"@ subtitle \"%s-%s\"\n",grpname[0],grpname[1]);
>   else {
>     fprintf(fp,"@ subtitle \"reference %s\"\n",grpname[0]);
>     xvgr_legend(fp,ng,grpname+1);
>   }
>   for(i=0; (i<nrdf); i++) {
>     fprintf(fp,"%10g", (i+0.5)*binwidth);
>     for(g=0; g<ng; g++)
>       fprintf(fp," %10g",rdf[g][i]);
>     fprintf(fp,"\n");
>   }
>   ffclose(fp);
>   
>   do_view(fnRDF,NULL);
>
>   /* h(Q) function: fourier transform of rdf */  
>   if (fnHQ) {
>     int nhq = 401;
>     real *hq,*integrand,Q;
>     
>     /* Get a better number density later! */
>     rho = isize[1]/vol;
>     snew(hq,nhq);
>     snew(integrand,nrdf);
>     for(i=0; (i<nhq); i++) {
>       Q = i*0.5;
>       integrand[0] = 0;
>       for(j=1; (j<nrdf); j++) {
> 	r = (j+0.5)*binwidth;
> 	integrand[j]  = (Q == 0) ? 1.0 : sin(Q*r)/(Q*r);
> 	integrand[j] *= 4.0*M_PI*rho*r*r*(rdf[0][j]-1.0);
>       }
>       hq[i] = print_and_integrate(debug,nrdf,binwidth,integrand,NULL,0);
>     }
>     fp=xvgropen(fnHQ,"h(Q)","Q(/nm)","h(Q)");
>     for(i=0; (i<nhq); i++) 
>       fprintf(fp,"%10g %10g\n",i*0.5,hq[i]);
>     ffclose(fp);
>     do_view(fnHQ,NULL);
>     sfree(hq);
>     sfree(integrand);
>   }
>   
>   if (fnCNRDF) {  
>     normfac = 1.0/(isize[0]*nframes);
>     fp=xvgropen(fnCNRDF,"Cumulative Number RDF","r","number");
>     if (ng==1)
>       fprintf(fp,"@ subtitle \"%s-%s\"\n",grpname[0],grpname[1]);
>     else {
>       fprintf(fp,"@ subtitle \"reference %s\"\n",grpname[0]);
>       xvgr_legend(fp,ng,grpname+1);
>     }
>     snew(sum,ng);
>     for(i=0; (i<nbin-1); i++) {
>       fprintf(fp,"%10g",i*binwidth);
>       for(g=0; g<ng; g++) {
> 	fprintf(fp," %10g",(real)((double)sum[g]*normfac));
> 	sum[g] += count[g][i];
>       }
>       fprintf(fp,"\n");
>     }
>     ffclose(fp);
>     sfree(sum);
>     
>     do_view(fnCNRDF,NULL);
>   }
>
>   for(g=0; g<ng; g++)
>     sfree(rdf[g]);
>   sfree(rdf);
> }
>
> typedef struct {
>   int  ndata;
>   real kkk;
>   real intensity;
> } t_xdata;
>
> int comp_xdata(const void *a,const void *b)
> {
>   t_xdata *xa,*xb;
>   real tmp;
>   
>   xa = (t_xdata *)a;
>   xb = (t_xdata *)b;
>   
>   if (xa->ndata == 0)
>     return 1;
>   else if (xb->ndata == 0)
>     return -1;
>   else {
>     tmp = xa->kkk - xb->kkk;
>     if (tmp < 0)
>       return -1;
>     else if (tmp > 0)
>       return 1;
>     else return 0;
>   }
> }
>
> static t_xdata *init_xdata(int nx,int ny)
> {
>   int     ix,iy,i,j,maxkx,maxky;
>   t_xdata *data;
>   
>   maxkx = (nx+1)/2;
>   maxky = (ny+1)/2;
>   snew(data,nx*ny);
>   for(i=0; (i<nx); i++) {
>     for(j=0; (j<ny); j++) {
>       ix = abs((i < maxkx) ? i : (i - nx)); 
>       iy = abs((j < maxky) ? j : (j - ny)); 
>       data[ix*ny+iy].kkk = sqrt(ix*ix+iy*iy);
>     }
>   }
>   return data;
> }
>
> static void extract_sq(t_fftgrid *fftgrid,int nbin,real k_max,real lambda,
> 		       real count[],rvec box,int npixel,real *map[],
> 		       t_xdata data[])
> {
>   int     nx,ny,nz,nx2,ny2,nz2,la2,la12;
>   t_fft_c *ptr,*p0;
>   int     i,j,k,maxkx,maxky,maxkz,n,ind,ix,iy;
>   real    k1,kxy2,kz2,k2,z,kxy,kxy_max,cos_theta2,ttt,factor;
>   rvec    lll,kk;
>   
>   /*calc_lll(box,lll);
>     k_max   = nbin/factor;
>     kxy_max = k_max/sqrt(3);*/
>   unpack_fftgrid(fftgrid,&nx,&ny,&nz,&nx2,&ny2,&nz2,
> 		 &la2,&la12,FALSE,(t_fft_r **)&ptr);
>   /* This bit copied from pme.c */
>   maxkx = (nx+1)/2;
>   maxky = (ny+1)/2;
>   maxkz = nz/2+1;
>   factor = nbin/k_max;
>   for(i=0; (i<nx); i++) {
> #define IDX(i,n)  (i<=n/2) ? (i) : (i-n)
>     kk[XX] = IDX(i,nx);
>     for(j=0; (j<ny); j++) {
>       kk[YY] = IDX(j,ny);
>       ind = INDEX(i,j,0);
>       p0  = ptr + ind;
>       for(k=0; (k<maxkz); k++,p0++) {
> 	if ((i==0) && (j==0) && (k==0))
> 	  continue;
> 	kk[ZZ] = IDX(k,nz);
> 	z   = sqrt(sqr(p0->re)+sqr(p0->im));
> 	kxy2 = sqr(kk[XX]) + sqr(kk[YY]);
> 	k2   = kxy2+sqr(kk[ZZ]);
> 	k1   = sqrt(k2);
> 	ind  = k1*factor;
> 	if (ind < nbin) {
> 	  /* According to:
> 	   * R. W. James (1962), 
> 	   * The Optical Principles of the Diffraction of X-Rays,
> 	   * Oxbow press, Woodbridge Connecticut
> 	   * the intensity is proportional to (eq. 9.10):
> 	   * I = C (1+cos^2 [2 theta])/2 FFT
> 	   * And since
> 	   * cos[2 theta] = cos^2[theta] - sin^2[theta] = 2 cos^2[theta] - 1 
> 	   * we can compute the prefactor straight from cos[theta]
> 	   */
> 	  cos_theta2  = kxy2/k2;
> 	  /*ttt         = z*0.5*(1+sqr(2*cos_theta2-1));*/
> 	  ttt         = z*0.5*(1+cos_theta2);
> 	  count[ind] += ttt;
> 	  ix = ((i < maxkx) ? i : (i - nx)); 
> 	  iy = ((j < maxky) ? j : (j - ny));
> 	  map[npixel/2+ix][npixel/2+iy] += ttt; 
> 	  data[abs(ix)*ny+abs(iy)].ndata     += 1;
> 	  data[abs(ix)*ny+abs(iy)].intensity += ttt;
> 	}
> 	else
> 	  fprintf(stderr,"k (%g) > k_max (%g)\n",k1,k_max);
>       }
>     }
>   }
> }
>
> typedef struct {
>   char *name;
>   int  nelec;
> } t_element;
>
> static void do_sq(char *fnNDX,char *fnTPS,char *fnTRX,char *fnSQ,
> 		  char *fnXPM,real grid,real lambda,real distance,
> 		  int npixel,int nlevel)
> {
>   FILE       *fp;
>   t_element  elem[] = { { "H", 1 }, { "C", 6 }, { "N", 7 }, { "O", 8 }, { "F", 9 }, { "S", 16 } };
> #define NELEM asize(elem)
>   int        status;
>   char       title[STRLEN],*aname;
>   int        natoms,i,j,k,nbin,j0,j1,n,nframes,pme_order;
>   real       *count,**map;
>   char       *grpname;
>   int        isize;
>   atom_id    *index;
>   real       I0,C,t,k_max,factor,yfactor,segvol;
>   rvec       *x,*xndx,box_size,kk,lll;
>   real       fj0,*fj,max_spacing,r,lambda_1;
>   bool       *bExcl;
>   matrix     box;
>   int        nx,ny,nz,nelectron;
>   atom_id    ix,jx,**pairs;
>   splinevec  *theta;
>   t_topology top;
>   t_fftgrid  *fftgrid;
>   t_nrnb     nrnb;
>   t_xdata    *data;
>     
>   /*  bTop=read_tps_conf(fnTPS,title,&top,&x,NULL,box,TRUE); */
>
>   fprintf(stderr,"\nSelect group for structure factor computation:\n");
>   get_index(&top.atoms,fnNDX,1,&isize,&index,&grpname);
>   natoms=read_first_x(&status,fnTRX,&t,&x,box);
>   if (isize < top.atoms.nr)
>     snew(xndx,isize);
>   else
>     xndx = x;
>   fprintf(stderr,"\n");
>   
>   init_nrnb(&nrnb);
>     
>   if ( !natoms )
>     fatal_error(0,"Could not read coordinates from statusfile\n");
>   /* check with topology */
>   if ( natoms > top.atoms.nr ) 
>     fatal_error(0,"Trajectory (%d atoms) does not match topology (%d atoms)",
> 		natoms,top.atoms.nr);
> 	
>   /* Atomic scattering factors */
>   snew(fj,isize);
>   I0 = 0;
>   nelectron = 0;
>   for(i=0; (i<isize); i++) {
>     aname = *(top.atoms.atomname[index[i]]);
>     fj0 = 1;
>     if (top.atoms.atom[i].ptype == eptAtom) {
>       for(j=0; (j<NELEM); j++)
> 	if (aname[0] == elem[j].name[0]) {
> 	  fj0 = elem[j].nelec;
> 	  break;
> 	}
>       if (j == NELEM)
> 	fprintf(stderr,"Warning: don't know number of electrons for atom %s\n",aname);
>     }
>     /* Correct for partial charge */
>     fj[i] = fj0 - top.atoms.atom[index[i]].q;
>     
>     nelectron += fj[i];
>     
>     I0 += sqr(fj[i]);
>   }
>   if (debug) {
>     /* Dump scattering factors */
>     for(i=0; (i<isize); i++)
>       fprintf(debug,"Atom %3s-%5d q = %10.4f  f = %10.4f\n",
> 	      *(top.atoms.atomname[index[i]]),index[i],
> 	      top.atoms.atom[index[i]].q,fj[i]);
>   }
>
>   /* Constant for scattering */
>   C = sqr(1.0/(ELECTRONMASS_keV*KILO*ELECTRONVOLT*1e7*distance));
>   fprintf(stderr,"C is %g\n",C);
>   
>   /* This bit is dimensionless */
>   nx = ny = nz = 0;
>   max_spacing = calc_grid(box,grid,&nx,&ny,&nz,1);	
>   pme_order   = max(4,1+(0.2/grid));
>   npixel      = max(nx,ny);
>   data        = init_xdata(nx,ny);
>   
>   fprintf(stderr,"Largest grid spacing: %g nm, pme_order %d, %dx%d pixel on image\n",
> 	  max_spacing,pme_order,npixel,npixel);
>   init_pme(stdout,NULL,nx,ny,nz,pme_order,isize,FALSE,eewg3D);
>     
>   /* Determine largest k vector length. */
>   k_max = 1+sqrt(sqr(1+nx/2)+sqr(1+ny/2)+sqr(1+nz/2));
>
>   /* this is the S(q) array */
>   nbin = npixel;
>   snew(count,nbin+1);
>   snew(map,npixel);
>   for(i=0; (i<npixel); i++)
>     snew(map[i],npixel);
>   
>   nframes = 0;
>   do {
>     /* Put the atoms with scattering factor on a grid. Misuses
>      * an old routine from the PPPM code.
>      */
>     for(j=0; (j<DIM); j++)
>       box_size[j] = box[j][j];
>     
>     /* Scale coordinates to the wavelength */
>     for(i=0; (i<isize); i++)
>       copy_rvec(x[index[i]],xndx[i]);
>       
>     /* put local atoms on grid. */
>     fftgrid = spread_on_grid(stdout,isize,pme_order,xndx,fj,box,FALSE);
>
>     /* FFT the density */
>     gmxfft3D(fftgrid,FFTW_FORWARD,NULL);  
>     
>     /* Extract the Sq function and sum it into the average array */
>     extract_sq(fftgrid,nbin,k_max,lambda,count,box_size,npixel,map,data);
>     
>     nframes++;
>   } while (read_next_x(status,&t,natoms,x,box));
>   fprintf(stderr,"\n");
>   
>   close_trj(status);
>   
>   sfree(x);
>
>   /* Normalize it ?? */  
>   factor  = k_max/(nbin);
>   yfactor = (1.0/nframes)/*(1.0/fftgrid->nxyz)*/;
>   fp=xvgropen(fnSQ,"Structure Factor","q (1/nm)","S(q)");
>   fprintf(fp,"@ subtitle \"Lambda = %g nm. Grid spacing = %g nm\"\n",
> 	  lambda,grid);
>   factor *= lambda;
>   for(i=0; i<nbin; i++) {
>     r      = (i+0.5)*factor*2*M_PI;
>     segvol = 4*M_PI*sqr(r)*factor;
>     fprintf(fp,"%10g %10g\n",r,count[i]*yfactor/segvol);
>   }
>   ffclose(fp);
>   
>   do_view(fnSQ,NULL);
>
>   if (fnXPM) {
>     t_rgb rhi = { 0,0,0 }, rlo = { 1,1,1 };
>     real *tx,*ty,hi,inv_nframes;
>     
>     hi = 0;
>     inv_nframes = 1.0/nframes;
>     snew(tx,npixel);
>     snew(ty,npixel);
>     for(i=0; (i<npixel); i++) {
>       tx[i] = i-npixel/2;
>       ty[i] = i-npixel/2;
>
>       for(j=0; (j<npixel); j++) { 
> 	map[i][j] *= inv_nframes;
> 	hi         = max(hi,map[i][j]);
>       }
>     }
>       
>     fp = ffopen(fnXPM,"w");
>     write_xpm(fp,"Diffraction Image","Intensity","kx","ky",
> 	      nbin,nbin,tx,ty,map,0,hi,rlo,rhi,&nlevel);
>     fclose(fp);
>     sfree(tx);
>     sfree(ty);
>
>     /* qsort(data,nx*ny,sizeof(data[0]),comp_xdata);    
>        fp = ffopen("test.xvg","w");
>        for(i=0; (i<nx*ny); i++) {
>        if (data[i].ndata != 0) {
>        fprintf(fp,"%10.3f  %10.3f\n",data[i].kkk,data[i].intensity/data[i].ndata);
>        }
>        }
>        fclose(fp);
>     */
>   }
> }
>
> t_complex *** rc_tensor_allocation(int x, int y, int z)
> {
>   t_complex ***t;
>   int i,j;
>   
>   snew(t,x);
>   t = (t_complex ***)calloc(x,sizeof(t_complex**));
>   if(!t) exit(fprintf(stderr,"\nallocation error"));
>   t[0] = (t_complex **)calloc(x*y,sizeof(t_complex*));
>   if(!t[0]) exit(fprintf(stderr,"\nallocation error"));
>   t[0][0] = (t_complex *)calloc(x*y*z,sizeof(t_complex));
>   if(!t[0][0]) exit(fprintf(stderr,"\nallocation error"));
>   
>   for( j = 1 ; j < y ; j++) 
>     t[0][j] = t[0][j-1] + z;
>   for( i = 1 ; i < x ; i++) {
>     t[i] = t[i-1] + y;;
>     t[i][0] = t[i-1][0] + y*z;
>     for( j = 1 ; j < y ; j++) 
>       t[i][j] = t[i][j-1] + z;
>   }
>   return t;
> }
>     
> int return_atom_type (char *type)
> {
>   int i;
>   
>   for (i = 0; (i < asize(CM_t)); i++)
>     if (!strcmp (type, CM_t[i].Label))
>       return i;
>   fatal_error(0,"\nError: atom type (%s) not in list (%d types checked)!\n", 
> 	      type,i);
>
>   return 0;
> }
>
> double CMSF (int type, double lambda, double sin_theta)
> /* 
>  * return Cromer-Mann fit for the atomic scattering factor:
>  * sin_theta is the sine of half the angle between incoming and scattered
>  * vectors. See g_sq.h for a short description of CM fit.
>  */
> {
>     int i;
>     double tmp = 0.0, k2;
>
>     k2 = (sqr (sin_theta) / sqr (10.0 * lambda));
>     /*
>      *  united atoms case
>      *  CH2 / CH3 groups  
>      */
>     if (!strcmp (CM_t[type].Label, "CS2") ||
> 	!strcmp (CM_t[type].Label, "CH2") ||
> 	!strcmp (CM_t[type].Label, "CH3") ||
> 	!strcmp (CM_t[type].Label, "CS3")) {
> 	tmp = CMSF (return_atom_type ("C"), lambda, sin_theta);
> 	if (!strcmp (CM_t[type].Label, "CH3") ||
> 	    !strcmp (CM_t[type].Label, "CS3"))
> 	    tmp += 3.0 * CMSF (return_atom_type ("H"), lambda, sin_theta);
> 	else
> 	    tmp += 2.0 * CMSF (return_atom_type ("H"), lambda, sin_theta);
>     }
>     /* all atom case */
>     else {
> 	tmp = CM_t[type].c;
> 	for (i = 0; i < 4; i++)
> 	    tmp += CM_t[type].a[i] * exp (-CM_t[type].b[i] * k2);
>     }
>     return tmp;
> }
>
> void compute_scattering_factor_table (structure_factor * sf)
> {
> /*
>  *  this function build up a table of scattering factors for every atom
>  *  type and for every scattering angle.
>  */
>     int i, j;
>     double sin_theta,q;
>
> /* \hbar \omega \lambda = hc = 1239.842 eV * nm */
>     sf->momentum = ((double) (2. * 1000.0 * M_PI * sf->energy) / 1239.842);
>     sf->lambda = 1239.842 / (1000.0 * sf->energy);
>     fprintf (stderr, "\nwavelenght = %f nm\n", sf->lambda);
>     snew (sf_table,asize (CM_t));
>     for (i = 0; (i < asize(CM_t)); i++) {
> 	snew (sf_table[i], sf->n_angles);
> 	for (j = 0; j < sf->n_angles; j++) {
> 	    q = ((double) j * sf->ref_k);
> /* theta is half the angle between incoming and scattered wavevectors. */
> 	    sin_theta = q / (2.0 * sf->momentum);
> 	    sf_table[i][j] = CMSF (i, sf->lambda, sin_theta);
> 	}
>     }
> }
>
> int * create_indexed_atom_type (reduced_atom * atm, int size)
> {
> /* 
>  * create an index of the atom types found in a  group
>  * i.e.: for water index_atp[0]=type_number_of_O and 
>  *                 index_atp[1]=type_number_of_H
>  * 
>  * the last element is set to 0 
>  */
>     int *index_atp, i, i_tmp, j;
>
>     snew (index_atp, 1);
>     i_tmp = 1;
>     index_atp[0] = atm[0].t;
>     for (i = 1; i < size; i++) {
> 	for (j = 0; j < i_tmp; j++)
> 	    if (atm[i].t == index_atp[j])
> 		break;
> 	if (j == i_tmp) {	/* i.e. no indexed atom type is  == to atm[i].t */
> 	    i_tmp++;
> 	    srenew (index_atp, i_tmp * sizeof (int));
> 	    index_atp[i_tmp - 1] = atm[i].t;
> 	}
>     }
>     i_tmp++;
>     srenew (index_atp, i_tmp * sizeof (int));
>     index_atp[i_tmp - 1] = 0;
>     return index_atp;
> }
>
> void rearrange_atoms (reduced_atom * positions, t_trxframe * fr, atom_id * index,
> 		 int isize, t_topology * top, real ** sf_table, bool flag)
> /* given the group's index, return the (continuous) array of atoms */
> {
>     int i;
>
>     if (flag)
> 	for (i = 0; i < isize; i++)
> 	    positions[i].t =
> 		return_atom_type (*(top->atoms.atomtype[index[i]]));
>     for (i = 0; i < isize; i++)
> 	copy_rvec (fr->x[index[i]], positions[i].x);
> }
>
>
> int atp_size (int *index_atp)
> {
>     int i = 0;
>
>     while (index_atp[i])
> 	i++;
>     return i;
> }
>
> void compute_structure_factor (structure_factor * sf, matrix box,
> 			  reduced_atom * red, int isize, real start_q,
> 			  real end_q, int group)
> {
>     t_complex ***tmpSF;
>     rvec k_factor;
>     real kdotx, asf, kx, ky, kz, krr;
>     int kr, maxkx, maxky, maxkz, i, j, k, p, *counter;
>
>
>     k_factor[XX] = 2 * M_PI / box[XX][XX];
>     k_factor[YY] = 2 * M_PI / box[YY][YY];
>     k_factor[ZZ] = 2 * M_PI / box[ZZ][ZZ];
>
>     maxkx = (int) rint (end_q / k_factor[XX]);
>     maxky = (int) rint (end_q / k_factor[YY]);
>     maxkz = (int) rint (end_q / k_factor[ZZ]);
>
>     snew (counter, sf->n_angles);
>
>     tmpSF = rc_tensor_allocation(maxkx,maxky,maxkz);
> /*
>  * The big loop...
>  * compute real and imaginary part of the structure factor for every
>  * (kx,ky,kz)) 
>  */
>     fprintf(stderr,"\n");
>     for (i = 0; i < maxkx; i++) {
> 	fprintf (stderr,"\rdone %3.1f%%     ", (double)(100.0*(i+1))/maxkx);
> 	fflush (stdout);
> 	kx = i * k_factor[XX];
> 	for (j = 0; j < maxky; j++) {
> 	    ky = j * k_factor[YY];
> 	    for (k = 0; k < maxkz; k++)
> 		if (i != 0 || j != 0 || k != 0) {
> 		    kz = k * k_factor[ZZ];
> 		    krr = sqrt (sqr (kx) + sqr (ky) + sqr (kz));
> 		    if (krr >= start_q && krr <= end_q) {
> 			kr = (int) rint (krr/sf->ref_k);
> 			if (kr < sf->n_angles) {
> 			    counter[kr]++;  /* will be used for the copmutation 
> 					       of the average*/
> 			    for (p = 0; p < isize; p++) {
> 				    
> 				asf = sf_table[red[p].t][kr];
>
> 				kdotx = kx * red[p].x[XX] +
> 				    ky * red[p].x[YY] + kz * red[p].x[ZZ];
> 				
> 				tmpSF[i][j][k].re += cos (kdotx) * asf;
> 				tmpSF[i][j][k].im += sin (kdotx) * asf;
> 			    }
> 			}
> 		    }
> 		}
> 	}
>     }				/* end loop on i */
> /*
>  *  compute the square modulus of the structure factor, averaging on the surface
>  *  kx*kx + ky*ky + kz*kz = krr*krr 
>  *  note that this is correct only for a (on the macroscopic scale)
>  *  isotropic system. 
>  */
>     for (i = 0; i < maxkx; i++) {
> 	kx = i * k_factor[XX]; for (j = 0; j < maxky; j++) {
> 	    ky = j * k_factor[YY]; for (k = 0; k < maxkz; k++) {
> 		kz = k * k_factor[ZZ]; krr = sqrt (sqr (kx) + sqr (ky)
> 		+ sqr (kz)); if (krr >= start_q && krr <= end_q) {
> 		    kr = (int) rint (krr / sf->ref_k); if (kr <
> 		    sf->n_angles && counter[kr] != 0)
> 			sf->F[group][kr] +=
> 			    (sqr (tmpSF[i][j][k].re) +
> 			     sqr (tmpSF[i][j][k].im))/ counter[kr];
> 		}
> 	    }
> 	}
>     } sfree (counter); free(tmpSF[0][0]); free(tmpSF[0]); free(tmpSF);
> }
>
> void save_data (structure_factor * sf, char *file, int ngrps, real start_q,
> 	   real end_q)
> {
>
>     FILE *fp;
>     int i, g = 0;
>     double *tmp, polarization_factor, A;
>
>     fp = xvgropen (file, "Scattering Intensity", "q (1/nm)",
> 		   "Intensity (a.u.)");
>
>     snew (tmp, ngrps);
>
>     for (g = 0; g < ngrps; g++)
> 	for (i = 0; i < sf->n_angles; i++) {
> /*
>  *          theta is half the angle between incoming and scattered vectors.
>  *          
>  *          polar. fact. = 0.5*(1+cos^2(2*theta)) = 1 - 0.5 * sin^2(2*theta)
>  *          
>  *          sin(theta) = q/(2k) := A  ->  sin^2(theta) = 4*A^2 (1-A^2) ->
>  *          -> 0.5*(1+cos^2(2*theta)) = 1 - 2 A^2 (1-A^2)
>  */
> 	    A = (double) (i * sf->ref_k) / (2.0 * sf->momentum);
> 	    polarization_factor = 1 - 2.0 * sqr (A) * (1 - sqr (A));
> 	    sf->F[g][i] *= polarization_factor;
> 	}
>     for (i = 0; i < sf->n_angles; i++) {
> 	if (i * sf->ref_k >= start_q && i * sf->ref_k <= end_q) {
> 	    fprintf (fp, "%10.5f  ", i * sf->ref_k);
> 	    for (g = 0; g < ngrps; g++)
>                fprintf (fp, "  %10.5f ", (sf->F[g][i]) /( sf->total_n_atoms*
> 				                          sf->nSteps));   
> 	    fprintf (fp, "\n");
> 	}
>     }
>     ffclose (fp);
> }
>
> int
> do_scattering_intensity (char* fnTPS, char* fnNDX, char* fnXVG, char *fnTRX,
> 		         real start_q,real end_q, real energy)
> {
>     int i,ng,*isize,status,flags = TRX_READ_X,**index_atp;
>     char **grpname,title[STRLEN];
>     atom_id **index;
>     t_topology top;
>     t_trxframe fr;
>     reduced_atom **red;
>     structure_factor *sf;
>     rvec *xtop;
>     matrix box;
>     double r_tmp;
>
>     snew (sf, 1);
>     sf->energy = energy;
>     /* Read the topology informations */
>     
>     read_tps_conf (fnTPS, title, &top, &xtop, NULL, box, TRUE);
>     sfree (xtop);
>
>     /* groups stuff... */
>     fprintf (stderr,
> 	     "\nHow many groups do you want to calculate the I(q) of?\n");
>     do {
> 	scanf ("%d", &ng);
>     }
>     while (ng < 1);
>     snew (isize, ng);
>     snew (index, ng);
>     snew (grpname, ng);
>
>     fprintf (stderr, "\nSelect %d group%s\n", ng,
> 	     ng == 1 ? "" : "s");
>     if (fnTPS)
> 	get_index (&top.atoms, fnNDX, ng, isize, index, grpname);
>     else
> 	rd_index (fnNDX, ng, isize, index, grpname);
>
>     /* The first time we read data is a little special */
>     read_first_frame (&status, fnTRX, &fr, flags);
>
>     sf->total_n_atoms = fr.natoms;
>     
>     snew (red, ng);
>     snew (index_atp, ng);
>
>     r_tmp = max (box[XX][XX], box[YY][YY]);
>     r_tmp = (double) max (box[ZZ][ZZ], r_tmp);
>
>     sf->ref_k = (2.0 * M_PI) / (r_tmp);
>     /* ref_k will be the reference momentum unit */
>     sf->n_angles = (int) rint (end_q / sf->ref_k);
>
>     snew (sf->F, ng);
>     for (i = 0; i < ng; i++)
> 	snew (sf->F[i], sf->n_angles);
>     for (i = 0; i < ng; i++) {
> 	snew (red[i], isize[i]);
> 	rearrange_atoms (red[i], &fr, index[i], isize[i], &top, sf_table, 1);
> 	index_atp[i] = create_indexed_atom_type (red[i], isize[i]);
>     }
>     compute_scattering_factor_table (sf);
>     /* This is the main loop over frames */
>
>     do {
> 	init_pbc (box);
> 	sf->nSteps++;
> 	for (i = 0; i < ng; i++) {
> 	    rearrange_atoms (red[i], &fr, index[i], isize[i], &top,
> 			     sf_table, 0);
>
> 	    compute_structure_factor (sf, box, red[i], isize[i],
> 				      start_q, end_q, i);
> 	}
>     }
>     while (read_next_frame (status, &fr));
>
>     save_data (sf, fnXVG, ng, start_q, end_q);
>
>     return 0;
> }
>
> int gmx_rdf(int argc,char *argv[])
> {
>   static char *desc[] = {
>     "The structure of liquids can be studied by either neutron or X-ray",
>     "scattering. The most common way to describe liquid structure is by a",
>     "radial distribution function. However, this is not easy to obtain from",
>     "a scattering experiment.[PAR]",
>     "g_rdf calculates radial distribution functions in different ways.",
>     "The normal method is around a (set of) particle(s), the other method",
>     "is around the center of mass of a set of particles.[PAR]",
>     "If a run input file is supplied ([TT]-s[tt]), exclusions defined",
>     "in that file are taken into account when calculating the rdf.",
>     "The option [TT]-cut[tt] is meant as an alternative way to avoid",
>     "intramolecular peaks in the rdf plot.",
>     "It is however better to supply a run input file with a higher number of",
>     "exclusions. For eg. benzene a topology with nrexcl set to 5",
>     "would eliminate all intramolecular contributions to the rdf.",
>     "Note that all atoms in the selected groups are used, also the ones",
>     "that don't have Lennard-Jones interactions.[PAR]",
>     "Option [TT]-cn[tt] produces the cumulative number rdf.[PAR]"
>     "To bridge the gap between theory and experiment structure factors can",
>     "be computed (option [TT]-sq[tt]). The algorithm uses FFT, the grid"
>     "spacing of which is determined by option [TT]-grid[tt]."
>   };
>   static bool bCM=FALSE;
>   static real cutoff=0,binwidth=0.001,grid=0.05,fade=0.0,lambda=0.1,distance=10;
>   static int  npixel=256,nlevel=20;
>   static real start_q=0.0, end_q=60.0, energy=12.0;
>   t_pargs pa[] = {
>     { "-bin",      FALSE, etREAL, {&binwidth},
>       "Binwidth (nm)" },
>     { "-com",      FALSE, etBOOL, {&bCM},
>       "RDF with respect to the center of mass of first group" },
>     { "-cut",      FALSE, etREAL, {&cutoff},
>       "Shortest distance (nm) to be considered"},
>     { "-fade",     FALSE, etREAL, {&fade},
>       "From this distance onwards the RDF is tranformed by g'(r) = 1 + [g(r)-1] exp(-(r/fade-1)^2 to make it go to 1 smoothly. If fade is 0.0 nothing is done." },
>     { "-grid",     FALSE, etREAL, {&grid},
>       "[HIDDEN]Grid spacing (in nm) for FFTs when computing structure factors" },
>     { "-npixel",   FALSE, etINT,  {&npixel},
>       "[HIDDEN]# pixels per edge of the square detector plate" },
>     { "-nlevel",   FALSE, etINT,  {&nlevel},
>       "Number of different colors in the diffraction image" },
>     { "-distance", FALSE, etREAL, {&distance},
>       "[HIDDEN]Distance (in cm) from the sample to the detector" },
>     { "-wave",     FALSE, etREAL, {&lambda},
>       "[HIDDEN]Wavelength for X-rays/Neutrons for scattering. 0.1 nm corresponds to roughly 12 keV" },
>     
>     {"-startq", FALSE, etREAL, {&start_q},
>      "Starting q (1/nm) "},
>     {"-endq", FALSE, etREAL, {&end_q},
>      "Ending q (1/nm)"},
>     {"-energy", FALSE, etREAL, {&energy},
>      "Energy of the incoming X-ray (keV) "}
>   };
> #define NPA asize(pa)
>   char       *fnTPS,*fnNDX;
>   bool       bSQ,bRDF;
>   
>   t_filenm   fnm[] = {
>     { efTRX, "-f",  NULL,     ffREAD },
>     { efTPS, NULL,  NULL,     ffOPTRD },
>     { efNDX, NULL,  NULL,     ffOPTRD },
>     { efXVG, "-o",  "rdf",    ffOPTWR },
>     { efXVG, "-sq", "sq",     ffOPTWR },
>     { efXVG, "-cn", "rdf_cn", ffOPTWR },
>     { efXVG, "-hq", "hq",     ffOPTWR },
> /*    { efXPM, "-image", "sq",  ffOPTWR }*/
>   };
> #define NFILE asize(fnm)
>   
>   CopyRight(stderr,argv[0]);
>   parse_common_args(&argc,argv,PCA_CAN_VIEW | PCA_CAN_TIME | PCA_BE_NICE,
> 		    NFILE,fnm,NPA,pa,asize(desc),desc,0,NULL);
>
>   fnTPS = ftp2fn_null(efTPS,NFILE,fnm);
>   fnNDX = ftp2fn_null(efNDX,NFILE,fnm);
>   /*  bSQ   = opt2bSet("-sq",NFILE,fnm) || opt2parg_bSet("-grid",NPA,pa); */
>   bSQ   = opt2bSet("-sq",NFILE,fnm);
>   bRDF  = opt2bSet("-o",NFILE,fnm) || !bSQ;
>   
>   if (bSQ) {
>     if (!fnTPS)
>       fatal_error(0,"Need a tps file for calculating structure factors\n");
>   }
>   else {
>     if (!fnTPS && !fnNDX)
>       fatal_error(0,"Neither index file nor topology file specified\n"
> 		  "             Nothing to do!");
>   }
>  
>   if  (bSQ) 
>    do_scattering_intensity(fnTPS,fnNDX,opt2fn("-sq",NFILE,fnm),ftp2fn(efTRX,NFILE,fnm),
> 		           start_q, end_q, energy  );
> /* old structure factor code */
> /*    do_sq(fnNDX,fnTPS,ftp2fn(efTRX,NFILE,fnm),opt2fn("-sq",NFILE,fnm),
> 	  ftp2fn(efXPM,NFILE,fnm),grid,lambda,distance,npixel,nlevel);
> */
>   if (bRDF) 
>     do_rdf(fnNDX,fnTPS,ftp2fn(efTRX,NFILE,fnm),
> 	   opt2fn("-o",NFILE,fnm),opt2fn_null("-cn",NFILE,fnm),
> 	   opt2fn_null("-hq",NFILE,fnm),
> 	   bCM,cutoff,binwidth,fade);
>
>   thanx(stderr);
>   
>   return 0;
> }
>   
>
> ------------------------------------------------------------------------
>
>
>
>
>
> On May 4, 2006, at 9:50 PM, David van der Spoel wrote:
>
>> Jennifer Rendell wrote:
>>> Dear friends,
>>> I have seen a couple of postings (January 2004, gmx-developers, 
>>> David Bostick, and November 2003, gmx-users, Kay Gottschalk) on 
>>> segmentation faults from g_rdf on Mac OS X systems.
>>> I am using the "Getting Started" section of the  gromacs web pages, 
>>> in particular, the section on water, where the command g_rdf is called.
>>> Below I show the results from two versions of gromacs, 3.2.1 on a 
>>> Mac OS X 10.4, and 3.1.5_pre2 on a Mac OS X 10.3. The results are 
>>> similar in that each results in a segmentation fault. g_rms and 
>>> gmxcheck work as I expect.
>>> Any ideas on how to fix this? Jennifer
>>
>> Maybe you don't want to hear this, but please upgrade to 3.3.1 and 
>> try again. If the problem persists in the latest version please post 
>> a bugzilla.
>>
>>
>>> ******************************************************************************* 
>>> 1. gromacs 3.2.1 on Mac OS X 10.4 (Tiger). g_rdf gives the following
>>>    results:
>>> % g_rdf -f water.trr -n oxygen.ndx -o rdf.xvg -s water.tpr
>>>                          :-)  G  R  O  M  A  C  S  (-:
>>>                Giving Russians Opium May Alter Current Situation
>>>                             :-)  VERSION 3.2.1  (-:
>>> (deleted some lines)
>>>                                 :-)  g_rdf  (-:
>>> Option     Filename  Type         Description
>>> ------------------------------------------------------------
>>>   -f      water.trr  Input        Generic trajectory: xtc trr trj 
>>> gro g96 pdb
>>>   -s      water.tpr  Input, Opt!  Structure+mass(db): tpr tpb tpa 
>>> gro g96 pdb
>>>                                    xml
>>>   -n     oxygen.ndx  Input, Opt!  Index file
>>>   -o        rdf.xvg  Output, Opt! xvgr/xmgr file
>>> (deleted all remaining option lines)
>>> Reading file water.tpr, VERSION 3.2.1 (single precision)
>>> Reading file water.tpr, VERSION 3.2.1 (single precision)
>>> How many groups do you want to calculate the RDF of?
>>> 1
>>> Select a reference group and 1 group
>>> Group     0 (          OW) has   216 elements
>>> There is one group in the index
>>> There is one group in the index
>>> trn version: GMX_trn_file (single precision)
>>> Last frame         10 time   10.000
>>> Segmentation fault
>>> ******************************************************************************* 
>>> 2. gromacs 3.1.5_pre2 on Mac OS X 10.3 (Panther). g_rdf gives the
>>>    following results (which appear to be the same as the above):
>>> $ g_rdf -f water.trr -n oxygen.ndx -o rdf.xvg -s water.tpr
>>>                          :-)  G  R  O  M  A  C  S  (-:
>>>                Go Rough, Oppose Many Angry Chinese Serial killers
>>>                           :-)  VERSION 3.1.5_pre2  (-:
>>> (deleted some lines)
>>>                                 :-)  g_rdf  (-:
>>> Option     Filename  Type          Description
>>> ------------------------------------------------------------
>>>   -f      water.trr  Input         Generic trajectory: xtc trr trj 
>>> gro g96 pdb
>>>   -s      water.tpr  Input, Opt!   Structure+mass(db): tpr tpb tpa 
>>> gro g96 pdb
>>>   -n     oxygen.ndx  Input, Opt!   Index file
>>> (deleted all remaining option lines)
>>> Reading file water.tpr, VERSION 3.1.5_pre2 (single precision)
>>> Reading file water.tpr, VERSION 3.1.5_pre2 (single precision)
>>> How many groups do you want to calculate the RDF of?
>>> 1
>>> Select a reference group and 1 group
>>> Group     0 (          OW) has   216 elements
>>> There is one group in the index
>>> There is one group in the index
>>> trn version: GMX_trn_file
>>> Last frame         10 time   10.000
>>> Segmentation fault
>>> ******************************************************************************* 
>>> _______________________________________________
>>> gmx-users mailing list    gmx-users at gromacs.org
>>> http://www.gromacs.org/mailman/listinfo/gmx-users
>>> Please don't post (un)subscribe requests to the list. Use the www 
>>> interface or send it to gmx-users-request at gromacs.org.
>>> Can't post? Read http://www.gromacs.org/mailing_lists/users.php
>>
>>
>> --David.
>> ________________________________________________________________________
>> David van der Spoel, PhD, Assoc. Prof., Molecular Biophysics group,
>> Dept. of Cell and Molecular Biology, Uppsala University.
>> Husargatan 3, Box 596,      75124 Uppsala, Sweden
>> phone:    46 18 471 4205        fax: 46 18 511 755
>> spoel at xray.bmc.uu.se    spoel at gromacs.org   http://folding.bmc.uu.se
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> _______________________________________________
>> gmx-users mailing list    gmx-users at gromacs.org
>> http://www.gromacs.org/mailman/listinfo/gmx-users
>> Please don't post (un)subscribe requests to the list. Use the www 
>> interface or send it to gmx-users-request at gromacs.org.
>> Can't post? Read http://www.gromacs.org/mailing_lists/users.php
>
>
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Dr. Kay-Eberhard Gottschalk
> Applied Physics and Center for Nano Sciences
> Ludwig-Maximilians University
> Amalienstr. 54
> 80799 Munich, Germany
>
> Phone: +49-89-2180 3436
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> gmx-users mailing list    gmx-users at gromacs.org
> http://www.gromacs.org/mailman/listinfo/gmx-users
> Please don't post (un)subscribe requests to the list. Use the 
> www interface or send it to gmx-users-request at gromacs.org.
> Can't post? Read http://www.gromacs.org/mailing_lists/users.php




More information about the gromacs.org_gmx-users mailing list