diff --git a/crates/feos-core/src/cubic.rs b/crates/feos-core/src/cubic.rs index 7f68dd1bb..2561feaed 100644 --- a/crates/feos-core/src/cubic.rs +++ b/crates/feos-core/src/cubic.rs @@ -208,7 +208,7 @@ mod tests { let parameters = PengRobinsonParameters::new_pure(propane)?; let pr = PengRobinson::new(parameters); let options = SolverOptions::new().verbosity(Verbosity::Iter); - let cp = State::critical_point(&&pr, None, None, options)?; + let cp = State::critical_point(&&pr, None, None, None, options)?; println!("{} {}", cp.temperature, cp.pressure(Contributions::Total)); assert_relative_eq!(cp.temperature, tc * KELVIN, max_relative = 1e-4); assert_relative_eq!( diff --git a/crates/feos-core/src/phase_equilibria/phase_diagram_binary.rs b/crates/feos-core/src/phase_equilibria/phase_diagram_binary.rs index bd14f0c1f..54e0a0b35 100644 --- a/crates/feos-core/src/phase_equilibria/phase_diagram_binary.rs +++ b/crates/feos-core/src/phase_equilibria/phase_diagram_binary.rs @@ -60,6 +60,7 @@ impl PhaseDiagram { temperature_or_pressure, None, None, + None, SolverOptions::default(), )?; let cp_vle = PhaseEquilibrium::from_states(cp.clone(), cp.clone()); @@ -71,6 +72,7 @@ impl PhaseDiagram { temperature_or_pressure, None, None, + None, SolverOptions::default(), )?; let cp_vle = PhaseEquilibrium::from_states(cp.clone(), cp.clone()); diff --git a/crates/feos-core/src/phase_equilibria/phase_diagram_pure.rs b/crates/feos-core/src/phase_equilibria/phase_diagram_pure.rs index d5a44b6c8..daeb12132 100644 --- a/crates/feos-core/src/phase_equilibria/phase_diagram_pure.rs +++ b/crates/feos-core/src/phase_equilibria/phase_diagram_pure.rs @@ -35,7 +35,13 @@ impl PhaseDiagram { ) -> FeosResult { let mut states = Vec::with_capacity(npoints); - let sc = State::critical_point(eos, None, critical_temperature, SolverOptions::default())?; + let sc = State::critical_point( + eos, + None, + critical_temperature, + None, + SolverOptions::default(), + )?; let max_temperature = min_temperature + (sc.temperature - min_temperature) * ((npoints - 2) as f64 / (npoints - 1) as f64); @@ -96,7 +102,13 @@ impl PhaseDiagram { where E: Send + Sync, { - let sc = State::critical_point(eos, None, critical_temperature, SolverOptions::default())?; + let sc = State::critical_point( + eos, + None, + critical_temperature, + None, + SolverOptions::default(), + )?; let max_temperature = min_temperature + (sc.temperature - min_temperature) * ((npoints - 2) as f64 / (npoints - 1) as f64); diff --git a/crates/feos-core/src/phase_equilibria/phase_envelope.rs b/crates/feos-core/src/phase_equilibria/phase_envelope.rs index 0c4d9407c..89610e538 100644 --- a/crates/feos-core/src/phase_equilibria/phase_envelope.rs +++ b/crates/feos-core/src/phase_equilibria/phase_envelope.rs @@ -22,6 +22,7 @@ impl PhaseDiagram { eos, Some(molefracs), critical_temperature, + None, SolverOptions::default(), )?; @@ -70,6 +71,7 @@ impl PhaseDiagram { eos, Some(molefracs), critical_temperature, + None, SolverOptions::default(), )?; @@ -134,6 +136,7 @@ impl PhaseDiagram { eos, Some(molefracs), critical_temperature, + None, SolverOptions::default(), )?; diff --git a/crates/feos-core/src/phase_equilibria/vle_pure.rs b/crates/feos-core/src/phase_equilibria/vle_pure.rs index 9fa162757..5e58601af 100644 --- a/crates/feos-core/src/phase_equilibria/vle_pure.rs +++ b/crates/feos-core/src/phase_equilibria/vle_pure.rs @@ -376,7 +376,7 @@ impl PhaseEquilibrium { vle = Some(_vle); } - let cp = State::critical_point(eos, None, None, SolverOptions::default())?; + let cp = State::critical_point(eos, None, None, None, SolverOptions::default())?; if pressure > cp.pressure(Contributions::Total) { return Err(FeosError::SuperCritical); }; diff --git a/crates/feos-core/src/state/critical_point.rs b/crates/feos-core/src/state/critical_point.rs index d27b07d0b..1f18093e0 100644 --- a/crates/feos-core/src/state/critical_point.rs +++ b/crates/feos-core/src/state/critical_point.rs @@ -22,12 +22,19 @@ impl State { pub fn critical_point_pure( eos: &R, initial_temperature: Option, + initial_density: Option, options: SolverOptions, ) -> FeosResult> { (0..eos.components()) .map(|i| { let pure_eos = eos.subset(&[i]); - let cp = State::critical_point(&pure_eos, None, initial_temperature, options)?; + let cp = State::critical_point( + &pure_eos, + None, + initial_temperature, + initial_density, + options, + )?; let mut molefracs = DVector::zeros(eos.components()); molefracs[i] = 1.0; State::new_intensive(eos, cp.temperature, cp.density, &molefracs) @@ -45,6 +52,7 @@ where temperature_or_pressure: TP, initial_temperature: Option, initial_molefracs: Option<[f64; 2]>, + initial_density: Option, options: SolverOptions, ) -> FeosResult { let eos_re = eos.re(); @@ -52,8 +60,13 @@ where let initial_molefracs = initial_molefracs.unwrap_or([0.5; 2]); let initial_molefracs = OVector::from_fn_generic(n, U1, |i, _| initial_molefracs[i]); if let Some(t) = temperature_or_pressure.temperature() { - let [rho0, rho1] = - critical_point_binary_t(&eos_re, t.re(), initial_molefracs, options)?; + let [rho0, rho1] = critical_point_binary_t( + &eos_re, + t.re(), + initial_molefracs, + initial_density, + options, + )?; let rho = implicit_derivative_binary( |rho0, rho1, &temperature| { let rho = [rho0, rho1]; @@ -74,6 +87,7 @@ where p.re(), initial_temperature, initial_molefracs, + initial_density, options, )?; let trho = implicit_derivative_vec::<_, _, _, _, U3>( @@ -99,21 +113,24 @@ where eos: &E, molefracs: Option<&OVector>, initial_temperature: Option, + initial_density: Option, options: SolverOptions, ) -> FeosResult { let eos_re = eos.re(); let molefracs = molefracs.map_or_else(E::pure_molefracs, |x| x.clone()); let x = &molefracs.map(|x| x.re()); + let rho_init = initial_density.map(|r| r.into_reduced()); let trial_temperatures = [300.0, 700.0, 500.0]; let mut t_rho = None; if let Some(t) = initial_temperature { - t_rho = Some(critical_point_hkm(&eos_re, x, t.into_reduced(), options)?); + let t = t.into_reduced(); + t_rho = Some(critical_point_hkm(&eos_re, x, t, rho_init, options)?); } for &t in trial_temperatures.iter() { if t_rho.is_some() { break; } - t_rho = critical_point_hkm(&eos_re, x, t, options).ok(); + t_rho = critical_point_hkm(&eos_re, x, t, rho_init, options).ok(); } let Some(t_rho) = t_rho else { return Err(FeosError::NotConverged(String::from("Critical point"))); @@ -134,10 +151,12 @@ where ) } } + fn critical_point_hkm, N: Gradients>( eos: &E, molefracs: &OVector, initial_temperature: f64, + initial_density: Option, options: SolverOptions, ) -> FeosResult<[f64; 2]> where @@ -147,7 +166,7 @@ where let mut t = initial_temperature; let max_density = eos.compute_max_density(molefracs); - let mut rho = 0.3 * max_density; + let mut rho = initial_density.unwrap_or(0.3 * max_density); log_iter!( verbosity, @@ -220,6 +239,7 @@ fn critical_point_binary_t, N: Gradients>( eos: &E, temperature: Temperature, initial_molefracs: OVector, + initial_density: Option, options: SolverOptions, ) -> FeosResult<[f64; 2]> where @@ -230,7 +250,8 @@ where let t = temperature.to_reduced(); let n = N::from_usize(2); let max_density = eos.compute_max_density(&initial_molefracs); - let mut rho = SVector::from([initial_molefracs[0], initial_molefracs[1]]) * 0.3 * max_density; + let rho_init = initial_density.map_or(0.3 * max_density, |r| r.into_reduced()); + let mut rho = SVector::from([initial_molefracs[0], initial_molefracs[1]]) * rho_init; log_iter!( verbosity, @@ -302,6 +323,7 @@ fn critical_point_binary_p, N: Gradients>( pressure: Pressure, initial_temperature: Option, initial_molefracs: OVector, + initial_density: Option, options: SolverOptions, ) -> FeosResult<[f64; 3]> where @@ -312,7 +334,8 @@ where let p = pressure.to_reduced(); let mut t = initial_temperature.map(|t| t.to_reduced()).unwrap_or(300.0); let max_density = eos.compute_max_density(&initial_molefracs); - let mut rho = SVector::from([initial_molefracs[0], initial_molefracs[1]]) * 0.3 * max_density; + let rho_init = initial_density.map_or(0.3 * max_density, |r| r.into_reduced()); + let mut rho = SVector::from([initial_molefracs[0], initial_molefracs[1]]) * rho_init; log_iter!( verbosity, @@ -393,7 +416,7 @@ where molefracs: Option<&OVector>, options: SolverOptions, ) -> FeosResult<[Self; 2]> { - let critical_point = Self::critical_point(eos, molefracs, None, options)?; + let critical_point = Self::critical_point(eos, molefracs, None, None, options)?; let molefracs = molefracs.map_or_else(E::pure_molefracs, |x| x.clone()); let spinodal_vapor = Self::calculate_spinodal( eos, diff --git a/crates/feos/benches/dual_numbers.rs b/crates/feos/benches/dual_numbers.rs index 4c50b938c..6ec66a63c 100644 --- a/crates/feos/benches/dual_numbers.rs +++ b/crates/feos/benches/dual_numbers.rs @@ -22,7 +22,7 @@ use typenum::P3; fn state_pcsaft(n: usize, eos: &PcSaft) -> State<&PcSaft> { let moles = DVector::from_element(n, 1.0 / n as f64) * 10.0 * MOL; let molefracs = (&moles / moles.sum()).into_value(); - let cp = State::critical_point(&eos, Some(&molefracs), None, Default::default()).unwrap(); + let cp = State::critical_point(&eos, Some(&molefracs), None, None, Default::default()).unwrap(); let temperature = 0.8 * cp.temperature; State::new_nvt(&eos, temperature, cp.volume, &moles).unwrap() } diff --git a/crates/feos/benches/dual_numbers_saftvrmie.rs b/crates/feos/benches/dual_numbers_saftvrmie.rs index 31ba7ef15..0d6329974 100644 --- a/crates/feos/benches/dual_numbers_saftvrmie.rs +++ b/crates/feos/benches/dual_numbers_saftvrmie.rs @@ -18,7 +18,7 @@ use quantity::*; /// - molefracs (or moles) for equimolar mixture. fn state_saftvrmie(n: usize, eos: &SaftVRMie) -> State<&SaftVRMie> { let molefracs = DVector::from_element(n, 1.0 / n as f64); - let cp = State::critical_point(&eos, Some(&molefracs), None, Default::default()).unwrap(); + let cp = State::critical_point(&eos, Some(&molefracs), None, None, Default::default()).unwrap(); let temperature = 0.8 * cp.temperature; State::new_nvt(&eos, temperature, cp.volume, &(molefracs * 10. * MOL)).unwrap() } diff --git a/crates/feos/benches/state_creation.rs b/crates/feos/benches/state_creation.rs index b8fbeef29..6110abd68 100644 --- a/crates/feos/benches/state_creation.rs +++ b/crates/feos/benches/state_creation.rs @@ -23,12 +23,12 @@ fn npt( /// Evaluate critical point constructor fn critical_point((eos, n): (&E, Option<&DVector>)) { - State::critical_point(eos, n, None, Default::default()).unwrap(); + State::critical_point(eos, n, None, None, Default::default()).unwrap(); } /// Evaluate critical point constructor for binary systems at given T or p fn critical_point_binary((eos, tp): (&E, TP)) { - State::critical_point_binary(eos, tp, None, None, Default::default()).unwrap(); + State::critical_point_binary(eos, tp, None, None, None, Default::default()).unwrap(); } /// VLE for pure substance for given temperature or pressure @@ -69,7 +69,7 @@ fn bench_states(c: &mut Criterion, group_name: &str, eos: &E) { let ncomponents = eos.components(); let x = DVector::from_element(ncomponents, 1.0 / ncomponents as f64); let n = &x * 100.0 * MOL; - let crit = State::critical_point(eos, Some(&x), None, Default::default()).unwrap(); + let crit = State::critical_point(eos, Some(&x), None, None, Default::default()).unwrap(); let vle = if ncomponents == 1 { PhaseEquilibrium::pure(eos, crit.temperature * 0.95, None, Default::default()).unwrap() } else { diff --git a/crates/feos/src/epcsaft/eos/mod.rs b/crates/feos/src/epcsaft/eos/mod.rs index 54f430189..b8b20c28b 100644 --- a/crates/feos/src/epcsaft/eos/mod.rs +++ b/crates/feos/src/epcsaft/eos/mod.rs @@ -273,7 +273,7 @@ mod tests { fn critical_point() { let e = ElectrolytePcSaft::new(propane_parameters()).unwrap(); let t = 300.0 * KELVIN; - let cp = State::critical_point(&&e, None, Some(t), Default::default()); + let cp = State::critical_point(&&e, None, Some(t), None, Default::default()); if let Ok(v) = cp { assert_relative_eq!(v.temperature, 375.1244078318015 * KELVIN, epsilon = 1e-8) } diff --git a/crates/feos/src/lib.rs b/crates/feos/src/lib.rs index 76f343b80..26bc87dcd 100644 --- a/crates/feos/src/lib.rs +++ b/crates/feos/src/lib.rs @@ -23,7 +23,7 @@ //! let saft = PcSaft::new(parameters); //! //! // Define thermodynamic conditions. -//! let critical_point = State::critical_point(&&saft, Some(&dvector![1.0]), None, Default::default())?; +//! let critical_point = State::critical_point(&&saft, Some(&dvector![1.0]), None, None, Default::default())?; //! //! // Compute properties. //! let p = critical_point.pressure(Contributions::Total); diff --git a/crates/feos/src/pcsaft/eos/mod.rs b/crates/feos/src/pcsaft/eos/mod.rs index 4c9ae0185..4cc64796f 100644 --- a/crates/feos/src/pcsaft/eos/mod.rs +++ b/crates/feos/src/pcsaft/eos/mod.rs @@ -506,7 +506,7 @@ mod tests { fn critical_point() { let e = &propane_parameters(); let t = 300.0 * KELVIN; - let cp = State::critical_point(&e, None, Some(t), Default::default()); + let cp = State::critical_point(&e, None, Some(t), None, Default::default()); if let Ok(v) = cp { assert_relative_eq!(v.temperature, 375.1244078318015 * KELVIN, epsilon = 1e-8) } diff --git a/crates/feos/tests/gc_pcsaft/binary.rs b/crates/feos/tests/gc_pcsaft/binary.rs index 77f288504..0419a8987 100644 --- a/crates/feos/tests/gc_pcsaft/binary.rs +++ b/crates/feos/tests/gc_pcsaft/binary.rs @@ -31,9 +31,9 @@ fn test_binary() -> FeosResult<()> { #[cfg(feature = "dft")] let func = &GcPcSaftFunctional::new(parameters_func); let molefracs = dvector![0.5, 0.5]; - let cp = State::critical_point(&eos, Some(&molefracs), None, Default::default())?; + let cp = State::critical_point(&eos, Some(&molefracs), None, None, Default::default())?; #[cfg(feature = "dft")] - let cp_func = State::critical_point(&func, Some(&molefracs), None, Default::default())?; + let cp_func = State::critical_point(&func, Some(&molefracs), None, None, Default::default())?; println!("{}", cp.temperature); #[cfg(feature = "dft")] println!("{}", cp_func.temperature); diff --git a/crates/feos/tests/gc_pcsaft/dft.rs b/crates/feos/tests/gc_pcsaft/dft.rs index e19063ffd..5d245bfb1 100644 --- a/crates/feos/tests/gc_pcsaft/dft.rs +++ b/crates/feos/tests/gc_pcsaft/dft.rs @@ -159,7 +159,7 @@ fn test_dft() -> Result<(), Box> { let t = 200.0 * KELVIN; let w = 150.0 * ANGSTROM; let points = 2048; - let tc = State::critical_point(&&func, None, None, Default::default())?.temperature; + let tc = State::critical_point(&&func, None, None, None, Default::default())?.temperature; let vle = PhaseEquilibrium::pure(&&func, t, None, Default::default())?; let profile = PlanarInterface::from_tanh(&vle, points, w, tc, false).solve(None)?; println!( @@ -253,7 +253,7 @@ fn test_dft_newton() -> Result<(), Box> { let t = 200.0 * KELVIN; let w = 150.0 * ANGSTROM; let points = 512; - let tc = State::critical_point(&&func, None, None, Default::default())?.temperature; + let tc = State::critical_point(&&func, None, None, None, Default::default())?.temperature; let vle = PhaseEquilibrium::pure(&&func, t, None, Default::default())?; let solver = DFTSolver::new(Some(Verbosity::Iter)) .picard_iteration(None, Some(10), None, None) diff --git a/crates/feos/tests/pcsaft/critical_point.rs b/crates/feos/tests/pcsaft/critical_point.rs index fdb80e1f2..097dd607a 100644 --- a/crates/feos/tests/pcsaft/critical_point.rs +++ b/crates/feos/tests/pcsaft/critical_point.rs @@ -17,7 +17,7 @@ fn test_critical_point_pure() -> Result<(), Box> { )?; let saft = PcSaft::new(params); let t = 300.0 * KELVIN; - let cp = State::critical_point(&&saft, None, Some(t), Default::default())?; + let cp = State::critical_point(&&saft, None, Some(t), None, Default::default())?; assert_relative_eq!(cp.temperature, 375.12441 * KELVIN, max_relative = 1e-8); assert_relative_eq!( cp.density, @@ -38,7 +38,7 @@ fn test_critical_point_mix() -> Result<(), Box> { let saft = PcSaft::new(params); let t = 300.0 * KELVIN; let molefracs = dvector![0.5, 0.5]; - let cp = State::critical_point(&&saft, Some(&molefracs), Some(t), Default::default())?; + let cp = State::critical_point(&&saft, Some(&molefracs), Some(t), None, Default::default())?; assert_relative_eq!(cp.temperature, 407.93481 * KELVIN, max_relative = 1e-8); assert_relative_eq!( cp.density, diff --git a/crates/feos/tests/pcsaft/dft.rs b/crates/feos/tests/pcsaft/dft.rs index 62c6fd549..b6c6f3880 100644 --- a/crates/feos/tests/pcsaft/dft.rs +++ b/crates/feos/tests/pcsaft/dft.rs @@ -104,7 +104,7 @@ fn test_dft_propane() -> Result<(), Box> { let t = 200.0 * KELVIN; let w = 150.0 * ANGSTROM; let points = 2048; - let tc = State::critical_point(&&func_pure, None, None, Default::default())?.temperature; + let tc = State::critical_point(&&func_pure, None, None, None, Default::default())?.temperature; let vle_pure = PhaseEquilibrium::pure(&&func_pure, t, None, Default::default())?; let vle_full = PhaseEquilibrium::pure(&&func_full, t, None, Default::default())?; let vle_full_vec = PhaseEquilibrium::pure(&&func_full_vec, t, None, Default::default())?; @@ -214,7 +214,7 @@ fn test_dft_propane_newton() -> Result<(), Box> { let t = 200.0 * KELVIN; let w = 150.0 * ANGSTROM; let points = 512; - let tc = State::critical_point(&&func, None, None, Default::default())?.temperature; + let tc = State::critical_point(&&func, None, None, None, Default::default())?.temperature; let vle = PhaseEquilibrium::pure(&&func, t, None, Default::default())?; let solver = DFTSolver::new(Some(Verbosity::Iter)).newton(None, None, None, None); PlanarInterface::from_tanh(&vle, points, w, tc, false).solve(Some(&solver))?; @@ -235,7 +235,7 @@ fn test_dft_water() -> Result<(), Box> { let t = 400.0 * KELVIN; let w = 120.0 * ANGSTROM; let points = 2048; - let tc = State::critical_point(&&func_pure, None, None, Default::default())?.temperature; + let tc = State::critical_point(&&func_pure, None, None, None, Default::default())?.temperature; let vle_pure = PhaseEquilibrium::pure(&&func_pure, t, None, Default::default())?; let vle_full_vec = PhaseEquilibrium::pure(&&func_full_vec, t, None, Default::default())?; let profile_pure = PlanarInterface::from_tanh(&vle_pure, points, w, tc, false).solve(None)?; diff --git a/crates/feos/tests/saftvrmie/critical_properties.rs b/crates/feos/tests/saftvrmie/critical_properties.rs index 8c13e92de..3a4a585ed 100644 --- a/crates/feos/tests/saftvrmie/critical_properties.rs +++ b/crates/feos/tests/saftvrmie/critical_properties.rs @@ -53,7 +53,7 @@ fn critical_properties_pure() { let option = SolverOptions::default(); let p = parameters.remove(name).unwrap(); let eos = SaftVRMie::new(p); - let cp = State::critical_point(&&eos, None, t0, option).unwrap(); + let cp = State::critical_point(&&eos, None, t0, None, option).unwrap(); assert_relative_eq!(cp.temperature, data.0, max_relative = 2e-3); assert_relative_eq!( cp.pressure(feos_core::Contributions::Total), diff --git a/py-feos/src/state.rs b/py-feos/src/state.rs index 6305fc01d..332c6c205 100644 --- a/py-feos/src/state.rs +++ b/py-feos/src/state.rs @@ -190,12 +190,13 @@ impl PyState { /// State : State at critical conditions #[staticmethod] #[pyo3( - text_signature = "(eos, initial_temperature=None, max_iter=None, tol=None, verbosity=None)" + text_signature = "(eos, initial_temperature=None, initial_density=None, max_iter=None, tol=None, verbosity=None)" )] - #[pyo3(signature = (eos, initial_temperature=None, max_iter=None, tol=None, verbosity=None))] + #[pyo3(signature = (eos, initial_temperature=None, initial_density=None, max_iter=None, tol=None, verbosity=None))] fn critical_point_pure( eos: &PyEquationOfState, initial_temperature: Option, + initial_density: Option, max_iter: Option, tol: Option, verbosity: Option, @@ -203,6 +204,7 @@ impl PyState { let cp = State::critical_point_pure( &eos.0, initial_temperature, + initial_density, (max_iter, tol, verbosity.map(|v| v.into())).into(), ) .map_err(PyFeosError::from)?; @@ -232,13 +234,14 @@ impl PyState { /// State : State at critical conditions. #[staticmethod] #[pyo3( - text_signature = "(eos, molefracs=None, initial_temperature=None, max_iter=None, tol=None, verbosity=None)" + text_signature = "(eos, molefracs=None, initial_temperature=None, initial_density=None, max_iter=None, tol=None, verbosity=None)" )] - #[pyo3(signature = (eos, molefracs=None, initial_temperature=None, max_iter=None, tol=None, verbosity=None))] + #[pyo3(signature = (eos, molefracs=None, initial_temperature=None, initial_density=None, max_iter=None, tol=None, verbosity=None))] fn critical_point<'py>( eos: &PyEquationOfState, molefracs: Option>, initial_temperature: Option, + initial_density: Option, max_iter: Option, tol: Option, verbosity: Option, @@ -248,6 +251,7 @@ impl PyState { &eos.0, parse_molefracs(molefracs).as_ref(), initial_temperature, + initial_density, (max_iter, tol, verbosity.map(|v| v.into())).into(), ) .map_err(PyFeosError::from)?, @@ -278,14 +282,16 @@ impl PyState { /// State : State at critical conditions. #[staticmethod] #[pyo3( - text_signature = "(eos, temperature_or_pressure, initial_temperature=None, initial_molefracs=None, max_iter=None, tol=None, verbosity=None)" + text_signature = "(eos, temperature_or_pressure, initial_temperature=None, initial_molefracs=None, initial_density=None, max_iter=None, tol=None, verbosity=None)" )] - #[pyo3(signature = (eos, temperature_or_pressure, initial_temperature=None, initial_molefracs=None, max_iter=None, tol=None, verbosity=None))] + #[pyo3(signature = (eos, temperature_or_pressure, initial_temperature=None, initial_molefracs=None, initial_density=None, max_iter=None, tol=None, verbosity=None))] + #[expect(clippy::too_many_arguments)] fn critical_point_binary( eos: &PyEquationOfState, temperature_or_pressure: Bound<'_, PyAny>, initial_temperature: Option, initial_molefracs: Option<[f64; 2]>, + initial_density: Option, max_iter: Option, tol: Option, verbosity: Option, @@ -298,6 +304,7 @@ impl PyState { t, initial_temperature, initial_molefracs, + initial_density, (max_iter, tol, v).into(), ) .map_err(PyFeosError::from)?, @@ -309,6 +316,7 @@ impl PyState { p, initial_temperature, initial_molefracs, + initial_density, (max_iter, tol, v).into(), ) .map_err(PyFeosError::from)?,