-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathtp_flash.rs
More file actions
62 lines (60 loc) · 2.04 KB
/
tp_flash.rs
File metadata and controls
62 lines (60 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use approx::assert_relative_eq;
use feos::pcsaft::{PcSaft, PcSaftParameters};
use feos_core::parameter::{IdentifierOption, Parameter, ParameterError};
use feos_core::{Contributions, PhaseEquilibrium, SolverOptions};
use ndarray::*;
use quantity::si::*;
use std::error::Error;
use std::sync::Arc;
fn read_params(components: Vec<&str>) -> Result<Arc<PcSaftParameters>, ParameterError> {
Ok(Arc::new(PcSaftParameters::from_json(
components,
"tests/pcsaft/test_parameters.json",
None,
IdentifierOption::Name,
)?))
}
#[test]
fn test_tp_flash() -> Result<(), Box<dyn Error>> {
let propane = Arc::new(PcSaft::new(read_params(vec!["propane"])?));
let butane = Arc::new(PcSaft::new(read_params(vec!["butane"])?));
let t = 250.0 * KELVIN;
let p_propane = PhaseEquilibrium::pure(&propane, t, None, Default::default())?
.vapor()
.pressure(Contributions::Total);
let p_butane = PhaseEquilibrium::pure(&butane, t, None, Default::default())?
.vapor()
.pressure(Contributions::Total);
let x1 = 0.5;
let p = x1 * p_propane + (1.0 - x1) * p_butane;
let y1 = (x1 * p_propane / p).into_value()?;
let z1 = 0.5 * (x1 + y1);
println!("{} {} {} {} {}", p_propane, p_butane, x1, y1, z1);
let mix = Arc::new(PcSaft::new(read_params(vec!["propane", "butane"])?));
let options = SolverOptions::new().max_iter(100).tol(1e-12);
let vle = PhaseEquilibrium::tp_flash(
&mix,
t,
p,
&(arr1(&[z1, 1.0 - z1]) * MOL),
None,
options,
None,
)?;
println!(
"x1: {}, y1: {}",
vle.liquid().molefracs[0],
vle.vapor().molefracs[0]
);
assert_relative_eq!(
vle.vapor().pressure(Contributions::Total),
vle.liquid().pressure(Contributions::Total),
max_relative = 1e-10
);
assert_relative_eq!(
&vle.vapor().molefracs * &vle.vapor().ln_phi().mapv(f64::exp),
&vle.liquid().molefracs * &vle.liquid().ln_phi().mapv(f64::exp),
max_relative = 1e-10
);
Ok(())
}