Skip to main content

feos_core/ad/properties/
equilibrium_liquid_density.rs

1use super::PropertyAD;
2use crate::{FeosResult, PhaseEquilibrium, Residual};
3use nalgebra::allocator::Allocator;
4use nalgebra::{DefaultAllocator, U1};
5use num_dual::{DualNum, DualStruct, Gradients};
6use quantity::{_Density, Density, KELVIN, Temperature};
7
8/// Equilibrium liquid density of a pure component as function of temperature.
9pub struct EquilibriumLiquidDensity(pub Temperature);
10
11impl<'a> From<&'a [f64]> for EquilibriumLiquidDensity {
12    fn from(value: &'a [f64]) -> Self {
13        Self(value[0] * KELVIN)
14    }
15}
16
17impl<N: Gradients> PropertyAD<N> for EquilibriumLiquidDensity
18where
19    DefaultAllocator: Allocator<N> + Allocator<U1, N> + Allocator<N, N>,
20{
21    type Unit = _Density;
22    const REFERENCE: Density = Density::new(1000.0);
23
24    fn evaluate<E: Residual<N, D>, D: DualNum<f64, Inner = f64> + Copy>(
25        &self,
26        eos: &E,
27    ) -> FeosResult<Density<D>> {
28        let t = Temperature::from_inner(&self.0);
29        PhaseEquilibrium::pure_t(eos, t, None, Default::default()).map(|(_, [_, r])| r)
30    }
31}