From 25de44f7c9782c75149e15285f8e04e3fabe48f0 Mon Sep 17 00:00:00 2001 From: Philipp Rehner Date: Thu, 12 Jan 2023 09:58:17 +0100 Subject: [PATCH 1/2] Minor cleanup of the PC-SAFT implementation --- benches/state_properties.rs | 35 ++++++- src/association/mod.rs | 31 +++--- src/pcsaft/eos/polar.rs | 201 ++++++++++++++++-------------------- 3 files changed, 138 insertions(+), 129 deletions(-) diff --git a/benches/state_properties.rs b/benches/state_properties.rs index db4373568..ae4207530 100644 --- a/benches/state_properties.rs +++ b/benches/state_properties.rs @@ -68,5 +68,38 @@ fn properties_pcsaft(c: &mut Criterion) { }); } -criterion_group!(bench, properties_pcsaft); +fn properties_pcsaft_polar(c: &mut Criterion) { + let parameters = PcSaftParameters::from_json( + vec!["acetone", "butanal", "dimethyl ether"], + "./parameters/pcsaft/gross2006.json", + None, + IdentifierOption::Name, + ) + .unwrap(); + let eos = Arc::new(PcSaft::new(Arc::new(parameters))); + let t = 300.0 * KELVIN; + let density = 71.18 * KILO * MOL / METER.powi(3); + let v = 100.0 * MOL / density; + let x = arr1(&[1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0]); + let m = &x * 100.0 * MOL; + + let mut group = c.benchmark_group("state_properties_pcsaft_polar"); + group.bench_function("a", |b| { + b.iter(|| property((&eos, S::helmholtz_energy, t, v, &m, Contributions::Total))) + }); + group.bench_function("compressibility", |b| { + b.iter(|| property((&eos, S::compressibility, t, v, &m, Contributions::Total))) + }); + group.bench_function("ln_phi", |b| { + b.iter(|| property_no_contributions((&eos, S::ln_phi, t, v, &m))) + }); + group.bench_function("c_v", |b| { + b.iter(|| property((&eos, S::c_v, t, v, &m, Contributions::ResidualNvt))) + }); + group.bench_function("molar_volume", |b| { + b.iter(|| property((&eos, S::molar_volume, t, v, &m, Contributions::ResidualNvt))) + }); +} + +criterion_group!(bench, properties_pcsaft, properties_pcsaft_polar); criterion_main!(bench); diff --git a/src/association/mod.rs b/src/association/mod.rs index eb0e304f3..3691ac466 100644 --- a/src/association/mod.rs +++ b/src/association/mod.rs @@ -80,12 +80,14 @@ impl AssociationParameters { for (i, record) in records.iter().enumerate() { if let Some(record) = record.as_ref() { - assoc_comp.push(i); - sigma_assoc.push(sigma[i]); - kappa_ab.push(record.kappa_ab); - epsilon_k_ab.push(record.epsilon_k_ab); - na.push(record.na.unwrap_or(1.0)); - nb.push(record.nb.unwrap_or(1.0)); + if record.kappa_ab > 0.0 && record.epsilon_k_ab > 0.0 { + assoc_comp.push(i); + sigma_assoc.push(sigma[i]); + kappa_ab.push(record.kappa_ab); + epsilon_k_ab.push(record.epsilon_k_ab); + na.push(record.na.unwrap_or(1.0)); + nb.push(record.nb.unwrap_or(1.0)); + } } } @@ -238,21 +240,14 @@ impl

fmt::Display for Association

{ impl Association

{ pub fn assoc_site_frac_ab>(deltarho: D, na: f64, nb: f64) -> D { - if deltarho.re() > f64::EPSILON.sqrt() { - (((deltarho * (na - nb) + 1.0).powi(2) + deltarho * nb * 4.0).sqrt() - - (deltarho * (nb - na) + 1.0)) - / (deltarho * na * 2.0) - } else { - D::one() + deltarho * nb * (deltarho * (nb + na) - 1.0) - } + (((deltarho * (na - nb) + 1.0).powi(2) + deltarho * nb * 4.0).sqrt() + + (deltarho * (nb - na) + 1.0)) + .recip() + * (2.0 * nb / na) } pub fn assoc_site_frac_a>(deltarho: D, na: f64) -> D { - if deltarho.re() > f64::EPSILON.sqrt() { - ((deltarho * na * 4.0 + 1.0).powi(2) - 1.0).sqrt() / (deltarho * na * 2.0) - } else { - D::one() + deltarho * na * (deltarho * na * 2.0 - 1.0) - } + ((deltarho * 4.0 * na + 1.0).sqrt() + 1.0).recip() * 2.0 } #[allow(clippy::too_many_arguments)] diff --git a/src/pcsaft/eos/polar.rs b/src/pcsaft/eos/polar.rs index 704da0059..b94df9087 100644 --- a/src/pcsaft/eos/polar.rs +++ b/src/pcsaft/eos/polar.rs @@ -99,39 +99,20 @@ impl MeanSegmentNumbers { Multipole::Quadrupole => (parameters.nquadpole, ¶meters.quadpole_comp), }; - let mut mi; - let mut mj; - let mut mk; - let mut mij; - let mut mijk; let mut mij1 = Array2::zeros((npoles, npoles)); let mut mij2 = Array2::zeros((npoles, npoles)); let mut mijk1 = Array3::zeros((npoles, npoles, npoles)); let mut mijk2 = Array3::zeros((npoles, npoles, npoles)); for i in 0..npoles { - let dci = comp[i]; - mi = parameters.m[dci].min(2.0); - mij1[[i, i]] = (mi - 1.0) / mi; - mij2[[i, i]] = mij1[[i, i]] * (mi - 2.0) / mi; - - mijk1[[i, i, i]] = mij1[[i, i]]; - mijk2[[i, i, i]] = mij2[[i, i]]; - for j in i + 1..npoles { - let dcj = comp[j]; - mj = parameters.m[dcj].min(2.0); - mij = (mi * mj).sqrt(); + let mi = parameters.m[comp[i]].min(2.0); + for j in i..npoles { + let mj = parameters.m[comp[j]].min(2.0); + let mij = (mi * mj).sqrt(); mij1[[i, j]] = (mij - 1.0) / mij; mij2[[i, j]] = mij1[[i, j]] * (mij - 2.0) / mij; - mijk = (mi * mi * mj).cbrt(); - mijk1[[i, i, j]] = (mijk - 1.0) / mijk; - mijk2[[i, i, j]] = mijk1[[i, i, j]] * (mijk - 2.0) / mijk; - mijk = (mi * mj * mj).cbrt(); - mijk1[[i, j, j]] = (mijk - 1.0) / mijk; - mijk2[[i, j, j]] = mijk1[[i, j, j]] * (mijk - 2.0) / mijk; - for k in j + 1..npoles { - let dck = comp[k]; - mk = parameters.m[dck].min(2.0); - mijk = (mi * mj * mk).cbrt(); + for k in j..npoles { + let mk = parameters.m[comp[k]].min(2.0); + let mijk = (mi * mj * mk).cbrt(); mijk1[[i, j, k]] = (mijk - 1.0) / mijk; mijk2[[i, j, k]] = mijk1[[i, j, k]] * (mijk - 2.0) / mijk; } @@ -149,34 +130,27 @@ impl MeanSegmentNumbers { fn pair_integral_ij>( mij1: f64, mij2: f64, - eta: D, + etas: &[D], a: &[[f64; 3]], b: &[[f64; 3]], eps_ij_t: D, ) -> D { - let eta2 = eta * eta; - let etas = [D::one(), eta, eta2, eta2 * eta, eta2 * eta2]; (0..a.len()) .map(|i| { etas[i] * (eps_ij_t * (b[i][0] + mij1 * b[i][1] + mij2 * b[i][2]) - + a[i][0] - + mij1 * a[i][1] - + mij2 * a[i][2]) + + (a[i][0] + mij1 * a[i][1] + mij2 * a[i][2])) }) .sum() } -fn triplet_integral_ijk>(mijk1: f64, mijk2: f64, eta: D, c: &[[f64; 3]]) -> D { - let eta2 = eta * eta; - let etas = [D::one(), eta, eta2, eta2 * eta]; +fn triplet_integral_ijk>(mijk1: f64, mijk2: f64, etas: &[D], c: &[[f64; 3]]) -> D { (0..c.len()) .map(|i| etas[i] * (c[i][0] + mijk1 * c[i][1] + mijk2 * c[i][2])) .sum() } -fn triplet_integral_ijk_dq>(mijk: f64, eta: D, c: &[[f64; 2]]) -> D { - let etas = [D::one(), eta, eta * eta]; +fn triplet_integral_ijk_dq>(mijk: f64, etas: &[D], c: &[[f64; 2]]) -> D { (0..c.len()) .map(|i| etas[i] * (c[i][0] + mijk * c[i][1])) .sum() @@ -203,34 +177,16 @@ impl> HelmholtzEnergyDual for Dipole { let rho = &state.partial_density; let r = p.hs_diameter(state.temperature) * 0.5; let eta = (rho * &p.m * &r * &r * &r).sum() * 4.0 * FRAC_PI_3; + let eta2 = eta * eta; + let etas = [D::one(), eta, eta2, eta2 * eta, eta2 * eta2]; let mut phi2 = D::zero(); let mut phi3 = D::zero(); for i in 0..p.ndipole { let di = p.dipole_comp[i]; - phi2 -= rho[di] - * rho[di] - * mu2_term[i] - * mu2_term[i] - * pair_integral_ij( - m.mij1[[i, i]], - m.mij2[[i, i]], - eta, - &AD, - &BD, - eps_ij_t[[di, di]], - ) - / sig_ij_3[[di, di]]; - phi3 -= rho[di] - * rho[di] - * rho[di] - * mu2_term[i] - * mu2_term[i] - * mu2_term[i] - * triplet_integral_ijk(m.mijk1[[i, i, i]], m.mijk2[[i, i, i]], eta, &CD) - / sig_ij_3[[di, di]]; - for j in (i + 1)..p.ndipole { + for j in i..p.ndipole { let dj = p.dipole_comp[j]; + let c = if i == j { 1.0 } else { 2.0 }; phi2 -= rho[di] * rho[dj] * mu2_term[i] @@ -238,27 +194,26 @@ impl> HelmholtzEnergyDual for Dipole { * pair_integral_ij( m.mij1[[i, j]], m.mij2[[i, j]], - eta, + &etas, &AD, &BD, eps_ij_t[[di, dj]], ) / sig_ij_3[[di, dj]] - * 2.0; - phi3 -= rho[di] * rho[di] * rho[dj] * mu2_term[i] * mu2_term[i] * mu2_term[j] - / (p.sigma_ij[[di, di]] * p.sigma_ij[[di, dj]] * p.sigma_ij[[di, dj]]) - * triplet_integral_ijk(m.mijk1[[i, i, j]], m.mijk2[[i, i, j]], eta, &CD) - * 3.0; - phi3 -= rho[di] * rho[dj] * rho[dj] * mu2_term[i] * mu2_term[j] * mu2_term[j] - / (p.sigma_ij[[di, dj]] * p.sigma_ij[[di, dj]] * p.sigma_ij[[dj, dj]]) - * triplet_integral_ijk(m.mijk1[[i, j, j]], m.mijk2[[i, j, j]], eta, &CD) - * 3.0; - for k in (j + 1)..p.ndipole { + * c; + for k in j..p.ndipole { let dk = p.dipole_comp[k]; + let c = if i == k { + 1.0 + } else if i == j || j == k { + 3.0 + } else { + 6.0 + }; phi3 -= rho[di] * rho[dj] * rho[dk] * mu2_term[i] * mu2_term[j] * mu2_term[k] / (p.sigma_ij[[di, dj]] * p.sigma_ij[[di, dk]] * p.sigma_ij[[dj, dk]]) - * triplet_integral_ijk(m.mijk1[[i, j, k]], m.mijk2[[i, j, k]], eta, &CD) - * 6.0; + * triplet_integral_ijk(m.mijk1[[i, j, k]], m.mijk2[[i, j, k]], &etas, &CD) + * c; } } } @@ -299,34 +254,16 @@ impl> HelmholtzEnergyDual for Quadrupole { let rho = &state.partial_density; let r = p.hs_diameter(state.temperature) * 0.5; let eta = (rho * &p.m * &r * &r * &r).sum() * 4.0 * FRAC_PI_3; + let eta2 = eta * eta; + let etas = [D::one(), eta, eta2, eta2 * eta, eta2 * eta2]; let mut phi2 = D::zero(); let mut phi3 = D::zero(); for i in 0..p.nquadpole { let di = p.quadpole_comp[i]; - phi2 -= (rho[di] - * rho[di] - * q2_term[i] - * q2_term[i] - * pair_integral_ij( - m.mij1[[i, i]], - m.mij2[[i, i]], - eta, - &AQ, - &BQ, - eps_ij_t[[di, di]], - )) - / p.sigma_ij[[di, di]].powi(7); - phi3 += (rho[di] - * rho[di] - * rho[di] - * q2_term[i] - * q2_term[i] - * q2_term[i] - * triplet_integral_ijk(m.mijk1[[i, i, i]], m.mijk2[[i, i, i]], eta, &CQ)) - / sig_ij_3[[di, di]].powi(3); - for j in (i + 1)..p.nquadpole { + for j in i..p.nquadpole { let dj = p.quadpole_comp[j]; + let c = if i == j { 1.0 } else { 2.0 }; phi2 -= (rho[di] * rho[dj] * q2_term[i] @@ -334,27 +271,26 @@ impl> HelmholtzEnergyDual for Quadrupole { * pair_integral_ij( m.mij1[[i, j]], m.mij2[[i, j]], - eta, + &etas, &AQ, &BQ, eps_ij_t[[di, dj]], )) / p.sigma_ij[[di, di]].powi(7) - * 2.0; - phi3 += rho[di] * rho[di] * rho[dj] * q2_term[i] * q2_term[i] * q2_term[j] - / (sig_ij_3[[di, di]] * sig_ij_3[[di, dj]] * sig_ij_3[[di, dj]]) - * triplet_integral_ijk(m.mijk1[[i, i, j]], m.mijk2[[i, i, j]], eta, &CQ) - * 3.0; - phi3 += rho[di] * rho[dj] * rho[dj] * q2_term[i] * q2_term[j] * q2_term[j] - / (sig_ij_3[[di, dj]] * sig_ij_3[[di, dj]] * sig_ij_3[[dj, dj]]) - * triplet_integral_ijk(m.mijk1[[i, j, j]], m.mijk2[[i, j, j]], eta, &CQ) - * 3.0; - for k in (j + 1)..p.nquadpole { + * c; + for k in j..p.nquadpole { let dk = p.quadpole_comp[k]; + let c = if i == k { + 1.0 + } else if i == j || j == k { + 3.0 + } else { + 6.0 + }; phi3 += rho[di] * rho[dj] * rho[dk] * q2_term[i] * q2_term[j] * q2_term[k] / (sig_ij_3[[di, dj]] * sig_ij_3[[di, dk]] * sig_ij_3[[dj, dk]]) - * triplet_integral_ijk(m.mijk1[[i, j, k]], m.mijk2[[i, j, k]], eta, &CQ) - * 6.0; + * triplet_integral_ijk(m.mijk1[[i, j, k]], m.mijk2[[i, j, k]], &etas, &CQ) + * c; } } } @@ -409,6 +345,8 @@ impl> HelmholtzEnergyDual for DipoleQuadrupole { let rho = &state.partial_density; let r = p.hs_diameter(state.temperature) * 0.5; let eta = (rho * &p.m * &r * &r * &r).sum() * 4.0 * FRAC_PI_3; + let eta2 = eta * eta; + let etas = [D::one(), eta, eta2, eta2 * eta, eta2 * eta2]; // mean segment number let mut mdq1 = Array2::zeros((p.ndipole, p.nquadpole)); @@ -453,7 +391,7 @@ impl> HelmholtzEnergyDual for DipoleQuadrupole { * pair_integral_ij( mdq1[[i, j]], mdq2[[i, j]], - eta, + &etas, &ADQ, &BDQ, eps_ij_t[[di, qj]], @@ -463,7 +401,7 @@ impl> HelmholtzEnergyDual for DipoleQuadrupole { phi3 += rho[di] * rho[qj] * rho[dk] * mu2_term[i] * q2_term[j] * mu2_term[k] / (p.sigma_ij[[di, qj]] * p.sigma_ij[[di, dk]] * p.sigma_ij[[qj, dk]]) .powi(2) - * triplet_integral_ijk_dq(mdqd[[i, j, k]], eta, &CDQ); + * triplet_integral_ijk_dq(mdqd[[i, j, k]], &etas, &CDQ); } for k in 0..p.nquadpole { let qk = p.quadpole_comp[k]; @@ -471,7 +409,7 @@ impl> HelmholtzEnergyDual for DipoleQuadrupole { / (p.sigma_ij[[di, qj]] * p.sigma_ij[[di, qk]] * p.sigma_ij[[qj, qk]]) .powi(2) * ALPHA - * triplet_integral_ijk_dq(mdqq[[i, j, k]], eta, &CDQ); + * triplet_integral_ijk_dq(mdqq[[i, j, k]], &etas, &CDQ); } } } @@ -500,6 +438,7 @@ mod tests { carbon_dioxide_parameters, dme_co2_parameters, dme_parameters, }; use approx::assert_relative_eq; + use feos_core::parameter::{IdentifierOption, Parameter}; use feos_core::StateHD; #[test] @@ -515,6 +454,27 @@ mod tests { assert_relative_eq!(a, -1.40501033595417E-002, epsilon = 1e-6); } + #[test] + fn test_dipolar_contribution_mix() { + let dp = Dipole { + parameters: Arc::new( + PcSaftParameters::from_json( + vec!["acetone", "butanal", "dimethyl ether"], + "./parameters/pcsaft/gross2006.json", + None, + IdentifierOption::Name, + ) + .unwrap(), + ), + }; + let t = 350.0; + let v = 1000.0; + let n = [1.0, 2.0, 3.0]; + let s = StateHD::new(t, v, arr1(&n)); + let a = dp.helmholtz_energy(&s); + assert_relative_eq!(a, -1.4126308106201688, epsilon = 1e-10); + } + #[test] fn test_quadrupolar_contribution() { let qp = Quadrupole { @@ -528,6 +488,27 @@ mod tests { assert_relative_eq!(a, -4.38559558854186E-002, epsilon = 1e-6); } + #[test] + fn test_quadrupolar_contribution_mix() { + let qp = Quadrupole { + parameters: Arc::new( + PcSaftParameters::from_json( + vec!["carbon dioxide", "chlorine", "ethylene"], + "./parameters/pcsaft/gross2005_literature.json", + None, + IdentifierOption::Name, + ) + .unwrap(), + ), + }; + let t = 350.0; + let v = 1000.0; + let n = [1.0, 2.0, 3.0]; + let s = StateHD::new(t, v, arr1(&n)); + let a = qp.helmholtz_energy(&s); + assert_relative_eq!(a, -0.327493924806138, epsilon = 1e-10); + } + #[test] fn test_dipolar_quadrupolar_contribution() { let dp = Dipole { From e38f90b0811d70b6adfcbf9c23cdaa097a95331f Mon Sep 17 00:00:00 2001 From: Philipp Rehner Date: Thu, 12 Jan 2023 11:47:49 +0100 Subject: [PATCH 2/2] readd association parameters to string repr of PcSaftParameters --- src/pcsaft/parameters.rs | 373 +-------------------------------------- 1 file changed, 7 insertions(+), 366 deletions(-) diff --git a/src/pcsaft/parameters.rs b/src/pcsaft/parameters.rs index f7e2b980c..9517b9317 100644 --- a/src/pcsaft/parameters.rs +++ b/src/pcsaft/parameters.rs @@ -505,12 +505,13 @@ impl std::fmt::Display for PcSaftParameters { if !self.quadpole_comp.is_empty() { write!(f, "\n\tq={}", self.q)?; } - // if !self.assoc_comp.is_empty() { - // write!(f, "\n\tkappa_ab={}", self.kappa_ab)?; - // write!(f, "\n\tepsilon_k_ab={}", self.epsilon_k_ab)?; - // write!(f, "\n\tna={}", self.na)?; - // write!(f, "\n\tnb={}", self.nb)?; - // } + if !self.association.assoc_comp.is_empty() { + write!(f, "\n\tassociating={}", self.association.assoc_comp)?; + write!(f, "\n\tkappa_ab={}", self.association.kappa_ab)?; + write!(f, "\n\tepsilon_k_ab={}", self.association.epsilon_k_ab)?; + write!(f, "\n\tna={}", self.association.na)?; + write!(f, "\n\tnb={}", self.association.nb)?; + } if !self.k_ij.iter().all(|k| k.is_zero()) { write!(f, "\n\tk_ij=\n{}", self.k_ij)?; } @@ -523,168 +524,6 @@ pub mod utils { use super::*; use feos_core::joback::JobackRecord; use std::sync::Arc; - // use feos_core::parameter::SegmentRecord; - - // pub fn pure_record_vec() -> Vec> { - // let records = r#"[ - // { - // "identifier": { - // "cas": "74-98-6", - // "name": "propane", - // "iupac_name": "propane", - // "smiles": "CCC", - // "inchi": "InChI=1/C3H8/c1-3-2/h3H2,1-2H3", - // "formula": "C3H8" - // }, - // "model_record": { - // "m": 2.0018290000000003, - // "sigma": 3.618353, - // "epsilon_k": 208.1101 - // }, - // "molarweight": 44.0962, - // "chemical_record": { - // "segments": ["CH3", "CH2", "CH3"] - // } - // }, - // { - // "identifier": { - // "cas": "106-97-8", - // "name": "butane", - // "iupac_name": "butane", - // "smiles": "CCCC", - // "inchi": "InChI=1/C4H10/c1-3-4-2/h3-4H2,1-2H3", - // "formula": "C4H10" - // }, - // "model_record": { - // "m": 2.331586, - // "sigma": 3.7086010000000003, - // "epsilon_k": 222.8774 - // }, - // "molarweight": 58.123, - // "chemical_record": { - // "segments": ["CH3", "CH2", "CH2", "CH3"] - // } - // }, - // { - // "identifier": { - // "cas": "74-82-8", - // "name": "methane", - // "iupac_name": "methane", - // "smiles": "C", - // "inchi": "InChI=1/CH4/h1H4", - // "formula": "CH4" - // }, - // "model_record": { - // "m": 1.0, - // "sigma": 3.7039, - // "epsilon_k": 150.034 - // }, - // "molarweight": 16.0426 - // }, - // { - // "identifier": { - // "cas": "124-38-9", - // "name": "carbon-dioxide", - // "iupac_name": "carbon dioxide", - // "smiles": "O=C=O", - // "inchi": "InChI=1/CO2/c2-1-3", - // "formula": "CO2" - // }, - // "molarweight": 44.0098, - // "model_record": { - // "m": 1.5131, - // "sigma": 3.1869, - // "epsilon_k": 163.333, - // "q": 4.4 - // } - // } - // ]"#; - // serde_json::from_str(records).expect("Unable to parse json.") - // } - - // pub fn segments_vec() -> Vec> { - // let segments_json = r#"[ - // { - // "identifier": "CH3", - // "model_record": { - // "m": 0.77247, - // "sigma": 3.6937, - // "epsilon_k": 181.49 - // }, - // "molarweight": 15.0345 - // }, - // { - // "identifier": "CH2", - // "model_record": { - // "m": 0.7912, - // "sigma": 3.0207, - // "epsilon_k": 157.23 - // }, - // "molarweight": 14.02658 - // }, - - // { - // "identifier": ">CH", - // "model_record": { - // "m": 0.52235, - // "sigma": 0.99912, - // "epsilon_k": 269.84 - // }, - // "molarweight": 13.01854 - // }, - // { - // "identifier": ">C<", - // "model_record": { - // "m": -0.70131, - // "sigma": 0.54350, - // "epsilon_k": 0.0 - // }, - // "molarweight": 12.0107 - // }, - // { - // "identifier": "=CH2", - // "model_record": { - // "m": 0.70581, - // "sigma": 3.1630, - // "epsilon_k": 171.34 - // }, - // "molarweight": 14.02658 - // }, - // { - // "identifier": "=CH", - // "model_record": { - // "m": 0.90182, - // "sigma": 2.8864, - // "epsilon_k": 158.90 - // }, - // "molarweight": 13.01854 - // } - // ]"#; - // serde_json::from_str(segments_json).expect("Unable to parse json.") - // } - - // pub fn methane_parameters() -> PcSaftParameters { - // let methane_json = r#" - // { - // "identifier": { - // "cas": "74-82-8", - // "name": "methane", - // "iupac_name": "methane", - // "smiles": "C", - // "inchi": "InChI=1/CH4/h1H4", - // "formula": "CH4" - // }, - // "model_record": { - // "m": 1.0, - // "sigma": 3.7039, - // "epsilon_k": 150.034 - // }, - // "molarweight": 16.0426 - // }"#; - // let methane_record: PureRecord = - // serde_json::from_str(methane_json).expect("Unable to parse json."); - // PcSaftParameters::from_records(vec![methane_record], None).unwrap() - // } pub fn propane_parameters() -> Arc { let propane_json = r#" @@ -712,53 +551,6 @@ pub mod utils { Arc::new(PcSaftParameters::new_pure(propane_record)) } - // pub fn propane_homogc_parameters() -> PcSaftParameters { - // let propane_json = r#" - // { - // "identifier": { - // "cas": "74-98-6", - // "name": "propane", - // "iupac_name": "propane", - // "smiles": "CCC", - // "inchi": "InChI=1/C3H8/c1-3-2/h3H2,1-2H3", - // "formula": "C3H8" - // }, - // "chemical_record": { - // "molarweight": 44.0962, - // "segments": ["CH3", "CH2", "CH3"] - // } - // }"#; - // let segments_json = r#"[ - // { - // "identifier": "CH3", - // "model_record": { - // "m": 0.61198, - // "sigma": 3.7202, - // "epsilon_k": 229.90 - // }, - // "molarweight": 15.0345 - // }, - // { - // "identifier": "CH2", - // "model_record": { - // "m": 0.45606, - // "sigma": 3.8900, - // "epsilon_k": 239.01 - // }, - // "molarweight": 14.02658 - // } - // ]"#; - // let propane_record: PureRecord = - // serde_json::from_str(&propane_json).expect("Unable to parse json."); - // let segment_records: Vec = - // serde_json::from_str(&segments_json).expect("Unable to parse json."); - // ParameterBuilder::new() - // .molecule_records(Some(&vec![propane_record]), None) - // .segment_records(Some(&segment_records), None) - // .build(BuilderOption::HomoGC) - // .unwrap() - // } - pub fn carbon_dioxide_parameters() -> PcSaftParameters { let co2_json = r#" { @@ -941,155 +733,4 @@ pub mod utils { serde_json::from_str(binary_json).expect("Unable to parse json."); Arc::new(PcSaftParameters::new_binary(binary_record, None)) } - - // pub fn water_hexane_parameters() -> PcSaftParameters { - // let binary_json = r#"[ - // { - // "identifier": { - // "cas": "7732-18-5", - // "name": "water_np", - // "iupac_name": "oxidane", - // "smiles": "O", - // "inchi": "InChI=1/H2O/h1H2", - // "formula": "H2O" - // }, - // "model_record": { - // "m": 1.065587, - // "sigma": 3.000683, - // "epsilon_k": 366.5121, - // "kappa_ab": 0.034867983, - // "epsilon_k_ab": 2500.6706 - // }, - // "molarweight": 18.0152 - // }, - // { - // "identifier": { - // "cas": "110-54-3", - // "name": "hexane", - // "iupac_name": "hexane", - // "smiles": "CCCCCC", - // "inchi": "InChI=1/C6H14/c1-3-5-6-4-2/h3-6H2,1-2H3", - // "formula": "C6H14" - // }, - // "model_record": { - // "m": 3.0576, - // "sigma": 3.7983, - // "epsilon_k": 236.77 - // }, - // "molarweight": 86.177 - // } - // ]"#; - // let binary_record: Vec> = - // serde_json::from_str(binary_json).expect("Unable to parse json."); - // PcSaftParameters::from_records(binary_record, None).unwrap() - // } - - // pub fn dodecane_nitrogen_parameters() -> PcSaftParameters { - // let binary_json = r#"[ - // { - // "identifier": { - // "cas": "112-40-3", - // "name": "dodecane", - // "iupac_name": "dodecane", - // "smiles": "CCCCCCCCCCCC", - // "inchi": "InChI=1/C12H26/c1-3-5-7-9-11-12-10-8-6-4-2/h3-12H2,1-2H3", - // "formula": "C12H26" - // }, - // "model_record": { - // "m": 5.305758999999999, - // "sigma": 3.895892, - // "epsilon_k": 249.2145, - // "viscosity": [ - // -1.6719, - // -3.39020393, - // -0.6956429590000001, - // -0.154563667 - // ], - // "diffusion": [ - // -1.709976456320196, - // 0.4350370700652692, - // 0.3567181896779805, - // 0.0, - // 0.0 - // ] - // }, - // "molarweight": 170.3374 - // }, - // { - // "identifier": { - // "cas": "7727-37-9", - // "name": "nitrogen", - // "iupac_name": "molecular nitrogen", - // "smiles": "N#N", - // "inchi": "InChI=1/N2/c1-2", - // "formula": "N2" - // }, - // "model_record": { - // "m": 1.1504, - // "sigma": 3.3848, - // "epsilon_k": 91.4, - // "q": 1.43, - // "viscosity": [ - // -0.196376646, - // -0.9460855, - // -0.0309718769, - // -0.0303367687 - // ], - // "diffusion": [ - // -0.12855765455212295, - // 0.24885131958296933, - // 0.08052800000000002, - // 0.0, - // 0.0 - // ] - // }, - // "molarweight": 28.0134 - // } - // ]"#; - // let kij_json = r#"[ - // { - // "id1": { - // "cas": "7727-37-9", - // "name": "nitrogen", - // "iupac_name": "molecular nitrogen", - // "smiles": "N#N", - // "inchi": "InChI=1/N2/c1-2", - // "formula": "N2" - // }, - // "id2": { - // "cas": "112-40-3", - // "name": "dodecane", - // "iupac_name": "dodecane", - // "smiles": "CCCCCCCCCCCC", - // "inchi": "InChI=1/C12H26/c1-3-5-7-9-11-12-10-8-6-4-2/h3-12H2,1-2H3", - // "formula": "C12H26" - // }, - // "k_ij": 0.1661 - // }, - // { - // "id1": { - // "cas": "7727-37-9", - // "name": "nitrogen", - // "iupac_name": "molecular nitrogen", - // "smiles": "N#N", - // "inchi": "InChI=1/N2/c1-2", - // "formula": "N2" - // }, - // "id2": { - // "cas": "74-98-6", - // "name": "propane", - // "iupac_name": "propane", - // "smiles": "CCC", - // "inchi": "InChI=1/C3H8/c1-3-2/h3H2,1-2H3", - // "formula": "C3H8" - // }, - // "k_ij": 0.02512 - // } - // ]"#; - // let binary_record: Vec> = - // serde_json::from_str(binary_json).expect("Unable to parse json."); - // let kij_record: Vec> = - // serde_json::from_str(kij_json).expect("Unable to parse binary json."); - // PcSaftParameters::from_records(binary_record, Some(kij_record)).unwrap() - // } }