-
Notifications
You must be signed in to change notification settings - Fork 33
Expand file tree
/
Copy pathstate_creation_mixture.rs
More file actions
125 lines (119 loc) · 3.97 KB
/
Copy pathstate_creation_mixture.rs
File metadata and controls
125 lines (119 loc) · 3.97 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use approx::assert_relative_eq;
use feos::pcsaft::{PcSaft, PcSaftParameters};
use feos_core::parameter::{IdentifierOption, Parameter, ParameterError};
use feos_core::{Contributions, StateBuilder};
use ndarray::prelude::*;
use ndarray::Zip;
use quantity::si::*;
use std::error::Error;
use std::sync::Arc;
fn propane_butane_parameters() -> Result<Arc<PcSaftParameters>, ParameterError> {
Ok(Arc::new(PcSaftParameters::from_json(
vec!["propane", "butane"],
"tests/pcsaft/test_parameters.json",
None,
IdentifierOption::Name,
)?))
}
#[test]
fn pressure_entropy_molefracs() -> Result<(), Box<dyn Error>> {
let saft = Arc::new(PcSaft::new(propane_butane_parameters()?));
let pressure = BAR;
let temperature = 300.0 * KELVIN;
let x = arr1(&[0.3, 0.7]);
let state = StateBuilder::new(&saft)
.temperature(temperature)
.pressure(pressure)
.molefracs(&x)
.build()?;
let molar_entropy = state.molar_entropy(Contributions::Total);
let state = StateBuilder::new(&saft)
.pressure(pressure)
.molar_entropy(molar_entropy)
.molefracs(&x)
.build()?;
assert_relative_eq!(
state.molar_entropy(Contributions::Total),
molar_entropy,
max_relative = 1e-8
);
assert_relative_eq!(state.temperature, temperature, max_relative = 1e-10);
assert_relative_eq!(
state.pressure(Contributions::Total),
pressure,
max_relative = 1e-8
);
Ok(())
}
#[test]
fn volume_temperature_molefracs() -> Result<(), Box<dyn Error>> {
let saft = Arc::new(PcSaft::new(propane_butane_parameters()?));
let temperature = 300.0 * KELVIN;
let volume = 1.5e-3 * METER.powi(3);
let moles = MOL;
let x = arr1(&[0.3, 0.7]);
let state = StateBuilder::new(&saft)
.temperature(temperature)
.volume(volume)
.total_moles(moles)
.molefracs(&x)
.build()?;
assert_relative_eq!(state.volume, volume, max_relative = 1e-10);
Ok(())
}
#[test]
fn temperature_partial_density() -> Result<(), Box<dyn Error>> {
let saft = Arc::new(PcSaft::new(propane_butane_parameters()?));
let temperature = 300.0 * KELVIN;
let x = arr1(&[0.3, 0.7]);
let partial_density = x.clone() * MOL / METER.powi(3);
let density = partial_density.sum();
let state = StateBuilder::new(&saft)
.temperature(temperature)
.partial_density(&partial_density)
.build()?;
assert_relative_eq!(x, state.molefracs, max_relative = 1e-10);
assert_relative_eq!(density, state.density, max_relative = 1e-10);
// Zip::from(&state.partial_density.to_reduced(reference))
// .and(&partial_density.into_value()?)
// .for_each(|&r1, &r2| assert_relative_eq!(r1, r2, max_relative = 1e-10));
Ok(())
}
#[test]
fn temperature_density_molefracs() -> Result<(), Box<dyn Error>> {
let saft = Arc::new(PcSaft::new(propane_butane_parameters()?));
let temperature = 300.0 * KELVIN;
let x = arr1(&[0.3, 0.7]);
let density = MOL / METER.powi(3);
let state = StateBuilder::new(&saft)
.temperature(temperature)
.density(density)
.molefracs(&x)
.build()?;
Zip::from(&state.molefracs)
.and(&x)
.for_each(|&l, &r| assert_relative_eq!(l, r, max_relative = 1e-10));
assert_relative_eq!(state.density, density);
Ok(())
}
#[test]
fn temperature_pressure_molefracs() -> Result<(), Box<dyn Error>> {
let saft = Arc::new(PcSaft::new(propane_butane_parameters()?));
let temperature = 300.0 * KELVIN;
let pressure = BAR;
let x = arr1(&[0.3, 0.7]);
let state = StateBuilder::new(&saft)
.temperature(temperature)
.pressure(pressure)
.molefracs(&x)
.build()?;
Zip::from(&state.molefracs)
.and(&x)
.for_each(|&l, &r| assert_relative_eq!(l, r, max_relative = 1e-10));
assert_relative_eq!(
state.pressure(Contributions::Total),
pressure,
max_relative = 1e-10
);
Ok(())
}