Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
py-feos exports of Datasets, moved records from props to sets.
  • Loading branch information
g-bauer committed May 18, 2026
commit 8c7cb4e52424e87edfe8f90827eb8a07ff8583b4
53 changes: 52 additions & 1 deletion crates/feos-core/src/ad/dataset/binary.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,62 @@
use std::{io, path::Path};

use ndarray::{Array1, Array2, ArrayView1, ArrayView2};
use serde::{Deserialize, Serialize};

use crate::ad::properties::*;
use crate::{ParametersAD, Residual};

use super::{Dataset, DatasetAD, DatasetStorage};
use super::{Dataset, DatasetAD, DatasetRecord, DatasetStorage};

/// The pressure column doubles as the initial guess passed to the VLE solver.
#[derive(Deserialize, Serialize)]
pub struct BubblePointRecord {
pub temperature_k: f64,
pub liquid_molefrac_1: f64,
pub bubble_pressure_pa: f64,
}

impl DatasetRecord for BubblePointRecord {
const N_INPUTS: usize = 3;

fn input(&self, column: usize) -> f64 {
match column {
0 => self.temperature_k,
1 => self.liquid_molefrac_1,
2 => self.bubble_pressure_pa,
_ => unreachable!("invalid bubble point input column"),
}
}

fn target(&self) -> f64 {
self.bubble_pressure_pa
}
}

/// The pressure column doubles as the initial guess passed to the VLE solver.
#[derive(Deserialize, Serialize)]
pub struct DewPointRecord {
pub temperature_k: f64,
pub vapor_molefrac_1: f64,
pub dew_pressure_pa: f64,
}

impl DatasetRecord for DewPointRecord {
const N_INPUTS: usize = 3;

fn input(&self, column: usize) -> f64 {
match column {
0 => self.temperature_k,
1 => self.vapor_molefrac_1,
2 => self.dew_pressure_pa,
_ => unreachable!("invalid dew point input column"),
}
}

fn target(&self) -> f64 {
self.dew_pressure_pa
}
}

/// Expand a list of binary-mixture property entries into:
/// - the [`BinaryProperty`] enum, metadata and dispatch methods,
Expand Down
4 changes: 2 additions & 2 deletions crates/feos-core/src/ad/dataset/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ use serde::de::DeserializeOwned;

use crate::{ParametersAD, Residual};

pub use binary::{BinaryDataset, BinaryProperty};
pub use pure::{PureDataset, PureProperty};
pub use binary::*;
pub use pure::*;

