use super::{DensityInitialization, State};
use crate::Total;
use crate::equation_of_state::Residual;
use crate::errors::FeosResult;
use nalgebra::DVector;
use quantity::*;
#[derive(Clone)]
pub struct StateBuilder<'a, E, const IG: bool> {
eos: &'a E,
temperature: Option<Temperature>,
volume: Option<Volume>,
density: Option<Density>,
partial_density: Option<&'a Density<DVector<f64>>>,
total_moles: Option<Moles>,
moles: Option<&'a Moles<DVector<f64>>>,
molefracs: Option<&'a DVector<f64>>,
pressure: Option<Pressure>,
molar_enthalpy: Option<MolarEnergy>,
molar_entropy: Option<MolarEntropy>,
molar_internal_energy: Option<MolarEnergy>,
density_initialization: Option<DensityInitialization>,
initial_temperature: Option<Temperature>,
}
impl<'a, E: Residual> StateBuilder<'a, E, false> {
pub fn new(eos: &'a E) -> Self {
StateBuilder {
eos,
temperature: None,
volume: None,
density: None,
partial_density: None,
total_moles: None,
moles: None,
molefracs: None,
pressure: None,
molar_enthalpy: None,
molar_entropy: None,
molar_internal_energy: None,
density_initialization: None,
initial_temperature: None,
}
}
}
impl<'a, E: Residual, const IG: bool> StateBuilder<'a, E, IG> {
pub fn temperature(mut self, temperature: Temperature) -> Self {
self.temperature = Some(temperature);
self
}
pub fn volume(mut self, volume: Volume) -> Self {
self.volume = Some(volume);
self
}
pub fn density(mut self, density: Density) -> Self {
self.density = Some(density);
self
}
pub fn partial_density(mut self, partial_density: &'a Density<DVector<f64>>) -> Self {
self.partial_density = Some(partial_density);
self
}
pub fn total_moles(mut self, total_moles: Moles) -> Self {
self.total_moles = Some(total_moles);
self
}
pub fn moles(mut self, moles: &'a Moles<DVector<f64>>) -> Self {
self.moles = Some(moles);
self
}
pub fn molefracs(mut self, molefracs: &'a DVector<f64>) -> Self {
self.molefracs = Some(molefracs);
self
}
pub fn pressure(mut self, pressure: Pressure) -> Self {
self.pressure = Some(pressure);
self
}
pub fn vapor(mut self) -> Self {
self.density_initialization = Some(DensityInitialization::Vapor);
self
}
pub fn liquid(mut self) -> Self {
self.density_initialization = Some(DensityInitialization::Liquid);
self
}
pub fn initial_density(mut self, initial_density: Density) -> Self {
self.density_initialization = Some(DensityInitialization::InitialDensity(initial_density));
self
}
}
impl<'a, E: Total, const IG: bool> StateBuilder<'a, E, IG> {
pub fn molar_enthalpy(mut self, molar_enthalpy: MolarEnergy) -> StateBuilder<'a, E, true> {
self.molar_enthalpy = Some(molar_enthalpy);
self.convert()
}
pub fn molar_entropy(mut self, molar_entropy: MolarEntropy) -> StateBuilder<'a, E, true> {
self.molar_entropy = Some(molar_entropy);
self.convert()
}
pub fn molar_internal_energy(
mut self,
molar_internal_energy: MolarEnergy,
) -> StateBuilder<'a, E, true> {
self.molar_internal_energy = Some(molar_internal_energy);
self.convert()
}
pub fn initial_temperature(
mut self,
initial_temperature: Temperature,
) -> StateBuilder<'a, E, true> {
self.initial_temperature = Some(initial_temperature);
self.convert()
}
fn convert(self) -> StateBuilder<'a, E, true> {
StateBuilder {
eos: self.eos,
temperature: self.temperature,
volume: self.volume,
density: self.density,
partial_density: self.partial_density,
total_moles: self.total_moles,
moles: self.moles,
molefracs: self.molefracs,
pressure: self.pressure,
molar_enthalpy: self.molar_enthalpy,
molar_entropy: self.molar_entropy,
molar_internal_energy: self.molar_internal_energy,
density_initialization: self.density_initialization,
initial_temperature: self.initial_temperature,
}
}
}
impl<E: Residual> StateBuilder<'_, E, false> {
pub fn build(self) -> FeosResult<State<E>> {
State::new(
self.eos,
self.temperature,
self.volume,
self.density,
self.partial_density,
self.total_moles,
self.moles,
self.molefracs,
self.pressure,
self.density_initialization,
)
}
}
impl<E: Total> StateBuilder<'_, E, true> {
pub fn build(self) -> FeosResult<State<E>> {
State::new_full(
self.eos,
self.temperature,
self.volume,
self.density,
self.partial_density,
self.total_moles,
self.moles,
self.molefracs,
self.pressure,
self.molar_enthalpy,
self.molar_entropy,
self.molar_internal_energy,
self.density_initialization,
self.initial_temperature,
)
}
}