Example #1
0
int gmx_sigeps(int argc, char *argv[])
{
    const char   *desc[] = {
        "[TT]g_sigeps[tt] is a simple utility that converts C6/C12 or C6/Cn combinations",
        "to [GRK]sigma[grk] and [GRK]epsilon[grk], or vice versa. It can also plot the potential",
        "in  file. In addition, it makes an approximation of a Buckingham potential",
        "to a Lennard-Jones potential."
    };
    static real   c6   = 1.0e-3, cn = 1.0e-6, qi = 0, qj = 0, sig = 0.3, eps = 1, sigfac = 0.7;
    static real   Abh  = 1e5, Bbh = 32, Cbh = 1e-3;
    static int    npow = 12;
    t_pargs       pa[] = {
        { "-c6",   FALSE,  etREAL,  {&c6},  "C6"   },
        { "-cn",   FALSE,  etREAL,  {&cn},  "Constant for repulsion"   },
        { "-pow",  FALSE,  etINT,   {&npow}, "Power of the repulsion term" },
        { "-sig",  FALSE,  etREAL,  {&sig}, "[GRK]sigma[grk]"  },
        { "-eps",  FALSE,  etREAL,  {&eps}, "[GRK]epsilon[grk]"  },
        { "-A",    FALSE,  etREAL,  {&Abh}, "Buckingham A" },
        { "-B",    FALSE,  etREAL,  {&Bbh}, "Buckingham B" },
        { "-C",    FALSE,  etREAL,  {&Cbh}, "Buckingham C" },
        { "-qi",   FALSE,  etREAL,  {&qi},  "qi"   },
        { "-qj",   FALSE,  etREAL,  {&qj},  "qj"   },
        { "-sigfac", FALSE, etREAL, {&sigfac}, "Factor in front of [GRK]sigma[grk] for starting the plot" }
    };
    t_filenm      fnm[] = {
        { efXVG, "-o", "potje", ffWRITE }
    };
    output_env_t  oenv;
#define NFILE asize(fnm)
    const char   *legend[] = { "Lennard-Jones", "Buckingham" };
    FILE         *fp;
    int           i;
    gmx_bool      bBham;
    real          qq, x, oldx, minimum, mval, dp[2], pp[2];
    int           cur = 0;
#define next (1-cur)

    parse_common_args(&argc, argv, PCA_CAN_VIEW,
                      NFILE, fnm, asize(pa), pa, asize(desc),
                      desc, 0, NULL, &oenv);

    bBham = (opt2parg_bSet("-A", asize(pa), pa) ||
             opt2parg_bSet("-B", asize(pa), pa) ||
             opt2parg_bSet("-C", asize(pa), pa));

    if (bBham)
    {
        c6  = Cbh;
        sig = pow((6.0/npow)*pow(npow/Bbh, npow-6.0), 1.0/(npow-6.0));
        eps = c6/(4*pow(sig, 6.0));
        cn  = 4*eps*pow(sig, npow);
    }
    else
    {
        if (opt2parg_bSet("-sig", asize(pa), pa) ||
            opt2parg_bSet("-eps", asize(pa), pa))
        {
            c6  = 4*eps*pow(sig, 6);
            cn  = 4*eps*pow(sig, npow);
        }
        else if (opt2parg_bSet("-c6", asize(pa), pa) ||
                 opt2parg_bSet("-cn", asize(pa), pa) ||
                 opt2parg_bSet("-pow", asize(pa), pa))
        {
            sig = pow(cn/c6, 1.0/(npow-6.0));
            eps = 0.25*c6*pow(sig, -6.0);
        }
        else
        {
            sig = eps = 0;
        }
        printf("c6    = %12.5e, c%d    = %12.5e\n", c6, npow, cn);
        printf("sigma = %12.5f, epsilon = %12.5f\n", sig, eps);

        minimum = pow(npow/6.0*pow(sig, npow-6.0), 1.0/(npow-6));
        printf("Van der Waals minimum at %g, V = %g\n\n",
               minimum, pot(minimum, 0, c6, cn, npow));
        printf("Fit of Lennard Jones (%d-6) to Buckingham:\n", npow);
        Bbh = npow/minimum;
        Cbh = c6;
        Abh = 4*eps*pow(sig/minimum, npow)*exp(npow);
        printf("A = %g, B = %g, C = %g\n", Abh, Bbh, Cbh);
    }
    qq = qi*qj;

    fp = xvgropen(ftp2fn(efXVG, NFILE, fnm), "Potential", "r (nm)", "E (kJ/mol)",
                  oenv);
    xvgr_legend(fp, asize(legend), legend,
                oenv);
    if (sig == 0)
    {
        sig = 0.25;
    }
    minimum = -1;
    mval    = 0;
    oldx    = 0;
    for (i = 0; (i < 100); i++)
    {
        x        = sigfac*sig+sig*i*0.02;
        dp[next] = dpot(x, qq, c6, cn, npow);
        fprintf(fp, "%10g  %10g  %10g\n", x, pot(x, qq, c6, cn, npow),
                bhpot(x, Abh, Bbh, Cbh));
        if (qq != 0)
        {
            if ((i > 0) && (dp[cur]*dp[next] < 0))
            {
                minimum = oldx + dp[cur]*(x-oldx)/(dp[cur]-dp[next]);
                mval    = pot(minimum, qq, c6, cn, npow);
                printf("Van der Waals + Coulomb minimum at r = %g (nm). Value = %g (kJ/mol)\n",
                       minimum, mval);
            }
        }
        cur  = next;
        oldx = x;

    }
    ffclose(fp);

    do_view(oenv, ftp2fn(efXVG, NFILE, fnm), NULL);

    return 0;
}
Example #2
0
int main(int argc,char *argv[])
{
  static char *desc[] = {
    "Plot the potential"
  };
  static real c6=1.0e-3,c12=1.0e-6,qi=1,qj=2,sig=0.3,eps=1,sigfac=0.7;
  t_pargs pa[] = {
    { "-c6",   FALSE,  etREAL,  {&c6},  "c6"   },
    { "-c12",  FALSE,  etREAL,  {&c12}, "c12"  },
    { "-sig",  FALSE,  etREAL,  {&sig}, "sig"  },
    { "-eps",  FALSE,  etREAL,  {&eps}, "eps"  },
    { "-qi",   FALSE,  etREAL,  {&qi},  "qi"   },
    { "-qj",   FALSE,  etREAL,  {&qj},  "qj"   },
    { "-sigfac", FALSE, etREAL, {&sigfac}, "Factor in front of sigma for starting the plot" }
  };
  t_filenm fnm[] = {
    { efXVG, "-o", "potje", ffWRITE }
  };
#define NFILE asize(fnm)

  FILE      *fp;
  int       i;
  real      qq,x,oldx,minimum,mval,dp[2],pp[2];
  int       cur=0;
#define next (1-cur)
  
  /* CopyRight(stdout,argv[0]);*/
  parse_common_args(&argc,argv,PCA_CAN_VIEW,
		    NFILE,fnm,asize(pa),pa,asize(desc),
		    desc,0,NULL);

  if (opt2parg_bSet("-sig",asize(pa),pa) ||
      opt2parg_bSet("-eps",asize(pa),pa)) {
    c6  = 4*eps*pow(sig,6);
    c12 = 4*eps*pow(sig,12);
  }
  else if ((c6 != 0) && (c12 != 0)) {
    sig = pow(c12/c6,1.0/6.0);
    eps = c6*c6/(4*c12);
  }
  else {
    sig = eps = 0;
  }
  printf("c6    = %12.5e, c12     = %12.5e\n",c6,c12);
  printf("sigma = %12.5f, epsilon = %12.5f\n",sig,eps);
  qq = qi*qj;
      
  fp = xvgropen(ftp2fn(efXVG,NFILE,fnm),"Potential","r (nm)","E (kJ/mol)");
  if (sig == 0)
    sig=0.25;
  minimum = -1;
  mval    = 0;
  oldx    = 0;
  for(i=0; (i<100); i++) {
    x    = sigfac*sig+sig*i*0.02;
    dp[next] = dpot(x,qq,c6,c12);
    fprintf(fp,"%10g  %10g  %10g\n",x,pot(x,qq,c6,c12),
	    dp[next]);
    if ((i > 0) && (dp[cur]*dp[next] < 0)) {
      minimum = oldx + dp[cur]*(x-oldx)/(dp[cur]-dp[next]);
      mval    = pot(minimum,qq,c6,c12);
      /*fprintf(stdout,"dp[cur] = %g, dp[next] = %g  oldx = %g, dx = %g\n",
	dp[cur],dp[next],oldx,x-oldx);*/
      printf("Minimum at r = %g (nm). Value = %g (kJ/mol)\n",
	      minimum,mval);
    }
    cur = next;
    oldx = x;
      
  }
  ffclose(fp);
  
  do_view(ftp2fn(efXVG,NFILE,fnm),NULL);

  thanx(stderr);  
	       
  return 0;
}