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; }
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; }