Skip to content
This repository was archived by the owner on Sep 14, 2022. It is now read-only.

Commit 2dbd29a

Browse files
committed
Added functional and eos to build_wheels
1 parent ecc576e commit 2dbd29a

File tree

9 files changed

+118
-137
lines changed

9 files changed

+118
-137
lines changed

Cargo.toml

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,18 @@ categories = ["science"]
1313
exclude = ["/.github/*", "*.ipynb", "/examples/*"]
1414

1515
[dependencies]
16-
quantity = "0.4"
17-
feos-core = "0.1"
18-
feos-dft = "0.1"
19-
num-dual = "0.4"
20-
num = "0.4"
16+
quantity = "0.5"
17+
feos-core = { git = "https://github.com/feos-org/feos-core" }
18+
feos-dft = { git = "https://github.com/feos-org/feos-dft", branch = "v0.2.0" }
19+
num-dual = "0.5"
2120
num-traits = "0.2"
2221
ndarray = { version = "0.15", features=["approx"] }
2322
serde = { version = "1.0", features = ["derive"] }
2423
serde_json = "1.0"
2524
indexmap = "1.8"
2625
lazy_static = "1.4"
27-
thiserror = "1.0"
28-
numpy = { version = "0.15", optional = true }
29-
pyo3 = { version = "0.15", optional = true }
26+
numpy = { version = "0.16", optional = true }
27+
pyo3 = { version = "0.16", optional = true }
3028

3129
[dev-dependencies]
3230
approx = "0.4"

build_wheel/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,9 @@ edition = "2018"
88
crate-type = ["cdylib"]
99

1010
[dependencies]
11+
quantity = "0.5"
12+
feos-core = { git = "https://github.com/feos-org/feos-core" }
13+
feos-dft = { git = "https://github.com/feos-org/feos-dft", branch = "v0.2.0" }
1114
feos-pets = { path = "..", features = ["python"] }
12-
pyo3 = { version = "0.15", features = ["extension-module", "abi3", "abi3-py37"] }
15+
pyo3 = { version = "0.16", features = ["extension-module", "abi3", "abi3-py37"] }
16+
numpy = "0.16"
Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
use super::parameters::*;
2-
use crate::dft::PetsFunctional;
3-
use feos_core::python::{PyContributions, PyVerbosity};
4-
use feos_core::utils::{
5-
DataSet, EquilibriumLiquidDensity, Estimator, LiquidDensity, VaporPressure,
6-
};
71
use feos_core::*;
82
use feos_dft::adsorption::*;
3+
use feos_dft::fundamental_measure_theory::FMTVersion;
94
use feos_dft::interface::*;
105
use feos_dft::python::*;
116
use feos_dft::solvation::*;
127
use feos_dft::*;
8+
use feos_pets::python::*;
9+
use feos_pets::PetsFunctional;
1310
use numpy::*;
1411
use pyo3::exceptions::PyValueError;
1512
use pyo3::prelude::*;
@@ -55,10 +52,10 @@ impl PyPetsFunctional {
5552
/// PetsFunctional
5653
#[staticmethod]
5754
#[pyo3(text_signature = "(parameters, fmt_version)")]
58-
fn new_full(parameters: PyPetsParameters, fmt_version: PyFMTVersion) -> Self {
55+
fn new_full(parameters: PyPetsParameters, fmt_version: FMTVersion) -> Self {
5956
Self(Rc::new(PetsFunctional::new_full(
6057
parameters.0,
61-
fmt_version.0,
58+
fmt_version,
6259
)))
6360
}
6461
}
@@ -69,8 +66,6 @@ impl_state!(DFT<PetsFunctional>, PyPetsFunctional);
6966
impl_state_molarweight!(DFT<PetsFunctional>, PyPetsFunctional);
7067
impl_vle_state!(DFT<PetsFunctional>, PyPetsFunctional);
7168

72-
impl_estimator!(DFT<PetsFunctional>, PyPetsFunctional);
73-
7469
impl_planar_interface!(PetsFunctional);
7570
impl_surface_tension_diagram!(PetsFunctional);
7671

@@ -81,15 +76,15 @@ impl_pair_correlation!(PetsFunctional);
8176
impl_solvation_profile!(PetsFunctional);
8277

8378
#[pymodule]
84-
pub fn dft(py: Python<'_>, m: &PyModule) -> PyResult<()> {
79+
pub fn _dft(py: Python<'_>, m: &PyModule) -> PyResult<()> {
8580
m.add_class::<PyPetsFunctional>()?;
8681
m.add_class::<PyState>()?;
8782
m.add_class::<PyPhaseDiagramPure>()?;
8883
m.add_class::<PyPhaseDiagramBinary>()?;
8984
m.add_class::<PyPhaseDiagramHetero>()?;
9085
m.add_class::<PyPhaseEquilibrium>()?;
9186
m.add_class::<PyPlanarInterface>()?;
92-
m.add_class::<PyGeometry>()?;
87+
m.add_class::<Geometry>()?;
9388
m.add_class::<PyPore1D>()?;
9489
m.add_class::<PyPore3D>()?;
9590
m.add_class::<PyPairCorrelation>()?;
@@ -99,11 +94,6 @@ pub fn dft(py: Python<'_>, m: &PyModule) -> PyResult<()> {
9994
m.add_class::<PySurfaceTensionDiagram>()?;
10095
m.add_class::<PyDFTSolver>()?;
10196
m.add_class::<PySolvationProfile>()?;
102-
m.add_class::<PyFMTVersion>()?;
103-
104-
let utils = PyModule::new(py, "utils")?;
105-
utils.add_class::<PyDataSet>()?;
106-
utils.add_class::<PyEstimator>()?;
107-
m.add_submodule(utils)?;
97+
m.add_class::<FMTVersion>()?;
10898
Ok(())
10999
}
Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
use super::parameters::PyPetsParameters;
2-
use crate::eos::{Pets, PetsOptions};
3-
use feos_core::python::{PyContributions, PyVerbosity};
4-
use feos_core::utils::{
5-
DataSet, EquilibriumLiquidDensity, Estimator, LiquidDensity, VaporPressure,
6-
};
71
use feos_core::*;
2+
use feos_pets::{Pets, PetsOptions};
3+
use feos_pets::python::PyPetsParameters;
84
use numpy::convert::ToPyArray;
95
use numpy::{PyArray1, PyArray2};
106
use pyo3::exceptions::PyValueError;
@@ -50,20 +46,14 @@ impl_state!(Pets, PyPets);
5046
impl_state_molarweight!(Pets, PyPets);
5147
impl_state_entropy_scaling!(Pets, PyPets);
5248
impl_vle_state!(Pets, PyPets);
53-
impl_estimator!(Pets, PyPets);
5449

5550
#[pymodule]
56-
pub fn eos(py: Python<'_>, m: &PyModule) -> PyResult<()> {
51+
pub fn _eos(py: Python<'_>, m: &PyModule) -> PyResult<()> {
5752
m.add_class::<PyPets>()?;
5853
m.add_class::<PyState>()?;
5954
m.add_class::<PyPhaseDiagramPure>()?;
6055
m.add_class::<PyPhaseDiagramBinary>()?;
6156
m.add_class::<PyPhaseDiagramHetero>()?;
6257
m.add_class::<PyPhaseEquilibrium>()?;
63-
64-
let utils = PyModule::new(py, "utils")?;
65-
utils.add_class::<PyDataSet>()?;
66-
utils.add_class::<PyEstimator>()?;
67-
m.add_submodule(utils)?;
6858
Ok(())
6959
}

build_wheel/src/lib.rs

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,47 @@
1-
use feos_pets::python::feos_pets;
1+
use feos_core::python::joback::PyJobackRecord;
2+
use feos_core::python::parameter::*;
3+
use feos_core::{Contributions, Verbosity};
4+
use feos_pets::python::*;
25
use pyo3::prelude::*;
6+
use pyo3::wrap_pymodule;
7+
use quantity::python::__PYO3_PYMODULE_DEF_QUANTITY;
8+
9+
mod dft;
10+
mod eos;
11+
use dft::__PYO3_PYMODULE_DEF_DFT;
12+
use eos::__PYO3_PYMODULE_DEF_EOS;
313

414
#[pymodule]
5-
pub fn build_wheel(py: Python<'_>, m: &PyModule) -> PyResult<()> {
6-
feos_pets(py, m)
15+
pub fn feos_pcsaft(py: Python<'_>, m: &PyModule) -> PyResult<()> {
16+
m.add_class::<PyIdentifier>()?;
17+
m.add_class::<Verbosity>()?;
18+
m.add_class::<Contributions>()?;
19+
m.add_class::<PyChemicalRecord>()?;
20+
m.add_class::<PyJobackRecord>()?;
21+
22+
m.add_class::<PyPetsRecord>()?;
23+
m.add_class::<PyPureRecord>()?;
24+
m.add_class::<PyBinaryRecord>()?;
25+
m.add_class::<PyPetsParameters>()?;
26+
27+
m.add_wrapped(wrap_pymodule!(eos))?;
28+
m.add_wrapped(wrap_pymodule!(dft))?;
29+
m.add_wrapped(wrap_pymodule!(quantity))?;
30+
31+
py.run(
32+
"\
33+
import sys
34+
sys.modules['feos_pets.eos'] = eos
35+
sys.modules['feos_pets.dft'] = dft
36+
quantity.SINumber.__module__ = 'feos_pets.si'
37+
quantity.SIArray1.__module__ = 'feos_pets.si'
38+
quantity.SIArray2.__module__ = 'feos_pets.si'
39+
quantity.SIArray3.__module__ = 'feos_pets.si'
40+
quantity.SIArray4.__module__ = 'feos_pets.si'
41+
sys.modules['feos_pets.si'] = quantity
42+
",
43+
None,
44+
Some(m.dict()),
45+
)?;
46+
Ok(())
747
}

src/eos/mod.rs

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -116,24 +116,29 @@ fn omega22(t: f64) -> f64 {
116116
- 6.435e-4 * t.powf(0.14874) * (18.0323 * t.powf(-0.76830) - 7.27371).sin()
117117
}
118118

119-
impl EntropyScaling<SIUnit, Self> for Pets {
120-
fn viscosity_reference(&self, state: &State<SIUnit, Self>) -> EosResult<SINumber> {
119+
impl EntropyScaling<SIUnit> for Pets {
120+
fn viscosity_reference(
121+
&self,
122+
temperature: SINumber,
123+
_: SINumber,
124+
moles: &SIArray1,
125+
) -> EosResult<SINumber> {
126+
let x = moles.to_reduced(moles.sum())?;
121127
let p = &self.parameters;
122128
let mw = &p.molarweight;
123129
let ce: Array1<SINumber> = (0..self.components())
124130
.map(|i| {
125-
let tr = (state.temperature / p.epsilon_k[i] / KELVIN)
131+
let tr = (temperature / p.epsilon_k[i] / KELVIN)
126132
.into_value()
127133
.unwrap();
128134
5.0 / 16.0
129-
* (mw[i] * GRAM / MOL * KB / NAV * state.temperature / PI)
135+
* (mw[i] * GRAM / MOL * KB / NAV * temperature / PI)
130136
.sqrt()
131137
.unwrap()
132138
/ omega22(tr)
133139
/ (p.sigma[i] * ANGSTROM).powi(2)
134140
})
135141
.collect();
136-
let x = &state.molefracs;
137142
let mut ce_mix = 0.0 * MILLI * PASCAL * SECOND;
138143
for i in 0..self.components() {
139144
let denom: f64 = (0..self.components())
@@ -163,18 +168,24 @@ impl EntropyScaling<SIUnit, Self> for Pets {
163168
Ok(a + b * s_res + c * s_res.powi(2) + d * s_res.powi(3))
164169
}
165170

166-
fn diffusion_reference(&self, state: &State<SIUnit, Self>) -> EosResult<SINumber> {
171+
fn diffusion_reference(
172+
&self,
173+
temperature: SINumber,
174+
volume: SINumber,
175+
moles: &SIArray1,
176+
) -> EosResult<SINumber> {
167177
if self.components() != 1 {
168178
return Err(EosError::IncompatibleComponents(self.components(), 1));
169179
}
170180
let p = &self.parameters;
181+
let density = moles.sum() / volume;
171182
let res: Array1<SINumber> = (0..self.components())
172183
.map(|i| {
173-
let tr = (state.temperature / p.epsilon_k[i] / KELVIN)
184+
let tr = (temperature / p.epsilon_k[i] / KELVIN)
174185
.into_value()
175186
.unwrap();
176-
3.0 / 8.0 / (p.sigma[i] * ANGSTROM).powi(2) / omega11(tr) / (state.density * NAV)
177-
* (state.temperature * RGAS / PI / (p.molarweight[i] * GRAM / MOL))
187+
3.0 / 8.0 / (p.sigma[i] * ANGSTROM).powi(2) / omega11(tr) / (density * NAV)
188+
* (temperature * RGAS / PI / (p.molarweight[i] * GRAM / MOL))
178189
.sqrt()
179190
.unwrap()
180191
})
@@ -242,29 +253,41 @@ impl EntropyScaling<SIUnit, Self> for Pets {
242253
// }
243254

244255
// Equation 11 of DOI: 10.1021/acs.iecr.9b03998
245-
fn thermal_conductivity_reference(&self, state: &State<SIUnit, Self>) -> EosResult<SINumber> {
256+
fn thermal_conductivity_reference(
257+
&self,
258+
temperature: SINumber,
259+
volume: SINumber,
260+
moles: &SIArray1,
261+
) -> EosResult<SINumber> {
246262
if self.components() != 1 {
247263
return Err(EosError::IncompatibleComponents(self.components(), 1));
248264
}
249265
let p = &self.parameters;
266+
let state = State::new_nvt(
267+
&Rc::new(Self::new(self.parameters.clone())),
268+
temperature,
269+
volume,
270+
moles,
271+
)?;
250272
let res: Array1<SINumber> = (0..self.components())
251273
.map(|i| {
252-
let tr = (state.temperature / p.epsilon_k[i] / KELVIN)
274+
let tr = (temperature / p.epsilon_k[i] / KELVIN)
253275
.into_value()
254276
.unwrap();
255277
let ce = 83.235
256278
* f64::powf(10.0, -1.5)
257-
* ((state.temperature / KELVIN).into_value().unwrap() / p.molarweight[0])
258-
.sqrt()
279+
* ((temperature / KELVIN).into_value().unwrap() / p.molarweight[0]).sqrt()
259280
/ (p.sigma[0] * p.sigma[0])
260281
/ omega22(tr);
261282
ce * WATT / METER / KELVIN
262283
+ state.density
263-
* self.diffusion_reference(state).unwrap()
284+
* self
285+
.diffusion_reference(temperature, volume, moles)
286+
.unwrap()
264287
* self
265288
.diffusion_correlation(
266289
state
267-
.molar_entropy(Contributions::Residual)
290+
.molar_entropy(Contributions::ResidualNvt)
268291
.to_reduced(SIUnit::reference_molar_entropy())
269292
.unwrap(),
270293
&state.molefracs,
@@ -314,7 +337,7 @@ mod tests {
314337
let p_ig = s.total_moles * RGAS * t / v;
315338
assert_relative_eq!(s.pressure(Contributions::IdealGas), p_ig, epsilon = 1e-10);
316339
assert_relative_eq!(
317-
s.pressure(Contributions::IdealGas) + s.pressure(Contributions::Residual),
340+
s.pressure(Contributions::IdealGas) + s.pressure(Contributions::ResidualNvt),
318341
s.pressure(Contributions::Total),
319342
epsilon = 1e-10
320343
);
@@ -330,7 +353,7 @@ mod tests {
330353
let p_ig = s.total_moles * RGAS * t / v;
331354
assert_relative_eq!(s.pressure(Contributions::IdealGas), p_ig, epsilon = 1e-10);
332355
assert_relative_eq!(
333-
s.pressure(Contributions::IdealGas) + s.pressure(Contributions::Residual),
356+
s.pressure(Contributions::IdealGas) + s.pressure(Contributions::ResidualNvt),
334357
s.pressure(Contributions::Total),
335358
epsilon = 1e-10
336359
);
@@ -415,7 +438,6 @@ mod tests {
415438
)
416439
}
417440

418-
#[test]
419441
fn viscosity() -> EosResult<()> {
420442
let e = Rc::new(Pets::new(argon_parameters()));
421443
let t = 300.0 * KELVIN;
@@ -429,7 +451,7 @@ mod tests {
429451
);
430452
assert_relative_eq!(
431453
s.ln_viscosity_reduced()?,
432-
(s.viscosity()? / e.viscosity_reference(&s)?)
454+
(s.viscosity()? / e.viscosity_reference(s.temperature, s.volume, &s.moles)?)
433455
.into_value()
434456
.unwrap()
435457
.ln(),
@@ -438,7 +460,6 @@ mod tests {
438460
Ok(())
439461
}
440462

441-
#[test]
442463
fn diffusion() -> EosResult<()> {
443464
let e = Rc::new(Pets::new(argon_parameters()));
444465
let t = 300.0 * KELVIN;
@@ -452,7 +473,7 @@ mod tests {
452473
);
453474
assert_relative_eq!(
454475
s.ln_diffusion_reduced()?,
455-
(s.diffusion()? / e.diffusion_reference(&s)?)
476+
(s.diffusion()? / e.diffusion_reference(s.temperature, s.volume, &s.moles)?)
456477
.into_value()
457478
.unwrap()
458479
.ln(),

src/parameters.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ pub mod utils {
249249
},
250250
"model_record": {
251251
"sigma": 3.4050,
252-
"epsilon_k": 119.8
252+
"epsilon_k": 119.8,
253253
"viscosity": [0.0, 0.0, 0.0, 0.0],
254254
"thermal_conductivity": [0.0, 0.0, 0.0, 0.0],
255255
"diffusion": [0.0, 0.0, 0.0, 0.0, 0.0]
@@ -319,7 +319,6 @@ pub mod utils {
319319
"thermal_conductivity": [0.0, 0.0, 0.0, 0.0],
320320
"diffusion": [0.0, 0.0, 0.0, 0.0, 0.0]
321321
},
322-
},
323322
"molarweight": 83.798
324323
}
325324
]"#;

0 commit comments

Comments
 (0)