mirror of
https://github.com/aselimov/cea-rs.git
synced 2026-04-21 09:24:21 +00:00
Add consts and gas_mixtures with initial calculations
This commit is contained in:
parent
44e2426aa2
commit
b6a18df17b
5 changed files with 95 additions and 4 deletions
2
src/consts.rs
Normal file
2
src/consts.rs
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
// 1 bar ref pressure in Pa
|
||||
pub const P_REF:f64 = 1e5;
|
||||
13
src/lib.rs
13
src/lib.rs
|
|
@ -1,3 +1,5 @@
|
|||
pub mod consts;
|
||||
pub mod mixtures;
|
||||
pub mod properties;
|
||||
|
||||
#[macro_export]
|
||||
|
|
@ -7,7 +9,10 @@ macro_rules! assert_delta {
|
|||
assert!(
|
||||
diff <= $delta,
|
||||
"|{} - {}| = {} > {}",
|
||||
$left, $right, diff, $delta
|
||||
$left,
|
||||
$right,
|
||||
diff,
|
||||
$delta
|
||||
);
|
||||
}};
|
||||
}
|
||||
|
|
@ -29,7 +34,11 @@ macro_rules! assert_vec_delta {
|
|||
assert!(
|
||||
diff <= $delta,
|
||||
"element {} not within delta: |{} - {}| = {} > {}",
|
||||
i, l, r, diff, $delta
|
||||
i,
|
||||
l,
|
||||
r,
|
||||
diff,
|
||||
$delta
|
||||
);
|
||||
}
|
||||
}};
|
||||
|
|
|
|||
79
src/mixtures/gas_mixture.rs
Normal file
79
src/mixtures/gas_mixture.rs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
use crate::{
|
||||
consts::P_REF,
|
||||
properties::{
|
||||
thermo_fit::{Phase, SpeciesThermoData},
|
||||
transport_fit::SpeciesTransportData,
|
||||
},
|
||||
};
|
||||
|
||||
pub struct GasMixture {
|
||||
pub(crate) ns: Vec<f64>,
|
||||
pub(crate) nsum: f64
|
||||
pub(crate) species: Vec<SpeciesThermoData>,
|
||||
pub(crate) transport_data: Vec<SpeciesTransportData>,
|
||||
}
|
||||
|
||||
impl GasMixture {
|
||||
// Calculate the normalized chemical potential (μ/RT) for each component in the mixture.
|
||||
//
|
||||
// Equations 2.11 from reference paper
|
||||
pub fn gas_chem_potentials_over_rt(&self, temp: f64, pressure: f64) -> Vec<f64> {
|
||||
self.ns
|
||||
.iter()
|
||||
.zip(self.species.iter())
|
||||
.map(|(n, s)| -> f64 {
|
||||
match s.phase {
|
||||
Phase::Gas => {
|
||||
let p = s
|
||||
.polynomial_at(temp)
|
||||
.expect("Gas doesn't have a polynomial");
|
||||
p.h_over_rt(temp) - p.s_over_r(temp) + (pressure / P_REF).ln() + (n/self.nsum).ln()
|
||||
}
|
||||
Phase::Condensed => todo!(),
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
// Calculate the normalized entropy (S/R) for each mixture component
|
||||
//
|
||||
// Equations 2.17 from reference paper
|
||||
pub fn gas_entropies_over_rt(&self, temp: f64, pressure: f64) -> Vec<f64> {
|
||||
self.ns
|
||||
.iter()
|
||||
.zip(self.species.iter())
|
||||
.map(|(n, s)| -> f64 {
|
||||
match s.phase {
|
||||
Phase::Gas => {
|
||||
let p = s
|
||||
.polynomial_at(temp)
|
||||
.expect("Gas doesn't have a polynomial");
|
||||
p.s_over_r(temp) - (n/self.nsum).ln() - (pressure/P_REF).ln()
|
||||
}
|
||||
Phase::Condensed => todo!(),
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
// Calculate the normalized mixture enthalpy (H/RT)
|
||||
// Note that the enthalpy doesn't have a dependence on the pressure.
|
||||
// Equation 2.14 from the paper
|
||||
pub fn mixture_h_over_rt(&self, temp: f64) -> Vec<f64>{
|
||||
self.ns
|
||||
.iter()
|
||||
.zip(self.species.iter())
|
||||
.map(|(n, s)| -> f64 {
|
||||
match s.phase {
|
||||
Phase::Gas => {
|
||||
let p = s
|
||||
.polynomial_at(temp)
|
||||
.expect("Gas doesn't have a polynomial");
|
||||
n*p.h_over_rt(temp)
|
||||
}
|
||||
Phase::Condensed => todo!(),
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
1
src/mixtures/mod.rs
Normal file
1
src/mixtures/mod.rs
Normal file
|
|
@ -0,0 +1 @@
|
|||
pub mod gas_mixture;
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
mod data;
|
||||
mod error;
|
||||
pub mod thermo_db;
|
||||
mod thermo_fit;
|
||||
pub mod thermo_fit;
|
||||
pub mod transport_db;
|
||||
mod transport_fit;
|
||||
pub mod transport_fit;
|
||||
mod utils;
|
||||
|
||||
pub use error::PropertiesError;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue