use tracing::debug;
#[derive(Debug, Clone)]
pub struct LoadShape {
pub name: String,
pub n_pts: usize,
pub interval_h: f64,
pub mult: Vec<f64>,
pub q_mult: Vec<f64>,
pub hours: Vec<f64>,
pub normalise: bool,
pub mean: Option<f64>,
pub std_dev: Option<f64>,
}
impl Default for LoadShape {
fn default() -> Self {
Self {
name: String::new(),
n_pts: 0,
interval_h: 1.0,
mult: Vec::new(),
q_mult: Vec::new(),
hours: Vec::new(),
normalise: false,
mean: None,
std_dev: None,
}
}
}
impl LoadShape {
pub fn flat(name: &str, n: usize) -> Self {
debug!(
name = name,
n_pts = n,
"LoadShape::flat: creating constant shape"
);
Self {
name: name.to_string(),
n_pts: n,
interval_h: 1.0,
mult: vec![1.0; n],
..Default::default()
}
}
pub fn get(&self, idx: usize) -> f64 {
if self.mult.is_empty() {
return 1.0;
}
let i = idx % self.mult.len();
self.mult[i]
}
pub fn get_q(&self, idx: usize) -> f64 {
if self.q_mult.is_empty() {
return self.get(idx);
}
let i = idx % self.q_mult.len();
self.q_mult[i]
}
pub fn normalise_peak(&mut self) {
let peak = self.mult.iter().cloned().fold(0.0_f64, f64::max);
debug!(name = %self.name, peak = peak, "LoadShape::normalise_peak: normalising");
if peak > 0.0 {
self.mult.iter_mut().for_each(|v| *v /= peak);
}
}
}