Add full transport parse

This commit is contained in:
Alex Selimov 2026-03-29 00:39:11 -04:00
parent 3548d8b449
commit 6d1d9bd290

View file

@ -15,7 +15,25 @@ pub struct TransportDB {
}
impl TransportDB {
pub fn parse() {}
pub fn parse(transport_file_contents: &str) -> Result<Self, PropertiesError> {
let mut lines = transport_file_contents.lines().peekable();
let mut data = vec![];
// Ignore header line
_ = lines.next();
loop {
data.push(parse_species_transport_block(&mut lines)?);
if let Some(line) = lines.peek() {
if line.contains("end") {
break;
}
} else {
break;
}
}
Ok(TransportDB { data })
}
}
fn parse_species_transport_block<'a>(
@ -97,7 +115,7 @@ pub mod test {
use crate::{
assert_delta,
properties::transport_db::{
ViscosityOrConductivity, parse_coefficients, parse_species_header_line,
TransportDB, ViscosityOrConductivity, parse_coefficients, parse_species_header_line,
parse_species_transport_block,
},
};
@ -204,4 +222,108 @@ pub mod test {
assert_delta!(species_data.conductivities[2].c, -0.71899552e06, 1e-8);
assert_delta!(species_data.conductivities[2].d, 0.56927918e00, 1e-8);
}
#[test]
fn test_parse_transport_file() {
let trans_input = r#"transport property coefficients
Ar V3C3 BICH ET AL (1990)
V 200.0 1000.0 0.61205763E 00-0.67714354E 02 0.19040660E 03 0.21588272E 01
V 1000.0 5000.0 0.69357334E 00 0.70953943E 02-0.28386007E 05 0.14856447E 01
V 5000.0 15000.0 0.76608935E+00 0.67867215E+03-0.84991417E+06 0.77935167E+00
C 200.0 1000.0 0.60968928E 00-0.70892249E 02 0.58420624E 03 0.19337152E 01
C 1000.0 5000.0 0.69075463E 00 0.62676058E 02-0.25667413E 05 0.12664189E 01
C 5000.0 15000.0 0.76269502E+00 0.62341752E+03-0.71899552E+06 0.56927918E+00
BCL3 V2C2 SVEHLA (1962)
V 300.0 1000.0 0.52572590E 00-0.27803504E 03 0.19159256E 05 0.24373790E 01
V 1000.0 5000.0 0.62929553E 00-0.60723560E 02-0.37711618E 05 0.15615047E 01
C 300.0 1000.0 0.41518585E 00-0.48149960E 03 0.30788060E 05 0.33168239E 01
C 1000.0 5000.0 0.61148589E 00-0.18167042E 03-0.20976969E 05 0.17127671E 01
end"#;
let db = TransportDB::parse(trans_input).unwrap();
assert_eq!(db.data.len(), 2);
// Ar species (V3C3)
let ar = &db.data[0];
assert_eq!(ar.name, "Ar");
assert_eq!(ar.viscosities.len(), 3);
assert_eq!(ar.conductivities.len(), 3);
assert_delta!(ar.viscosities[0].temp_range.0, 200.0, 1e-1);
assert_delta!(ar.viscosities[0].temp_range.1, 1000.0, 1e-1);
assert_delta!(ar.viscosities[0].a, 0.61205763e00, 1e-8);
assert_delta!(ar.viscosities[0].b, -0.67714354e02, 1e-8);
assert_delta!(ar.viscosities[0].c, 0.19040660e03, 1e-8);
assert_delta!(ar.viscosities[0].d, 0.21588272e01, 1e-8);
assert_delta!(ar.viscosities[1].temp_range.0, 1000.0, 1e-1);
assert_delta!(ar.viscosities[1].temp_range.1, 5000.0, 1e-1);
assert_delta!(ar.viscosities[1].a, 0.69357334e00, 1e-8);
assert_delta!(ar.viscosities[1].b, 0.70953943e02, 1e-8);
assert_delta!(ar.viscosities[1].c, -0.28386007e05, 1e-8);
assert_delta!(ar.viscosities[1].d, 0.14856447e01, 1e-8);
assert_delta!(ar.viscosities[2].temp_range.0, 5000.0, 1e-1);
assert_delta!(ar.viscosities[2].temp_range.1, 15000.0, 1e-1);
assert_delta!(ar.viscosities[2].a, 0.76608935e00, 1e-8);
assert_delta!(ar.viscosities[2].b, 0.67867215e03, 1e-8);
assert_delta!(ar.viscosities[2].c, -0.84991417e06, 1e-8);
assert_delta!(ar.viscosities[2].d, 0.77935167e00, 1e-8);
assert_delta!(ar.conductivities[0].temp_range.0, 200.0, 1e-1);
assert_delta!(ar.conductivities[0].temp_range.1, 1000.0, 1e-1);
assert_delta!(ar.conductivities[0].a, 0.60968928e00, 1e-8);
assert_delta!(ar.conductivities[0].b, -0.70892249e02, 1e-8);
assert_delta!(ar.conductivities[0].c, 0.58420624e03, 1e-8);
assert_delta!(ar.conductivities[0].d, 0.19337152e01, 1e-8);
assert_delta!(ar.conductivities[1].temp_range.0, 1000.0, 1e-1);
assert_delta!(ar.conductivities[1].temp_range.1, 5000.0, 1e-1);
assert_delta!(ar.conductivities[1].a, 0.69075463e00, 1e-8);
assert_delta!(ar.conductivities[1].b, 0.62676058e02, 1e-8);
assert_delta!(ar.conductivities[1].c, -0.25667413e05, 1e-8);
assert_delta!(ar.conductivities[1].d, 0.12664189e01, 1e-8);
assert_delta!(ar.conductivities[2].temp_range.0, 5000.0, 1e-1);
assert_delta!(ar.conductivities[2].temp_range.1, 15000.0, 1e-1);
assert_delta!(ar.conductivities[2].a, 0.76269502e00, 1e-8);
assert_delta!(ar.conductivities[2].b, 0.62341752e03, 1e-8);
assert_delta!(ar.conductivities[2].c, -0.71899552e06, 1e-8);
assert_delta!(ar.conductivities[2].d, 0.56927918e00, 1e-8);
// BCL3 species (V2C2)
let bcl3 = &db.data[1];
assert_eq!(bcl3.name, "BCL3");
assert_eq!(bcl3.viscosities.len(), 2);
assert_eq!(bcl3.conductivities.len(), 2);
assert_delta!(bcl3.viscosities[0].temp_range.0, 300.0, 1e-1);
assert_delta!(bcl3.viscosities[0].temp_range.1, 1000.0, 1e-1);
assert_delta!(bcl3.viscosities[0].a, 0.52572590e00, 1e-8);
assert_delta!(bcl3.viscosities[0].b, -0.27803504e03, 1e-8);
assert_delta!(bcl3.viscosities[0].c, 0.19159256e05, 1e-8);
assert_delta!(bcl3.viscosities[0].d, 0.24373790e01, 1e-8);
assert_delta!(bcl3.viscosities[1].temp_range.0, 1000.0, 1e-1);
assert_delta!(bcl3.viscosities[1].temp_range.1, 5000.0, 1e-1);
assert_delta!(bcl3.viscosities[1].a, 0.62929553e00, 1e-8);
assert_delta!(bcl3.viscosities[1].b, -0.60723560e02, 1e-8);
assert_delta!(bcl3.viscosities[1].c, -0.37711618e05, 1e-8);
assert_delta!(bcl3.viscosities[1].d, 0.15615047e01, 1e-8);
assert_delta!(bcl3.conductivities[0].temp_range.0, 300.0, 1e-1);
assert_delta!(bcl3.conductivities[0].temp_range.1, 1000.0, 1e-1);
assert_delta!(bcl3.conductivities[0].a, 0.41518585e00, 1e-8);
assert_delta!(bcl3.conductivities[0].b, -0.48149960e03, 1e-8);
assert_delta!(bcl3.conductivities[0].c, 0.30788060e05, 1e-8);
assert_delta!(bcl3.conductivities[0].d, 0.33168239e01, 1e-8);
assert_delta!(bcl3.conductivities[1].temp_range.0, 1000.0, 1e-1);
assert_delta!(bcl3.conductivities[1].temp_range.1, 5000.0, 1e-1);
assert_delta!(bcl3.conductivities[1].a, 0.61148589e00, 1e-8);
assert_delta!(bcl3.conductivities[1].b, -0.18167042e03, 1e-8);
assert_delta!(bcl3.conductivities[1].c, -0.20976969e05, 1e-8);
assert_delta!(bcl3.conductivities[1].d, 0.17127671e01, 1e-8);
}
}