use super::parameters::{PcSaftBinaryRecord, PcSaftParameters, PcSaftRecord}; use super::DQVariants; use feos_core::parameter::{ BinaryRecord, Identifier, IdentifierOption, Parameter, ParameterError, PureRecord, SegmentRecord, }; use feos_core::python::parameter::*; use feos_core::*; use numpy::{PyArray2, PyReadonlyArray2, ToPyArray}; use pyo3::exceptions::PyTypeError; use pyo3::prelude::*; use std::convert::{TryFrom, TryInto}; use std::sync::Arc; /// Create a new set of PC-SAFT pure component parameters. #[pyclass(name = "PcSaftRecord")] #[pyo3( text_signature = "(m, sigma, epsilon_k, mu=None, q=None, kappa_ab=None, epsilon_k_ab=None, na=None, nb=None, viscosity=None, diffusion=None, thermal_conductivity=None)" )] #[derive(Clone)] pub struct PyPcSaftRecord(PcSaftRecord); #[pymethods] impl PyPcSaftRecord { #[new] fn new( m: f64, sigma: f64, epsilon_k: f64, mu: Option, q: Option, kappa_ab: Option, epsilon_k_ab: Option, na: Option, nb: Option, nc: Option, viscosity: Option<[f64; 4]>, diffusion: Option<[f64; 5]>, thermal_conductivity: Option<[f64; 4]>, ) -> Self { Self(PcSaftRecord::new( m, sigma, epsilon_k, mu, q, kappa_ab, epsilon_k_ab, na, nb, nc, viscosity, diffusion, thermal_conductivity, )) } #[getter] fn get_m(&self) -> f64 { self.0.m } #[getter] fn get_sigma(&self) -> f64 { self.0.sigma } #[getter] fn get_epsilon_k(&self) -> f64 { self.0.epsilon_k } #[getter] fn get_mu(&self) -> Option { self.0.mu } #[getter] fn get_q(&self) -> Option { self.0.q } #[getter] fn get_kappa_ab(&self) -> Option { self.0.association_record.map(|a| a.kappa_ab) } #[getter] fn get_epsilon_k_ab(&self) -> Option { self.0.association_record.map(|a| a.epsilon_k_ab) } #[getter] fn get_na(&self) -> Option { self.0.association_record.map(|a| a.na) } #[getter] fn get_nb(&self) -> Option { self.0.association_record.map(|a| a.nb) } #[getter] fn get_nc(&self) -> Option { self.0.association_record.map(|a| a.nc) } #[getter] fn get_viscosity(&self) -> Option<[f64; 4]> { self.0.viscosity } #[getter] fn get_diffusion(&self) -> Option<[f64; 5]> { self.0.diffusion } #[getter] fn get_thermal_conductivity(&self) -> Option<[f64; 4]> { self.0.thermal_conductivity } fn __repr__(&self) -> PyResult { Ok(self.0.to_string()) } } impl_json_handling!(PyPcSaftRecord); impl_pure_record!(PcSaftRecord, PyPcSaftRecord); impl_segment_record!(PcSaftRecord, PyPcSaftRecord); #[pyclass(name = "PcSaftBinaryRecord")] #[derive(Clone)] pub struct PyPcSaftBinaryRecord(PcSaftBinaryRecord); #[pymethods] impl PyPcSaftBinaryRecord { #[new] fn new(k_ij: Option, kappa_ab: Option, epsilon_k_ab: Option) -> Self { Self(PcSaftBinaryRecord::new(k_ij, kappa_ab, epsilon_k_ab)) } fn __repr__(&self) -> PyResult { Ok(self.0.to_string()) } } impl_json_handling!(PyPcSaftBinaryRecord); impl_binary_record!(PcSaftBinaryRecord, PyPcSaftBinaryRecord); #[pyclass(name = "PcSaftParameters")] #[derive(Clone)] pub struct PyPcSaftParameters(pub Arc); impl_parameter!( PcSaftParameters, PyPcSaftParameters, PyPcSaftRecord, PyPcSaftBinaryRecord ); impl_parameter_from_segments!(PcSaftParameters, PyPcSaftParameters); #[pymethods] impl PyPcSaftParameters { #[getter] fn get_k_ij<'py>(&self, py: Python<'py>) -> Option<&'py PyArray2> { self.0 .binary_records .as_ref() .map(|br| br.map(|br| br.k_ij).view().to_pyarray(py)) } fn _repr_markdown_(&self) -> String { self.0.to_markdown() } } #[pymodule] pub fn pcsaft(_py: Python<'_>, m: &PyModule) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; Ok(()) }