/// Shared numerical data for all datasets.
struct DatasetData {
Expand Down
103 changes: 102 additions & 1 deletion crates/feos-core/src/ad/dataset/pure.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,112 @@
use std::{io, path::Path};

use ndarray::{Array1, Array2, ArrayView1, ArrayView2};
use serde::{Deserialize, Serialize};

use crate::ad::properties::*;
use crate::{ParametersAD, Residual};

use super::{Dataset, DatasetAD, DatasetStorage};
use super::{Dataset, DatasetAD, DatasetRecord, DatasetStorage};

#[derive(Deserialize, Serialize)]
pub struct VaporPressureRecord {
pub temperature_k: f64,
pub vapor_pressure_pa: f64,
}

impl DatasetRecord for VaporPressureRecord {
const N_INPUTS: usize = 1;

fn input(&self, _column: usize) -> f64 {
self.temperature_k
}

fn target(&self) -> f64 {
self.vapor_pressure_pa
}
}

#[derive(Deserialize, Serialize)]
pub struct LiquidDensityRecord {
pub temperature_k: f64,
pub pressure_pa: f64,
pub liquid_density_kmol_m3: f64,
}

impl DatasetRecord for LiquidDensityRecord {
const N_INPUTS: usize = 2;

fn input(&self, column: usize) -> f64 {
match column {
0 => self.temperature_k,
1 => self.pressure_pa,
_ => unreachable!("invalid liquid density input column"),
}
}

fn target(&self) -> f64 {
self.liquid_density_kmol_m3
}
}

#[derive(Deserialize, Serialize)]
pub struct EquilibriumLiquidDensityRecord {
pub temperature_k: f64,
pub liquid_density_kmol_m3: f64,
}

impl DatasetRecord for EquilibriumLiquidDensityRecord {
const N_INPUTS: usize = 1;

fn input(&self, _column: usize) -> f64 {
self.temperature_k
}

fn target(&self) -> f64 {
self.liquid_density_kmol_m3
}
}

#[derive(Deserialize, Serialize)]
pub struct EnthalpyOfVaporizationRecord {
pub temperature_k: f64,
pub dh_vap_j_mol: f64,
}

impl DatasetRecord for EnthalpyOfVaporizationRecord {
const N_INPUTS: usize = 1;

fn input(&self, _column: usize) -> f64 {
self.temperature_k
}

fn target(&self) -> f64 {
self.dh_vap_j_mol
}
}

#[derive(Deserialize, Serialize)]
pub struct ResidualIsobaricHeatCapacityRecord {
pub temperature_k: f64,
pub pressure_pa: f64,
pub cp_res_j_molk: f64,
}

impl DatasetRecord for ResidualIsobaricHeatCapacityRecord {
const N_INPUTS: usize = 2;

fn input(&self, column: usize) -> f64 {
match column {
0 => self.temperature_k,
1 => self.pressure_pa,
_ => unreachable!("invalid residual isobaric heat capacity input column"),
}
}

fn target(&self) -> f64 {
self.cp_res_j_molk
}
}

/// Expand a list of pure-component property entries into:
/// - the [`PureProperty`] enum, metadata and dispatch methods,
Expand Down
27 changes: 0 additions & 27 deletions crates/feos-core/src/ad/properties/bubble_point_pressure.rs
Original file line number Diff line number Diff line change
@@ -1,37 +1,10 @@
use crate::Contributions;
use crate::ad::Gradient;
use crate::ad::dataset::DatasetRecord;
use crate::ad::{ParametersAD, vectorize, vectorize_ad};
use crate::{Composition, FeosResult, PhaseEquilibrium, ReferenceSystem, Residual};
use nalgebra::{SVector, U2};
use ndarray::{Array1, Array2, ArrayView2};
use quantity::{KELVIN, PASCAL, Pressure, Temperature};
use serde::{Deserialize, Serialize};

/// The pressure column doubles as the initial guess passed to the VLE solver.
#[derive(Deserialize, Serialize)]
pub struct BubblePointRecord {
pub temperature_k: f64,
pub liquid_molefrac_1: f64,
pub bubble_pressure_pa: f64,
}

impl DatasetRecord for BubblePointRecord {
const N_INPUTS: usize = 3;

fn input(&self, column: usize) -> f64 {
match column {
0 => self.temperature_k,
1 => self.liquid_molefrac_1,
2 => self.bubble_pressure_pa,
_ => unreachable!("invalid bubble point input column"),
}
}

fn target(&self) -> f64 {
self.bubble_pressure_pa
}
}

pub fn bubble_point_pressure_ad<
E: Residual<U2, Gradient<P>>,
Expand Down
27 changes: 0 additions & 27 deletions crates/feos-core/src/ad/properties/dew_point_pressure.rs
Original file line number Diff line number Diff line change
@@ -1,36 +1,9 @@
use crate::ad::Gradient;
use crate::ad::dataset::DatasetRecord;
use crate::ad::{ParametersAD, vectorize, vectorize_ad};
use crate::{Composition, Contributions, FeosResult, PhaseEquilibrium, ReferenceSystem, Residual};
use nalgebra::{SVector, U2};
use ndarray::{Array1, Array2, ArrayView2};
use quantity::{KELVIN, PASCAL, Pressure, Temperature};
use serde::{Deserialize, Serialize};

/// The pressure column doubles as the initial guess passed to the VLE solver.
#[derive(Deserialize, Serialize)]
pub struct DewPointRecord {
pub temperature_k: f64,
pub vapor_molefrac_1: f64,
pub dew_pressure_pa: f64,
}

impl DatasetRecord for DewPointRecord {
const N_INPUTS: usize = 3;

fn input(&self, column: usize) -> f64 {
match column {
0 => self.temperature_k,
1 => self.vapor_molefrac_1,
2 => self.dew_pressure_pa,
_ => unreachable!("invalid dew point input column"),
}
}

fn target(&self) -> f64 {
self.dew_pressure_pa
}
}

pub fn dew_point_pressure_ad<
E: Residual<U2, Gradient<P>>,
Expand Down
20 changes: 0 additions & 20 deletions crates/feos-core/src/ad/properties/enthalpy_of_vaporization.rs
Original file line number Diff line number Diff line change
@@ -1,30 +1,10 @@
use crate::ad::Gradient;
use crate::ad::dataset::DatasetRecord;
use crate::ad::{ParametersAD, vectorize, vectorize_ad};
use crate::{FeosResult, PhaseEquilibrium, ReferenceSystem, Residual};
use nalgebra::U1;
use ndarray::{Array1, Array2, ArrayView2};
use num_dual::{DualNum, DualStruct, first_derivative, partial2};
use quantity::{JOULE, KELVIN, MOL, MolarEnergy, Temperature};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
pub struct EnthalpyOfVaporizationRecord {
pub temperature_k: f64,
pub dh_vap_j_mol: f64,
}

impl DatasetRecord for EnthalpyOfVaporizationRecord {
const N_INPUTS: usize = 1;

fn input(&self, _column: usize) -> f64 {
self.temperature_k
}

fn target(&self) -> f64 {
self.dh_vap_j_mol
}
}

pub fn enthalpy_of_vaporization_ad<E: Residual<U1, Gradient<P>>, const P: usize>(
eos: &E,
Expand Down
20 changes: 0 additions & 20 deletions crates/feos-core/src/ad/properties/equilibrium_liquid_density.rs
Original file line number Diff line number Diff line change
@@ -1,30 +1,10 @@
use crate::ad::Gradient;
use crate::ad::dataset::DatasetRecord;
use crate::ad::{ParametersAD, vectorize, vectorize_ad};
use crate::{FeosResult, PhaseEquilibrium, Residual};
use nalgebra::U1;
use ndarray::{Array1, Array2, ArrayView2};
use num_dual::DualStruct;
use quantity::{Density, KELVIN, KILO, METER, MOL, Pressure, Temperature};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
pub struct EquilibriumLiquidDensityRecord {
pub temperature_k: f64,
pub liquid_density_kmol_m3: f64,
}

impl DatasetRecord for EquilibriumLiquidDensityRecord {
const N_INPUTS: usize = 1;

fn input(&self, _column: usize) -> f64 {
self.temperature_k
}

fn target(&self) -> f64 {
self.liquid_density_kmol_m3
}
}

pub fn equilibrium_liquid_density_ad<E: Residual<U1, Gradient<P>>, const P: usize>(
eos: &E,
Expand Down
25 changes: 0 additions & 25 deletions crates/feos-core/src/ad/properties/liquid_density.rs
Original file line number Diff line number Diff line change
@@ -1,37 +1,12 @@
use crate::DensityInitialization::Liquid;
use crate::ad::Gradient;
use crate::ad::dataset::DatasetRecord;
use crate::ad::{ParametersAD, vectorize, vectorize_ad};
use crate::density_iteration::density_iteration;
use crate::{FeosResult, ReferenceSystem, Residual, State};
use nalgebra::U1;
use ndarray::{Array1, Array2, ArrayView2};
use num_dual::DualStruct;
use quantity::{Density, KELVIN, KILO, METER, MOL, Moles, PASCAL, Pressure, Temperature};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
pub struct LiquidDensityRecord {
pub temperature_k: f64,
pub pressure_pa: f64,
pub liquid_density_kmol_m3: f64,
}

impl DatasetRecord for LiquidDensityRecord {
const N_INPUTS: usize = 2;

fn input(&self, column: usize) -> f64 {
match column {
0 => self.temperature_k,
1 => self.pressure_pa,
_ => unreachable!("invalid liquid density input column"),
}
}

fn target(&self) -> f64 {
self.liquid_density_kmol_m3
}
}

pub fn liquid_density_ad<E: Residual<U1, Gradient<P>>, const P: usize>(
eos: &E,
Expand Down
Loading
Loading