use crate::deck::Deck;
use crate::smr::{SmrCase, SmrReaction};
use crate::species::Species;
pub const CSV_HEADER: &str = "case,sweep_value,T_K,P_Pa,S_C,V_m3,tau_s,\
X_CH4,y_CH4,y_H2O,y_CO,y_CO2,y_H2,H2_per_CH4,duty_W,K_reform,K_wgs,status\n";
#[must_use]
pub fn run_case(name: &str, sweep_value: f64, case: &SmrCase) -> String {
let sweep = if sweep_value.is_nan() {
String::new()
} else {
format!("{sweep_value:.6}")
};
let k_ref = SmrReaction::Reforming.equilibrium_constant(case.temperature);
let k_wgs = SmrReaction::WaterGasShift.equilibrium_constant(case.temperature);
match case.solve() {
Ok(o) => format!(
"{name},{sweep},{:.4},{:.1},{:.4},{:.6},{:.6},{:.6},\
{:.6},{:.6},{:.6},{:.6},{:.6},{:.6},{:.4},{:.6e},{:.6e},ok\n",
case.temperature,
case.pressure,
case.steam_to_carbon,
case.volume,
o.residence_time,
o.methane_conversion,
o.mole_fraction(Species::Methane),
o.mole_fraction(Species::Steam),
o.mole_fraction(Species::CarbonMonoxide),
o.mole_fraction(Species::CarbonDioxide),
o.mole_fraction(Species::Hydrogen),
o.hydrogen_yield(case.methane_feed),
o.heat_duty,
k_ref,
k_wgs,
),
Err(e) => format!(
"{name},{sweep},{:.4},{:.1},{:.4},{:.6},{:.6},,,,,,,,,{:.6e},{:.6e},ERROR:{}\n",
case.temperature,
case.pressure,
case.steam_to_carbon,
case.volume,
case.residence_time(),
k_ref,
k_wgs,
e.to_string().replace(',', ";"),
),
}
}
#[must_use]
pub fn run_deck(deck: &Deck) -> String {
let mut out = String::from(CSV_HEADER);
for (v, case) in deck.cases() {
out.push_str(&run_case(&deck.case.name, v, &case));
}
out
}
pub fn run_toml(text: &str) -> Result<String, crate::deck::DeckError> {
Ok(run_deck(&Deck::from_toml(text)?))
}