use twine_core::{TimeDerivative, TimeIntegrable};
use uom::si::f64::{MassDensity, ThermodynamicTemperature, Time};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct State<Fluid> {
pub temperature: ThermodynamicTemperature,
pub density: MassDensity,
pub fluid: Fluid,
}
impl<Fluid> State<Fluid> {
#[must_use]
pub fn new(temperature: ThermodynamicTemperature, density: MassDensity, fluid: Fluid) -> Self {
Self {
temperature,
density,
fluid,
}
}
#[must_use]
pub fn with_temperature(self, temperature: ThermodynamicTemperature) -> Self {
Self {
temperature,
..self
}
}
#[must_use]
pub fn with_density(self, density: MassDensity) -> Self {
Self { density, ..self }
}
#[must_use]
pub fn with_fluid(self, fluid: Fluid) -> Self {
Self { fluid, ..self }
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct StateDerivative<Fluid: TimeIntegrable> {
pub temperature: TimeDerivative<ThermodynamicTemperature>,
pub density: TimeDerivative<MassDensity>,
pub fluid: TimeDerivative<Fluid>,
}
impl<Fluid> Copy for StateDerivative<Fluid>
where
Fluid: TimeIntegrable,
TimeDerivative<Fluid>: Copy,
{
}
impl<Fluid: TimeIntegrable> TimeIntegrable for State<Fluid> {
type Derivative = StateDerivative<Fluid>;
fn step(self, derivative: Self::Derivative, dt: Time) -> Self {
Self {
temperature: self.temperature.step(derivative.temperature, dt),
density: self.density.step(derivative.density, dt),
fluid: self.fluid.step(derivative.fluid, dt),
}
}
}