from __future__ import annotations from PythonModels.core.base import DynamicComponent from PythonModels.core.medium import IdealGasMedium, ThermodynamicProperties from PythonModels.core.ports import PortState from PythonModels.core.state import VolumeState class Cylinder(DynamicComponent): """Python port of ModelicaModels.Mycylinder.""" def __init__( self, name: str, medium: IdealGasMedium, V: float = 0.01, p0: float = 35e6, T0: float = 300.0, ) -> None: super().__init__(name=name) self.medium = medium self.V = V m0 = p0 * V / (medium.R_gas * T0) U0 = m0 * medium.specific_internal_energy(T0) self.state = VolumeState(m=m0, U=U0) self.port_b = PortState() def get_state_vector(self) -> list[float]: return self.state.as_vector() def set_state_vector(self, values: list[float]) -> None: self.state = VolumeState.from_vector(values) def properties(self) -> ThermodynamicProperties: props = self.medium.properties_from_mU(self.state.m, self.state.U, self.V) self.port_b.p = props.p self.port_b.h_outflow = props.h return props def derivatives_from_connection( self, *, connected_h: float, port_m_flow: float, internal_h: float, ) -> VolumeState: inlet_h = self.connection_inlet_enthalpy( port_m_flow=port_m_flow, connected_h=connected_h, internal_h=internal_h, ) return self.derivatives(inlet_h, port_m_flow) def derivatives(self, inlet_h: float, m_flow: float) -> VolumeState: return VolumeState(m=m_flow, U=m_flow * inlet_h)