58 N = component_names.size();
65 for (
unsigned int i = 0; i <
N; ++i) {
92 std::string kij_string;
93 std::string kijT_string;
99 for (
unsigned int i = 0; i <
N; ++i) {
100 for (
unsigned int j = 0; j <
N; ++j) {
104 k_ij[i *
N + j] = atof(kij_string.c_str());
105 k_ijT[i *
N + j] = atof(kijT_string.c_str());
111 if (generate_SatL_and_SatV) {
112 bool SatLSatV =
false;
133 for (
unsigned int i = 0; i <
N; ++i) {
158 std::string kij_string;
159 std::string kijT_string;
165 for (
unsigned int i = 0; i <
N; ++i) {
166 for (
unsigned int j = 0; j <
N; ++j) {
170 k_ij[i *
N + j] = atof(kij_string.c_str());
171 k_ijT[i *
N + j] = atof(kijT_string.c_str());
177 if (generate_SatL_and_SatV) {
178 bool SatLSatV =
false;
202 if (mass_fractions.size() !=
N) {
203 throw ValueError(
format(
"size of mass fraction vector [%d] does not equal that of component vector [%d]", mass_fractions.size(),
N));
205 std::vector<CoolPropDbl> moles;
208 for (
unsigned int i = 0; i <
components.size(); ++i) {
209 tmp = mass_fractions[i] /
components[i].molar_mass();
210 moles.push_back(tmp);
214 for (std::vector<CoolPropDbl>::iterator it = moles.begin(); it != moles.end(); ++it) {
248 vector<double> d(ncomp);
249 for (
auto i = 0U; i < ncomp; i++) {
253 for (
auto i = 0U; i < ncomp; i++) {
263 vector<double> zeta(4, 0);
265 for (
int i = 0; i < 4; i++) {
267 for (
size_t j = 0; j < ncomp; j++) {
270 zeta[i] = PI / 6 * den * summ;
273 double eta = zeta[3];
275 for (
size_t i = 0; i < ncomp; i++) {
279 vector<double> ghs(ncomp * ncomp, 0);
280 vector<double> e_ij(ncomp * ncomp, 0);
281 vector<double> s_ij(ncomp * ncomp, 0);
285 for (
size_t i = 0; i < ncomp; i++) {
286 for (
size_t j = 0; j < ncomp; j++) {
309 ghs[idx] = 1 / (1 - zeta[3]) + (d[i] * d[j] / (d[i] + d[j])) * 3 * zeta[2] / (1 - zeta[3]) / (1 - zeta[3])
310 + pow(d[i] * d[j] / (d[i] + d[j]), 2) * 2 * zeta[2] * zeta[2] / pow(1 - zeta[3], 3);
314 double ares_hs = 1 / zeta[0]
315 * (3 * zeta[1] * zeta[2] / (1 - zeta[3]) + pow(zeta[2], 3.) / (zeta[3] * pow(1 - zeta[3], 2))
316 + (pow(zeta[2], 3.) / pow(zeta[3], 2.) - zeta[0]) * log(1 - zeta[3]));
318 static double a0[7] = {0.9105631445, 0.6361281449, 2.6861347891, -26.547362491, 97.759208784, -159.59154087, 91.297774084};
319 static double a1[7] = {-0.3084016918, 0.1860531159, -2.5030047259, 21.419793629, -65.255885330, 83.318680481, -33.746922930};
320 static double a2[7] = {-0.0906148351, 0.4527842806, 0.5962700728, -1.7241829131, -4.1302112531, 13.776631870, -8.6728470368};
321 static double b0[7] = {0.7240946941, 2.2382791861, -4.0025849485, -21.003576815, 26.855641363, 206.55133841, -355.60235612};
322 static double b1[7] = {-0.5755498075, 0.6995095521, 3.8925673390, -17.215471648, 192.67226447, -161.82646165, -165.20769346};
323 static double b2[7] = {0.0976883116, -0.2557574982, -9.1558561530, 20.642075974, -38.804430052, 93.626774077, -29.666905585};
325 vector<double> a(7, 0);
326 vector<double> b(7, 0);
327 for (
int i = 0; i < 7; i++) {
328 a[i] = a0[i] + (m_avg - 1.) / m_avg * a1[i] + (m_avg - 1.) / m_avg * (m_avg - 2.) / m_avg * a2[i];
329 b[i] = b0[i] + (m_avg - 1.) / m_avg * b1[i] + (m_avg - 1.) / m_avg * (m_avg - 2.) / m_avg * b2[i];
334 for (
int i = 0; i < 7; i++) {
335 I1 += a[i] * pow(eta, i);
336 I2 += b[i] * pow(eta, i);
339 / (1. + m_avg * (8 * eta - 2 * eta * eta) / pow(1 - eta, 4)
340 + (1 - m_avg) * (20 * eta - 27 * eta * eta + 12 * pow(eta, 3) - 2 * pow(eta, 4)) / pow((1 - eta) * (2 - eta), 2.0));
343 for (
size_t i = 0; i < ncomp; i++) {
347 double ares_hc = m_avg * ares_hs - summ;
348 double ares_disp = -2 * PI * den * I1 * m2es3 - PI * den * m_avg * C1 * I2 * m2e2s3;
351 double ares_polar = 0.;
355 vector<double> dipmSQ(ncomp, 0);
357 static double a0dip[5] = {0.3043504, -0.1358588, 1.4493329, 0.3556977, -2.0653308};
358 static double a1dip[5] = {0.9534641, -1.8396383, 2.0131180, -7.3724958, 8.2374135};
359 static double a2dip[5] = {-1.1610080, 4.5258607, 0.9751222, -12.281038, 5.9397575};
360 static double b0dip[5] = {0.2187939, -1.1896431, 1.1626889, 0, 0};
361 static double b1dip[5] = {-0.5873164, 1.2489132, -0.5085280, 0, 0};
362 static double b2dip[5] = {3.4869576, -14.915974, 15.372022, 0, 0};
363 static double c0dip[5] = {-0.0646774, 0.1975882, -0.8087562, 0.6902849, 0};
364 static double c1dip[5] = {-0.9520876, 2.9924258, -2.3802636, -0.2701261, 0};
365 static double c2dip[5] = {-0.6260979, 1.2924686, 1.6542783, -3.4396744, 0};
367 const static double conv = 7242.702976750923;
369 for (
size_t i = 0; i < ncomp; i++) {
373 vector<double> adip(5, 0);
374 vector<double> bdip(5, 0);
375 vector<double> cdip(5, 0);
379 for (
size_t i = 0; i < ncomp; i++) {
380 for (
size_t j = 0; j < ncomp; j++) {
386 for (
int l = 0; l < 5; l++) {
387 adip[l] = a0dip[l] + (m_ij - 1) / m_ij * a1dip[l] + (m_ij - 1) / m_ij * (m_ij - 2) / m_ij * a2dip[l];
388 bdip[l] = b0dip[l] + (m_ij - 1) / m_ij * b1dip[l] + (m_ij - 1) / m_ij * (m_ij - 2) / m_ij * b2dip[l];
389 J2 += (adip[l] + bdip[l] * e_ij[i * ncomp + j] /
_T)
393 * pow(s_ij[j * ncomp + j], 3) / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum() * dipmSQ[i]
396 for (
size_t k = 0; k < ncomp; k++) {
402 for (
int l = 0; l < 5; l++) {
403 cdip[l] = c0dip[l] + (m_ijk - 1) / m_ijk * c1dip[l] + (m_ijk - 1) / m_ijk * (m_ijk - 2) / m_ijk * c2dip[l];
404 J3 += cdip[l] * pow(eta, l);
407 * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3)
408 / s_ij[i * ncomp + j] / s_ij[i * ncomp + k] / s_ij[j * ncomp + k] *
components[i].getDipnum() *
components[j].getDipnum()
409 *
components[k].getDipnum() * dipmSQ[i] * dipmSQ[j] * dipmSQ[k] * J3;
415 A3 = -4 / 3. * PI * PI * den * den * A3;
418 ares_polar = A2 / (1 - A3 / A2);
423 double ares_assoc = 0.;
427 for (std::vector<int>::iterator it =
assoc_num.begin(); it !=
assoc_num.end(); ++it) {
429 for (
int i = 0; i < *it; i++) {
430 iA.push_back(
static_cast<int>(it -
assoc_num.begin()));
434 vector<double> x_assoc(num_sites);
435 for (
int i = 0; i < num_sites; i++) {
440 vector<double> XA(num_sites, 0);
441 vector<double> delta_ij(num_sites * num_sites, 0);
445 for (
auto i = 0; i < num_sites; i++) {
446 idxi = iA[i] * ncomp + iA[i];
447 for (
int j = 0; j < num_sites; j++) {
448 idxj = iA[j] * ncomp + iA[j];
452 * pow(sqrt(s_ij[idxi] * s_ij[idxj]) / (0.5 * (s_ij[idxi] + s_ij[idxj])), 3);
453 delta_ij[idxa] = ghs[iA[i] * ncomp + iA[j]] * (exp(eABij /
_T) - 1) * pow(s_ij[iA[i] * ncomp + iA[j]], 3) * volABij;
457 XA[i] = (-1 + sqrt(1 + 8 * den * delta_ij[i * num_sites + i])) / (4 * den * delta_ij[i * num_sites + i]);
458 if (!std::isfinite(XA[i])) {
465 vector<double> XA_old = XA;
466 while ((ctr < 100) && (dif > 1e-15)) {
468 XA =
XA_find(XA_old, delta_ij, den, x_assoc);
470 for (
int i = 0; i < num_sites; i++) {
471 dif += abs(XA[i] - XA_old[i]);
473 for (
int i = 0; i < num_sites; i++) {
474 XA_old[i] = (XA[i] + XA_old[i]) / 2.0;
479 for (
int i = 0; i < num_sites; i++) {
480 ares_assoc +=
mole_fractions[iA[i]] * (log(XA[i]) - 0.5 * XA[i] + 0.5);
485 double ares_ion = 0.;
487 vector<double> q(ncomp);
488 for (
size_t i = 0; i < ncomp; i++) {
493 for (
size_t i = 0; i < ncomp; i++) {
497 sqrt(den * E_CHRG * E_CHRG / kb /
_T / (
dielc * perm_vac) * summ);
500 vector<double> chi(ncomp);
501 vector<double> sigma_k(ncomp);
503 for (
size_t i = 0; i < ncomp; i++) {
504 chi[i] = 3 / pow(kappa * d[i], 3) * (1.5 + log(1 + kappa * d[i]) - 2 * (1 + kappa * d[i]) + 0.5 * pow(1 + kappa * d[i], 2));
508 ares_ion = -1 / 12. / PI / kb /
_T / (
dielc * perm_vac) * summ;
512 CoolPropDbl ares = ares_hc + ares_disp + ares_polar + ares_assoc + ares_ion;
518 vector<double> d(ncomp), dd_dt(ncomp);
519 for (
auto i = 0U; i < ncomp; i++) {
524 for (
auto i = 0U; i < ncomp; i++) {
535 vector<double> zeta(4, 0);
537 for (
int i = 0; i < 4; i++) {
539 for (
size_t j = 0; j < ncomp; j++) {
542 zeta[i] = PI / 6 * den * summ;
545 vector<double> dzeta_dt(4, 0);
546 for (
int i = 1; i < 4; i++) {
548 for (
size_t j = 0; j < ncomp; j++) {
551 dzeta_dt[i] = PI / 6 * den * summ;
554 double eta = zeta[3];
556 for (
size_t i = 0; i < ncomp; i++) {
560 vector<double> ghs(ncomp * ncomp, 0);
561 vector<double> dghs_dt(ncomp * ncomp, 0);
562 vector<double> e_ij(ncomp * ncomp, 0);
563 vector<double> s_ij(ncomp * ncomp, 0);
568 for (
size_t i = 0; i < ncomp; i++) {
569 for (
size_t j = 0; j < ncomp; j++) {
592 ghs[idx] = 1 / (1 - zeta[3]) + (d[i] * d[j] / (d[i] + d[j])) * 3 * zeta[2] / (1 - zeta[3]) / (1 - zeta[3])
593 + pow(d[i] * d[j] / (d[i] + d[j]), 2) * 2 * zeta[2] * zeta[2] / pow(1 - zeta[3], 3);
594 ddij_dt = (d[i] * d[j] / (d[i] + d[j])) * (dd_dt[i] / d[i] + dd_dt[j] / d[j] - (dd_dt[i] + dd_dt[j]) / (d[i] + d[j]));
595 dghs_dt[idx] = dzeta_dt[3] / pow(1 - zeta[3], 2.)
596 + 3 * (ddij_dt * zeta[2] + (d[i] * d[j] / (d[i] + d[j])) * dzeta_dt[2]) / pow(1 - zeta[3], 2.)
597 + 4 * (d[i] * d[j] / (d[i] + d[j])) * zeta[2]
598 * (1.5 * dzeta_dt[3] + ddij_dt * zeta[2] + (d[i] * d[j] / (d[i] + d[j])) * dzeta_dt[2]) / pow(1 - zeta[3], 3.)
599 + 6 * pow((d[i] * d[j] / (d[i] + d[j])) * zeta[2], 2.) * dzeta_dt[3] / pow(1 - zeta[3], 4.);
605 * (3 * (dzeta_dt[1] * zeta[2] + zeta[1] * dzeta_dt[2]) / (1 - zeta[3]) + 3 * zeta[1] * zeta[2] * dzeta_dt[3] / pow(1 - zeta[3], 2.)
606 + 3 * pow(zeta[2], 2.) * dzeta_dt[2] / zeta[3] / pow(1 - zeta[3], 2.)
607 + pow(zeta[2], 3.) * dzeta_dt[3] * (3 * zeta[3] - 1) / pow(zeta[3], 2.) / pow(1 - zeta[3], 3.)
608 + (3 * pow(zeta[2], 2.) * dzeta_dt[2] * zeta[3] - 2 * pow(zeta[2], 3.) * dzeta_dt[3]) / pow(zeta[3], 3.) * log(1 - zeta[3])
609 + (zeta[0] - pow(zeta[2], 3) / pow(zeta[3], 2.)) * dzeta_dt[3] / (1 - zeta[3]));
611 static double a0[7] = {0.9105631445, 0.6361281449, 2.6861347891, -26.547362491, 97.759208784, -159.59154087, 91.297774084};
612 static double a1[7] = {-0.3084016918, 0.1860531159, -2.5030047259, 21.419793629, -65.255885330, 83.318680481, -33.746922930};
613 static double a2[7] = {-0.0906148351, 0.4527842806, 0.5962700728, -1.7241829131, -4.1302112531, 13.776631870, -8.6728470368};
614 static double b0[7] = {0.7240946941, 2.2382791861, -4.0025849485, -21.003576815, 26.855641363, 206.55133841, -355.60235612};
615 static double b1[7] = {-0.5755498075, 0.6995095521, 3.8925673390, -17.215471648, 192.67226447, -161.82646165, -165.20769346};
616 static double b2[7] = {0.0976883116, -0.2557574982, -9.1558561530, 20.642075974, -38.804430052, 93.626774077, -29.666905585};
618 vector<double> a(7, 0);
619 vector<double> b(7, 0);
620 for (
int i = 0; i < 7; i++) {
621 a[i] = a0[i] + (m_avg - 1.) / m_avg * a1[i] + (m_avg - 1.) / m_avg * (m_avg - 2.) / m_avg * a2[i];
622 b[i] = b0[i] + (m_avg - 1.) / m_avg * b1[i] + (m_avg - 1.) / m_avg * (m_avg - 2.) / m_avg * b2[i];
627 double dI1_dt = 0.0, dI2_dt = 0.;
628 for (
int i = 0; i < 7; i++) {
629 I1 += a[i] * pow(eta, i);
630 I2 += b[i] * pow(eta, i);
631 dI1_dt += a[i] * dzeta_dt[3] * i * pow(eta, i - 1);
632 dI2_dt += b[i] * dzeta_dt[3] * i * pow(eta, i - 1);
635 / (1. + m_avg * (8 * eta - 2 * eta * eta) / pow(1 - eta, 4)
636 + (1 - m_avg) * (20 * eta - 27 * eta * eta + 12 * pow(eta, 3) - 2 * pow(eta, 4)) / pow((1 - eta) * (2 - eta), 2.0));
637 double C2 = -1 * C1 * C1
638 * (m_avg * (-4 * eta * eta + 20 * eta + 8) / pow(1 - eta, 5.)
639 + (1 - m_avg) * (2 * pow(eta, 3) + 12 * eta * eta - 48 * eta + 40) / pow((1 - eta) * (2 - eta), 3));
640 double dC1_dt = C2 * dzeta_dt[3];
643 for (
size_t i = 0; i < ncomp; i++) {
647 double dadt_hc = m_avg * dadt_hs - summ;
648 double dadt_disp = -2 * PI * den * (dI1_dt - I1 /
_T) * m2es3 - PI * den * m_avg * (dC1_dt * I2 + C1 * dI2_dt - 2 * C1 * I2 /
_T) * m2e2s3;
651 double dadt_polar = 0.;
657 vector<double> dipmSQ(ncomp, 0);
659 static double a0dip[5] = {0.3043504, -0.1358588, 1.4493329, 0.3556977, -2.0653308};
660 static double a1dip[5] = {0.9534641, -1.8396383, 2.0131180, -7.3724958, 8.2374135};
661 static double a2dip[5] = {-1.1610080, 4.5258607, 0.9751222, -12.281038, 5.9397575};
662 static double b0dip[5] = {0.2187939, -1.1896431, 1.1626889, 0, 0};
663 static double b1dip[5] = {-0.5873164, 1.2489132, -0.5085280, 0, 0};
664 static double b2dip[5] = {3.4869576, -14.915974, 15.372022, 0, 0};
665 static double c0dip[5] = {-0.0646774, 0.1975882, -0.8087562, 0.6902849, 0};
666 static double c1dip[5] = {-0.9520876, 2.9924258, -2.3802636, -0.2701261, 0};
667 static double c2dip[5] = {-0.6260979, 1.2924686, 1.6542783, -3.4396744, 0};
669 const static double conv = 7242.702976750923;
671 for (
size_t i = 0; i < ncomp; i++) {
675 vector<double> adip(5, 0);
676 vector<double> bdip(5, 0);
677 vector<double> cdip(5, 0);
678 double J2, J3, dJ2_dt, dJ3_dt;
681 for (
size_t i = 0; i < ncomp; i++) {
682 for (
size_t j = 0; j < ncomp; j++) {
689 for (
int l = 0; l < 5; l++) {
690 adip[l] = a0dip[l] + (m_ij - 1) / m_ij * a1dip[l] + (m_ij - 1) / m_ij * (m_ij - 2) / m_ij * a2dip[l];
691 bdip[l] = b0dip[l] + (m_ij - 1) / m_ij * b1dip[l] + (m_ij - 1) / m_ij * (m_ij - 2) / m_ij * b2dip[l];
692 J2 += (adip[l] + bdip[l] * e_ij[i * ncomp + j] /
_T)
694 dJ2_dt += adip[l] * l * pow(eta, l - 1) * dzeta_dt[3]
695 + bdip[l] * e_ij[j * ncomp + j] * (1 /
_T * l * pow(eta, l - 1) * dzeta_dt[3] - 1 / pow(
_T, 2.) * pow(eta, l));
698 * pow(s_ij[j * ncomp + j], 3) / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum() * dipmSQ[i]
701 * pow(s_ij[j * ncomp + j], 3) / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum()
702 * dipmSQ[i] * dipmSQ[j] * (dJ2_dt / pow(
_T, 2) - 2 * J2 / pow(
_T, 3));
704 for (
size_t k = 0; k < ncomp; k++) {
711 for (
int l = 0; l < 5; l++) {
712 cdip[l] = c0dip[l] + (m_ijk - 1) / m_ijk * c1dip[l] + (m_ijk - 1) / m_ijk * (m_ijk - 2) / m_ijk * c2dip[l];
713 J3 += cdip[l] * pow(eta, l);
714 dJ3_dt += cdip[l] * l * pow(eta, l - 1) * dzeta_dt[3];
717 * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3)
718 / s_ij[i * ncomp + j] / s_ij[i * ncomp + k] / s_ij[j * ncomp + k] *
components[i].getDipnum() *
components[j].getDipnum()
719 *
components[k].getDipnum() * dipmSQ[i] * dipmSQ[j] * dipmSQ[k] * J3;
721 * e_ij[k * ncomp + k] * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3)
722 / s_ij[i * ncomp + j] / s_ij[i * ncomp + k] / s_ij[j * ncomp + k] *
components[i].getDipnum()
724 * (-3 * J3 / pow(
_T, 4) + dJ3_dt / pow(
_T, 3));
730 A3 = -4 / 3. * PI * PI * den * den * A3;
731 dA2_dt = -PI * den * dA2_dt;
732 dA3_dt = -4 / 3. * PI * PI * den * den * dA3_dt;
735 dadt_polar = (dA2_dt - 2 * A3 / A2 * dA2_dt + dA3_dt) / pow(1 - A3 / A2, 2.);
740 double dadt_assoc = 0.;
744 for (std::vector<int>::iterator it =
assoc_num.begin(); it !=
assoc_num.end(); ++it) {
746 for (
int i = 0; i < *it; i++) {
747 iA.push_back(
static_cast<int>(it -
assoc_num.begin()));
751 vector<double> x_assoc(num_sites);
752 for (
int i = 0; i < num_sites; i++) {
757 vector<double> XA(num_sites, 0);
758 vector<double> delta_ij(num_sites * num_sites, 0);
759 vector<double> ddelta_dt(num_sites * num_sites, 0);
760 std::size_t idxa = 0UL;
761 std::size_t idxi = 0UL;
762 std::size_t idxj = 0UL;
763 for (
auto i = 0; i < num_sites; i++) {
764 idxi = iA[i] * ncomp + iA[i];
765 for (
auto j = 0; j < num_sites; j++) {
766 idxj = iA[j] * ncomp + iA[j];
770 * pow(sqrt(s_ij[idxi] * s_ij[idxj]) / (0.5 * (s_ij[idxi] + s_ij[idxj])), 3);
771 delta_ij[idxa] = ghs[iA[i] * ncomp + iA[j]] * (exp(eABij /
_T) - 1) * pow(s_ij[iA[i] * ncomp + iA[j]], 3) * volABij;
773 pow(s_ij[idxj], 3) * volABij
774 * (-eABij / pow(
_T, 2) * exp(eABij /
_T) * ghs[iA[i] * ncomp + iA[j]] + dghs_dt[iA[i] * ncomp + iA[j]] * (exp(eABij /
_T) - 1));
778 XA[i] = (-1 + sqrt(1 + 8 * den * delta_ij[i * num_sites + i])) / (4 * den * delta_ij[i * num_sites + i]);
779 if (!std::isfinite(XA[i])) {
786 vector<double> XA_old = XA;
787 while ((ctr < 100) && (dif > 1e-15)) {
789 XA =
XA_find(XA_old, delta_ij, den, x_assoc);
791 for (
int i = 0; i < num_sites; i++) {
792 dif += abs(XA[i] - XA_old[i]);
794 for (
int i = 0; i < num_sites; i++) {
795 XA_old[i] = (XA[i] + XA_old[i]) / 2.0;
799 vector<double> dXA_dt(num_sites, 0);
800 dXA_dt =
dXAdt_find(delta_ij, den, XA, ddelta_dt, x_assoc);
802 for (
int i = 0; i < num_sites; i++) {
803 dadt_assoc +=
mole_fractions[iA[i]] * (1 / XA[i] - 0.5) * dXA_dt[i];
808 double dadt_ion = 0.;
810 vector<double> q(ncomp);
811 for (
size_t i = 0; i < ncomp; i++) {
816 for (
size_t i = 0; i < ncomp; i++) {
820 sqrt(den * E_CHRG * E_CHRG / kb /
_T / (
dielc * perm_vac) * summ);
824 vector<double> chi(ncomp);
825 vector<double> dchikap_dk(ncomp);
827 for (
size_t i = 0; i < ncomp; i++) {
828 chi[i] = 3 / pow(kappa * d[i], 3) * (1.5 + log(1 + kappa * d[i]) - 2 * (1 + kappa * d[i]) + 0.5 * pow(1 + kappa * d[i], 2));
829 dchikap_dk[i] = -2 * chi[i] + 3 / (1 + kappa * d[i]);
832 dkappa_dt = -0.5 * den * E_CHRG * E_CHRG / kb /
_T /
_T / (
dielc * perm_vac) * summ / kappa;
835 for (
size_t i = 0; i < ncomp; i++) {
836 summ +=
mole_fractions[i] * q[i] * q[i] * (dchikap_dk[i] * dkappa_dt /
_T - kappa * chi[i] /
_T /
_T);
838 dadt_ion = -1 / 12. / PI / kb / (
dielc * perm_vac) * summ;
842 double dadt = dadt_hc + dadt_disp + dadt_assoc + dadt_polar + dadt_ion;
864 vector<double> d(ncomp);
865 for (
auto i = 0U; i < ncomp; i++) {
869 for (
auto i = 0U; i < ncomp; i++) {
879 vector<double> zeta(4, 0);
881 for (
int i = 0; i < 4; i++) {
883 for (
size_t j = 0; j < ncomp; j++) {
886 zeta[i] = PI / 6 * den * summ;
889 double eta = zeta[3];
891 for (
size_t i = 0; i < ncomp; i++) {
895 vector<double> ghs(ncomp * ncomp, 0);
896 vector<double> denghs(ncomp * ncomp, 0);
897 vector<double> e_ij(ncomp * ncomp, 0);
898 vector<double> s_ij(ncomp * ncomp, 0);
902 for (
size_t i = 0; i < ncomp; i++) {
903 for (
size_t j = 0; j < ncomp; j++) {
926 ghs[idx] = 1 / (1 - zeta[3]) + (d[i] * d[j] / (d[i] + d[j])) * 3 * zeta[2] / (1 - zeta[3]) / (1 - zeta[3])
927 + pow(d[i] * d[j] / (d[i] + d[j]), 2) * 2 * zeta[2] * zeta[2] / pow(1 - zeta[3], 3);
929 zeta[3] / (1 - zeta[3]) / (1 - zeta[3])
930 + (d[i] * d[j] / (d[i] + d[j])) * (3 * zeta[2] / (1 - zeta[3]) / (1 - zeta[3]) + 6 * zeta[2] * zeta[3] / pow(1 - zeta[3], 3))
931 + pow(d[i] * d[j] / (d[i] + d[j]), 2)
932 * (4 * zeta[2] * zeta[2] / pow(1 - zeta[3], 3) + 6 * zeta[2] * zeta[2] * zeta[3] / pow(1 - zeta[3], 4));
936 double ares_hs = 1 / zeta[0]
937 * (3 * zeta[1] * zeta[2] / (1 - zeta[3]) + pow(zeta[2], 3.) / (zeta[3] * pow(1 - zeta[3], 2))
938 + (pow(zeta[2], 3.) / pow(zeta[3], 2.) - zeta[0]) * log(1 - zeta[3]));
939 double Zhs = zeta[3] / (1 - zeta[3]) + 3. * zeta[1] * zeta[2] / zeta[0] / (1. - zeta[3]) / (1. - zeta[3])
940 + (3. * pow(zeta[2], 3.) - zeta[3] * pow(zeta[2], 3.)) / zeta[0] / pow(1. - zeta[3], 3.);
942 static double a0[7] = {0.9105631445, 0.6361281449, 2.6861347891, -26.547362491, 97.759208784, -159.59154087, 91.297774084};
943 static double a1[7] = {-0.3084016918, 0.1860531159, -2.5030047259, 21.419793629, -65.255885330, 83.318680481, -33.746922930};
944 static double a2[7] = {-0.0906148351, 0.4527842806, 0.5962700728, -1.7241829131, -4.1302112531, 13.776631870, -8.6728470368};
945 static double b0[7] = {0.7240946941, 2.2382791861, -4.0025849485, -21.003576815, 26.855641363, 206.55133841, -355.60235612};
946 static double b1[7] = {-0.5755498075, 0.6995095521, 3.8925673390, -17.215471648, 192.67226447, -161.82646165, -165.20769346};
947 static double b2[7] = {0.0976883116, -0.2557574982, -9.1558561530, 20.642075974, -38.804430052, 93.626774077, -29.666905585};
949 vector<double> a(7, 0);
950 vector<double> b(7, 0);
951 for (
int i = 0; i < 7; i++) {
952 a[i] = a0[i] + (m_avg - 1.) / m_avg * a1[i] + (m_avg - 1.) / m_avg * (m_avg - 2.) / m_avg * a2[i];
953 b[i] = b0[i] + (m_avg - 1.) / m_avg * b1[i] + (m_avg - 1.) / m_avg * (m_avg - 2.) / m_avg * b2[i];
956 double detI1_det = 0.0;
957 double detI2_det = 0.0;
960 for (
int i = 0; i < 7; i++) {
961 detI1_det += a[i] * (i + 1) * pow(eta, i);
962 detI2_det += b[i] * (i + 1) * pow(eta, i);
963 I2 += b[i] * pow(eta, i);
964 I1 += a[i] * pow(eta, i);
967 / (1. + m_avg * (8 * eta - 2 * eta * eta) / pow(1 - eta, 4)
968 + (1 - m_avg) * (20 * eta - 27 * eta * eta + 12 * pow(eta, 3) - 2 * pow(eta, 4)) / pow((1 - eta) * (2 - eta), 2.0));
969 double C2 = -1. * C1 * C1
970 * (m_avg * (-4 * eta * eta + 20 * eta + 8) / pow(1 - eta, 5)
971 + (1 - m_avg) * (2 * pow(eta, 3) + 12 * eta * eta - 48 * eta + 40) / pow((1 - eta) * (2 - eta), 3.0));
974 for (
size_t i = 0; i < ncomp; i++) {
978 double ares_hc = m_avg * ares_hs - summ;
979 double ares_disp = -2 * PI * den * I1 * m2es3 - PI * den * m_avg * C1 * I2 * m2e2s3;
982 for (
size_t i = 0; i < ncomp; i++) {
986 double Zhc = m_avg * Zhs - summ;
987 double Zdisp = -2 * PI * den * detI1_det * m2es3 - PI * den * m_avg * (C1 * detI2_det + C2 * eta * I2) * m2e2s3;
989 vector<double> dghsii_dx(ncomp * ncomp, 0);
990 vector<double> dahs_dx(ncomp, 0);
991 vector<double> dzeta_dx(4, 0);
993 for (
size_t i = 0; i < ncomp; i++) {
994 for (
int l = 0; l < 4; l++) {
995 dzeta_dx[l] = PI / 6. * den *
components[i].getM() * pow(d[i], l);
997 for (
size_t j = 0; j < ncomp; j++) {
1000 dzeta_dx[3] / (1 - zeta[3]) / (1 - zeta[3])
1001 + (d[j] * d[j] / (d[j] + d[j])) * (3 * dzeta_dx[2] / (1 - zeta[3]) / (1 - zeta[3]) + 6 * zeta[2] * dzeta_dx[3] / pow(1 - zeta[3], 3))
1002 + pow(d[j] * d[j] / (d[j] + d[j]), 2)
1003 * (4 * zeta[2] * dzeta_dx[2] / pow(1 - zeta[3], 3) + 6 * zeta[2] * zeta[2] * dzeta_dx[3] / pow(1 - zeta[3], 4));
1006 -dzeta_dx[0] / zeta[0] * ares_hs
1008 * (3 * (dzeta_dx[1] * zeta[2] + zeta[1] * dzeta_dx[2]) / (1 - zeta[3])
1009 + 3 * zeta[1] * zeta[2] * dzeta_dx[3] / (1 - zeta[3]) / (1 - zeta[3])
1010 + 3 * zeta[2] * zeta[2] * dzeta_dx[2] / zeta[3] / (1 - zeta[3]) / (1 - zeta[3])
1011 + pow(zeta[2], 3) * dzeta_dx[3] * (3 * zeta[3] - 1) / zeta[3] / zeta[3] / pow(1 - zeta[3], 3)
1013 * ((3 * zeta[2] * zeta[2] * dzeta_dx[2] * zeta[3] - 2 * pow(zeta[2], 3) * dzeta_dx[3]) / pow(zeta[3], 3) - dzeta_dx[0])
1014 + (zeta[0] - pow(zeta[2], 3) / zeta[3] / zeta[3]) * dzeta_dx[3] / (1 - zeta[3]));
1017 vector<double> dadisp_dx(ncomp, 0);
1018 vector<double> dahc_dx(ncomp, 0);
1019 double dzeta3_dx, daa_dx, db_dx, dI1_dx, dI2_dx, dm2es3_dx, dm2e2s3_dx, dC1_dx;
1020 for (
size_t i = 0; i < ncomp; i++) {
1021 dzeta3_dx = PI / 6. * den *
components[i].getM() * pow(d[i], 3);
1026 for (
int l = 0; l < 7; l++) {
1027 daa_dx =
components[i].getM() / m_avg / m_avg * a1[l] +
components[i].getM() / m_avg / m_avg * (3 - 4 / m_avg) * a2[l];
1028 db_dx =
components[i].getM() / m_avg / m_avg * b1[l] +
components[i].getM() / m_avg / m_avg * (3 - 4 / m_avg) * b2[l];
1029 dI1_dx += a[l] * l * dzeta3_dx * pow(eta, l - 1) + daa_dx * pow(eta, l);
1030 dI2_dx += b[l] * l * dzeta3_dx * pow(eta, l - 1) + db_dx * pow(eta, l);
1032 for (
size_t j = 0; j < ncomp; j++) {
1037 dm2es3_dx = dm2es3_dx * 2 *
components[i].getM();
1038 dm2e2s3_dx = dm2e2s3_dx * 2 *
components[i].getM();
1039 dahc_dx[i] =
components[i].getM() * ares_hs + m_avg * dahs_dx[i] - dahc_dx[i] - (
components[i].getM() - 1) * log(ghs[i * ncomp + i]);
1040 dC1_dx = C2 * dzeta3_dx
1042 * (
components[i].getM() * (8 * eta - 2 * eta * eta) / pow(1 - eta, 4)
1043 -
components[i].getM() * (20 * eta - 27 * eta * eta + 12 * pow(eta, 3) - 2 * pow(eta, 4)) / pow((1 - eta) * (2 - eta), 2));
1046 -2 * PI * den * (dI1_dx * m2es3 + I1 * dm2es3_dx)
1047 - PI * den * ((
components[i].getM() * C1 * I2 + m_avg * dC1_dx * I2 + m_avg * C1 * dI2_dx) * m2e2s3 + m_avg * C1 * I2 * dm2e2s3_dx);
1050 vector<double> mu_hc(ncomp, 0);
1051 vector<double> mu_disp(ncomp, 0);
1052 for (
size_t i = 0; i < ncomp; i++) {
1053 for (
size_t j = 0; j < ncomp; j++) {
1057 mu_hc[i] = ares_hc + Zhc + dahc_dx[i] - mu_hc[i];
1058 mu_disp[i] = ares_disp + Zdisp + dadisp_dx[i] - mu_disp[i];
1062 vector<double> mu_polar(ncomp, 0);
1066 double dA2_det = 0.;
1067 double dA3_det = 0.;
1068 vector<double> dA2_dx(ncomp, 0);
1069 vector<double> dA3_dx(ncomp, 0);
1071 static double a0dip[5] = {0.3043504, -0.1358588, 1.4493329, 0.3556977, -2.0653308};
1072 static double a1dip[5] = {0.9534641, -1.8396383, 2.0131180, -7.3724958, 8.2374135};
1073 static double a2dip[5] = {-1.1610080, 4.5258607, 0.9751222, -12.281038, 5.9397575};
1074 static double b0dip[5] = {0.2187939, -1.1896431, 1.1626889, 0, 0};
1075 static double b1dip[5] = {-0.5873164, 1.2489132, -0.5085280, 0, 0};
1076 static double b2dip[5] = {3.4869576, -14.915974, 15.372022, 0, 0};
1077 static double c0dip[5] = {-0.0646774, 0.1975882, -0.8087562, 0.6902849, 0};
1078 static double c1dip[5] = {-0.9520876, 2.9924258, -2.3802636, -0.2701261, 0};
1079 static double c2dip[5] = {-0.6260979, 1.2924686, 1.6542783, -3.4396744, 0};
1081 const static double conv = 7242.702976750923;
1083 vector<double> dipmSQ(ncomp, 0);
1084 for (
size_t i = 0; i < ncomp; i++) {
1088 vector<double> adip(5, 0);
1089 vector<double> bdip(5, 0);
1090 vector<double> cdip(5, 0);
1091 double J2, dJ2_det, detJ2_det, J3, dJ3_det, detJ3_det;
1094 for (
size_t i = 0; i < ncomp; i++) {
1095 for (
size_t j = 0; j < ncomp; j++) {
1103 for (
int l = 0; l < 5; l++) {
1104 adip[l] = a0dip[l] + (m_ij - 1) / m_ij * a1dip[l] + (m_ij - 1) / m_ij * (m_ij - 2) / m_ij * a2dip[l];
1105 bdip[l] = b0dip[l] + (m_ij - 1) / m_ij * b1dip[l] + (m_ij - 1) / m_ij * (m_ij - 2) / m_ij * b2dip[l];
1106 J2 += (adip[l] + bdip[l] * e_ij[i * ncomp + j] /
_T)
1108 dJ2_det += (adip[l] + bdip[l] * e_ij[i * ncomp + j] /
_T) * l * pow(eta, l - 1);
1109 detJ2_det += (adip[l] + bdip[l] * e_ij[i * ncomp + j] /
_T) * (l + 1) * pow(eta, l);
1112 * pow(s_ij[j * ncomp + j], 3) / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum() * dipmSQ[i]
1115 * pow(s_ij[j * ncomp + j], 3) / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum()
1116 * dipmSQ[i] * dipmSQ[j] * detJ2_det;
1118 dA2_dx[i] += e_ij[i * ncomp + i] /
_T * e_ij[j * ncomp + j] /
_T * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3)
1119 / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum() * dipmSQ[i] * dipmSQ[j]
1123 dA2_dx[i] += e_ij[i * ncomp + i] /
_T * e_ij[j * ncomp + j] /
_T * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3)
1124 / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum() * dipmSQ[i] * dipmSQ[j]
1129 for (
size_t k = 0; k < ncomp; k++) {
1137 for (
int l = 0; l < 5; l++) {
1138 cdip[l] = c0dip[l] + (m_ijk - 1) / m_ijk * c1dip[l] + (m_ijk - 1) / m_ijk * (m_ijk - 2) / m_ijk * c2dip[l];
1139 J3 += cdip[l] * pow(eta, l);
1140 dJ3_det += cdip[l] * l * pow(eta, (l - 1));
1141 detJ3_det += cdip[l] * (l + 2) * pow(eta, (l + 1));
1144 * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3)
1145 / s_ij[i * ncomp + j] / s_ij[i * ncomp + k] / s_ij[j * ncomp + k] *
components[i].getDipnum() *
components[j].getDipnum()
1146 *
components[k].getDipnum() * dipmSQ[i] * dipmSQ[j] * dipmSQ[k] * J3;
1148 * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3)
1149 / s_ij[i * ncomp + j] / s_ij[i * ncomp + k] / s_ij[j * ncomp + k] *
components[i].getDipnum()
1150 *
components[j].getDipnum() *
components[k].getDipnum() * dipmSQ[i] * dipmSQ[j] * dipmSQ[k] * detJ3_det;
1151 if ((i == j) && (i == k)) {
1153 e_ij[i * ncomp + i] /
_T * e_ij[j * ncomp + j] /
_T * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3)
1154 * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3) / s_ij[i * ncomp + j] / s_ij[i * ncomp + k]
1156 * dipmSQ[j] * dipmSQ[k]
1159 }
else if ((i == j) || (i == k)) {
1161 e_ij[i * ncomp + i] /
_T * e_ij[j * ncomp + j] /
_T * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3)
1162 * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3) / s_ij[i * ncomp + j] / s_ij[i * ncomp + k]
1164 * dipmSQ[j] * dipmSQ[k]
1169 e_ij[i * ncomp + i] /
_T * e_ij[j * ncomp + j] /
_T * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3)
1170 * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3) / s_ij[i * ncomp + j] / s_ij[i * ncomp + k]
1172 * dipmSQ[j] * dipmSQ[k]
1180 A2 = -PI * den * A2;
1181 A3 = -4 / 3. * PI * PI * den * den * A3;
1182 dA2_det = -PI * den / eta * dA2_det;
1183 dA3_det = -4 / 3. * PI * PI * den / eta * den / eta * dA3_det;
1184 for (
size_t i = 0; i < ncomp; i++) {
1185 dA2_dx[i] = -PI * den * dA2_dx[i];
1186 dA3_dx[i] = -4 / 3. * PI * PI * den * den * dA3_dx[i];
1189 vector<double> dapolar_dx(ncomp);
1190 for (
size_t i = 0; i < ncomp; i++) {
1191 dapolar_dx[i] = (dA2_dx[i] * (1 - A3 / A2) + (dA3_dx[i] * A2 - A3 * dA2_dx[i]) / A2) / pow(1 - A3 / A2, 2);
1195 double ares_polar = A2 / (1 - A3 / A2);
1196 double Zpolar = eta * ((dA2_det * (1 - A3 / A2) + (dA3_det * A2 - A3 * dA2_det) / A2) / (1 - A3 / A2) / (1 - A3 / A2));
1197 for (
size_t i = 0; i < ncomp; i++) {
1198 for (
size_t j = 0; j < ncomp; j++) {
1201 mu_polar[i] = ares_polar + Zpolar + dapolar_dx[i] - mu_polar[i];
1207 vector<double> mu_assoc(ncomp, 0);
1211 for (std::vector<int>::iterator it =
assoc_num.begin(); it !=
assoc_num.end(); ++it) {
1213 for (
int i = 0; i < *it; i++) {
1214 iA.push_back(
static_cast<int>(it -
assoc_num.begin()));
1218 vector<double> x_assoc(num_sites);
1219 for (
int i = 0; i < num_sites; i++) {
1224 vector<double> XA(num_sites, 0);
1225 vector<double> delta_ij(num_sites * num_sites, 0);
1226 std::size_t idxa = 0UL;
1227 std::size_t idxi = 0UL;
1228 std::size_t idxj = 0UL;
1229 for (
auto i = 0UL; i < static_cast<std::size_t>(num_sites); i++) {
1230 idxi = iA[i] * ncomp + iA[i];
1231 for (
auto j = 0UL; j < static_cast<std::size_t>(num_sites); j++) {
1232 idxj = iA[j] * ncomp + iA[j];
1236 * pow(sqrt(s_ij[idxi] * s_ij[idxj]) / (0.5 * (s_ij[idxi] + s_ij[idxj])), 3);
1237 delta_ij[idxa] = ghs[iA[i] * ncomp + iA[j]] * (exp(eABij /
_T) - 1) * pow(s_ij[iA[i] * ncomp + iA[j]], 3) * volABij;
1241 XA[i] = (-1 + sqrt(1 + 8 * den * delta_ij[i * num_sites + i])) / (4 * den * delta_ij[i * num_sites + i]);
1242 if (!std::isfinite(XA[i])) {
1247 vector<double> ddelta_dx(num_sites * num_sites * ncomp, 0);
1249 for (
size_t k = 0; k < ncomp; k++) {
1250 std::size_t idxi = 0UL;
1251 std::size_t idxj = 0UL;
1253 for (
auto i = 0UL; i < static_cast<std::size_t>(num_sites); i++) {
1254 idxi = iA[i] * ncomp + iA[i];
1255 for (
auto j = 0UL; j < static_cast<std::size_t>(num_sites); j++) {
1256 idxj = iA[j] * ncomp + iA[j];
1260 * pow(sqrt(s_ij[idxi] * s_ij[idxj]) / (0.5 * (s_ij[idxi] + s_ij[idxj])), 3);
1263 * (pow(d[k], 3) / (1 - zeta[3]) / (1 - zeta[3])
1264 + 3 * d[iA[i]] * d[iA[j]] / (d[iA[i]] + d[iA[j]])
1265 * (d[k] * d[k] / (1 - zeta[3]) / (1 - zeta[3]) + 2 * pow(d[k], 3) * zeta[2] / pow(1 - zeta[3], 3))
1266 + 2 * pow((d[iA[i]] * d[iA[j]] / (d[iA[i]] + d[iA[j]])), 2)
1267 * (2 * d[k] * d[k] * zeta[2] / pow(1 - zeta[3], 3) + 3 * (pow(d[k], 3) * zeta[2] * zeta[2] / pow(1 - zeta[3], 4))));
1268 ddelta_dx[idx_ddelta] = dghsd_dx * (exp(eABij /
_T) - 1) * pow(s_ij[iA[i] * ncomp + iA[j]], 3) * volABij;
1278 vector<double> XA_old = XA;
1279 while ((ctr < 100) && (dif > 1e-15)) {
1281 XA =
XA_find(XA_old, delta_ij, den, x_assoc);
1283 for (
int i = 0; i < num_sites; i++) {
1284 dif += abs(XA[i] - XA_old[i]);
1286 for (
int i = 0; i < num_sites; i++) {
1287 XA_old[i] = (XA[i] + XA_old[i]) / 2.0;
1291 vector<double> dXA_dx(num_sites * ncomp, 0);
1295 for (
size_t i = 0; i < ncomp; i++) {
1296 for (
int j = 0; j < num_sites; j++) {
1297 mu_assoc[i] +=
mole_fractions[iA[j]] * den * dXA_dx[ij] * (1 / XA[j] - 0.5);
1302 for (
int i = 0; i < num_sites; i++) {
1303 mu_assoc[iA[i]] += log(XA[i]) - 0.5 * XA[i] + 0.5;
1308 vector<double> mu_ion(ncomp, 0);
1310 vector<double> q(ncomp);
1311 for (
size_t i = 0; i < ncomp; i++) {
1316 for (
size_t i = 0; i < ncomp; i++) {
1320 sqrt(den * E_CHRG * E_CHRG / kb /
_T / (
dielc * perm_vac) * summ);
1323 vector<double> chi(ncomp);
1324 vector<double> sigma_k(ncomp);
1327 for (
size_t i = 0; i < ncomp; i++) {
1328 chi[i] = 3 / pow(kappa * d[i], 3) * (1.5 + log(1 + kappa * d[i]) - 2 * (1 + kappa * d[i]) + 0.5 * pow(1 + kappa * d[i], 2));
1329 sigma_k[i] = -2 * chi[i] + 3 / (1 + kappa * d[i]);
1334 for (
size_t i = 0; i < ncomp; i++) {
1335 mu_ion[i] = -q[i] * q[i] * kappa / 24. / PI / kb /
_T / (
dielc * perm_vac) * (2 * chi[i] + summ1 / summ2);
1342 vector<double> mu(ncomp, 0);
1343 vector<CoolPropDbl> fugcoef(ncomp, 0);
1344 for (
size_t i = 0; i < ncomp; i++) {
1345 mu[i] = mu_hc[i] + mu_disp[i] + mu_polar[i] + mu_assoc[i] + mu_ion[i];
1346 fugcoef[i] = exp(mu[i] - log(Z));
1356 CoolPropDbl gres = (ares + (Z - 1) - log(Z)) * kb * N_AV *
_T;
1362 vector<double> d(ncomp);
1363 for (
auto i = 0UL; i < ncomp; i++) {
1367 for (
auto i = 0UL; i < ncomp; i++) {
1377 vector<double> zeta(4, 0);
1379 for (
int i = 0; i < 4; i++) {
1381 for (
size_t j = 0; j < ncomp; j++) {
1384 zeta[i] = PI / 6 * den * summ;
1387 double eta = zeta[3];
1389 for (
size_t i = 0; i < ncomp; i++) {
1393 vector<double> ghs(ncomp * ncomp, 0);
1394 vector<double> denghs(ncomp * ncomp, 0);
1395 vector<double> e_ij(ncomp * ncomp, 0);
1396 vector<double> s_ij(ncomp * ncomp, 0);
1400 for (
size_t i = 0; i < ncomp; i++) {
1401 for (
size_t j = 0; j < ncomp; j++) {
1424 ghs[idx] = 1 / (1 - zeta[3]) + (d[i] * d[j] / (d[i] + d[j])) * 3 * zeta[2] / (1 - zeta[3]) / (1 - zeta[3])
1425 + pow(d[i] * d[j] / (d[i] + d[j]), 2) * 2 * zeta[2] * zeta[2] / pow(1 - zeta[3], 3);
1427 zeta[3] / (1 - zeta[3]) / (1 - zeta[3])
1428 + (d[i] * d[j] / (d[i] + d[j])) * (3 * zeta[2] / (1 - zeta[3]) / (1 - zeta[3]) + 6 * zeta[2] * zeta[3] / pow(1 - zeta[3], 3))
1429 + pow(d[i] * d[j] / (d[i] + d[j]), 2)
1430 * (4 * zeta[2] * zeta[2] / pow(1 - zeta[3], 3) + 6 * zeta[2] * zeta[2] * zeta[3] / pow(1 - zeta[3], 4));
1434 double Zhs = zeta[3] / (1 - zeta[3]) + 3. * zeta[1] * zeta[2] / zeta[0] / (1. - zeta[3]) / (1. - zeta[3])
1435 + (3. * pow(zeta[2], 3.) - zeta[3] * pow(zeta[2], 3.)) / zeta[0] / pow(1. - zeta[3], 3.);
1437 static double a0[7] = {0.9105631445, 0.6361281449, 2.6861347891, -26.547362491, 97.759208784, -159.59154087, 91.297774084};
1438 static double a1[7] = {-0.3084016918, 0.1860531159, -2.5030047259, 21.419793629, -65.255885330, 83.318680481, -33.746922930};
1439 static double a2[7] = {-0.0906148351, 0.4527842806, 0.5962700728, -1.7241829131, -4.1302112531, 13.776631870, -8.6728470368};
1440 static double b0[7] = {0.7240946941, 2.2382791861, -4.0025849485, -21.003576815, 26.855641363, 206.55133841, -355.60235612};
1441 static double b1[7] = {-0.5755498075, 0.6995095521, 3.8925673390, -17.215471648, 192.67226447, -161.82646165, -165.20769346};
1442 static double b2[7] = {0.0976883116, -0.2557574982, -9.1558561530, 20.642075974, -38.804430052, 93.626774077, -29.666905585};
1444 vector<double> a(7, 0);
1445 vector<double> b(7, 0);
1446 for (
int i = 0; i < 7; i++) {
1447 a[i] = a0[i] + (m_avg - 1.) / m_avg * a1[i] + (m_avg - 1.) / m_avg * (m_avg - 2.) / m_avg * a2[i];
1448 b[i] = b0[i] + (m_avg - 1.) / m_avg * b1[i] + (m_avg - 1.) / m_avg * (m_avg - 2.) / m_avg * b2[i];
1451 double detI1_det = 0.0;
1452 double detI2_det = 0.0;
1454 for (
int i = 0; i < 7; i++) {
1455 detI1_det += a[i] * (i + 1) * pow(eta, i);
1456 detI2_det += b[i] * (i + 1) * pow(eta, i);
1457 I2 += b[i] * pow(eta, i);
1460 / (1. + m_avg * (8 * eta - 2 * eta * eta) / pow(1 - eta, 4)
1461 + (1 - m_avg) * (20 * eta - 27 * eta * eta + 12 * pow(eta, 3) - 2 * pow(eta, 4)) / pow((1 - eta) * (2 - eta), 2.0));
1462 double C2 = -1. * C1 * C1
1463 * (m_avg * (-4 * eta * eta + 20 * eta + 8) / pow(1 - eta, 5)
1464 + (1 - m_avg) * (2 * pow(eta, 3) + 12 * eta * eta - 48 * eta + 40) / pow((1 - eta) * (2 - eta), 3.0));
1467 for (
size_t i = 0; i < ncomp; i++) {
1472 double Zhc = m_avg * Zhs - summ;
1473 double Zdisp = -2 * PI * den * detI1_det * m2es3 - PI * den * m_avg * (C1 * detI2_det + C2 * eta * I2) * m2e2s3;
1480 double dA2_det = 0.;
1481 double dA3_det = 0.;
1482 vector<double> adip(5, 0);
1483 vector<double> bdip(5, 0);
1484 vector<double> cdip(5, 0);
1485 vector<double> dipmSQ(ncomp, 0);
1486 double J2, detJ2_det, J3, detJ3_det;
1488 static double a0dip[5] = {0.3043504, -0.1358588, 1.4493329, 0.3556977, -2.0653308};
1489 static double a1dip[5] = {0.9534641, -1.8396383, 2.0131180, -7.3724958, 8.2374135};
1490 static double a2dip[5] = {-1.1610080, 4.5258607, 0.9751222, -12.281038, 5.9397575};
1491 static double b0dip[5] = {0.2187939, -1.1896431, 1.1626889, 0, 0};
1492 static double b1dip[5] = {-0.5873164, 1.2489132, -0.5085280, 0, 0};
1493 static double b2dip[5] = {3.4869576, -14.915974, 15.372022, 0, 0};
1494 static double c0dip[5] = {-0.0646774, 0.1975882, -0.8087562, 0.6902849, 0};
1495 static double c1dip[5] = {-0.9520876, 2.9924258, -2.3802636, -0.2701261, 0};
1496 static double c2dip[5] = {-0.6260979, 1.2924686, 1.6542783, -3.4396744, 0};
1498 const static double conv = 7242.702976750923;
1500 for (
size_t i = 0; i < ncomp; i++) {
1505 for (
size_t i = 0; i < ncomp; i++) {
1506 for (
size_t j = 0; j < ncomp; j++) {
1513 for (
int l = 0; l < 5; l++) {
1514 adip[l] = a0dip[l] + (m_ij - 1) / m_ij * a1dip[l] + (m_ij - 1) / m_ij * (m_ij - 2) / m_ij * a2dip[l];
1515 bdip[l] = b0dip[l] + (m_ij - 1) / m_ij * b1dip[l] + (m_ij - 1) / m_ij * (m_ij - 2) / m_ij * b2dip[l];
1516 J2 += (adip[l] + bdip[l] * e_ij[i * ncomp + j] /
_T)
1518 detJ2_det += (adip[l] + bdip[l] * e_ij[i * ncomp + j] /
_T) * (l + 1) * pow(eta, l);
1521 * pow(s_ij[j * ncomp + j], 3) / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum() * dipmSQ[i]
1524 * pow(s_ij[j * ncomp + j], 3) / pow(s_ij[i * ncomp + j], 3) *
components[i].getDipnum() *
components[j].getDipnum()
1525 * dipmSQ[i] * dipmSQ[j] * detJ2_det;
1530 for (
size_t i = 0; i < ncomp; i++) {
1531 for (
size_t j = 0; j < ncomp; j++) {
1532 for (
size_t k = 0; k < ncomp; k++) {
1539 for (
int l = 0; l < 5; l++) {
1540 cdip[l] = c0dip[l] + (m_ijk - 1) / m_ijk * c1dip[l] + (m_ijk - 1) / m_ijk * (m_ijk - 2) / m_ijk * c2dip[l];
1541 J3 += cdip[l] * pow(eta, l);
1542 detJ3_det += cdip[l] * (l + 2) * pow(eta, (l + 1));
1545 * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3)
1546 / s_ij[i * ncomp + j] / s_ij[i * ncomp + k] / s_ij[j * ncomp + k] *
components[i].getDipnum() *
components[j].getDipnum()
1547 *
components[k].getDipnum() * dipmSQ[i] * dipmSQ[j] * dipmSQ[k] * J3;
1549 * e_ij[k * ncomp + k] /
_T * pow(s_ij[i * ncomp + i], 3) * pow(s_ij[j * ncomp + j], 3) * pow(s_ij[k * ncomp + k], 3)
1550 / s_ij[i * ncomp + j] / s_ij[i * ncomp + k] / s_ij[j * ncomp + k] *
components[i].getDipnum()
1551 *
components[j].getDipnum() *
components[k].getDipnum() * dipmSQ[i] * dipmSQ[j] * dipmSQ[k] * detJ3_det;
1556 A2 = -PI * den * A2;
1557 A3 = -4 / 3. * PI * PI * den * den * A3;
1558 dA2_det = -PI * den / eta * dA2_det;
1559 dA3_det = -4 / 3. * PI * PI * den / eta * den / eta * dA3_det;
1562 Zpolar = eta * ((dA2_det * (1 - A3 / A2) + (dA3_det * A2 - A3 * dA2_det) / A2) / (1 - A3 / A2) / (1 - A3 / A2));
1571 for (std::vector<int>::iterator it =
assoc_num.begin(); it !=
assoc_num.end(); ++it) {
1573 for (
int i = 0; i < *it; i++) {
1574 iA.push_back(
static_cast<int>(it -
assoc_num.begin()));
1578 vector<double> x_assoc(num_sites);
1579 for (
int i = 0; i < num_sites; i++) {
1584 vector<double> XA(num_sites, 0);
1585 vector<double> delta_ij(num_sites * num_sites, 0);
1586 std::size_t idxa = 0UL;
1587 std::size_t idxi = 0UL;
1588 std::size_t idxj = 0UL;
1589 for (
auto i = 0UL; i < static_cast<std::size_t>(num_sites); i++) {
1590 idxi = iA[i] * ncomp + iA[i];
1591 for (
auto j = 0UL; j < static_cast<std::size_t>(num_sites); j++) {
1592 idxj = iA[j] * ncomp + iA[j];
1596 * pow(sqrt(s_ij[idxi] * s_ij[idxj]) / (0.5 * (s_ij[idxi] + s_ij[idxj])), 3);
1597 delta_ij[idxa] = ghs[iA[i] * ncomp + iA[j]] * (exp(eABij /
_T) - 1) * pow(s_ij[iA[i] * ncomp + iA[j]], 3) * volABij;
1601 XA[i] = (-1 + sqrt(1 + 8 * den * delta_ij[i * num_sites + i])) / (4 * den * delta_ij[i * num_sites + i]);
1602 if (!std::isfinite(XA[i])) {
1607 vector<double> ddelta_dx(num_sites * num_sites * ncomp, 0);
1609 for (
size_t k = 0; k < ncomp; k++) {
1610 std::size_t idxi = 0UL;
1611 std::size_t idxj = 0UL;
1613 for (
auto i = 0UL; i < static_cast<std::size_t>(num_sites); i++) {
1614 idxi = iA[i] * ncomp + iA[i];
1615 for (
auto j = 0UL; j < static_cast<std::size_t>(num_sites); j++) {
1616 idxj = iA[j] * ncomp + iA[j];
1620 * pow(sqrt(s_ij[idxi] * s_ij[idxj]) / (0.5 * (s_ij[idxi] + s_ij[idxj])), 3);
1623 * (pow(d[k], 3) / (1 - zeta[3]) / (1 - zeta[3])
1624 + 3 * d[iA[i]] * d[iA[j]] / (d[iA[i]] + d[iA[j]])
1625 * (d[k] * d[k] / (1 - zeta[3]) / (1 - zeta[3]) + 2 * pow(d[k], 3) * zeta[2] / pow(1 - zeta[3], 3))
1626 + 2 * pow((d[iA[i]] * d[iA[j]] / (d[iA[i]] + d[iA[j]])), 2)
1627 * (2 * d[k] * d[k] * zeta[2] / pow(1 - zeta[3], 3) + 3 * (pow(d[k], 3) * zeta[2] * zeta[2] / pow(1 - zeta[3], 4))));
1628 ddelta_dx[idx_ddelta] = dghsd_dx * (exp(eABij /
_T) - 1) * pow(s_ij[iA[i] * ncomp + iA[j]], 3) * volABij;
1638 vector<double> XA_old = XA;
1639 while ((ctr < 100) && (dif > 1e-14)) {
1641 XA =
XA_find(XA_old, delta_ij, den, x_assoc);
1643 for (
int i = 0; i < num_sites; i++) {
1644 dif += abs(XA[i] - XA_old[i]);
1646 for (
int i = 0; i < num_sites; i++) {
1647 XA_old[i] = (XA[i] + XA_old[i]) / 2.0;
1651 vector<double> dXA_dx(num_sites * ncomp, 0);
1656 for (
size_t i = 0; i < ncomp; i++) {
1657 for (
int j = 0; j < num_sites; j++) {
1669 vector<double> q(ncomp);
1670 for (
size_t i = 0; i < ncomp; i++) {
1675 for (
size_t i = 0; i < ncomp; i++) {
1680 sqrt(den * E_CHRG * E_CHRG / kb /
_T / (
dielc * perm_vac) * summ);
1683 double chi, sigma_k;
1685 for (
size_t i = 0; i < ncomp; i++) {
1686 chi = 3 / pow(kappa * d[i], 3) * (1.5 + log(1 + kappa * d[i]) - 2 * (1 + kappa * d[i]) + 0.5 * pow(1 + kappa * d[i], 2));
1687 sigma_k = -2 * chi + 3 / (1 + kappa * d[i]);
1690 Zion = -1 * kappa / 24. / PI / kb /
_T / (
dielc * perm_vac) * summ;
1694 double Z = Zid + Zhc + Zdisp + Zpolar + Zassoc + Zion;
1710 throw ValueError(
"rhomolar is less than zero");
1713 throw ValueError(
"rhomolar is not a valid number");
1716 if (optional_checks) {
1728 std::cout <<
format(
"%s (%d): update called with (%d: (%s), %g, %g)", __FILE__, __LINE__, input_pair,
1734 CoolPropDbl ld_value1 = value1, ld_value2 = value2;
1742 throw ValueError(
"Mole fractions must be set");
1745 if (
SatL->mole_fractions.empty()) {
1748 if (
SatV->mole_fractions.empty()) {
1751 for (
size_t i = 0; i <
N; i++) {
1752 if (
SatV->components[i].getZ() != 0) {
1753 SatV->mole_fractions[i] = 0;
1755 summ +=
SatV->mole_fractions[i];
1758 for (
size_t i = 0; i <
N; i++) {
1759 SatV->mole_fractions[i] =
SatV->mole_fractions[i] / summ;
1766 switch (input_pair) {
1812 if ((
_Q < 0) || (
_Q > 1)) {
1820 SatL->_rhomolar = value1;
1821 SatV->_rhomolar = value1;
1874 double p_input, rho_input;
1875 double p_bub, p_dew, p_equil;
1876 switch (input_pair) {
1887 if (p_input > 1.6 * p_equil) {
1889 }
else if (p_input < 0.5 * p_equil) {
1909 }
else if (
_p == p_bub) {
1921 }
else if ((
_p <= p_bub) && (
_p >= p_dew)) {
1930 double rho_bub, rho_dew;
1981 bool solution_found =
false;
1987 solution_found =
true;
1993 if (!solution_found) {
1994 double p_lbound = -6;
1995 double p_ubound = 9;
1996 double p_step = 0.1;
1998 while (p_guess < p_ubound && !solution_found) {
2000 p =
outerTQ(pow(10, p_guess), PCSAFT);
2001 solution_found =
true;
2010 if (!solution_found) {
2011 throw SolutionError(
"solution could not be found for TQ flash");
2016 PCSAFT.
_rhomolar = 1 / (PCSAFT.
_Q / PCSAFT.
SatV->_rhomolar + (1 - PCSAFT.
_Q) / PCSAFT.
SatL->_rhomolar);
2021 bool solution_found =
false;
2027 solution_found =
true;
2033 if (!solution_found) {
2034 double t_lbound = 1;
2035 double t_ubound = 800;
2042 while (t_guess > t_lbound && !solution_found) {
2045 solution_found =
true;
2054 if (!solution_found) {
2055 throw SolutionError(
"solution could not be found for PQ flash");
2060 PCSAFT.
_rhomolar = 1 / (PCSAFT.
_Q / PCSAFT.
SatV->_rhomolar + (1 - PCSAFT.
_Q) / PCSAFT.
SatL->_rhomolar);
2076 vector<CoolPropDbl> u;
2078 SolverInnerResid(
PCSAFTBackend& PCSAFT,
CoolPropDbl kb0, vector<CoolPropDbl> u) : PCSAFT(PCSAFT), kb0(kb0), u(u) {}
2083 vector<double> pp(ncomp, 0);
2085 for (
auto i = 0U; i < ncomp; i++) {
2087 pp[i] = PCSAFT.
mole_fractions[i] / (1 - R + kb0 * R * exp(u[i]));
2095 error = pow((L + PCSAFT.
_Q - 1), 2.);
2101 for (
size_t i = 0; i < ncomp; i++) {
2108 vector<double> k(ncomp, 0), u(ncomp, 0), kprime(ncomp, 0), uprime(ncomp, 0);
2109 double Tref = t_guess - 1;
2110 double Tprime = t_guess + 1;
2113 PCSAFT.
SatL->_T = t;
2114 PCSAFT.
SatV->_T = t;
2130 if ((PCSAFT.
SatL->_rhomolar - PCSAFT.
SatV->_rhomolar) < 1e-4) {
2131 throw SolutionError(
"liquid and vapor densities are the same.");
2133 vector<double> fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2134 vector<double> fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2138 for (
size_t i = 0; i < ncomp; i++) {
2140 k[i] = fugcoef_l[i] / fugcoef_v[i];
2145 xl_sum += PCSAFT.
SatL->mole_fractions[i];
2146 PCSAFT.
SatV->mole_fractions[i] = k[i] * PCSAFT.
mole_fractions[i] / (1 + PCSAFT.
_Q * (k[i] - 1));
2147 xv_sum += PCSAFT.
SatV->mole_fractions[i];
2151 for (
size_t i = 0; i < ncomp; i++) {
2152 PCSAFT.
SatV->mole_fractions[i] = PCSAFT.
SatV->mole_fractions[i] / xv_sum;
2157 for (
size_t i = 0; i < ncomp; i++) {
2158 PCSAFT.
SatL->mole_fractions[i] = PCSAFT.
SatL->mole_fractions[i] / xl_sum;
2163 fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2165 fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2166 for (
size_t i = 0; i < ncomp; i++) {
2167 k[i] = fugcoef_l[i] / fugcoef_v[i];
2170 PCSAFT.
SatL->_T = Tprime;
2171 PCSAFT.
SatV->_T = Tprime;
2175 PCSAFT.
SatL->components[
water_idx].calc_water_sigma(Tprime);
2176 PCSAFT.
SatV->components[
water_idx].calc_water_sigma(Tprime);
2183 fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2185 fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2186 for (
size_t i = 0; i < ncomp; i++) {
2187 kprime[i] = fugcoef_l[i] / fugcoef_v[i];
2190 vector<double> t_weight(ncomp);
2192 for (
size_t i = 0; i < ncomp; i++) {
2193 double dlnk_dt = (kprime[i] - k[i]) / (Tprime - t);
2194 t_weight[i] = PCSAFT.
SatV->mole_fractions[i] * dlnk_dt / (1 + PCSAFT.
_Q * (k[i] - 1));
2195 t_sum += t_weight[i];
2199 for (
size_t i = 0; i < ncomp; i++) {
2200 double wi = t_weight[i] / t_sum;
2202 kb += wi * std::log(k[i]);
2208 for (
size_t i = 0; i < ncomp; i++) {
2209 double dlnk_dt = (kprime[i] - k[i]) / (Tprime - t);
2210 t_weight[i] = PCSAFT.
SatV->mole_fractions[i] * dlnk_dt / (1 + PCSAFT.
_Q * (kprime[i] - 1));
2211 t_sum += t_weight[i];
2215 for (
size_t i = 0; i < ncomp; i++) {
2216 double wi = t_weight[i] / t_sum;
2218 kbprime += wi * std::log(kprime[i]);
2221 kbprime = std::exp(kbprime);
2222 double kb0 = kbprime;
2224 for (
size_t i = 0; i < ncomp; i++) {
2225 u[i] = std::log(k[i] / kb);
2226 uprime[i] = std::log(kprime[i] / kbprime);
2229 double B = std::log(kbprime / kb) / (1 / Tprime - 1 / t);
2230 double A = std::log(kb) - B * (1 / t - 1 / Tref);
2233 SolverInnerResid resid(*
this, kb0, u);
2235 vector<double> pp(ncomp, 0);
2236 double maxdif = 1e10 * TOL;
2238 double Rmin = 0, Rmax = 1;
2239 while (maxdif > TOL && itr < MAXITER) {
2241 vector<double> u_old = u;
2245 double R0 = kb * PCSAFT.
_Q / (kb * PCSAFT.
_Q + kb0 * (1 - PCSAFT.
_Q));
2247 if (resid.call(R) > TOL) {
2252 double eupp_sum = 0;
2253 for (
size_t i = 0; i < ncomp; i++) {
2254 pp[i] = PCSAFT.
mole_fractions[i] / (1 - R + kb0 * R * std::exp(u[i]));
2257 eupp_sum += std::exp(u[i]) * pp[i];
2260 kb = pp_sum / eupp_sum;
2262 t = 1 / (1 / Tref + (std::log(kb) - A) / B);
2263 for (
size_t i = 0; i < ncomp; i++) {
2265 PCSAFT.
SatL->mole_fractions[i] = pp[i] / pp_sum;
2266 PCSAFT.
SatV->mole_fractions[i] = std::exp(u[i]) * pp[i] / eupp_sum;
2268 PCSAFT.
SatL->mole_fractions[i] = pp[i] / pp_sum * (1 - x_ions / (1 - PCSAFT.
_Q));
2269 PCSAFT.
SatV->mole_fractions[i] = std::exp(u[i]) * pp[i] / eupp_sum;
2272 PCSAFT.
SatV->mole_fractions[i] = 0;
2276 PCSAFT.
SatL->_T = t;
2277 PCSAFT.
SatV->_T = t;
2289 vector<CoolPropDbl> fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2291 vector<CoolPropDbl> fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2292 for (
size_t i = 0; i < ncomp; i++) {
2293 k[i] = fugcoef_l[i] / fugcoef_v[i];
2294 u[i] = std::log(k[i] / kb);
2298 B = std::log(kbprime / kb) / (1 / Tprime - 1 / t);
2303 A = std::log(kb) - B * (1 / t - 1 / Tref);
2305 maxdif = std::abs(A - A_old);
2306 for (
size_t i = 0; i < ncomp; i++) {
2308 double dif = std::abs(u[i] - u_old[i]);
2318 if (!std::isfinite(t) || maxdif > 1e-3 || t < 0) {
2319 throw SolutionError(
"outerPQ did not converge to a solution");
2337 vector<CoolPropDbl> u;
2339 SolverInnerResid(
PCSAFTBackend& PCSAFT,
CoolPropDbl kb0, vector<CoolPropDbl> u) : PCSAFT(PCSAFT), kb0(kb0), u(u) {}
2344 vector<double> pp(ncomp, 0);
2347 for (
size_t i = 0; i < ncomp; i++) {
2349 pp[i] = PCSAFT.
mole_fractions[i] / (1 - R + kb0 * R * exp(u[i]));
2357 error = pow((L + PCSAFT.
_Q - 1), 2.);
2363 for (
size_t i = 0; i < ncomp; i++) {
2370 vector<double> k(ncomp, 0), u(ncomp, 0), kprime(ncomp, 0), uprime(ncomp, 0);
2371 double Pref = p_guess - 0.01 * p_guess;
2372 double Pprime = p_guess + 0.01 * p_guess;
2373 if (p_guess > 1e6) {
2374 Pprime = p_guess - 0.005 * p_guess;
2381 if ((PCSAFT.
SatL->_rhomolar - PCSAFT.
SatV->_rhomolar) < 1e-4) {
2382 throw SolutionError(
"liquid and vapor densities are the same.");
2384 vector<double> fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2385 vector<double> fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2389 for (
size_t i = 0; i < ncomp; i++) {
2391 k[i] = fugcoef_l[i] / fugcoef_v[i];
2396 xl_sum += PCSAFT.
SatL->mole_fractions[i];
2397 PCSAFT.
SatV->mole_fractions[i] = k[i] * PCSAFT.
mole_fractions[i] / (1 + PCSAFT.
_Q * (k[i] - 1));
2398 xv_sum += PCSAFT.
SatV->mole_fractions[i];
2402 for (
size_t i = 0; i < ncomp; i++) {
2403 PCSAFT.
SatV->mole_fractions[i] = PCSAFT.
SatV->mole_fractions[i] / xv_sum;
2408 for (
size_t i = 0; i < ncomp; i++) {
2409 PCSAFT.
SatL->mole_fractions[i] = PCSAFT.
SatL->mole_fractions[i] / xl_sum;
2414 fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2416 fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2417 for (
size_t i = 0; i < ncomp; i++) {
2418 k[i] = fugcoef_l[i] / fugcoef_v[i];
2419 u[i] = std::log(k[i] / kb);
2423 fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2425 fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2426 for (
size_t i = 0; i < ncomp; i++) {
2427 kprime[i] = fugcoef_l[i] / fugcoef_v[i];
2430 vector<double> t_weight(ncomp);
2432 for (
size_t i = 0; i < ncomp; i++) {
2433 double dlnk_dt = (kprime[i] - k[i]) / (Pprime -
p);
2434 t_weight[i] = PCSAFT.
SatV->mole_fractions[i] * dlnk_dt / (1 + PCSAFT.
_Q * (k[i] - 1));
2435 t_sum += t_weight[i];
2439 for (
size_t i = 0; i < ncomp; i++) {
2440 double wi = t_weight[i] / t_sum;
2442 kb += wi * std::log(k[i]);
2448 for (
size_t i = 0; i < ncomp; i++) {
2449 double dlnk_dt = (kprime[i] - k[i]) / (Pprime -
p);
2450 t_weight[i] = PCSAFT.
SatV->mole_fractions[i] * dlnk_dt / (1 + PCSAFT.
_Q * (kprime[i] - 1));
2451 t_sum += t_weight[i];
2455 for (
size_t i = 0; i < ncomp; i++) {
2456 double wi = t_weight[i] / t_sum;
2458 kbprime += wi * std::log(kprime[i]);
2461 kbprime = std::exp(kbprime);
2462 double kb0 = kbprime;
2464 for (
size_t i = 0; i < ncomp; i++) {
2465 u[i] = std::log(k[i] / kb);
2466 uprime[i] = std::log(kprime[i] / kbprime);
2469 double B = std::log(kbprime / kb) / (1 / Pprime - 1 /
p);
2470 double A = std::log(kb) - B * (1 /
p - 1 / Pref);
2477 SolverInnerResid resid(*
this, kb0, u);
2479 vector<double> pp(ncomp, 0);
2480 double maxdif = 1e10 * TOL;
2482 double Rmin = 0, Rmax = 1;
2483 while (maxdif > TOL && itr < MAXITER) {
2485 vector<double> u_old = u;
2488 double R0 = kb * PCSAFT.
_Q / (kb * PCSAFT.
_Q + kb0 * (1 - PCSAFT.
_Q));
2491 if (resid.call(R) > TOL) {
2496 double eupp_sum = 0;
2497 for (
size_t i = 0; i < ncomp; i++) {
2498 pp[i] = PCSAFT.
mole_fractions[i] / (1 - R + kb0 * R * std::exp(u[i]));
2501 eupp_sum += std::exp(u[i]) * pp[i];
2504 kb = pp_sum / eupp_sum;
2506 p = 1 / (1 / Pref + (std::log(kb) - A) / B);
2507 for (
size_t i = 0; i < ncomp; i++) {
2509 PCSAFT.
SatL->mole_fractions[i] = pp[i] / pp_sum;
2510 PCSAFT.
SatV->mole_fractions[i] = std::exp(u[i]) * pp[i] / eupp_sum;
2512 PCSAFT.
SatL->mole_fractions[i] = pp[i] / pp_sum * (1 - x_ions / (1 - PCSAFT.
_Q));
2513 PCSAFT.
SatV->mole_fractions[i] = std::exp(u[i]) * pp[i] / eupp_sum;
2516 PCSAFT.
SatV->mole_fractions[i] = 0;
2521 vector<CoolPropDbl> fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2523 vector<CoolPropDbl> fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2524 for (
size_t i = 0; i < ncomp; i++) {
2525 k[i] = fugcoef_l[i] / fugcoef_v[i];
2526 u[i] = std::log(k[i] / kb);
2530 B = std::log(kbprime / kb) / (1 / Pprime - 1 /
p);
2532 A = std::log(kb) - B * (1 /
p - 1 / Pref);
2534 maxdif = std::abs(A - A_old);
2535 for (
size_t i = 0; i < ncomp; i++) {
2537 double dif = std::abs(u[i] - u_old[i]);
2540 }
else if (!std::isfinite(dif)) {
2548 if (!std::isfinite(
p) || !std::isfinite(maxdif) || maxdif > 0.1 ||
p < 0) {
2549 throw SolutionError(
"outerTQ did not converge to a solution");
2559 double t_guess = _HUGE;
2563 for (
size_t i = 0; i < ncomp; i++) {
2569 bool guess_found =
false;
2571 double t_start = 571;
2572 double t_lbound = 1;
2578 while (!guess_found && t_start > t_lbound) {
2580 double Tprime = t_start - 50;
2583 PCSAFT.
SatL->_T = t;
2584 PCSAFT.
SatV->_T = t;
2599 PCSAFT.
SatL->_T = Tprime;
2600 PCSAFT.
SatV->_T = Tprime;
2602 PCSAFT.
SatL->_T = t;
2603 PCSAFT.
SatV->_T = t;
2605 double slope = (std::log10(p1) - std::log10(p2)) / (1 / t - 1 / Tprime);
2606 double intercept = std::log10(p1) - slope * (1 / t);
2607 t_guess = slope / (std::log10(PCSAFT.
_p) - intercept);
2615 throw SolutionError(
"an estimate for the VLE temperature could not be found");
2625 double p_guess = _HUGE;
2629 for (
auto i = 0U; i < ncomp; i++) {
2635 bool guess_found =
false;
2636 double p_start = 10000;
2637 while (!guess_found && p_start < 1e7) {
2639 vector<double> k(ncomp, 0), u(ncomp, 0), kprime(ncomp, 0), uprime(ncomp, 0);
2640 double Pprime = 0.99 * p_start;
2646 if ((PCSAFT.
SatL->_rhomolar - PCSAFT.
SatV->_rhomolar) < 1e-4) {
2647 p_start = p_start + 2e5;
2650 vector<double> fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2651 vector<double> fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2655 for (
size_t i = 0; i < ncomp; i++) {
2657 k[i] = fugcoef_l[i] / fugcoef_v[i];
2662 xl_sum += PCSAFT.
SatL->mole_fractions[i];
2663 PCSAFT.
SatV->mole_fractions[i] = k[i] * PCSAFT.
mole_fractions[i] / (1 + PCSAFT.
_Q * (k[i] - 1));
2664 xv_sum += PCSAFT.
SatV->mole_fractions[i];
2668 for (
size_t i = 0; i < ncomp; i++) {
2669 PCSAFT.
SatV->mole_fractions[i] = PCSAFT.
SatV->mole_fractions[i] / xv_sum;
2674 for (
size_t i = 0; i < ncomp; i++) {
2675 PCSAFT.
SatL->mole_fractions[i] = PCSAFT.
SatL->mole_fractions[i] / xl_sum;
2681 if ((PCSAFT.
SatL->_rhomolar - PCSAFT.
SatV->_rhomolar) < 1e-4) {
2682 p_start = p_start + 2e5;
2685 fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2686 fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2689 for (
size_t i = 0; i < ncomp; i++) {
2691 numer += PCSAFT.
SatL->mole_fractions[i] * fugcoef_l[i];
2692 denom += PCSAFT.
SatV->mole_fractions[i] * fugcoef_v[i];
2695 double ratio = numer / denom;
2699 if ((PCSAFT.
SatL->_rhomolar - PCSAFT.
SatV->_rhomolar) < 1e-4) {
2700 p_start = p_start + 2e5;
2703 fugcoef_l = PCSAFT.
SatL->calc_fugacity_coefficients();
2704 fugcoef_v = PCSAFT.
SatV->calc_fugacity_coefficients();
2707 for (
size_t i = 0; i < ncomp; i++) {
2709 numer += PCSAFT.
SatL->mole_fractions[i] * fugcoef_l[i];
2710 denom += PCSAFT.
SatV->mole_fractions[i] * fugcoef_v[i];
2713 double ratio_prime = numer / denom;
2715 double slope = (std::log10(ratio) - std::log10(ratio_prime)) / (std::log10(
p) - std::log10(Pprime));
2716 double intercept = std::log10(ratio) - slope * std::log10(
p);
2717 p_guess = std::pow(10, -intercept / slope);
2723 throw SolutionError(
"an estimate for the VLE pressure could not be found");
2740 double cost = (peos -
p) /
p;
2749 SolverRhoResid resid(*
this,
T,
p);
2752 vector<double> x_lo, x_hi;
2754 double limit_lower = -8;
2755 double limit_upper = -1;
2756 double rho_guess = 1e-13;
2757 double rho_guess_prev = rho_guess;
2759 for (
int i = 0; i < num_pts; i++) {
2760 rho_guess = pow(10, (limit_upper - limit_lower) / (
double)num_pts * i + limit_lower);
2762 if (err * err_prev < 0) {
2763 x_lo.push_back(rho_guess_prev);
2764 x_hi.push_back(rho_guess);
2767 rho_guess_prev = rho_guess;
2771 limit_upper = 0.7405;
2772 for (
int i = 0; i < num_pts; i++) {
2773 rho_guess = (limit_upper - limit_lower) / (
double)num_pts * i + limit_lower;
2775 if (err * err_prev < 0) {
2776 x_lo.push_back(rho_guess_prev);
2777 x_hi.push_back(rho_guess);
2780 rho_guess_prev = rho_guess;
2785 double x_lo_molar = 1e-8, x_hi_molar = 1e7;
2787 if (x_lo.size() == 1) {
2792 }
else if (x_lo.size() <= 3 && !x_lo.empty()) {
2804 }
else if (x_lo.size() > 3) {
2806 double g_min = 1e60;
2807 for (
size_t i = 0; i < x_lo.size(); i++) {
2810 double rho_i =
Brent(resid, x_lo_molar, x_hi_molar,
DBL_EPSILON, 1e-8, 200);
2822 double err_min = 1e40;
2824 for (
int i = 0; i < num_pts; i++) {
2825 double rho_guess = (0.7405 - 1e-8) / (
double)num_pts * i + 1e-8;
2827 if (abs(err) < err_min) {
2839 vector<CoolPropDbl> d(
N);
2841 for (
int i = 0; i <
N; i++) {
2845 return 6 / PI * nu / summ * 1.0e30 / N_AV;
2850 for (
unsigned int i = 0; i <
N; ++i) {
2858 auto num_sites = XA_guess.size();
2859 vector<double> XA = XA_guess;
2862 for (
auto i = 0U; i < num_sites; i++) {
2864 for (
int j = 0; j < num_sites; j++) {
2866 summ += den * x[j] * XA_guess[j] * delta_ij[idxij];
2868 XA[i] = 1. / (1. + summ);
2874vector<double>
PCSAFTBackend::dXAdt_find(vector<double> delta_ij,
double den, vector<double> XA, vector<double> ddelta_dt, vector<double> x) {
2876 auto num_sites = XA.size();
2877 Eigen::MatrixXd B = Eigen::MatrixXd::Zero(num_sites, 1);
2878 Eigen::MatrixXd A = Eigen::MatrixXd::Zero(num_sites, num_sites);
2882 for (
auto i = 0U; i < num_sites; i++) {
2884 for (
int j = 0; j < num_sites; j++) {
2885 B(i) -= x[j] * XA[j] * ddelta_dt[ij];
2886 A(i, j) = x[j] * delta_ij[ij];
2887 summ += x[j] * XA[j] * delta_ij[ij];
2890 A(i, i) = pow(1 + den * summ, 2.) / den;
2893 Eigen::MatrixXd solution = A.lu().solve(B);
2894 vector<double> dXA_dt(num_sites);
2895 for (
int i = 0; i < num_sites; i++) {
2896 dXA_dt[i] = solution(i);
2901vector<double>
PCSAFTBackend::dXAdx_find(vector<int> assoc_num, vector<double> delta_ij,
double den, vector<double> XA, vector<double> ddelta_dx,
2905 auto num_sites = XA.size();
2907 Eigen::MatrixXd B(num_sites * ncomp, 1);
2908 Eigen::MatrixXd A = Eigen::MatrixXd::Zero(num_sites * ncomp, num_sites * ncomp);
2913 for (
auto i = 0U; i < ncomp; i++) {
2914 for (
auto j = 0U; j < num_sites; j++) {
2916 for (
int k = 0; k < num_sites; k++) {
2917 sum1 = sum1 + den * x[k] * (XA[k] * ddelta_dx[i * num_sites * num_sites + j * num_sites + k]);
2918 A(ij, i * num_sites + k) = XA[j] * XA[j] * den * x[k] * delta_ij[j * num_sites + k];
2922 for (
int l = 0; l <
assoc_num[i]; l++) {
2923 sum2 = sum2 + XA[idx1 + l] * delta_ij[idx1 * num_sites + l * num_sites + j];
2926 A(ij, ij) = A(ij, ij) + 1;
2927 B(ij) = -1 * XA[j] * XA[j] * (sum1 + sum2);
2933 Eigen::MatrixXd solution = A.lu().solve(B);
2934 vector<double> dXA_dx(num_sites * ncomp);
2935 for (
int i = 0; i < num_sites * ncomp; i++) {
2936 dXA_dx[i] = solution(i);
2945 for (
int i = 0; i <
N; i++) {
2946 vector<std::string> assoc_scheme =
components[i].getAssocScheme();
2948 auto num = assoc_scheme.size();
2949 for (
auto j = 0U; j < num; j++) {
2952 charge.push_back(0);
2957 vector<int> tmp{0, 0};
2958 charge.insert(charge.end(), tmp.begin(), tmp.end());
2963 vector<int> tmp{-1, 1};
2964 charge.insert(charge.end(), tmp.begin(), tmp.end());
2969 vector<int> tmp{0, 0, 0};
2970 charge.insert(charge.end(), tmp.begin(), tmp.end());
2975 vector<int> tmp{-1, -1, 1};
2976 charge.insert(charge.end(), tmp.begin(), tmp.end());
2981 vector<int> tmp{0, 0, 0, 0};
2982 charge.insert(charge.end(), tmp.begin(), tmp.end());
2987 vector<int> tmp{1, 1, 1, -1};
2988 charge.insert(charge.end(), tmp.begin(), tmp.end());
2993 vector<int> tmp{-1, -1, 1, 1};
2994 charge.insert(charge.end(), tmp.begin(), tmp.end());
2999 throw ValueError(
format(
"%s is not a valid association type.", assoc_scheme[j]));
3006 for (std::vector<int>::iterator
i1 = charge.begin();
i1 != charge.end();
i1++) {
3007 for (std::vector<int>::iterator i2 = charge.begin(); i2 != charge.end(); i2++) {
3008 if (*
i1 == 0 || *i2 == 0) {
3010 }
else if (*
i1 == 1 && *i2 == -1) {
3012 }
else if (*
i1 == -1 && *i2 == 1) {
3039 throw ValueError(
"The current function for the dielectric constant for water is only valid for temperatures above 263.15 K.");
3040 }
else if (t <= 368.15) {
3041 dielc = 7.6555618295E-04 *
_T *
_T - 8.1783881423E-01 *
_T + 2.5419616803E+02;
3042 }
else if (t <= 443.15) {
3043 dielc = 0.0005003272124 *
_T *
_T - 0.6285556029 *
_T + 220.4467027;
3045 throw ValueError(
"The current function for the dielectric constant for water is only valid for temperatures less than 443.15 K.");