///|
pub fn residence_time(feed : Feed, volume : Double) -> Double {
  volume / feed.volumetric_flow.max(1.0e-12)
}

///|
pub fn space_time(feed : Feed, volume : Double) -> Double {
  residence_time(feed, volume)
}

///|
pub fn yield_from_conversion_selectivity(
  conversion : Double,
  selectivity : Double,
) -> Double {
  clamp_conversion(conversion) * selectivity.clamp(min=0.0, max=1.0)
}

///|
pub fn conversion_from_concentration(feed : Feed, outlet : Double) -> Double {
  if feed.concentration <= 0.0 {
    0.0
  } else {
    clamp_conversion(1.0 - outlet / feed.concentration)
  }
}