From 3409ac6b3d4ebd04ce051c9414d4b7788012a5a2 Mon Sep 17 00:00:00 2001 From: Philipp Rehner Date: Mon, 14 Feb 2022 13:19:46 +0100 Subject: [PATCH 1/2] allow multiple dipolar or associating segments --- src/parameters.rs | 55 ++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/parameters.rs b/src/parameters.rs index 5ccd922..93a8056 100644 --- a/src/parameters.rs +++ b/src/parameters.rs @@ -63,26 +63,41 @@ impl FromSegments for PcSaftRecord { 1 => Some(q[0]), _ => panic!("More than one segment with quadrupole moment."), }; - let mu: Vec = segments.iter().filter_map(|s| s.0.mu).collect(); - let mu = match mu.len() { - 0 => None, - 1 => Some(mu[0]), - _ => panic!("More than one segment with dipole moment."), - }; - let kappa_ab: Vec = segments.iter().filter_map(|s| s.0.kappa_ab).collect(); - let kappa_ab = match kappa_ab.len() { - 0 => None, - 1 => Some(kappa_ab[0]), - _ => panic!("More than one segment with association site."), - }; - let epsilon_k_ab: Vec = segments.iter().filter_map(|s| s.0.epsilon_k_ab).collect(); - let epsilon_k_ab = match epsilon_k_ab.len() { - 0 => None, - 1 => Some(epsilon_k_ab[0]), - _ => panic!("More than one segment with association site"), - }; - let na = Some(1.0); - let nb = Some(1.0); + let mu = segments + .iter() + .filter_map(|(s, n)| s.mu.map(|mu| mu * *n)) + .reduce(|a, b| a + b); + // let mu = match mu.len() { + // 0 => None, + // 1 => Some(mu[0]), + // _ => panic!("More than one segment with dipole moment."), + // }; + let kappa_ab = segments + .iter() + .filter_map(|(s, n)| s.kappa_ab.map(|k| k * *n)) + .reduce(|a, b| a + b); + // let kappa_ab = match kappa_ab.len() { + // 0 => None, + // 1 => Some(kappa_ab[0]), + // _ => panic!("More than one segment with association site."), + // }; + let epsilon_k_ab = segments + .iter() + .filter_map(|(s, n)| s.epsilon_k_ab.map(|e| e * *n)) + .reduce(|a, b| a + b); + // let epsilon_k_ab = match epsilon_k_ab.len() { + // 0 => None, + // 1 => Some(epsilon_k_ab[0]), + // _ => panic!("More than one segment with association site"), + // }; + let na = segments + .iter() + .filter_map(|(s, n)| s.na.map(|na| na * *n)) + .reduce(|a, b| a + b); + let nb = segments + .iter() + .filter_map(|(s, n)| s.nb.map(|nb| nb * *n)) + .reduce(|a, b| a + b); Self { m, sigma: (sigma3 / m).cbrt(), From 47f126a5ebea03d858d987f55c106ffe72c839be Mon Sep 17 00:00:00 2001 From: Philipp Rehner Date: Thu, 31 Mar 2022 20:21:08 +0200 Subject: [PATCH 2/2] Removed the check for multiple polar/associating groups in homo gc constructor --- CHANGELOG.md | 1 + src/parameters.rs | 27 +++++---------------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fefcf6..2e18163 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Added optional arguments to the constructor of `PcSaftFunctional` in Python to make it more analogous to `PcSaft`. [#34](https://github.com/feos-org/feos-pcsaft/pull/34) +- Building Pc-SAFT parameters from segments does not check anymore, whether multiple polar or associating groups are present. [#33](https://github.com/feos-org/feos-pcsaft/pull/33) ## [0.1.0] - 2022-01-12 ### Added diff --git a/src/parameters.rs b/src/parameters.rs index 93a8056..94f5375 100644 --- a/src/parameters.rs +++ b/src/parameters.rs @@ -56,40 +56,22 @@ impl FromSegments for PcSaftRecord { epsilon_k += s.m * s.epsilon_k * *n; }); - // We do not allow more than a single segment for q, mu, kappa_ab, epsilon_k_ab - let q: Vec = segments.iter().filter_map(|s| s.0.q).collect(); - let q = match q.len() { - 0 => None, - 1 => Some(q[0]), - _ => panic!("More than one segment with quadrupole moment."), - }; + let q = segments + .iter() + .filter_map(|(s, n)| s.q.map(|q| q * *n)) + .reduce(|a, b| a + b); let mu = segments .iter() .filter_map(|(s, n)| s.mu.map(|mu| mu * *n)) .reduce(|a, b| a + b); - // let mu = match mu.len() { - // 0 => None, - // 1 => Some(mu[0]), - // _ => panic!("More than one segment with dipole moment."), - // }; let kappa_ab = segments .iter() .filter_map(|(s, n)| s.kappa_ab.map(|k| k * *n)) .reduce(|a, b| a + b); - // let kappa_ab = match kappa_ab.len() { - // 0 => None, - // 1 => Some(kappa_ab[0]), - // _ => panic!("More than one segment with association site."), - // }; let epsilon_k_ab = segments .iter() .filter_map(|(s, n)| s.epsilon_k_ab.map(|e| e * *n)) .reduce(|a, b| a + b); - // let epsilon_k_ab = match epsilon_k_ab.len() { - // 0 => None, - // 1 => Some(epsilon_k_ab[0]), - // _ => panic!("More than one segment with association site"), - // }; let na = segments .iter() .filter_map(|(s, n)| s.na.map(|na| na * *n)) @@ -98,6 +80,7 @@ impl FromSegments for PcSaftRecord { .iter() .filter_map(|(s, n)| s.nb.map(|nb| nb * *n)) .reduce(|a, b| a + b); + Self { m, sigma: (sigma3 / m).cbrt(),