feos_core/ad/properties/
equilibrium_liquid_density.rs1use 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
8pub 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}