diff --git a/feos-core/CHANGELOG.md b/feos-core/CHANGELOG.md index e12e758b1..33c06cafe 100644 --- a/feos-core/CHANGELOG.md +++ b/feos-core/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased +### Fixed +- Avoid panicking when calculating `ResidualNpt` properties of states with negative pressures. [#42](https://github.com/feos-org/feos/pull/42) ## [0.3.0] - 2022-06-13 ### Added diff --git a/feos-core/src/state/mod.rs b/feos-core/src/state/mod.rs index 86678f528..8baad3097 100644 --- a/feos-core/src/state/mod.rs +++ b/feos-core/src/state/mod.rs @@ -232,16 +232,25 @@ impl State { eos.validate_moles(Some(moles))?; validate(temperature, volume, moles)?; - let t = temperature.to_reduced(U::reference_temperature())?; - let v = volume.to_reduced(U::reference_volume())?; - let m = moles.to_reduced(U::reference_moles())?; + Ok(Self::new_nvt_unchecked(eos, temperature, volume, moles)) + } + + pub(super) fn new_nvt_unchecked( + eos: &Rc, + temperature: QuantityScalar, + volume: QuantityScalar, + moles: &QuantityArray1, + ) -> Self { + let t = temperature.to_reduced(U::reference_temperature()).unwrap(); + let v = volume.to_reduced(U::reference_volume()).unwrap(); + let m = moles.to_reduced(U::reference_moles()).unwrap(); let total_moles = moles.sum(); let partial_density = moles / volume; let density = total_moles / volume; - let molefracs = &m / total_moles.to_reduced(U::reference_moles())?; + let molefracs = &m / total_moles.to_reduced(U::reference_moles()).unwrap(); - Ok(State { + State { eos: eos.clone(), total_moles, temperature, @@ -254,7 +263,7 @@ impl State { reduced_volume: v, reduced_moles: m, cache: RefCell::new(Cache::with_capacity(eos.components())), - }) + } } /// Return a new `State` for a pure component given a temperature and a density. The moles diff --git a/feos-core/src/state/properties.rs b/feos-core/src/state/properties.rs index 5e0289765..13d0ea400 100644 --- a/feos-core/src/state/properties.rs +++ b/feos-core/src/state/properties.rs @@ -155,13 +155,12 @@ impl State { } Contributions::ResidualNpt => { let p = self.pressure_(Evaluate::Total); - let state_p = Self::new_nvt( + let state_p = Self::new_nvt_unchecked( &self.eos, self.temperature, self.total_moles * U::gas_constant() * self.temperature / p, &self.moles, - ) - .unwrap(); + ); if additive { f(self, Evaluate::Residual) + f(self, Evaluate::IdealGasDelta) - f(&state_p, Evaluate::IdealGasDelta)