20 #ifndef JDFTX_FLUID_FEX_SCALAREOS_INTERNAL_H 21 #define JDFTX_FLUID_FEX_SCALAREOS_INTERNAL_H 24 #include <core/scalar.h> 29 double vdwRadius()
const 30 {
return pow(3.*b/(16.*M_PI), 1./3);
33 __hostanddev__
double getAhs(
double N,
double& Ahs_N,
double Vhs)
const 34 {
double n3 = Vhs*N;
if(n3 >= 1.) { Ahs_N = NAN;
return NAN; }
35 double den = 1./(1-n3);
36 Ahs_N = T*Vhs * (den*den*den)*2*(2-n3);
37 return T * (den*den)*n3*(4-3*n3);
44 double lambda, C1, nHB, dnHB;
50 const double TB = 1408.4 *
Kelvin;
52 const double Tf = 273.16 *
Kelvin;
56 const double bStar = 1.0823*vB;
66 const double b1 = 0.25081;
67 const double b2 = 0.99859;
69 b = vB * (0.2*
exp(-21.4*
pow(T/TB+0.0445,3)) - b1*
exp(1.016*T/TB) + b2);
70 prefacHB = -2*T *
log((omega0+omegaHB*
exp(-epsHB/T))/(omega0+omegaHB)) *
exp(-0.18*
pow(T/Tf,8)) * (1+C1);
71 prefacVW1 = -T*alpha/(lambda*
b);
72 prefacVW2 = bStar*T + aVW;
75 const double A1 = -2.9293;
76 const double A2 = 0.1572;
77 const double A5 = 1.873;
78 const double kappa = 0.8921;
79 const double Tc = 647.096*
Kelvin;
81 VPzi = A1*
exp(-A5*
pow(T/Tc,6)) * (
pow(T/Tc - kappa, 2) + A2);
84 __hostanddev__
double getVPphiInt(
double n,
double& VPphiInt_n)
const 85 {
const double A4 = 0.0610;
86 const double d0 = 1.917;
87 const double d1 = 26.01;
88 const double beta = 3.24;
89 double x = n/nc, xPowBetaM1 =
pow(x, beta-1.), xPow57 =
pow(x,5.7);
90 double den = 1./(d0*(1 + d0*x*(1 + d0*x)) + x*d1*xPowBetaM1);
91 double den_x = -den*den*(d0*d0*(1 + d0*x*2) + beta*d1*xPowBetaM1);
92 double expTerm =
exp(-A4*xPow57*x);
93 VPphiInt_n = expTerm*(A4*xPow57*6.7*den-den_x);
94 return -nc*expTerm*den;
98 __hostanddev__
void operator()(
int i,
const double* Nbar,
double* Aex,
double* Aex_Nbar,
double Vhs)
const 106 double gaussHB =
exp(
pow((Nbar[i]-nHB)/dnHB,2));
107 double fHBden = C1 + gaussHB;
108 double fHBdenPrime = gaussHB * 2*(Nbar[i]-nHB)/
pow(dnHB,2);
109 double AHB = prefacHB / fHBden;
110 double AHB_Nbar = -AHB * fHBdenPrime/fHBden;
112 double Ginv = 1 - lambda*
b*Nbar[i];
if(Ginv<=0.0) { Aex_Nbar[i] = NAN; Aex[i]=NAN;
return; }
113 double VPphiInt_Nbar, VPphiInt = getVPphiInt(Nbar[i], VPphiInt_Nbar);
114 double AVW = prefacVW1*
log(Ginv) + (VPzi*VPphiInt - Nbar[i])*prefacVW2;
115 double AVW_Nbar = T*alpha/Ginv + (VPzi*VPphiInt_Nbar - 1.) * prefacVW2;
117 double AFMT_Nbar, AFMT = getAhs(Nbar[i], AFMT_Nbar, Vhs);
119 Aex_Nbar[i] = AHB_Nbar + AVW_Nbar - AFMT_Nbar;
120 Aex[i] = AHB + AVW - AFMT;
127 double lambda, prefacQuad, prefacVap, prefacPole;
134 double kappa = 1.093 + 0.26*(
sqrt(0.002+omega) + 4.5*(0.002+omega));
136 double A2 = 1.64 + 2.65*(
exp(kappa-1.093)-1);
138 double TB = Tc * (2.6455 - 1.1941*omega);
139 double vB = (Tc/Pc) * (0.1646 + 0.1014*omega);
141 const double a1 = -0.0648, a2 = 1.8067, c1 = 2.6038, c2 = 0.9726;
142 double alpha = vB*( a1*
exp(-c1*T/TB) + a2*(1 -
exp(-c2*
pow(TB/T,0.25))) );
143 double B = (Tc/Pc) * (0.1445+omega*0.0637 + (Tc/T)*(-0.330 + (Tc/T)*(-0.1385+0.331*omega + (Tc/T)*(-0.0121-0.423*omega +
pow(Tc/T,5)*(-0.000607-0.008*omega)))));
144 b = vB*( a1*(1-c1*T/TB)*
exp(-c1*T/TB) + a2*(1 - (1+0.25*c2*
pow(TB/T,0.25))*
exp(-c2*
pow(TB/T,0.25))) );
145 lambda = 0.4324 - 0.3331*omega;
147 prefacQuad = -T*(alpha - B);
148 prefacVap = prefacQuad * (-A1 * (
exp(kappa*Tc/T)-A2)) / (2*
sqrt(1.8)*
b);
149 prefacPole = alpha*T/(lambda*
b);
153 __hostanddev__
void operator()(
int i,
const double* Nbar,
double* Aex,
double* Aex_Nbar,
double Vhs)
const 161 double Ginv = 1 - lambda*
b*Nbar[i];
if(Ginv<=0.0) { Aex_Nbar[i] = NAN; Aex[i]=NAN;
return; }
162 double AVW = Nbar[i]*prefacQuad + prefacPole*(-
log(Ginv));
163 double AVW_Nbar = prefacQuad + prefacPole*(lambda*
b/Ginv);
165 double b2term =
sqrt(1.8)*
b*
b;
166 double bn2term = b2term*Nbar[i]*Nbar[i];
167 double Avap = prefacVap * atan(bn2term);
168 double Avap_Nbar = prefacVap * b2term*Nbar[i]*2. / (1 + bn2term*bn2term);
170 double AFMT_Nbar, AFMT = getAhs(Nbar[i], AFMT_Nbar, Vhs);
172 Aex_Nbar[i] = AVW_Nbar + Avap_Nbar - AFMT_Nbar;
173 Aex[i] = AVW + Avap - AFMT;
177 #endif // JDFTX_FLUID_FEX_SCALAREOS_INTERNAL_H ScalarField pow(const ScalarField &, double alpha)
Elementwise power (preserve input)
ScalarField sqrt(const ScalarField &)
Elementwise square root (preserve input)
const double Joule
Definition: Units.h:30
const double Kelvin
Definition: Units.h:33
const double meter
Definition: Units.h:38
ScalarField log(const ScalarField &)
Elementwise logarithm (preserve input)
double prefacVW2
prefactors to the HB and VW terms
Definition: Fex_ScalarEOS_internal.h:43
Definition: Fex_ScalarEOS_internal.h:41
const double KJoule
Definition: Units.h:31
Definition: Fex_ScalarEOS_internal.h:26
Commonly used measurement units in terms of atomic units.
const double mol
(= Avogadro number)
Definition: Units.h:46
ScalarField exp(const ScalarField &)
Elementwise exponential (preserve input)
const double liter
Definition: Units.h:39
TaoMasonEOS_eval(double T, double Tc, double Pc, double omega)
Construct the equation of state for temperature T, given critical point and acentricity (all in atomi...
Definition: Fex_ScalarEOS_internal.h:130
Tao-Mason equation of state [F. Tao and E. A. Mason, J. Chem. Phys. 100, 9075 (1994)].
Definition: Fex_ScalarEOS_internal.h:125
double b
temperature and exclusion volume
Definition: Fex_ScalarEOS_internal.h:27
double VPzi
vapor-pressure correction temperature dependent prefactor
Definition: Fex_ScalarEOS_internal.h:45