Created
November 18, 2014 21:11
-
-
Save 3ki5tj/25d3cf6a116f126a61ba to your computer and use it in GitHub Desktop.
Lennard-Jones equations of state (needs dygraph-combined.js for graphics)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"> | |
<title>Lennard-Jones equation of state</title> | |
<script type="text/javascript" src="dygraph-combined.js"></script> | |
<script type="text/javascript"> | |
//<![CDATA[ | |
/* compute reference thermal dynamics variables | |
using the modified Benedic-Webb-Rubin (MBWR) equation of states | |
return | |
U: the average potential energy | |
P: pressure | |
Ar: Helmholtz free energy (potential part) | |
mu: Gibbs free energy (potential part) */ | |
function lj_eos3dMBWR(rho, T, x) | |
{ | |
var gam = x[33], U, P, Ar, mu; | |
var rhop, rho2 = rho*rho, Pa = 0., Pb = 0., i; | |
var a = [ | |
x[1]*T + x[2]*Math.sqrt(T) + x[3] + x[4]/T + x[5]/(T*T), | |
x[6]*T + x[7] + x[8]/T + x[9]/(T*T), | |
x[10]*T + x[11] + x[12]/T, | |
x[13], | |
x[14]/T + x[15]/(T*T), | |
x[16]/T, | |
x[17]/T + x[18]/(T*T), | |
x[19]/(T*T) | |
]; | |
var b = [ | |
(x[20] + x[21]/T)/(T*T), | |
(x[22] + x[23]/(T*T))/(T*T), | |
(x[24] + x[25]/T)/(T*T), | |
(x[26] + x[27]/(T*T))/(T*T), | |
(x[28] + x[29]/T)/(T*T), | |
(x[30] + x[31]/T + x[32]/(T*T))/(T*T) | |
]; | |
var c = [ | |
x[2]*Math.sqrt(T)/2 + x[3] + 2*x[4]/T + 3*x[5]/(T*T), | |
x[7] + 2*x[8]/T + 3*x[9]/(T*T), | |
x[11] + 2*x[12]/T, | |
x[13], | |
2*x[14]/T + 3*x[15]/(T*T), | |
2*x[16]/T, | |
2*x[17]/T + 3*x[18]/(T*T), | |
3*x[19]/(T*T) | |
]; | |
var d = [ | |
(3*x[20] + 4*x[21]/T)/(T*T), | |
(3*x[22] + 5*x[23]/(T*T))/(T*T), | |
(3*x[24] + 4*x[25]/T)/(T*T), | |
(3*x[26] + 5*x[27]/(T*T))/(T*T), | |
(3*x[28] + 4*x[29]/T)/(T*T), | |
(3*x[30] + 4*x[31]/T + 5*x[32]/(T*T))/(T*T) | |
]; | |
var F = Math.exp(-gam*rho*rho); | |
var G = [0, 0, 0, 0, 0, 0]; | |
G[0] = (1 - F)/(2*gam); | |
for (rhop = 1, i = 1; i < 6; i++) { | |
rhop *= rho*rho; | |
G[i] = -(F*rhop - 2*i*G[i-1])/(2*gam); | |
} | |
Ar = 0; | |
Pa = Pb = 0; | |
for (U = 0, i = 7; i >= 0; i--) { | |
U = rho * (c[i]/(i+1) + U); | |
Ar = rho * (a[i]/(i+1) + Ar); | |
Pa = rho * (a[i] + Pa); | |
} | |
for (i = 5; i >= 0; i--) { | |
U += d[i]*G[i]; | |
Ar += b[i]*G[i]; | |
Pb = rho2*(b[i] + Pb); | |
} | |
P = rho*(T + Pa + F*Pb); | |
mu = Ar + P/rho - T; | |
return [U, P, Ar, mu]; | |
} | |
/* Reference: | |
* J. Karl Johnson, John A. Zollweg, and Keith E. Gubbins | |
* The Lennard-Jones equation of states revisited, | |
* Molecular Physics (1993) Vol. 78, No 3, 591-618 */ | |
var ljparam_JZG1993 = [0, | |
0.8623085097507421, | |
2.976218765822098, | |
-8.402230115796038, | |
0.1054136629203555, | |
-0.8564583828174598, | |
1.582759470107601, | |
0.7639421948305453, | |
1.753173414312048, | |
2.798291772190376e+03, | |
-4.8394220260857657e-02, | |
0.9963265197721935, | |
-3.698000291272493e+01, | |
2.084012299434647e+01, | |
8.305402124717285e+01, | |
-9.574799715203068e+02, | |
-1.477746229234994e+02, | |
6.398607852471505e+01, | |
1.603993673294834e+01, | |
6.805916615864377e+01, | |
-2.791293578795945e+03, | |
-6.245128304568454, | |
-8.116836104958410e+03, | |
1.488735559561229e+01, | |
-1.059346754655084e+04, | |
-1.131607632802822e+02, | |
-8.867771540418822e+03, | |
-3.986982844450543e+01, | |
-4.689270299917261e+03, | |
2.593535277438717e+02, | |
-2.694523589434903e+03, | |
-7.218487631550215e+02, | |
1.721802063863269e+02, | |
3.0 // gamma | |
]; | |
/* Reference: | |
* Jiri Kolafa and Ivo Nezbeda | |
* The Lennard-Jones fluid: An accurate analytic | |
* and theoretically-based equation of state | |
* Fluid Phase Equilibria (1994) Vol. 100, 1-34 | |
* TABLE 5 | |
* regressed from data with T <= 6 | |
* */ | |
var ljparam_KN1994 = [0, | |
0.86230851, | |
2.97621877, | |
-8.40223012, | |
0.10541366, | |
-0.85645838, | |
1.39945300, | |
-0.20682219, | |
2.66555449, | |
1205.90355811, | |
0.24414200, | |
6.17927577, | |
-41.33848427, | |
15.14482295, | |
88.90243729, | |
-2425.74868591, | |
-148.52651854, | |
68.73779789, | |
2698.26346845, | |
-1216.87158315, | |
-1199.67930914, | |
-7.28265251, | |
-4942.58001124, | |
24.87520514, | |
-6246.96241113, | |
-235.12327760, | |
-7241.61133138, | |
-111.27706706, | |
-2800.52326352, | |
1109.71518240, | |
1455.47321956, | |
-2577.25311109, | |
476.67051504, | |
4.52000000 // gamma | |
]; | |
function lj_eos3d_bAhs(eta) | |
{ | |
var e1 = 1 - eta; | |
return Math.log(e1)*5/3 + eta*(34 - 33*eta + 4*eta*eta)/(6*e1*e1); | |
} | |
function lj_eos3d_zhs(eta) | |
{ | |
var e1 = 1 - eta; | |
return (1 + eta*(1 + eta*(1 - eta*(1 + eta)*2/3)))/(e1*e1*e1); | |
} | |
/* equivalent hard-sphere diameter of the hybrid Barker-Henderson theory | |
* defined in Eq. (17) | |
* d = Int {0 to 2^(1/6)} (1 - exp(-beta*u)) dr | |
* Parameters are given by Table 2 with the functional form given by (29) | |
* | |
* To verify it WolframAlpha or Mathematica | |
* Integrate[(1-Exp[-(4/x^12-4/x^6+1)/T]), {x, 0, 2.0^(1.0/6)}] | |
* */ | |
function lj_eos3d_dhBH(T) | |
{ | |
var Ci = [1.080142248, -0.076383859, 0.011117524]; | |
var C1 = 0.000693129, Cln = -0.063920968; | |
var x = Math.sqrt(T); | |
return [ | |
Ci[2]/T + Ci[1]/x + Ci[0] + C1*x + Cln*Math.log(T), | |
Ci[2] + 0.5*Ci[1]*x - 0.5*C1*x*T - T*Cln] | |
} | |
/* The residual second virial coefficient B2_LJ - B2_hs | |
* from the hybrid Barker-Henderson theory | |
* Parameters are given by Table 2 with the functional form given by (29) */ | |
function lj_eos3d_dB2hBH(T) | |
{ | |
/* from Table 2 */ | |
var Ci = [ | |
0.02459877, | |
0, | |
-7.02181962, | |
2.90616279, | |
-4.13749995, | |
0.87361369, | |
0.43102052, | |
-0.58544978]; | |
var f = 0, dfdbeta = 0, invx = 1/Math.sqrt(T), i; | |
for ( i = 7; i > 0; i-- ) { | |
f = (f + Ci[i]) * invx; | |
dfdbeta = (dfdbeta - Ci[i]*i/2) * invx; | |
} | |
dfdbeta *= -T; | |
f += Ci[0]; | |
return [f, dfdbeta]; | |
} | |
function lj_eos3dPVEhBH(rho, T) | |
{ | |
/* Table 3 */ | |
var Cij = [ | |
[0, 0, /* i = 0 */ | |
2.01546797, | |
-28.17881636, | |
28.28313847, | |
-10.42402873, | |
0], | |
[0, 0, /* i = -1 */ | |
-19.58371655, | |
75.62340289, | |
-120.70586598, | |
93.92740328, | |
-27.37737354], | |
[0, 0, /* i = -2 */ | |
29.34470520, | |
-112.35356937, | |
170.64908980, | |
-123.06669187, | |
34.42288969], | |
[0, 0, 0, 0, 0, 0, 0], | |
[0, 0, /* i = -4 */ | |
-13.37031968, | |
65.38059570, | |
-115.09233113, | |
88.91973082, | |
-25.62099890]]; | |
var gam = 1.92907278; | |
var i, j, tmp; | |
tmp = lj_eos3d_dhBH(T); | |
var dia = tmp[0]; | |
var ddia = tmp[1]; | |
tmp = lj_eos3d_dB2hBH(T); | |
var dB2 = tmp[0]; | |
var ddB2 = tmp[1]; | |
var grho2 = gam*rho*rho; | |
var xpngrho2 = Math.exp(-grho2); | |
var eta = Math.PI * rho * dia*dia*dia/6; | |
var Ahs = T * lj_eos3d_bAhs(eta); | |
var AhBH = xpngrho2 * rho * T * dB2; | |
var ACij = 0, zCij = 0, UCij = 0; | |
for ( i = 0; i <= 4; i++ ) { | |
var xpT = Math.pow(T, -i*.5); | |
var xprho = rho; | |
for ( j = 2; j <= 6; j++ ) { | |
xprho *= rho; | |
var xp = xpT * xprho; | |
ACij += Cij[i][j] * xp; | |
zCij += j * Cij[i][j] * xp / T; | |
UCij += (1 + i*.5) * Cij[i][j] * xp; | |
} | |
} | |
var A = Ahs + AhBH + ACij; | |
var zhs = lj_eos3d_zhs(eta); | |
var z = zhs + rho * (1 - 2*grho2) * xpngrho2 * dB2 + zCij; | |
var P = rho * T * z; | |
var U = 3*(zhs - 1)*ddia/dia + rho * xpngrho2 * ddB2 + UCij; | |
var mu = P/rho + A - T; | |
return [U, P, A, mu]; | |
} | |
function setnum(who, num) | |
{ | |
var x = num.toPrecision(6); | |
if ( x < 0 ) x = "−" + (-x); | |
document.getElementById(who).innerHTML = x; | |
} | |
function mkplot() | |
{ | |
var rho, drho = 0.01; | |
var arr1, arr2, arr3; | |
var datU, datP, datF, datG, dat = "density," | |
+"JZG1993," | |
+"KN1994<sub>MBWR</sub>," | |
+"KN1994<sub>PVE-hBH</sub>\n"; | |
var temp = parseFloat( document.getElementById("temp").value ); | |
if ( isNaN(temp) ) temp = 1; | |
var rhomax = parseFloat( document.getElementById("rho").value ); | |
if ( isNaN(rhomax) ) { | |
rhomax = 1; | |
} else { | |
rhomax *= 1.2; | |
} | |
datU = datP = datF = datG = dat; | |
for ( var i = 1; i*drho <= rhomax; i++ ) { | |
rho = i * drho; | |
arr1 = lj_eos3dMBWR(rho, temp, ljparam_JZG1993); | |
arr2 = lj_eos3dMBWR(rho, temp, ljparam_KN1994); | |
arr3 = lj_eos3dPVEhBH(rho, temp); | |
datU += "" + rho + "," + arr1[0] + "," + arr2[0] + "," + arr3[0] + "\n"; | |
datP += "" + rho + "," + arr1[1] + "," + arr2[1] + "," + arr3[1] + "\n"; | |
datF += "" + rho + "," + arr1[2] + "," + arr2[2] + "," + arr3[2] + "\n"; | |
datG += "" + rho + "," + arr1[3] + "," + arr2[3] + "," + arr3[3] + "\n"; | |
} | |
var optionsU = { | |
showRoller: true, | |
ylabel: 'Internal energy per particle, <i>U</i>/<i>N</i>' | |
}; | |
var optionsP = { | |
showRoller: true, | |
ylabel: 'Pressure, <i>P</i>' | |
}; | |
var optionsF = { | |
showRoller: true, | |
xlabel: 'Density, <i>ρ</i>', | |
ylabel: 'Helmholtz free energy per particle, <i>F</i><sup>ex</sup>/<i>N</i>' | |
}; | |
var optionsG = { | |
showRoller: true, | |
xlabel: 'Density, <i>ρ</i>', | |
ylabel: 'Excess chemical potential, <i>μ</i><sup>ex</sup>' | |
}; | |
var gU = new Dygraph(document.getElementById("U_plot"), datU, optionsU); | |
var gP = new Dygraph(document.getElementById("P_plot"), datP, optionsP); | |
var gF = new Dygraph(document.getElementById("F_plot"), datF, optionsF); | |
var gG = new Dygraph(document.getElementById("G_plot"), datG, optionsG); | |
} | |
function getEOS() | |
{ | |
var inpT = parseFloat( document.getElementById("temp").value ); | |
var inprho = parseFloat( document.getElementById("rho").value ); | |
if ( isNaN(inpT) ) inpT = 1; | |
if ( isNaN(inprho) ) inprho = 0.7; | |
var arr1 = lj_eos3dMBWR(inprho, inpT, ljparam_JZG1993); | |
setnum("U1", arr1[0]); | |
setnum("P1", arr1[1]); | |
setnum("Fex1", arr1[2]); | |
setnum("muex1", arr1[3]); | |
var arr2 = lj_eos3dMBWR(inprho, inpT, ljparam_KN1994); | |
setnum("U2", arr2[0]); | |
setnum("P2", arr2[1]); | |
setnum("Fex2", arr2[2]); | |
setnum("muex2", arr2[3]); | |
var arr3 = lj_eos3dPVEhBH(inprho, inpT); | |
setnum("U3", arr3[0]); | |
setnum("P3", arr3[1]); | |
setnum("Fex3", arr3[2]); | |
setnum("muex3", arr3[3]); | |
mkplot(); | |
} | |
//]]> | |
</script> | |
</head> | |
<body> | |
<h2>Lennard-Jones equation of states</h2> | |
<form id="my_form"> | |
<i>T</i>: <input type="text" id="temp" value="1" size="10" /> | |
<i>ρ</i>: <input type="text" id="rho" value="0.7" size="10" /> | |
<input type="button" value="Compute" size="10" onClick="getEOS()" /> | |
<br /> | |
<table style="text-align: center; margin: 2px; border: 2px solid"> | |
<tr> | |
<th></th> | |
<th style="text-align:left">Johnson, Zollweg, and Gubbins (1993)</th> | |
<th style="text-align:left">Kolafa and Nezbeda, MBWR (1994)</th> | |
<th style="text-align:left">Kolafa and Nezbeda, PVE-hBH (1994)</th> | |
</tr> | |
<tr> | |
<td style="text-align:left"> | |
Internal energy per particle, <i>U/N</i>: | |
</td> | |
<td id="U1"></td> | |
<td id="U2"></td> | |
<td id="U3"></td> | |
</tr> | |
<tr> | |
<td style="text-align:left"> | |
Pressure, <i>P</i>: | |
</td> | |
<td id="P1"></td> | |
<td id="P2"></td> | |
<td id="P3"></td> | |
</tr> | |
<tr> | |
<td style="text-align:left"> | |
Excess free energy per particle, <i>F/N</i>: | |
</td> | |
<td id="Fex1"></td> | |
<td id="Fex2"></td> | |
<td id="Fex3"></td> | |
</tr> | |
<tr> | |
<td style="text-align:left"> | |
Excess chemical potential, <i>μ</i>: | |
</td> | |
<td id="muex1"></td> | |
<td id="muex2"></td> | |
<td id="muex3"></td> | |
</tr> | |
</table> | |
<center> | |
<input type="button" value="Plot!" | |
onClick="mkplot()" | |
style="padding: 5px 20px; width: 400px; margin:auto; text-align:center;"> | |
</center> | |
<table> | |
<tr> | |
<td> <div id="U_plot"></div> </td> | |
<td> <div id="P_plot"></div> </td> | |
</tr> | |
<tr> | |
<td> <div id="F_plot"></div> </td> | |
<td> <div id="G_plot"></div> </td> | |
</tr> | |
</table> | |
</form> | |
</body> | |
</html> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment