use std::f64::consts;
pub fn initial_spread_index(ffmc: f64, ws: f64) -> f64 {
let fm = 147.27723 * (101. - ffmc) / (59.5 + ffmc);
let fw = consts::E.powf(0.05039 * ws);
let ff = 91.9 * consts::E.powf(-0.1386 * fm) * (1. + (fm.powf(5.31) / 49300000.));
0.208 * fw * ff
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_util::precision_f64;
#[derive(Debug, serde::Deserialize)]
struct TestRow {
ffmc: f64,
ws: f64,
isi: f64,
}
#[test]
fn test_initial_spread_index() -> Result<(), Box<dyn std::error::Error>> {
let fixture = std::fs::File::open("./tests/fixtures/isi.csv")?;
let mut rdr = csv::Reader::from_reader(fixture);
for result in rdr.deserialize() {
let record: TestRow = result?;
let isi = initial_spread_index(record.ffmc, record.ws);
assert_eq!(precision_f64(isi, 4), record.isi);
}
Ok(())
}
}