chore: sync project state and current artifacts
This commit is contained in:
@@ -15,10 +15,10 @@
|
||||
//! Use `FluidId::new("Air")` for air ports.
|
||||
|
||||
use super::condenser::Condenser;
|
||||
use crate::{
|
||||
Component, ComponentError, ConnectedPort, JacobianBuilder, ResidualVector, SystemState,
|
||||
};
|
||||
use crate::state_machine::{CircuitId, OperationalState, StateManageable};
|
||||
use crate::{
|
||||
Component, ComponentError, ConnectedPort, JacobianBuilder, ResidualVector, StateSlice,
|
||||
};
|
||||
|
||||
/// Condenser coil (air-side finned heat exchanger).
|
||||
///
|
||||
@@ -86,10 +86,13 @@ impl CondenserCoil {
|
||||
impl Component for CondenserCoil {
|
||||
fn compute_residuals(
|
||||
&self,
|
||||
state: &SystemState,
|
||||
state: &StateSlice,
|
||||
residuals: &mut ResidualVector,
|
||||
) -> Result<(), ComponentError> {
|
||||
if !self.air_validated.load(std::sync::atomic::Ordering::Relaxed) {
|
||||
if !self
|
||||
.air_validated
|
||||
.load(std::sync::atomic::Ordering::Relaxed)
|
||||
{
|
||||
if let Some(fluid_id) = self.inner.cold_fluid_id() {
|
||||
if fluid_id.0.as_str() != "Air" {
|
||||
return Err(ComponentError::InvalidState(format!(
|
||||
@@ -97,7 +100,8 @@ impl Component for CondenserCoil {
|
||||
fluid_id.0.as_str()
|
||||
)));
|
||||
}
|
||||
self.air_validated.store(true, std::sync::atomic::Ordering::Relaxed);
|
||||
self.air_validated
|
||||
.store(true, std::sync::atomic::Ordering::Relaxed);
|
||||
}
|
||||
}
|
||||
self.inner.compute_residuals(state, residuals)
|
||||
@@ -105,7 +109,7 @@ impl Component for CondenserCoil {
|
||||
|
||||
fn jacobian_entries(
|
||||
&self,
|
||||
state: &SystemState,
|
||||
state: &StateSlice,
|
||||
jacobian: &mut JacobianBuilder,
|
||||
) -> Result<(), ComponentError> {
|
||||
self.inner.jacobian_entries(state, jacobian)
|
||||
@@ -122,6 +126,27 @@ impl Component for CondenserCoil {
|
||||
fn set_calib_indices(&mut self, indices: entropyk_core::CalibIndices) {
|
||||
self.inner.set_calib_indices(indices);
|
||||
}
|
||||
|
||||
fn port_mass_flows(
|
||||
&self,
|
||||
state: &StateSlice,
|
||||
) -> Result<Vec<entropyk_core::MassFlow>, ComponentError> {
|
||||
self.inner.port_mass_flows(state)
|
||||
}
|
||||
|
||||
fn port_enthalpies(
|
||||
&self,
|
||||
state: &StateSlice,
|
||||
) -> Result<Vec<entropyk_core::Enthalpy>, ComponentError> {
|
||||
self.inner.port_enthalpies(state)
|
||||
}
|
||||
|
||||
fn energy_transfers(
|
||||
&self,
|
||||
state: &StateSlice,
|
||||
) -> Option<(entropyk_core::Power, entropyk_core::Power)> {
|
||||
self.inner.energy_transfers(state)
|
||||
}
|
||||
}
|
||||
|
||||
impl StateManageable for CondenserCoil {
|
||||
@@ -176,21 +201,27 @@ mod tests {
|
||||
let mut residuals = vec![0.0; 3];
|
||||
let result = coil.compute_residuals(&state, &mut residuals);
|
||||
assert!(result.is_ok());
|
||||
assert!(residuals.iter().all(|r| r.is_finite()), "residuals must be finite");
|
||||
assert!(
|
||||
residuals.iter().all(|r| r.is_finite()),
|
||||
"residuals must be finite"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_condenser_coil_rejects_non_air() {
|
||||
use crate::heat_exchanger::HxSideConditions;
|
||||
use entropyk_core::{Temperature, Pressure, MassFlow};
|
||||
use entropyk_core::{MassFlow, Pressure, Temperature};
|
||||
|
||||
let mut coil = CondenserCoil::new(10_000.0);
|
||||
coil.inner.set_cold_conditions(HxSideConditions::new(
|
||||
Temperature::from_celsius(20.0),
|
||||
Pressure::from_bar(1.0),
|
||||
MassFlow::from_kg_per_s(1.0),
|
||||
"Water",
|
||||
));
|
||||
coil.inner.set_cold_conditions(
|
||||
HxSideConditions::new(
|
||||
Temperature::from_celsius(20.0),
|
||||
Pressure::from_bar(1.0),
|
||||
MassFlow::from_kg_per_s(1.0),
|
||||
"Water",
|
||||
)
|
||||
.expect("Valid cold conditions"),
|
||||
);
|
||||
|
||||
let state = vec![0.0; 10];
|
||||
let mut residuals = vec![0.0; 3];
|
||||
|
||||
Reference in New Issue
Block a user