Skip to content

Commit 0cbfa12

Browse files
committed
Fix UNIQUAC NaN at pure component using algebraic V/x and F/V identities
1 parent c7665bc commit 0cbfa12

2 files changed

Lines changed: 13 additions & 5 deletions

File tree

src/pathsim_chem/thermodynamics/activity_coefficients.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -306,17 +306,22 @@ def _eval(self, T):
306306
tau = np.exp(self.a + self.b_param / T + self.c_param * np.log(T) + self.d_param * T)
307307

308308
# volume and surface fractions
309-
V = self.r * x / np.dot(self.r, x)
310-
F = self.q * x / np.dot(self.q, x)
309+
sum_rx = np.dot(self.r, x)
310+
sum_qx = np.dot(self.q, x)
311311
Fp = self.q_prime * x / np.dot(self.q_prime, x)
312312

313313
# combinatorial part
314+
# V_i / x_i = r_i / sum_j(r_j x_j) is well-defined even at x_i=0
315+
# F_i / V_i = (q_i / r_i) * sum_rx / sum_qx (algebraic identity)
316+
V_over_x = self.r / sum_rx
317+
F_over_V = (self.q / self.r) * (sum_rx / sum_qx)
318+
314319
ln_gamma_C = np.zeros(n)
315320
sum_xl = np.dot(x, self.l)
316321
for i in range(n):
317-
ln_gamma_C[i] = (np.log(V[i] / x[i])
318-
+ self.z / 2 * self.q[i] * np.log(F[i] / V[i])
319-
+ self.l[i] - V[i] / x[i] * sum_xl)
322+
ln_gamma_C[i] = (np.log(V_over_x[i])
323+
+ self.z / 2 * self.q[i] * np.log(F_over_V[i])
324+
+ self.l[i] - V_over_x[i] * sum_xl)
320325

321326
# residual part
322327
ln_gamma_R = np.zeros(n)

tests/thermodynamics/test_activity_coefficients.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ def test_pure_component_gamma_is_one(self):
174174
)
175175
gamma1, gamma2 = eval_block(U, 350)
176176
self.assertAlmostEqual(gamma1, 1.0, places=10)
177+
# gamma_2 at infinite dilution must be finite (not NaN)
178+
self.assertTrue(np.isfinite(gamma2))
179+
self.assertGreater(gamma2, 0.0)
177180

178181
def test_symmetric_case(self):
179182
# Identical r, q, symmetric a => gamma_1 = gamma_2

0 commit comments

Comments
 (0)