From 6d1d9bd290a714d5493158c66cf646b0b324489c Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Sun, 29 Mar 2026 00:39:11 -0400 Subject: [PATCH] Add full transport parse --- src/properties/transport_db.rs | 126 ++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 2 deletions(-) diff --git a/src/properties/transport_db.rs b/src/properties/transport_db.rs index d9f47d8..a3860de 100644 --- a/src/properties/transport_db.rs +++ b/src/properties/transport_db.rs @@ -15,7 +15,25 @@ pub struct TransportDB { } impl TransportDB { - pub fn parse() {} + pub fn parse(transport_file_contents: &str) -> Result { + 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); + } }