use crate::imports::*;
use crate::train::TrainState;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, SerdeAPI)]
#[altrios_api]
pub struct Basic {
drag_area: si::Area,
}
impl Basic {
pub fn new(drag_area: si::Area) -> Self {
Self { drag_area }
}
pub fn from_drag_area_vec(
drag_area_single: si::Area,
drag_area_ratios: Vec<si::Ratio>,
) -> Self {
let drag_area = drag_area_ratios
.iter()
.fold(0. * uc::M2, |acc, x| acc + drag_area_single * *x);
Self { drag_area }
}
pub fn calc_res(&mut self, state: &TrainState) -> si::Force {
self.drag_area * uc::rho_air() * state.speed * state.speed
}
}