Skip to content

Commit 7eef180

Browse files
committed
fix tp-flash and add test
1 parent b09ea33 commit 7eef180

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

crates/feos-core/src/phase_equilibria/tp_flash.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::state::{Contributions, State};
55
use crate::{SolverOptions, Verbosity};
66
use nalgebra::{DVector, Matrix3, Matrix4xX};
77
use num_dual::{Dual, DualNum, first_derivative};
8+
use num_traits::Zero;
89
use quantity::{Dimensionless, Moles, Pressure, Temperature};
910

1011
const MAX_ITER_TP: usize = 400;
@@ -270,12 +271,20 @@ impl<E: Residual> PhaseEquilibrium<E, 2> {
270271
.liquid()
271272
.molefracs
272273
.component_div(&self.vapor().molefracs)
273-
.map(|i| if i > 0.0 { i.ln() } else { 0.0 });
274+
.map(|i| i.ln());
274275

275276
// Set residuum to 0 for non-volatile components
276277
if let Some(nvc) = non_volatile_components.as_ref() {
277278
nvc.iter().for_each(|&c| res_vec[c] = 0.0);
278279
}
280+
281+
// Set residuum to 0 for non-present components
282+
for (i, &x) in self.liquid().molefracs.iter().enumerate() {
283+
if x.is_zero() {
284+
res_vec[i] = 0.0
285+
}
286+
}
287+
279288
let res = res_vec.norm();
280289
log_iter!(
281290
verbosity,

crates/feos/tests/pcsaft/tp_flash.rs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use feos_core::parameter::IdentifierOption;
44
use feos_core::{Contributions, FeosResult, PhaseEquilibrium, SolverOptions};
55
use nalgebra::dvector;
66
use quantity::*;
7-
use std::error::Error;
87

98
fn read_params(components: Vec<&str>) -> FeosResult<PcSaftParameters> {
109
PcSaftParameters::from_json(
@@ -16,7 +15,7 @@ fn read_params(components: Vec<&str>) -> FeosResult<PcSaftParameters> {
1615
}
1716

1817
#[test]
19-
fn test_tp_flash() -> Result<(), Box<dyn Error>> {
18+
fn test_tp_flash() -> FeosResult<()> {
2019
let propane = PcSaft::new(read_params(vec!["propane"])?);
2120
let butane = PcSaft::new(read_params(vec!["butane"])?);
2221
let t = 250.0 * KELVIN;
@@ -63,3 +62,51 @@ fn test_tp_flash() -> Result<(), Box<dyn Error>> {
6362
);
6463
Ok(())
6564
}
65+
66+
#[test]
67+
fn test_tp_flash_zero_component() -> FeosResult<()> {
68+
let eos_full = PcSaft::new(PcSaftParameters::from_json(
69+
vec!["propane", "butane", "hexane"],
70+
"tests/pcsaft/test_parameters.json",
71+
None,
72+
IdentifierOption::Name,
73+
)?);
74+
let eos_binary = PcSaft::new(PcSaftParameters::from_json(
75+
vec!["butane", "hexane"],
76+
"tests/pcsaft/test_parameters.json",
77+
None,
78+
IdentifierOption::Name,
79+
)?);
80+
let options = SolverOptions {
81+
verbosity: feos_core::Verbosity::Iter,
82+
..Default::default()
83+
};
84+
let vle_full = PhaseEquilibrium::tp_flash(
85+
&&eos_full,
86+
300.0 * KELVIN,
87+
1.2 * BAR,
88+
&(dvector![0.0, 0.5, 0.5] * MOL),
89+
None,
90+
options,
91+
None,
92+
)?;
93+
let vle_binary = PhaseEquilibrium::tp_flash(
94+
&&eos_binary,
95+
300.0 * KELVIN,
96+
1.2 * BAR,
97+
&(dvector![0.5, 0.5] * MOL),
98+
None,
99+
options,
100+
None,
101+
)?;
102+
println!("{vle_full}\n{vle_binary}");
103+
assert_eq!(
104+
vle_full.liquid().molefracs[1],
105+
vle_binary.liquid().molefracs[0]
106+
);
107+
assert_eq!(
108+
vle_full.vapor().molefracs[1],
109+
vle_binary.vapor().molefracs[0]
110+
);
111+
Ok(())
112+
}

0 commit comments

Comments
 (0)