from __future__ import annotations from dataclasses import dataclass from typing import Callable from app.simulation.examples.test_mql.primitives.pneumatic import ( AmesimPneumaticGas, AmesimPneumaticOrifice, AmesimPneumaticVolume, ) from app.simulation.examples.test_mql.primitives.pneumatic_lines import ( AmesimPnl0001Pipe, AmesimPnl0002Pipe, AmesimPnl0003Pipe, AmesimPnl00rPipe, ) from app.simulation.core.medium import ThermodynamicProperties from app.simulation.core.ports import PortState from app.simulation.core.state import VolumeState from app.simulation.examples.test_mql.nodes import ( TestMqlPneumaticNode3, TestMqlPneumaticNode3Balance, TestMqlPneumaticNode4, TestMqlPneumaticNode4Balance, ) @dataclass(frozen=True) class TestMqlPneumaticBranchSpec: name: str upstream_volume_alias: str orifice_alias: str downstream_volume_alias: str source: str = "manual" @dataclass(frozen=True) class TestMqlPneumaticTopologyCandidate: connection_alias: str line_submodel: str source_component: str source_port: str target_component: str target_port: str source_is_typed_pneumatic: bool target_is_typed_pneumatic: bool category: str reason: str @dataclass(frozen=True) class TestMqlPneumaticChamberSegmentSpec: name: str inlet_node_alias: str inlet_line_alias: str inlet_orifice_alias: str inlet_orifice_boundary_port: str inlet_orifice_volume_port: str volume_alias: str volume_inlet_port: str volume_outlet_port: str outlet_orifice_alias: str outlet_orifice_volume_port: str outlet_orifice_boundary_port: str outlet_line_alias: str outlet_node_alias: str source: str = "amesim-cir-topology" @dataclass(frozen=True) class TestMqlPneumaticTopologyDiscovery: branch_specs: tuple[TestMqlPneumaticBranchSpec, ...] chamber_segment_specs: tuple[TestMqlPneumaticChamberSegmentSpec, ...] blocked_candidates: tuple[TestMqlPneumaticTopologyCandidate, ...] @dataclass(frozen=True) class TestMqlPneumaticBoundaryCondition: pressure_pa: float temperature_k: float def properties(self, gas: AmesimPneumaticGas) -> ThermodynamicProperties: if self.pressure_pa <= 0.0: raise ValueError("boundary pressure must be positive") if self.temperature_k <= 0.0: raise ValueError("boundary temperature must be positive") return ThermodynamicProperties( p=self.pressure_pa, T=self.temperature_k, rho=gas.density(self.pressure_pa, self.temperature_k), u=gas.specific_internal_energy(self.temperature_k), h=gas.specific_enthalpy(self.temperature_k), ) @dataclass(frozen=True) class TestMqlPneumaticChamberSegmentComponents: volume: AmesimPneumaticVolume inlet_orifice: AmesimPneumaticOrifice outlet_orifice: AmesimPneumaticOrifice spec: TestMqlPneumaticChamberSegmentSpec @dataclass(frozen=True) class TestMqlPneumaticChamberSegmentSnapshot: chamber: ThermodynamicProperties inlet_boundary: ThermodynamicProperties outlet_boundary: ThermodynamicProperties inlet_flow: float outlet_flow: float @dataclass(frozen=True) class TestMqlPnl0001ChamberSegmentComponents: inlet_line: AmesimPnl0001Pipe volume: AmesimPneumaticVolume inlet_orifice: AmesimPneumaticOrifice outlet_orifice: AmesimPneumaticOrifice spec: TestMqlPneumaticChamberSegmentSpec @dataclass(frozen=True) class TestMqlPnl0001ChamberSegmentSnapshot: inlet_line: ThermodynamicProperties chamber: ThermodynamicProperties inlet_node: ThermodynamicProperties outlet_boundary: ThermodynamicProperties node_to_line_flow: float line_to_chamber_flow: float outlet_flow: float @dataclass(frozen=True) class TestMqlPnl0001PairChamberSegmentComponents: inlet_line: AmesimPnl0001Pipe outlet_line: AmesimPnl0001Pipe volume: AmesimPneumaticVolume inlet_orifice: AmesimPneumaticOrifice outlet_orifice: AmesimPneumaticOrifice spec: TestMqlPneumaticChamberSegmentSpec @dataclass(frozen=True) class TestMqlPnl0001PairChamberSegmentSnapshot: inlet_line: ThermodynamicProperties chamber: ThermodynamicProperties outlet_line: ThermodynamicProperties inlet_node: ThermodynamicProperties outlet_node: ThermodynamicProperties inlet_node_to_line_flow: float inlet_line_to_chamber_flow: float outlet_node_to_line_flow: float outlet_line_to_chamber_flow: float @dataclass(frozen=True) class TestMqlPn3NodeChamberSegmentComponents: inlet_line: AmesimPnl0001Pipe outlet_line: AmesimPnl0001Pipe node_line: AmesimPnl0003Pipe node_resistance: AmesimPnl00rPipe node_orifice: AmesimPneumaticOrifice node: TestMqlPneumaticNode3 volume: AmesimPneumaticVolume inlet_orifice: AmesimPneumaticOrifice outlet_orifice: AmesimPneumaticOrifice spec: TestMqlPneumaticChamberSegmentSpec @dataclass(frozen=True) class TestMqlPn3NodeChamberSegmentSnapshot: inlet_line: ThermodynamicProperties chamber: ThermodynamicProperties outlet_line: ThermodynamicProperties node_line_port_1: ThermodynamicProperties node_line_port_2: ThermodynamicProperties inlet_node: ThermodynamicProperties resistance_boundary: ThermodynamicProperties p4_boundary: ThermodynamicProperties node_balance: TestMqlPneumaticNode3Balance inlet_node_to_line_flow: float inlet_line_to_chamber_flow: float outlet_node_to_line_flow: float outlet_line_to_chamber_flow: float node_to_resistance_flow: float node_to_pnl0003_flow: float pnl0003_center_flow: float pnl0003_to_p4_flow: float @dataclass(frozen=True) class TestMqlPn3P4NodeChamberSegmentComponents: inlet_line: AmesimPnl0001Pipe outlet_line: AmesimPnl0001Pipe node_line: AmesimPnl0003Pipe node_resistance: AmesimPnl00rPipe node_orifice: AmesimPneumaticOrifice node: TestMqlPneumaticNode3 p4_node: TestMqlPneumaticNode4 p4_primary_line: AmesimPnl0001Pipe p4_primary_chamber: AmesimPneumaticVolume p4_port1_line: AmesimPnl0002Pipe p4_port1_remote_node: TestMqlPneumaticNode4 p4_port1_remote_primary_line: AmesimPnl0001Pipe p4_port1_remote_primary_chamber: AmesimPneumaticVolume p4_port1_remote_port1_line: AmesimPnl0002Pipe p4_port1_far_node: TestMqlPneumaticNode4 p4_port1_far_primary_line: AmesimPnl0001Pipe p4_port1_far_primary_chamber: AmesimPneumaticVolume p4_port1_far_port1_line: AmesimPnl0002Pipe p4_port1_next_node: TestMqlPneumaticNode4 p4_port1_next_primary_line: AmesimPnl0001Pipe p4_port1_next_primary_chamber: AmesimPneumaticVolume p4_port1_next_port1_line: AmesimPnl0002Pipe p4_port1_next_orifice: AmesimPneumaticOrifice p4_port1_next_orifice_line: AmesimPnl0003Pipe p4_port1_next_orifice_node: TestMqlPneumaticNode3 p4_port1_next_orifice_output_line: AmesimPnl0001Pipe p4_port1_next_orifice_resistance: AmesimPnl00rPipe p4_port1_next_orifice_resistance_node: TestMqlPneumaticNode3 p4_port1_next_orifice_resistance_line: AmesimPnl0003Pipe p4_port1_next_orifice_resistance_orifice: AmesimPneumaticOrifice p4_port1_next_orifice_resistance_chamber_inlet_line: AmesimPnl0001Pipe p4_port1_next_orifice_resistance_chamber: AmesimPneumaticVolume p4_port1_next_orifice_resistance_chamber_outlet_line: AmesimPnl0001Pipe p4_port1_next_orifice_resistance_chamber_inlet_orifice: AmesimPneumaticOrifice p4_port1_next_orifice_resistance_chamber_outlet_orifice: AmesimPneumaticOrifice p4_port1_next_orifice_resistance_chamber_spec: TestMqlPneumaticChamberSegmentSpec p4_bridge_node: TestMqlPneumaticNode4 p4_bridge_primary_line: AmesimPnl0001Pipe p4_bridge_primary_chamber: AmesimPneumaticVolume p4_port1_remote_orifice: AmesimPneumaticOrifice p4_port1_remote_orifice_line: AmesimPnl0003Pipe p4_port1_remote_orifice_node: TestMqlPneumaticNode3 p4_port3_line: AmesimPnl0002Pipe p4_port3_remote_node: TestMqlPneumaticNode4 p4_port3_remote_primary_line: AmesimPnl0001Pipe p4_port3_remote_primary_chamber: AmesimPneumaticVolume p4_port3_remote_port3_line: AmesimPnl0002Pipe p4_port3_far_node: TestMqlPneumaticNode4 p4_port3_far_primary_line: AmesimPnl0001Pipe p4_port3_far_primary_chamber: AmesimPneumaticVolume p4_port3_far_port3_line: AmesimPnl0002Pipe p4_port3_next_node: TestMqlPneumaticNode4 p4_port3_next_primary_line: AmesimPnl0001Pipe p4_port3_next_primary_chamber: AmesimPneumaticVolume p4_port3_next_port3_line: AmesimPnl0002Pipe p4_port3_next_orifice: AmesimPneumaticOrifice p4_port3_next_orifice_line: AmesimPnl0003Pipe p4_port3_next_orifice_node: TestMqlPneumaticNode3 p4_port3_next_orifice_output_line: AmesimPnl0001Pipe p4_port3_next_chamber_inlet_line: AmesimPnl0001Pipe p4_port3_next_chamber: AmesimPneumaticVolume p4_port3_next_chamber_outlet_line: AmesimPnl0001Pipe p4_port3_next_chamber_inlet_orifice: AmesimPneumaticOrifice p4_port3_next_chamber_outlet_orifice: AmesimPneumaticOrifice p4_port3_next_chamber_spec: TestMqlPneumaticChamberSegmentSpec p4_port3_next_orifice_resistance: AmesimPnl00rPipe p4_port3_next_resistance_node: TestMqlPneumaticNode3 p4_port3_next_resistance_node_line: AmesimPnl0003Pipe p4_port3_next_resistance_orifice: AmesimPneumaticOrifice p4_port3_next_resistance_output_line: AmesimPnl0001Pipe p4_port3_next_resistance_chamber_inlet_line: AmesimPnl0001Pipe p4_port3_next_resistance_chamber: AmesimPneumaticVolume p4_port3_next_resistance_chamber_outlet_line: AmesimPnl0001Pipe p4_port3_next_resistance_chamber_inlet_orifice: AmesimPneumaticOrifice p4_port3_next_resistance_chamber_outlet_orifice: AmesimPneumaticOrifice p4_port3_next_resistance_chamber_spec: TestMqlPneumaticChamberSegmentSpec p4_port3_remote_orifice: AmesimPneumaticOrifice p4_port3_remote_orifice_line: AmesimPnl0003Pipe p4_port3_remote_orifice_node: TestMqlPneumaticNode3 p4_port3_remote_orifice_resistance: AmesimPnl00rPipe p4_port3_remote_resistance_node: TestMqlPneumaticNode3 p4_port3_remote_resistance_node_line: AmesimPnl0003Pipe p4_port3_remote_resistance_orifice: AmesimPneumaticOrifice p4_port3_remote_resistance_output_line: AmesimPnl0001Pipe volume: AmesimPneumaticVolume inlet_orifice: AmesimPneumaticOrifice outlet_orifice: AmesimPneumaticOrifice spec: TestMqlPneumaticChamberSegmentSpec @dataclass(frozen=True) class TestMqlTwoStateOrificeLineFlows: line_center_flow: float line_to_boundary_flow: float @dataclass(frozen=True) class TestMqlP4NeighborhoodLineFlows: primary_chamber_to_line_flow: float port_1_line_flow: float port_3_line_flow: float @dataclass(frozen=True) class TestMqlFixedChamberSegmentFlows: inlet_node_to_line_flow: float inlet_line_to_chamber_flow: float outlet_node_to_line_flow: float outlet_line_to_chamber_flow: float @dataclass(frozen=True) class TestMqlPn3NodeBalancePort: flow_kg_s: float node_h: float connected_h: float port_mass_flow_kg_s: float @dataclass(frozen=True) class TestMqlP4NodeBalancePort: flow_kg_s: float node_h: float connected_h: float port_mass_flow_kg_s: float @dataclass(frozen=True) class TestMqlPn3P4NodeChamberSegmentSnapshot: inlet_line: ThermodynamicProperties chamber: ThermodynamicProperties outlet_line: ThermodynamicProperties node_line_port_1: ThermodynamicProperties node_line_port_2: ThermodynamicProperties p4_primary_line: ThermodynamicProperties p4_boundary: ThermodynamicProperties p4_primary_chamber: ThermodynamicProperties p4_port1_line: ThermodynamicProperties p4_port1_remote_primary_line: ThermodynamicProperties p4_port1_remote_primary_chamber: ThermodynamicProperties p4_port1_remote_port1_line: ThermodynamicProperties p4_port1_far_primary_line: ThermodynamicProperties p4_port1_far_primary_chamber: ThermodynamicProperties p4_port1_far_port1_line: ThermodynamicProperties p4_port1_next_primary_line: ThermodynamicProperties p4_port1_next_primary_chamber: ThermodynamicProperties p4_port1_next_port1_line: ThermodynamicProperties p4_port1_next_orifice_line_port_1: ThermodynamicProperties p4_port1_next_orifice_line_port_2: ThermodynamicProperties p4_port1_next_orifice_output_line: ThermodynamicProperties p4_port1_next_orifice_resistance_line_port_1: ThermodynamicProperties p4_port1_next_orifice_resistance_line_port_2: ThermodynamicProperties p4_port1_next_orifice_resistance_chamber_inlet_line: ThermodynamicProperties p4_port1_next_orifice_resistance_chamber: ThermodynamicProperties p4_port1_next_orifice_resistance_chamber_outlet_line: ThermodynamicProperties p4_bridge_primary_line: ThermodynamicProperties p4_bridge_primary_chamber: ThermodynamicProperties p4_port1_remote_orifice_line_port_1: ThermodynamicProperties p4_port1_remote_orifice_line_port_2: ThermodynamicProperties p4_port3_line: ThermodynamicProperties p4_port3_remote_primary_line: ThermodynamicProperties p4_port3_remote_primary_chamber: ThermodynamicProperties p4_port3_remote_port3_line: ThermodynamicProperties p4_port3_far_primary_line: ThermodynamicProperties p4_port3_far_primary_chamber: ThermodynamicProperties p4_port3_far_port3_line: ThermodynamicProperties p4_port3_next_primary_line: ThermodynamicProperties p4_port3_next_primary_chamber: ThermodynamicProperties p4_port3_next_port3_line: ThermodynamicProperties p4_port3_next_orifice_line_port_1: ThermodynamicProperties p4_port3_next_orifice_line_port_2: ThermodynamicProperties p4_port3_next_orifice_output_line: ThermodynamicProperties p4_port3_next_chamber_inlet_line: ThermodynamicProperties p4_port3_next_chamber: ThermodynamicProperties p4_port3_next_chamber_outlet_line: ThermodynamicProperties p4_port3_next_resistance_node_line_port_1: ThermodynamicProperties p4_port3_next_resistance_node_line_port_2: ThermodynamicProperties p4_port3_next_resistance_output_line: ThermodynamicProperties p4_port3_next_resistance_chamber_inlet_line: ThermodynamicProperties p4_port3_next_resistance_chamber: ThermodynamicProperties p4_port3_next_resistance_chamber_outlet_line: ThermodynamicProperties p4_port3_remote_orifice_line_port_1: ThermodynamicProperties p4_port3_remote_orifice_line_port_2: ThermodynamicProperties p4_port3_remote_resistance_node_line_port_1: ThermodynamicProperties p4_port3_remote_resistance_node_line_port_2: ThermodynamicProperties p4_port3_remote_resistance_output_line: ThermodynamicProperties inlet_node: ThermodynamicProperties resistance_boundary: ThermodynamicProperties node_balance: TestMqlPneumaticNode3Balance p4_balance: TestMqlPneumaticNode4Balance p4_port1_remote_balance: TestMqlPneumaticNode4Balance p4_port1_far_balance: TestMqlPneumaticNode4Balance p4_port1_next_balance: TestMqlPneumaticNode4Balance p4_bridge_balance: TestMqlPneumaticNode4Balance p4_port1_remote_orifice_node_balance: TestMqlPneumaticNode3Balance p4_port1_next_orifice_node_balance: TestMqlPneumaticNode3Balance p4_port1_next_orifice_resistance_node_balance: TestMqlPneumaticNode3Balance p4_port3_remote_balance: TestMqlPneumaticNode4Balance p4_port3_far_balance: TestMqlPneumaticNode4Balance p4_port3_next_balance: TestMqlPneumaticNode4Balance p4_port3_next_orifice_node_balance: TestMqlPneumaticNode3Balance p4_port3_next_resistance_node_balance: TestMqlPneumaticNode3Balance p4_port3_remote_orifice_node_balance: TestMqlPneumaticNode3Balance p4_port3_remote_resistance_node_balance: TestMqlPneumaticNode3Balance inlet_node_to_line_flow: float inlet_line_to_chamber_flow: float outlet_node_to_line_flow: float outlet_line_to_chamber_flow: float node_to_resistance_flow: float node_to_pnl0003_flow: float pnl0003_center_flow: float pnl0003_to_p4_flow: float p4_primary_chamber_to_line_flow: float p4_node_to_primary_line_flow: float p4_to_port1_line_flow: float p4_port1_remote_node_to_line_flow: float p4_port1_remote_chamber_to_line_flow: float p4_port1_remote_node_to_primary_line_flow: float p4_port1_remote_to_port1_line_flow: float p4_port1_far_node_to_line_flow: float p4_port1_far_chamber_to_line_flow: float p4_port1_far_node_to_primary_line_flow: float p4_port1_far_to_next_line_flow: float p4_port1_next_node_to_line_flow: float p4_port1_next_chamber_to_line_flow: float p4_port1_next_node_to_primary_line_flow: float p4_port1_next_to_bridge_line_flow: float p4_port1_next_orifice_p4_to_output_line_flow: float p4_port1_next_orifice_node_to_line_flow: float p4_port1_next_orifice_line_center_flow: float p4_port1_next_orifice_to_output_line_flow: float p4_port1_next_orifice_resistance_node_to_next_flow: float p4_port1_next_orifice_resistance_node_to_line_flow: float p4_port1_next_orifice_resistance_line_center_flow: float p4_port1_next_orifice_resistance_to_p4_flow: float p4_port1_next_orifice_resistance_chamber_inlet_node_to_line_flow: float p4_port1_next_orifice_resistance_chamber_inlet_line_to_chamber_flow: float p4_port1_next_orifice_resistance_chamber_outlet_node_to_line_flow: float p4_port1_next_orifice_resistance_chamber_outlet_line_to_chamber_flow: float p4_bridge_to_port1_next_line_flow: float p4_bridge_chamber_to_line_flow: float p4_bridge_node_to_primary_line_flow: float p4_port1_remote_node_to_orifice_line_flow: float p4_port1_remote_orifice_line_center_flow: float p4_port1_remote_orifice_to_node_flow: float p4_to_port3_line_flow: float p4_port3_remote_node_to_line_flow: float p4_port3_remote_chamber_to_line_flow: float p4_port3_remote_node_to_primary_line_flow: float p4_port3_remote_to_port3_line_flow: float p4_port3_far_node_to_line_flow: float p4_port3_far_chamber_to_line_flow: float p4_port3_far_node_to_primary_line_flow: float p4_port3_far_to_next_line_flow: float p4_port3_next_node_to_line_flow: float p4_port3_next_chamber_to_line_flow: float p4_port3_next_node_to_primary_line_flow: float p4_bridge_to_port3_next_line_flow: float p4_port3_next_to_bridge_line_flow: float p4_port3_next_orifice_node_to_line_flow: float p4_port3_next_orifice_line_center_flow: float p4_port3_next_orifice_to_output_line_flow: float p4_port3_next_orifice_output_to_p4_flow: float p4_port3_next_chamber_inlet_node_to_line_flow: float p4_port3_next_chamber_inlet_line_to_chamber_flow: float p4_port3_next_chamber_outlet_node_to_line_flow: float p4_port3_next_chamber_outlet_line_to_chamber_flow: float p4_port3_next_resistance_node_to_next_flow: float p4_port3_next_resistance_node_to_line_flow: float p4_port3_next_resistance_line_center_flow: float p4_port3_next_resistance_to_output_line_flow: float p4_port3_next_resistance_output_to_p4_flow: float p4_port3_next_resistance_chamber_inlet_node_to_line_flow: float p4_port3_next_resistance_chamber_inlet_line_to_chamber_flow: float p4_port3_next_resistance_chamber_outlet_node_to_line_flow: float p4_port3_next_resistance_chamber_outlet_line_to_chamber_flow: float p4_port3_remote_node_to_orifice_line_flow: float p4_port3_remote_node_to_resistance_flow: float p4_port3_remote_resistance_node_to_line_flow: float p4_port3_remote_resistance_line_center_flow: float p4_port3_remote_resistance_to_output_line_flow: float p4_port3_remote_resistance_output_to_p4_flow: float p4_port3_remote_orifice_line_center_flow: float p4_port3_remote_orifice_to_node_flow: float class TestMqlPn3P4NodeChamberSegmentClosure: """PN3 chamber segment closed through the adjacent real P4 node. The P4 primary pressure/temperature comes from the PNL0001 storage on ``port_2``. P4 ports 1 and 3 are represented by the adjacent PNL0002 center compliances; their far nodes remain prescribed pressure boundaries. """ def __init__( self, *, components: TestMqlPn3P4NodeChamberSegmentComponents, inlet_node: TestMqlPneumaticBoundaryCondition, resistance_boundary: TestMqlPneumaticBoundaryCondition, use_inlet_line_reference_rhs: bool = False, use_p4_port3_remote_primary_reference_rhs: bool = False, ) -> None: self.components = components self.inlet_node = inlet_node self.resistance_boundary = resistance_boundary self.use_inlet_line_reference_rhs = use_inlet_line_reference_rhs self.use_p4_port3_remote_primary_reference_rhs = ( use_p4_port3_remote_primary_reference_rhs ) def initial_state_vector(self) -> list[float]: return [ *self.components.inlet_line.get_state_vector(), *self.components.volume.get_state_vector(), *self.components.outlet_line.get_state_vector(), *self.components.node_line.get_state_vector(), *self.components.p4_primary_line.get_state_vector(), *self.components.p4_primary_chamber.get_state_vector(), *self.components.p4_port1_line.get_state_vector(), *self.components.p4_port1_remote_primary_line.get_state_vector(), *self.components.p4_port1_remote_primary_chamber.get_state_vector(), *self.components.p4_port1_remote_port1_line.get_state_vector(), *self.components.p4_port1_far_primary_line.get_state_vector(), *self.components.p4_port1_far_primary_chamber.get_state_vector(), *self.components.p4_port1_far_port1_line.get_state_vector(), *self.components.p4_port1_next_primary_line.get_state_vector(), *self.components.p4_port1_next_primary_chamber.get_state_vector(), *self.components.p4_port1_next_port1_line.get_state_vector(), *self.components.p4_bridge_primary_line.get_state_vector(), *self.components.p4_bridge_primary_chamber.get_state_vector(), *self.components.p4_port1_remote_orifice_line.get_state_vector(), *self.components.p4_port3_line.get_state_vector(), *self.components.p4_port3_remote_primary_line.get_state_vector(), *self.components.p4_port3_remote_primary_chamber.get_state_vector(), *self.components.p4_port3_remote_port3_line.get_state_vector(), *self.components.p4_port3_far_primary_line.get_state_vector(), *self.components.p4_port3_far_primary_chamber.get_state_vector(), *self.components.p4_port3_far_port3_line.get_state_vector(), *self.components.p4_port3_next_primary_line.get_state_vector(), *self.components.p4_port3_next_primary_chamber.get_state_vector(), *self.components.p4_port3_next_port3_line.get_state_vector(), *self.components.p4_port3_remote_resistance_node_line.get_state_vector(), *self.components.p4_port3_remote_resistance_output_line.get_state_vector(), *self.components.p4_port3_remote_orifice_line.get_state_vector(), *self.components.p4_port3_next_orifice_line.get_state_vector(), *self.components.p4_port3_next_orifice_output_line.get_state_vector(), *self.components.p4_port3_next_chamber_inlet_line.get_state_vector(), *self.components.p4_port3_next_chamber.get_state_vector(), *self.components.p4_port3_next_chamber_outlet_line.get_state_vector(), *self.components.p4_port3_next_resistance_node_line.get_state_vector(), *self.components.p4_port3_next_resistance_output_line.get_state_vector(), *self.components.p4_port3_next_resistance_chamber_inlet_line.get_state_vector(), *self.components.p4_port3_next_resistance_chamber.get_state_vector(), *self.components.p4_port3_next_resistance_chamber_outlet_line.get_state_vector(), *self.components.p4_port1_next_orifice_line.get_state_vector(), *self.components.p4_port1_next_orifice_output_line.get_state_vector(), *self.components.p4_port1_next_orifice_resistance_line.get_state_vector(), *self.components.p4_port1_next_orifice_resistance_chamber_inlet_line.get_state_vector(), *self.components.p4_port1_next_orifice_resistance_chamber.get_state_vector(), *self.components.p4_port1_next_orifice_resistance_chamber_outlet_line.get_state_vector(), ] def apply_state_vector(self, values: list[float]) -> None: if len(values) != 112: raise ValueError("PN3/P4 node chamber segment state vector requires one hundred twelve values") self.components.inlet_line.set_state_vector(values[:2]) self.components.volume.set_state_vector(values[2:4]) self.components.outlet_line.set_state_vector(values[4:6]) self.components.node_line.set_state_vector(values[6:10]) self.components.p4_primary_line.set_state_vector(values[10:12]) self.components.p4_primary_chamber.set_state_vector(values[12:14]) self.components.p4_port1_line.set_state_vector(values[14:16]) self.components.p4_port1_remote_primary_line.set_state_vector(values[16:18]) self.components.p4_port1_remote_primary_chamber.set_state_vector(values[18:20]) self.components.p4_port1_remote_port1_line.set_state_vector(values[20:22]) self.components.p4_port1_far_primary_line.set_state_vector(values[22:24]) self.components.p4_port1_far_primary_chamber.set_state_vector(values[24:26]) self.components.p4_port1_far_port1_line.set_state_vector(values[26:28]) self.components.p4_port1_next_primary_line.set_state_vector(values[28:30]) self.components.p4_port1_next_primary_chamber.set_state_vector(values[30:32]) self.components.p4_port1_next_port1_line.set_state_vector(values[32:34]) self.components.p4_bridge_primary_line.set_state_vector(values[34:36]) self.components.p4_bridge_primary_chamber.set_state_vector(values[36:38]) self.components.p4_port1_remote_orifice_line.set_state_vector(values[38:42]) self.components.p4_port3_line.set_state_vector(values[42:44]) self.components.p4_port3_remote_primary_line.set_state_vector(values[44:46]) self.components.p4_port3_remote_primary_chamber.set_state_vector(values[46:48]) self.components.p4_port3_remote_port3_line.set_state_vector(values[48:50]) self.components.p4_port3_far_primary_line.set_state_vector(values[50:52]) self.components.p4_port3_far_primary_chamber.set_state_vector(values[52:54]) self.components.p4_port3_far_port3_line.set_state_vector(values[54:56]) self.components.p4_port3_next_primary_line.set_state_vector(values[56:58]) self.components.p4_port3_next_primary_chamber.set_state_vector(values[58:60]) self.components.p4_port3_next_port3_line.set_state_vector(values[60:62]) self.components.p4_port3_remote_resistance_node_line.set_state_vector(values[62:66]) self.components.p4_port3_remote_resistance_output_line.set_state_vector(values[66:68]) self.components.p4_port3_remote_orifice_line.set_state_vector(values[68:72]) self.components.p4_port3_next_orifice_line.set_state_vector(values[72:76]) self.components.p4_port3_next_orifice_output_line.set_state_vector(values[76:78]) self.components.p4_port3_next_chamber_inlet_line.set_state_vector(values[78:80]) self.components.p4_port3_next_chamber.set_state_vector(values[80:82]) self.components.p4_port3_next_chamber_outlet_line.set_state_vector(values[82:84]) self.components.p4_port3_next_resistance_node_line.set_state_vector(values[84:88]) self.components.p4_port3_next_resistance_output_line.set_state_vector(values[88:90]) self.components.p4_port3_next_resistance_chamber_inlet_line.set_state_vector(values[90:92]) self.components.p4_port3_next_resistance_chamber.set_state_vector(values[92:94]) self.components.p4_port3_next_resistance_chamber_outlet_line.set_state_vector(values[94:96]) self.components.p4_port1_next_orifice_line.set_state_vector(values[96:100]) self.components.p4_port1_next_orifice_output_line.set_state_vector(values[100:102]) self.components.p4_port1_next_orifice_resistance_line.set_state_vector(values[102:106]) self.components.p4_port1_next_orifice_resistance_chamber_inlet_line.set_state_vector(values[106:108]) self.components.p4_port1_next_orifice_resistance_chamber.set_state_vector(values[108:110]) self.components.p4_port1_next_orifice_resistance_chamber_outlet_line.set_state_vector(values[110:]) def snapshot( self, state_vector: list[float] | None = None, ) -> TestMqlPn3P4NodeChamberSegmentSnapshot: if state_vector is not None: self.apply_state_vector(state_vector) inlet_line = self.components.inlet_line.properties() chamber = self.components.volume.properties() outlet_line = self.components.outlet_line.properties() node_line_port_1 = self.components.node_line.properties_1() node_line_port_2 = self.components.node_line.properties_2() p4_primary_line = self.components.p4_primary_line.properties() p4_primary_chamber = self.components.p4_primary_chamber.properties() p4_port1_line = self.components.p4_port1_line.properties() p4_port1_remote_primary_line = ( self.components.p4_port1_remote_primary_line.properties() ) p4_port1_remote_primary_chamber = ( self.components.p4_port1_remote_primary_chamber.properties() ) p4_port1_remote_port1_line = ( self.components.p4_port1_remote_port1_line.properties() ) p4_port1_far_primary_line = self.components.p4_port1_far_primary_line.properties() p4_port1_far_primary_chamber = ( self.components.p4_port1_far_primary_chamber.properties() ) p4_port1_far_port1_line = self.components.p4_port1_far_port1_line.properties() p4_port1_next_primary_line = self.components.p4_port1_next_primary_line.properties() p4_port1_next_primary_chamber = ( self.components.p4_port1_next_primary_chamber.properties() ) p4_port1_next_port1_line = self.components.p4_port1_next_port1_line.properties() p4_port1_next_orifice_line_port_1 = ( self.components.p4_port1_next_orifice_line.properties_1() ) p4_port1_next_orifice_line_port_2 = ( self.components.p4_port1_next_orifice_line.properties_2() ) p4_port1_next_orifice_output_line = ( self.components.p4_port1_next_orifice_output_line.properties() ) p4_port1_next_orifice_resistance_line_port_1 = ( self.components.p4_port1_next_orifice_resistance_line.properties_1() ) p4_port1_next_orifice_resistance_line_port_2 = ( self.components.p4_port1_next_orifice_resistance_line.properties_2() ) p4_port1_next_orifice_resistance_chamber_inlet_line = ( self.components.p4_port1_next_orifice_resistance_chamber_inlet_line.properties() ) p4_port1_next_orifice_resistance_chamber = ( self.components.p4_port1_next_orifice_resistance_chamber.properties() ) p4_port1_next_orifice_resistance_chamber_outlet_line = ( self.components.p4_port1_next_orifice_resistance_chamber_outlet_line.properties() ) p4_bridge_primary_line = self.components.p4_bridge_primary_line.properties() p4_bridge_primary_chamber = self.components.p4_bridge_primary_chamber.properties() p4_port1_remote_orifice_line_port_1 = ( self.components.p4_port1_remote_orifice_line.properties_1() ) p4_port1_remote_orifice_line_port_2 = ( self.components.p4_port1_remote_orifice_line.properties_2() ) p4_port3_line = self.components.p4_port3_line.properties() p4_port3_remote_primary_line = ( self.components.p4_port3_remote_primary_line.properties() ) p4_port3_remote_primary_chamber = ( self.components.p4_port3_remote_primary_chamber.properties() ) p4_port3_remote_port3_line = ( self.components.p4_port3_remote_port3_line.properties() ) p4_port3_far_primary_line = self.components.p4_port3_far_primary_line.properties() p4_port3_far_primary_chamber = ( self.components.p4_port3_far_primary_chamber.properties() ) p4_port3_far_port3_line = self.components.p4_port3_far_port3_line.properties() p4_port3_next_primary_line = self.components.p4_port3_next_primary_line.properties() p4_port3_next_primary_chamber = ( self.components.p4_port3_next_primary_chamber.properties() ) p4_port3_next_port3_line = self.components.p4_port3_next_port3_line.properties() p4_port3_next_orifice_line_port_1 = ( self.components.p4_port3_next_orifice_line.properties_1() ) p4_port3_next_orifice_line_port_2 = ( self.components.p4_port3_next_orifice_line.properties_2() ) p4_port3_next_orifice_output_line = ( self.components.p4_port3_next_orifice_output_line.properties() ) p4_port3_next_chamber_inlet_line = ( self.components.p4_port3_next_chamber_inlet_line.properties() ) p4_port3_next_chamber = self.components.p4_port3_next_chamber.properties() p4_port3_next_chamber_outlet_line = ( self.components.p4_port3_next_chamber_outlet_line.properties() ) p4_port3_next_resistance_node_line_port_1 = ( self.components.p4_port3_next_resistance_node_line.properties_1() ) p4_port3_next_resistance_node_line_port_2 = ( self.components.p4_port3_next_resistance_node_line.properties_2() ) p4_port3_next_resistance_output_line = ( self.components.p4_port3_next_resistance_output_line.properties() ) p4_port3_next_resistance_chamber_inlet_line = ( self.components.p4_port3_next_resistance_chamber_inlet_line.properties() ) p4_port3_next_resistance_chamber = ( self.components.p4_port3_next_resistance_chamber.properties() ) p4_port3_next_resistance_chamber_outlet_line = ( self.components.p4_port3_next_resistance_chamber_outlet_line.properties() ) p4_port3_remote_orifice_line_port_1 = ( self.components.p4_port3_remote_orifice_line.properties_1() ) p4_port3_remote_orifice_line_port_2 = ( self.components.p4_port3_remote_orifice_line.properties_2() ) p4_port3_remote_resistance_node_line_port_1 = ( self.components.p4_port3_remote_resistance_node_line.properties_1() ) p4_port3_remote_resistance_node_line_port_2 = ( self.components.p4_port3_remote_resistance_node_line.properties_2() ) p4_port3_remote_resistance_output_line = ( self.components.p4_port3_remote_resistance_output_line.properties() ) inlet_node = self.inlet_node.properties(self.components.inlet_line.gas) resistance_boundary = self.resistance_boundary.properties( self.components.node_resistance.gas ) chamber_segment_flows = self._fixed_chamber_segment_flows( chamber_properties=chamber, inlet_line=self.components.inlet_line, inlet_line_properties=inlet_line, inlet_node_properties=p4_port3_remote_orifice_line_port_1, inlet_orifice=self.components.inlet_orifice, outlet_line=self.components.outlet_line, outlet_line_properties=outlet_line, outlet_node_properties=node_line_port_1, outlet_orifice=self.components.outlet_orifice, ) inlet_node_to_line_flow = chamber_segment_flows.inlet_node_to_line_flow inlet_line_to_chamber_flow = chamber_segment_flows.inlet_line_to_chamber_flow outlet_node_to_line_flow = chamber_segment_flows.outlet_node_to_line_flow outlet_line_to_chamber_flow = chamber_segment_flows.outlet_line_to_chamber_flow node_to_resistance_flow = self._resistance_flow( resistance=self.components.node_resistance, port_1_properties=node_line_port_1, port_2_properties=p4_port1_remote_orifice_line_port_1, ) node_balance = self._pn3_node_balance( node=self.components.node, primary_properties=node_line_port_1, port_1=TestMqlPn3NodeBalancePort( flow_kg_s=node_to_resistance_flow, node_h=node_line_port_1.h, connected_h=p4_port1_remote_orifice_line_port_1.h, port_mass_flow_kg_s=node_to_resistance_flow, ), port_3=TestMqlPn3NodeBalancePort( flow_kg_s=outlet_node_to_line_flow, node_h=node_line_port_1.h, connected_h=outlet_line.h, port_mass_flow_kg_s=outlet_node_to_line_flow, ), ) node_to_pnl0003_flow = -node_balance.port_2_mass_flow_g_s * 1.0e-3 pnl0003_center_flow = self.components.node_line.resistance_mass_flow() pnl0003_to_p4_flow = self._line_to_p4_flow( line=node_line_port_2, p4_boundary=p4_primary_line, orifice=self.components.node_orifice, ) p4_node_line_flows = self._p4_neighborhood_line_flows( primary_line=self.components.p4_primary_line, primary_chamber_properties=p4_primary_chamber, port_1_line=self.components.p4_port1_line, port_1_properties=p4_primary_line, port_3_line=self.components.p4_port3_line, port_3_properties=p4_primary_line, ) p4_primary_chamber_to_line_flow = ( p4_node_line_flows.primary_chamber_to_line_flow ) p4_to_port1_line_flow = p4_node_line_flows.port_1_line_flow p4_to_port3_line_flow = p4_node_line_flows.port_3_line_flow p4_port1_remote_line_flows = self._p4_neighborhood_line_flows( primary_line=self.components.p4_port1_remote_primary_line, primary_chamber_properties=p4_port1_remote_primary_chamber, port_1_line=self.components.p4_port1_remote_port1_line, port_1_properties=p4_port1_remote_primary_line, port_3_line=self.components.p4_port1_line, port_3_properties=p4_port1_remote_primary_line, ) p4_port1_remote_chamber_to_line_flow = ( p4_port1_remote_line_flows.primary_chamber_to_line_flow ) p4_port1_remote_to_port1_line_flow = ( p4_port1_remote_line_flows.port_1_line_flow ) p4_port1_remote_node_to_line_flow = ( p4_port1_remote_line_flows.port_3_line_flow ) p4_port1_far_line_flows = self._p4_neighborhood_line_flows( primary_line=self.components.p4_port1_far_primary_line, primary_chamber_properties=p4_port1_far_primary_chamber, port_1_line=self.components.p4_port1_far_port1_line, port_1_properties=p4_port1_far_primary_line, port_3_line=self.components.p4_port1_remote_port1_line, port_3_properties=p4_port1_far_primary_line, ) p4_port1_far_chamber_to_line_flow = ( p4_port1_far_line_flows.primary_chamber_to_line_flow ) p4_port1_far_to_next_line_flow = p4_port1_far_line_flows.port_1_line_flow p4_port1_far_node_to_line_flow = p4_port1_far_line_flows.port_3_line_flow p4_port1_next_line_flows = self._p4_neighborhood_line_flows( primary_line=self.components.p4_port1_next_primary_line, primary_chamber_properties=p4_port1_next_primary_chamber, port_1_line=self.components.p4_port1_next_port1_line, port_1_properties=p4_port1_next_primary_line, port_3_line=self.components.p4_port1_far_port1_line, port_3_properties=p4_port1_next_primary_line, ) p4_port1_next_chamber_to_line_flow = ( p4_port1_next_line_flows.primary_chamber_to_line_flow ) p4_port1_next_to_bridge_line_flow = ( p4_port1_next_line_flows.port_1_line_flow ) p4_port1_next_node_to_line_flow = p4_port1_next_line_flows.port_3_line_flow p4_port1_next_orifice_p4_to_output_line_flow = ( self.components.p4_port1_next_orifice_output_line.resistance_mass_flow( port_1_pressure_pa=p4_port1_next_primary_line.p, port_1_temperature_k=p4_port1_next_primary_line.T, ) ) p4_bridge_line_flows = self._p4_neighborhood_line_flows( primary_line=self.components.p4_bridge_primary_line, primary_chamber_properties=p4_bridge_primary_chamber, port_1_line=self.components.p4_port3_next_port3_line, port_1_properties=p4_bridge_primary_line, port_3_line=self.components.p4_port1_next_port1_line, port_3_properties=p4_bridge_primary_line, ) p4_bridge_chamber_to_line_flow = ( p4_bridge_line_flows.primary_chamber_to_line_flow ) p4_bridge_to_port3_next_line_flow = p4_bridge_line_flows.port_1_line_flow p4_bridge_to_port1_next_line_flow = p4_bridge_line_flows.port_3_line_flow p4_port1_next_orifice_resistance_chamber_flows = ( self._fixed_chamber_segment_flows( chamber_properties=p4_port1_next_orifice_resistance_chamber, inlet_line=( self.components.p4_port1_next_orifice_resistance_chamber_inlet_line ), inlet_line_properties=( p4_port1_next_orifice_resistance_chamber_inlet_line ), inlet_node_properties=p4_port1_remote_orifice_line_port_1, inlet_orifice=( self.components.p4_port1_next_orifice_resistance_chamber_inlet_orifice ), outlet_line=( self.components.p4_port1_next_orifice_resistance_chamber_outlet_line ), outlet_line_properties=( p4_port1_next_orifice_resistance_chamber_outlet_line ), outlet_node_properties=p4_port1_next_orifice_resistance_line_port_1, outlet_orifice=( self.components.p4_port1_next_orifice_resistance_chamber_outlet_orifice ), ) ) p4_port1_next_orifice_resistance_chamber_inlet_node_to_line_flow = ( p4_port1_next_orifice_resistance_chamber_flows.inlet_node_to_line_flow ) p4_port1_next_orifice_resistance_chamber_inlet_line_to_chamber_flow = ( p4_port1_next_orifice_resistance_chamber_flows.inlet_line_to_chamber_flow ) p4_port1_next_orifice_resistance_chamber_outlet_node_to_line_flow = ( p4_port1_next_orifice_resistance_chamber_flows.outlet_node_to_line_flow ) p4_port1_next_orifice_resistance_chamber_outlet_line_to_chamber_flow = ( p4_port1_next_orifice_resistance_chamber_flows.outlet_line_to_chamber_flow ) p4_port1_remote_orifice_node_balance = self._pn3_node_balance( node=self.components.p4_port1_remote_orifice_node, primary_properties=p4_port1_remote_orifice_line_port_1, port_1=TestMqlPn3NodeBalancePort( flow_kg_s=( p4_port1_next_orifice_resistance_chamber_inlet_node_to_line_flow ), node_h=p4_port1_remote_orifice_line_port_1.h, connected_h=p4_port1_next_orifice_resistance_chamber_inlet_line.h, port_mass_flow_kg_s=( p4_port1_next_orifice_resistance_chamber_inlet_node_to_line_flow ), ), port_3=TestMqlPn3NodeBalancePort( flow_kg_s=-node_to_resistance_flow, node_h=p4_port1_remote_orifice_line_port_1.h, connected_h=node_line_port_1.h, port_mass_flow_kg_s=-node_to_resistance_flow, ), ) p4_port1_remote_node_to_orifice_line_flow = ( -p4_port1_remote_orifice_node_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port1_remote_orifice_line_flows = self._two_state_orifice_line_flows( line=self.components.p4_port1_remote_orifice_line, line_port_2_properties=p4_port1_remote_orifice_line_port_2, boundary_properties=p4_port1_remote_primary_line, orifice=self.components.p4_port1_remote_orifice, ) p4_port1_remote_orifice_line_center_flow = ( p4_port1_remote_orifice_line_flows.line_center_flow ) p4_port1_remote_orifice_to_node_flow = ( p4_port1_remote_orifice_line_flows.line_to_boundary_flow ) p4_port3_remote_line_flows = self._p4_neighborhood_line_flows( primary_line=self.components.p4_port3_remote_primary_line, primary_chamber_properties=p4_port3_remote_primary_chamber, port_1_line=self.components.p4_port3_line, port_1_properties=p4_port3_remote_primary_line, port_3_line=self.components.p4_port3_remote_port3_line, port_3_properties=p4_port3_remote_primary_line, ) p4_port3_remote_chamber_to_line_flow = ( p4_port3_remote_line_flows.primary_chamber_to_line_flow ) p4_port3_remote_node_to_line_flow = ( p4_port3_remote_line_flows.port_1_line_flow ) p4_port3_remote_to_port3_line_flow = ( p4_port3_remote_line_flows.port_3_line_flow ) p4_port3_far_line_flows = self._p4_neighborhood_line_flows( primary_line=self.components.p4_port3_far_primary_line, primary_chamber_properties=p4_port3_far_primary_chamber, port_1_line=self.components.p4_port3_remote_port3_line, port_1_properties=p4_port3_far_primary_line, port_3_line=self.components.p4_port3_far_port3_line, port_3_properties=p4_port3_far_primary_line, ) p4_port3_far_chamber_to_line_flow = ( p4_port3_far_line_flows.primary_chamber_to_line_flow ) p4_port3_far_node_to_line_flow = p4_port3_far_line_flows.port_1_line_flow p4_port3_far_to_next_line_flow = p4_port3_far_line_flows.port_3_line_flow p4_port3_next_line_flows = self._p4_neighborhood_line_flows( primary_line=self.components.p4_port3_next_primary_line, primary_chamber_properties=p4_port3_next_primary_chamber, port_1_line=self.components.p4_port3_far_port3_line, port_1_properties=p4_port3_next_primary_line, port_3_line=self.components.p4_port3_next_port3_line, port_3_properties=p4_port3_next_primary_line, ) p4_port3_next_chamber_to_line_flow = ( p4_port3_next_line_flows.primary_chamber_to_line_flow ) p4_port3_next_node_to_line_flow = p4_port3_next_line_flows.port_1_line_flow p4_port3_next_to_bridge_line_flow = ( p4_port3_next_line_flows.port_3_line_flow ) p4_port3_next_chamber_flows = self._fixed_chamber_segment_flows( chamber_properties=p4_port3_next_chamber, inlet_line=self.components.p4_port3_next_chamber_inlet_line, inlet_line_properties=p4_port3_next_chamber_inlet_line, inlet_node_properties=p4_port3_next_orifice_line_port_1, inlet_orifice=self.components.p4_port3_next_chamber_inlet_orifice, outlet_line=self.components.p4_port3_next_chamber_outlet_line, outlet_line_properties=p4_port3_next_chamber_outlet_line, outlet_node_properties=p4_port3_remote_resistance_node_line_port_1, outlet_orifice=self.components.p4_port3_next_chamber_outlet_orifice, ) p4_port3_next_chamber_inlet_node_to_line_flow = ( p4_port3_next_chamber_flows.inlet_node_to_line_flow ) p4_port3_next_chamber_inlet_line_to_chamber_flow = ( p4_port3_next_chamber_flows.inlet_line_to_chamber_flow ) p4_port3_next_chamber_outlet_node_to_line_flow = ( p4_port3_next_chamber_flows.outlet_node_to_line_flow ) p4_port3_next_chamber_outlet_line_to_chamber_flow = ( p4_port3_next_chamber_flows.outlet_line_to_chamber_flow ) p4_port3_next_resistance_node_to_next_flow = self._resistance_flow( resistance=self.components.p4_port3_next_orifice_resistance, port_1_properties=p4_port3_next_resistance_node_line_port_1, port_2_properties=p4_port3_next_orifice_line_port_1, ) p4_port3_next_orifice_node_balance = self._pn3_node_balance( node=self.components.p4_port3_next_orifice_node, primary_properties=p4_port3_next_orifice_line_port_1, port_1=TestMqlPn3NodeBalancePort( flow_kg_s=p4_port3_next_chamber_inlet_node_to_line_flow, node_h=p4_port3_next_orifice_line_port_1.h, connected_h=p4_port3_next_chamber_inlet_line.h, port_mass_flow_kg_s=p4_port3_next_chamber_inlet_node_to_line_flow, ), port_3=TestMqlPn3NodeBalancePort( flow_kg_s=-p4_port3_next_resistance_node_to_next_flow, node_h=p4_port3_next_orifice_line_port_1.h, connected_h=p4_port3_next_resistance_node_line_port_1.h, port_mass_flow_kg_s=-p4_port3_next_resistance_node_to_next_flow, ), ) p4_port3_next_orifice_node_to_line_flow = ( -p4_port3_next_orifice_node_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port3_next_orifice_line_flows = self._two_state_orifice_line_flows( line=self.components.p4_port3_next_orifice_line, line_port_2_properties=p4_port3_next_orifice_line_port_2, boundary_properties=p4_port3_next_orifice_output_line, orifice=self.components.p4_port3_next_orifice, ) p4_port3_next_orifice_line_center_flow = ( p4_port3_next_orifice_line_flows.line_center_flow ) p4_port3_next_orifice_to_output_line_flow = ( p4_port3_next_orifice_line_flows.line_to_boundary_flow ) p4_port3_next_orifice_output_to_p4_flow = ( p4_port3_next_orifice_to_output_line_flow ) p4_port3_next_resistance_chamber_flows = ( self._fixed_chamber_segment_flows( chamber_properties=p4_port3_next_resistance_chamber, inlet_line=self.components.p4_port3_next_resistance_chamber_inlet_line, inlet_line_properties=p4_port3_next_resistance_chamber_inlet_line, inlet_node_properties=p4_port1_next_orifice_line_port_1, inlet_orifice=( self.components.p4_port3_next_resistance_chamber_inlet_orifice ), outlet_line=( self.components.p4_port3_next_resistance_chamber_outlet_line ), outlet_line_properties=p4_port3_next_resistance_chamber_outlet_line, outlet_node_properties=p4_port3_next_resistance_node_line_port_1, outlet_orifice=( self.components.p4_port3_next_resistance_chamber_outlet_orifice ), ) ) p4_port3_next_resistance_chamber_inlet_node_to_line_flow = ( p4_port3_next_resistance_chamber_flows.inlet_node_to_line_flow ) p4_port3_next_resistance_chamber_inlet_line_to_chamber_flow = ( p4_port3_next_resistance_chamber_flows.inlet_line_to_chamber_flow ) p4_port3_next_resistance_chamber_outlet_node_to_line_flow = ( p4_port3_next_resistance_chamber_flows.outlet_node_to_line_flow ) p4_port3_next_resistance_chamber_outlet_line_to_chamber_flow = ( p4_port3_next_resistance_chamber_flows.outlet_line_to_chamber_flow ) p4_port1_next_orifice_resistance_node_to_next_flow = self._resistance_flow( resistance=self.components.p4_port1_next_orifice_resistance, port_1_properties=p4_port1_next_orifice_resistance_line_port_1, port_2_properties=p4_port1_next_orifice_line_port_1, ) p4_port1_next_orifice_node_balance = self._pn3_node_balance( node=self.components.p4_port1_next_orifice_node, primary_properties=p4_port1_next_orifice_line_port_1, port_1=TestMqlPn3NodeBalancePort( flow_kg_s=p4_port3_next_resistance_chamber_inlet_node_to_line_flow, node_h=p4_port1_next_orifice_line_port_1.h, connected_h=p4_port3_next_resistance_chamber_inlet_line.h, port_mass_flow_kg_s=( p4_port3_next_resistance_chamber_inlet_node_to_line_flow ), ), port_3=TestMqlPn3NodeBalancePort( flow_kg_s=-p4_port1_next_orifice_resistance_node_to_next_flow, node_h=p4_port1_next_orifice_line_port_1.h, connected_h=p4_port1_next_orifice_resistance_line_port_1.h, port_mass_flow_kg_s=( -p4_port1_next_orifice_resistance_node_to_next_flow ), ), ) p4_port1_next_orifice_node_to_line_flow = ( -p4_port1_next_orifice_node_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port1_next_orifice_line_flows = self._two_state_orifice_line_flows( line=self.components.p4_port1_next_orifice_line, line_port_2_properties=p4_port1_next_orifice_line_port_2, boundary_properties=p4_port1_next_orifice_output_line, orifice=self.components.p4_port1_next_orifice, ) p4_port1_next_orifice_line_center_flow = ( p4_port1_next_orifice_line_flows.line_center_flow ) p4_port1_next_orifice_to_output_line_flow = ( p4_port1_next_orifice_line_flows.line_to_boundary_flow ) p4_port1_next_orifice_resistance_node_balance = self._pn3_node_balance( node=self.components.p4_port1_next_orifice_resistance_node, primary_properties=p4_port1_next_orifice_resistance_line_port_1, port_1=TestMqlPn3NodeBalancePort( flow_kg_s=p4_port1_next_orifice_resistance_node_to_next_flow, node_h=p4_port1_next_orifice_resistance_line_port_1.h, connected_h=p4_port1_next_orifice_line_port_1.h, port_mass_flow_kg_s=p4_port1_next_orifice_resistance_node_to_next_flow, ), port_3=TestMqlPn3NodeBalancePort( flow_kg_s=( p4_port1_next_orifice_resistance_chamber_outlet_node_to_line_flow ), node_h=p4_port1_next_orifice_resistance_line_port_1.h, connected_h=p4_port1_next_orifice_resistance_chamber_outlet_line.h, port_mass_flow_kg_s=( p4_port1_next_orifice_resistance_chamber_outlet_node_to_line_flow ), ), ) p4_port1_next_orifice_resistance_node_to_line_flow = ( -p4_port1_next_orifice_resistance_node_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port1_next_orifice_resistance_line_flows = ( self._two_state_orifice_line_flows( line=self.components.p4_port1_next_orifice_resistance_line, line_port_2_properties=( p4_port1_next_orifice_resistance_line_port_2 ), boundary_properties=p4_port1_far_primary_line, orifice=self.components.p4_port1_next_orifice_resistance_orifice, ) ) p4_port1_next_orifice_resistance_line_center_flow = ( p4_port1_next_orifice_resistance_line_flows.line_center_flow ) p4_port1_next_orifice_resistance_to_p4_flow = ( p4_port1_next_orifice_resistance_line_flows.line_to_boundary_flow ) p4_port3_next_resistance_node_balance = self._pn3_node_balance( node=self.components.p4_port3_next_resistance_node, primary_properties=p4_port3_next_resistance_node_line_port_1, port_1=TestMqlPn3NodeBalancePort( flow_kg_s=p4_port3_next_resistance_node_to_next_flow, node_h=p4_port3_next_resistance_node_line_port_1.h, connected_h=p4_port3_next_orifice_line_port_1.h, port_mass_flow_kg_s=p4_port3_next_resistance_node_to_next_flow, ), port_3=TestMqlPn3NodeBalancePort( flow_kg_s=p4_port3_next_resistance_chamber_outlet_node_to_line_flow, node_h=p4_port3_next_resistance_node_line_port_1.h, connected_h=p4_port3_next_resistance_chamber_outlet_line.h, port_mass_flow_kg_s=( p4_port3_next_resistance_chamber_outlet_node_to_line_flow ), ), ) p4_port3_next_resistance_node_to_line_flow = ( -p4_port3_next_resistance_node_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port3_next_resistance_line_flows = self._two_state_orifice_line_flows( line=self.components.p4_port3_next_resistance_node_line, line_port_2_properties=p4_port3_next_resistance_node_line_port_2, boundary_properties=p4_port3_next_resistance_output_line, orifice=self.components.p4_port3_next_resistance_orifice, ) p4_port3_next_resistance_line_center_flow = ( p4_port3_next_resistance_line_flows.line_center_flow ) p4_port3_next_resistance_to_output_line_flow = ( p4_port3_next_resistance_line_flows.line_to_boundary_flow ) p4_port3_next_resistance_output_to_p4_flow = ( p4_port3_next_resistance_to_output_line_flow ) p4_port3_remote_node_to_resistance_flow = self._resistance_flow( resistance=self.components.p4_port3_remote_orifice_resistance, port_1_properties=p4_port3_remote_orifice_line_port_1, port_2_properties=p4_port3_remote_resistance_node_line_port_1, ) p4_port3_remote_orifice_node_balance = self._pn3_node_balance( node=self.components.p4_port3_remote_orifice_node, primary_properties=p4_port3_remote_orifice_line_port_1, port_1=TestMqlPn3NodeBalancePort( flow_kg_s=inlet_node_to_line_flow, node_h=p4_port3_remote_orifice_line_port_1.h, connected_h=inlet_line.h, port_mass_flow_kg_s=inlet_node_to_line_flow, ), port_3=TestMqlPn3NodeBalancePort( flow_kg_s=p4_port3_remote_node_to_resistance_flow, node_h=p4_port3_remote_orifice_line_port_1.h, connected_h=p4_port3_remote_resistance_node_line_port_1.h, port_mass_flow_kg_s=p4_port3_remote_node_to_resistance_flow, ), ) p4_port3_remote_node_to_orifice_line_flow = ( -p4_port3_remote_orifice_node_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port3_remote_resistance_node_balance = self._pn3_node_balance( node=self.components.p4_port3_remote_resistance_node, primary_properties=p4_port3_remote_resistance_node_line_port_1, port_1=TestMqlPn3NodeBalancePort( flow_kg_s=-p4_port3_remote_node_to_resistance_flow, node_h=p4_port3_remote_resistance_node_line_port_1.h, connected_h=p4_port3_remote_orifice_line_port_1.h, port_mass_flow_kg_s=-p4_port3_remote_node_to_resistance_flow, ), port_3=TestMqlPn3NodeBalancePort( flow_kg_s=p4_port3_next_chamber_outlet_node_to_line_flow, node_h=p4_port3_remote_resistance_node_line_port_1.h, connected_h=p4_port3_next_chamber_outlet_line.h, port_mass_flow_kg_s=p4_port3_next_chamber_outlet_node_to_line_flow, ), ) p4_port3_remote_resistance_node_to_line_flow = ( -p4_port3_remote_resistance_node_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port3_remote_resistance_line_flows = self._two_state_orifice_line_flows( line=self.components.p4_port3_remote_resistance_node_line, line_port_2_properties=p4_port3_remote_resistance_node_line_port_2, boundary_properties=p4_port3_remote_resistance_output_line, orifice=self.components.p4_port3_remote_resistance_orifice, ) p4_port3_remote_resistance_line_center_flow = ( p4_port3_remote_resistance_line_flows.line_center_flow ) p4_port3_remote_resistance_to_output_line_flow = ( p4_port3_remote_resistance_line_flows.line_to_boundary_flow ) p4_port3_remote_resistance_output_to_p4_flow = ( p4_port3_remote_resistance_to_output_line_flow ) p4_port3_remote_orifice_line_flows = self._two_state_orifice_line_flows( line=self.components.p4_port3_remote_orifice_line, line_port_2_properties=p4_port3_remote_orifice_line_port_2, boundary_properties=p4_port3_remote_primary_line, orifice=self.components.p4_port3_remote_orifice, ) p4_port3_remote_orifice_line_center_flow = ( p4_port3_remote_orifice_line_flows.line_center_flow ) p4_port3_remote_orifice_to_node_flow = ( p4_port3_remote_orifice_line_flows.line_to_boundary_flow ) p4_balance = self._p4_node_balance( node=self.components.p4_node, primary_properties=p4_primary_line, port_1=TestMqlP4NodeBalancePort( flow_kg_s=p4_to_port1_line_flow, node_h=p4_primary_line.h, connected_h=p4_port1_line.h, port_mass_flow_kg_s=-p4_to_port1_line_flow, ), port_3=TestMqlP4NodeBalancePort( flow_kg_s=p4_to_port3_line_flow, node_h=p4_primary_line.h, connected_h=p4_port3_line.h, port_mass_flow_kg_s=-p4_to_port3_line_flow, ), port_4=TestMqlP4NodeBalancePort( flow_kg_s=pnl0003_to_p4_flow, node_h=node_line_port_2.h, connected_h=p4_primary_line.h, port_mass_flow_kg_s=pnl0003_to_p4_flow, ), ) p4_node_to_primary_line_flow = p4_balance.port_2_mass_flow_g_s * 1.0e-3 p4_port1_remote_balance = self._p4_node_balance( node=self.components.p4_port1_remote_node, primary_properties=p4_port1_remote_primary_line, port_1=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_remote_to_port1_line_flow, node_h=p4_port1_remote_primary_line.h, connected_h=p4_port1_remote_port1_line.h, port_mass_flow_kg_s=-p4_port1_remote_to_port1_line_flow, ), port_3=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_remote_node_to_line_flow, node_h=p4_port1_remote_primary_line.h, connected_h=p4_port1_line.h, port_mass_flow_kg_s=-p4_port1_remote_node_to_line_flow, ), port_4=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_remote_orifice_to_node_flow, node_h=p4_port1_remote_orifice_line_port_2.h, connected_h=p4_port1_remote_primary_line.h, port_mass_flow_kg_s=p4_port1_remote_orifice_to_node_flow, ), ) p4_port1_remote_node_to_primary_line_flow = ( p4_port1_remote_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port1_far_balance = self._p4_node_balance( node=self.components.p4_port1_far_node, primary_properties=p4_port1_far_primary_line, port_1=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_far_to_next_line_flow, node_h=p4_port1_far_primary_line.h, connected_h=p4_port1_far_port1_line.h, port_mass_flow_kg_s=-p4_port1_far_to_next_line_flow, ), port_3=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_far_node_to_line_flow, node_h=p4_port1_far_primary_line.h, connected_h=p4_port1_remote_port1_line.h, port_mass_flow_kg_s=-p4_port1_far_node_to_line_flow, ), port_4=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_next_orifice_resistance_to_p4_flow, node_h=p4_port1_next_orifice_resistance_line_port_2.h, connected_h=p4_port1_far_primary_line.h, port_mass_flow_kg_s=p4_port1_next_orifice_resistance_to_p4_flow, ), ) p4_port1_far_node_to_primary_line_flow = ( p4_port1_far_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port1_next_balance = self._p4_node_balance( node=self.components.p4_port1_next_node, primary_properties=p4_port1_next_primary_line, port_1=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_next_to_bridge_line_flow, node_h=p4_port1_next_primary_line.h, connected_h=p4_port1_next_port1_line.h, port_mass_flow_kg_s=-p4_port1_next_to_bridge_line_flow, ), port_3=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_next_node_to_line_flow, node_h=p4_port1_next_primary_line.h, connected_h=p4_port1_far_port1_line.h, port_mass_flow_kg_s=-p4_port1_next_node_to_line_flow, ), port_4=TestMqlP4NodeBalancePort( flow_kg_s=p4_port1_next_orifice_p4_to_output_line_flow, node_h=p4_port1_next_primary_line.h, connected_h=p4_port1_next_orifice_output_line.h, port_mass_flow_kg_s=-p4_port1_next_orifice_p4_to_output_line_flow, ), ) p4_port1_next_node_to_primary_line_flow = ( p4_port1_next_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port3_remote_balance = self._p4_node_balance( node=self.components.p4_port3_remote_node, primary_properties=p4_port3_remote_primary_line, port_1=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_remote_node_to_line_flow, node_h=p4_port3_remote_primary_line.h, connected_h=p4_port3_line.h, port_mass_flow_kg_s=-p4_port3_remote_node_to_line_flow, ), port_3=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_remote_to_port3_line_flow, node_h=p4_port3_remote_primary_line.h, connected_h=p4_port3_remote_port3_line.h, port_mass_flow_kg_s=-p4_port3_remote_to_port3_line_flow, ), port_4=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_remote_orifice_to_node_flow, node_h=p4_port3_remote_orifice_line_port_2.h, connected_h=p4_port3_remote_primary_line.h, port_mass_flow_kg_s=p4_port3_remote_orifice_to_node_flow, ), ) p4_port3_remote_node_to_primary_line_flow = ( p4_port3_remote_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port3_far_balance = self._p4_node_balance( node=self.components.p4_port3_far_node, primary_properties=p4_port3_far_primary_line, port_1=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_far_node_to_line_flow, node_h=p4_port3_far_primary_line.h, connected_h=p4_port3_remote_port3_line.h, port_mass_flow_kg_s=-p4_port3_far_node_to_line_flow, ), port_3=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_far_to_next_line_flow, node_h=p4_port3_far_primary_line.h, connected_h=p4_port3_far_port3_line.h, port_mass_flow_kg_s=-p4_port3_far_to_next_line_flow, ), port_4=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_remote_resistance_output_to_p4_flow, node_h=p4_port3_remote_resistance_output_line.h, connected_h=p4_port3_far_primary_line.h, port_mass_flow_kg_s=p4_port3_remote_resistance_output_to_p4_flow, ), ) p4_port3_far_node_to_primary_line_flow = ( p4_port3_far_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_port3_next_balance = self._p4_node_balance( node=self.components.p4_port3_next_node, primary_properties=p4_port3_next_primary_line, port_1=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_next_node_to_line_flow, node_h=p4_port3_next_primary_line.h, connected_h=p4_port3_far_port3_line.h, port_mass_flow_kg_s=-p4_port3_next_node_to_line_flow, ), port_3=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_next_to_bridge_line_flow, node_h=p4_port3_next_primary_line.h, connected_h=p4_port3_next_port3_line.h, port_mass_flow_kg_s=-p4_port3_next_to_bridge_line_flow, ), port_4=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_next_orifice_output_to_p4_flow, node_h=p4_port3_next_orifice_output_line.h, connected_h=p4_port3_next_primary_line.h, port_mass_flow_kg_s=p4_port3_next_orifice_output_to_p4_flow, ), ) p4_port3_next_node_to_primary_line_flow = ( p4_port3_next_balance.port_2_mass_flow_g_s * 1.0e-3 ) p4_bridge_balance = self._p4_node_balance( node=self.components.p4_bridge_node, primary_properties=p4_bridge_primary_line, port_1=TestMqlP4NodeBalancePort( flow_kg_s=p4_bridge_to_port3_next_line_flow, node_h=p4_bridge_primary_line.h, connected_h=p4_port3_next_port3_line.h, port_mass_flow_kg_s=-p4_bridge_to_port3_next_line_flow, ), port_3=TestMqlP4NodeBalancePort( flow_kg_s=p4_bridge_to_port1_next_line_flow, node_h=p4_bridge_primary_line.h, connected_h=p4_port1_next_port1_line.h, port_mass_flow_kg_s=-p4_bridge_to_port1_next_line_flow, ), port_4=TestMqlP4NodeBalancePort( flow_kg_s=p4_port3_next_resistance_output_to_p4_flow, node_h=p4_port3_next_resistance_output_line.h, connected_h=p4_bridge_primary_line.h, port_mass_flow_kg_s=p4_port3_next_resistance_output_to_p4_flow, ), ) p4_bridge_node_to_primary_line_flow = ( p4_bridge_balance.port_2_mass_flow_g_s * 1.0e-3 ) snapshot = TestMqlPn3P4NodeChamberSegmentSnapshot( inlet_line=inlet_line, chamber=chamber, outlet_line=outlet_line, node_line_port_1=node_line_port_1, node_line_port_2=node_line_port_2, p4_primary_line=p4_primary_line, p4_boundary=p4_primary_line, p4_primary_chamber=p4_primary_chamber, p4_port1_line=p4_port1_line, p4_port1_remote_primary_line=p4_port1_remote_primary_line, p4_port1_remote_primary_chamber=p4_port1_remote_primary_chamber, p4_port1_remote_port1_line=p4_port1_remote_port1_line, p4_port1_far_primary_line=p4_port1_far_primary_line, p4_port1_far_primary_chamber=p4_port1_far_primary_chamber, p4_port1_far_port1_line=p4_port1_far_port1_line, p4_port1_next_primary_line=p4_port1_next_primary_line, p4_port1_next_primary_chamber=p4_port1_next_primary_chamber, p4_port1_next_port1_line=p4_port1_next_port1_line, p4_port1_next_orifice_line_port_1=p4_port1_next_orifice_line_port_1, p4_port1_next_orifice_line_port_2=p4_port1_next_orifice_line_port_2, p4_port1_next_orifice_output_line=p4_port1_next_orifice_output_line, p4_port1_next_orifice_resistance_line_port_1=( p4_port1_next_orifice_resistance_line_port_1 ), p4_port1_next_orifice_resistance_line_port_2=( p4_port1_next_orifice_resistance_line_port_2 ), p4_port1_next_orifice_resistance_chamber_inlet_line=( p4_port1_next_orifice_resistance_chamber_inlet_line ), p4_port1_next_orifice_resistance_chamber=( p4_port1_next_orifice_resistance_chamber ), p4_port1_next_orifice_resistance_chamber_outlet_line=( p4_port1_next_orifice_resistance_chamber_outlet_line ), p4_bridge_primary_line=p4_bridge_primary_line, p4_bridge_primary_chamber=p4_bridge_primary_chamber, p4_port1_remote_orifice_line_port_1=p4_port1_remote_orifice_line_port_1, p4_port1_remote_orifice_line_port_2=p4_port1_remote_orifice_line_port_2, p4_port3_line=p4_port3_line, p4_port3_remote_primary_line=p4_port3_remote_primary_line, p4_port3_remote_primary_chamber=p4_port3_remote_primary_chamber, p4_port3_remote_port3_line=p4_port3_remote_port3_line, p4_port3_far_primary_line=p4_port3_far_primary_line, p4_port3_far_primary_chamber=p4_port3_far_primary_chamber, p4_port3_far_port3_line=p4_port3_far_port3_line, p4_port3_next_primary_line=p4_port3_next_primary_line, p4_port3_next_primary_chamber=p4_port3_next_primary_chamber, p4_port3_next_port3_line=p4_port3_next_port3_line, p4_port3_next_orifice_line_port_1=p4_port3_next_orifice_line_port_1, p4_port3_next_orifice_line_port_2=p4_port3_next_orifice_line_port_2, p4_port3_next_orifice_output_line=p4_port3_next_orifice_output_line, p4_port3_next_chamber_inlet_line=p4_port3_next_chamber_inlet_line, p4_port3_next_chamber=p4_port3_next_chamber, p4_port3_next_chamber_outlet_line=p4_port3_next_chamber_outlet_line, p4_port3_next_resistance_node_line_port_1=( p4_port3_next_resistance_node_line_port_1 ), p4_port3_next_resistance_node_line_port_2=( p4_port3_next_resistance_node_line_port_2 ), p4_port3_next_resistance_output_line=p4_port3_next_resistance_output_line, p4_port3_next_resistance_chamber_inlet_line=( p4_port3_next_resistance_chamber_inlet_line ), p4_port3_next_resistance_chamber=p4_port3_next_resistance_chamber, p4_port3_next_resistance_chamber_outlet_line=( p4_port3_next_resistance_chamber_outlet_line ), p4_port3_remote_orifice_line_port_1=p4_port3_remote_orifice_line_port_1, p4_port3_remote_orifice_line_port_2=p4_port3_remote_orifice_line_port_2, p4_port3_remote_resistance_node_line_port_1=( p4_port3_remote_resistance_node_line_port_1 ), p4_port3_remote_resistance_node_line_port_2=( p4_port3_remote_resistance_node_line_port_2 ), p4_port3_remote_resistance_output_line=( p4_port3_remote_resistance_output_line ), inlet_node=inlet_node, resistance_boundary=resistance_boundary, node_balance=node_balance, p4_balance=p4_balance, p4_port1_remote_balance=p4_port1_remote_balance, p4_port1_far_balance=p4_port1_far_balance, p4_port1_next_balance=p4_port1_next_balance, p4_bridge_balance=p4_bridge_balance, p4_port1_remote_orifice_node_balance=p4_port1_remote_orifice_node_balance, p4_port1_next_orifice_node_balance=p4_port1_next_orifice_node_balance, p4_port1_next_orifice_resistance_node_balance=( p4_port1_next_orifice_resistance_node_balance ), p4_port3_remote_balance=p4_port3_remote_balance, p4_port3_far_balance=p4_port3_far_balance, p4_port3_next_balance=p4_port3_next_balance, p4_port3_next_orifice_node_balance=p4_port3_next_orifice_node_balance, p4_port3_next_resistance_node_balance=p4_port3_next_resistance_node_balance, p4_port3_remote_orifice_node_balance=p4_port3_remote_orifice_node_balance, p4_port3_remote_resistance_node_balance=( p4_port3_remote_resistance_node_balance ), inlet_node_to_line_flow=inlet_node_to_line_flow, inlet_line_to_chamber_flow=inlet_line_to_chamber_flow, outlet_node_to_line_flow=outlet_node_to_line_flow, outlet_line_to_chamber_flow=outlet_line_to_chamber_flow, node_to_resistance_flow=node_to_resistance_flow, node_to_pnl0003_flow=node_to_pnl0003_flow, pnl0003_center_flow=pnl0003_center_flow, pnl0003_to_p4_flow=pnl0003_to_p4_flow, p4_primary_chamber_to_line_flow=p4_primary_chamber_to_line_flow, p4_node_to_primary_line_flow=p4_node_to_primary_line_flow, p4_to_port1_line_flow=p4_to_port1_line_flow, p4_port1_remote_node_to_line_flow=p4_port1_remote_node_to_line_flow, p4_port1_remote_chamber_to_line_flow=p4_port1_remote_chamber_to_line_flow, p4_port1_remote_node_to_primary_line_flow=( p4_port1_remote_node_to_primary_line_flow ), p4_port1_remote_to_port1_line_flow=p4_port1_remote_to_port1_line_flow, p4_port1_far_node_to_line_flow=p4_port1_far_node_to_line_flow, p4_port1_far_chamber_to_line_flow=p4_port1_far_chamber_to_line_flow, p4_port1_far_node_to_primary_line_flow=( p4_port1_far_node_to_primary_line_flow ), p4_port1_far_to_next_line_flow=p4_port1_far_to_next_line_flow, p4_port1_next_node_to_line_flow=p4_port1_next_node_to_line_flow, p4_port1_next_chamber_to_line_flow=p4_port1_next_chamber_to_line_flow, p4_port1_next_node_to_primary_line_flow=( p4_port1_next_node_to_primary_line_flow ), p4_port1_next_to_bridge_line_flow=p4_port1_next_to_bridge_line_flow, p4_port1_next_orifice_p4_to_output_line_flow=( p4_port1_next_orifice_p4_to_output_line_flow ), p4_port1_next_orifice_node_to_line_flow=( p4_port1_next_orifice_node_to_line_flow ), p4_port1_next_orifice_line_center_flow=( p4_port1_next_orifice_line_center_flow ), p4_port1_next_orifice_to_output_line_flow=( p4_port1_next_orifice_to_output_line_flow ), p4_port1_next_orifice_resistance_node_to_next_flow=( p4_port1_next_orifice_resistance_node_to_next_flow ), p4_port1_next_orifice_resistance_node_to_line_flow=( p4_port1_next_orifice_resistance_node_to_line_flow ), p4_port1_next_orifice_resistance_line_center_flow=( p4_port1_next_orifice_resistance_line_center_flow ), p4_port1_next_orifice_resistance_to_p4_flow=( p4_port1_next_orifice_resistance_to_p4_flow ), p4_port1_next_orifice_resistance_chamber_inlet_node_to_line_flow=( p4_port1_next_orifice_resistance_chamber_inlet_node_to_line_flow ), p4_port1_next_orifice_resistance_chamber_inlet_line_to_chamber_flow=( p4_port1_next_orifice_resistance_chamber_inlet_line_to_chamber_flow ), p4_port1_next_orifice_resistance_chamber_outlet_node_to_line_flow=( p4_port1_next_orifice_resistance_chamber_outlet_node_to_line_flow ), p4_port1_next_orifice_resistance_chamber_outlet_line_to_chamber_flow=( p4_port1_next_orifice_resistance_chamber_outlet_line_to_chamber_flow ), p4_bridge_to_port1_next_line_flow=p4_bridge_to_port1_next_line_flow, p4_bridge_chamber_to_line_flow=p4_bridge_chamber_to_line_flow, p4_bridge_node_to_primary_line_flow=p4_bridge_node_to_primary_line_flow, p4_port1_remote_node_to_orifice_line_flow=( p4_port1_remote_node_to_orifice_line_flow ), p4_port1_remote_orifice_line_center_flow=( p4_port1_remote_orifice_line_center_flow ), p4_port1_remote_orifice_to_node_flow=p4_port1_remote_orifice_to_node_flow, p4_to_port3_line_flow=p4_to_port3_line_flow, p4_port3_remote_node_to_line_flow=p4_port3_remote_node_to_line_flow, p4_port3_remote_chamber_to_line_flow=p4_port3_remote_chamber_to_line_flow, p4_port3_remote_node_to_primary_line_flow=( p4_port3_remote_node_to_primary_line_flow ), p4_port3_remote_to_port3_line_flow=p4_port3_remote_to_port3_line_flow, p4_port3_far_node_to_line_flow=p4_port3_far_node_to_line_flow, p4_port3_far_chamber_to_line_flow=p4_port3_far_chamber_to_line_flow, p4_port3_far_node_to_primary_line_flow=( p4_port3_far_node_to_primary_line_flow ), p4_port3_far_to_next_line_flow=p4_port3_far_to_next_line_flow, p4_port3_next_node_to_line_flow=p4_port3_next_node_to_line_flow, p4_port3_next_chamber_to_line_flow=p4_port3_next_chamber_to_line_flow, p4_port3_next_node_to_primary_line_flow=( p4_port3_next_node_to_primary_line_flow ), p4_bridge_to_port3_next_line_flow=p4_bridge_to_port3_next_line_flow, p4_port3_next_to_bridge_line_flow=p4_port3_next_to_bridge_line_flow, p4_port3_next_orifice_node_to_line_flow=( p4_port3_next_orifice_node_to_line_flow ), p4_port3_next_orifice_line_center_flow=( p4_port3_next_orifice_line_center_flow ), p4_port3_next_orifice_to_output_line_flow=( p4_port3_next_orifice_to_output_line_flow ), p4_port3_next_orifice_output_to_p4_flow=( p4_port3_next_orifice_output_to_p4_flow ), p4_port3_next_chamber_inlet_node_to_line_flow=( p4_port3_next_chamber_inlet_node_to_line_flow ), p4_port3_next_chamber_inlet_line_to_chamber_flow=( p4_port3_next_chamber_inlet_line_to_chamber_flow ), p4_port3_next_chamber_outlet_node_to_line_flow=( p4_port3_next_chamber_outlet_node_to_line_flow ), p4_port3_next_chamber_outlet_line_to_chamber_flow=( p4_port3_next_chamber_outlet_line_to_chamber_flow ), p4_port3_next_resistance_node_to_next_flow=( p4_port3_next_resistance_node_to_next_flow ), p4_port3_next_resistance_node_to_line_flow=( p4_port3_next_resistance_node_to_line_flow ), p4_port3_next_resistance_line_center_flow=( p4_port3_next_resistance_line_center_flow ), p4_port3_next_resistance_to_output_line_flow=( p4_port3_next_resistance_to_output_line_flow ), p4_port3_next_resistance_output_to_p4_flow=( p4_port3_next_resistance_output_to_p4_flow ), p4_port3_next_resistance_chamber_inlet_node_to_line_flow=( p4_port3_next_resistance_chamber_inlet_node_to_line_flow ), p4_port3_next_resistance_chamber_inlet_line_to_chamber_flow=( p4_port3_next_resistance_chamber_inlet_line_to_chamber_flow ), p4_port3_next_resistance_chamber_outlet_node_to_line_flow=( p4_port3_next_resistance_chamber_outlet_node_to_line_flow ), p4_port3_next_resistance_chamber_outlet_line_to_chamber_flow=( p4_port3_next_resistance_chamber_outlet_line_to_chamber_flow ), p4_port3_remote_node_to_orifice_line_flow=( p4_port3_remote_node_to_orifice_line_flow ), p4_port3_remote_node_to_resistance_flow=( p4_port3_remote_node_to_resistance_flow ), p4_port3_remote_resistance_node_to_line_flow=( p4_port3_remote_resistance_node_to_line_flow ), p4_port3_remote_resistance_line_center_flow=( p4_port3_remote_resistance_line_center_flow ), p4_port3_remote_resistance_to_output_line_flow=( p4_port3_remote_resistance_to_output_line_flow ), p4_port3_remote_resistance_output_to_p4_flow=( p4_port3_remote_resistance_output_to_p4_flow ), p4_port3_remote_orifice_line_center_flow=( p4_port3_remote_orifice_line_center_flow ), p4_port3_remote_orifice_to_node_flow=p4_port3_remote_orifice_to_node_flow, ) self._write_port_states(snapshot) return snapshot @staticmethod def _line_to_chamber_flow( *, line: ThermodynamicProperties, chamber: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> float: return TestMqlPn3NodeChamberSegmentClosure._line_to_chamber_flow( line=line, chamber=chamber, orifice=orifice, ) @staticmethod def _line_to_p4_flow( *, line: ThermodynamicProperties, p4_boundary: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> float: return TestMqlPn3NodeChamberSegmentClosure._line_to_p4_flow( line=line, p4_boundary=p4_boundary, orifice=orifice, ) @staticmethod def _boundary_to_p4_flow( *, boundary: ThermodynamicProperties, p4_boundary: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> float: upstream_temperature = boundary.T if boundary.p >= p4_boundary.p else p4_boundary.T return orifice.mass_flow(boundary.p, p4_boundary.p, upstream_temperature) @staticmethod def _port( component: AmesimPneumaticVolume | AmesimPneumaticOrifice, port_name: str, ) -> PortState: return TestMqlPn3NodeChamberSegmentClosure._port(component, port_name) @staticmethod def _enthalpy_flow_from_node( *, flow_kg_s: float, node_h: float, connected_h: float, ) -> float: return TestMqlPn3NodeChamberSegmentClosure._enthalpy_flow_from_node( flow_kg_s=flow_kg_s, node_h=node_h, connected_h=connected_h, ) @staticmethod def _enthalpy_flow_for_node_port( *, flow_kg_s: float, node_h: float, connected_h: float, port_mass_flow_kg_s: float, ) -> float: upstream_h = node_h if flow_kg_s >= 0.0 else connected_h return port_mass_flow_kg_s * upstream_h def _two_state_orifice_line_flows( self, *, line: AmesimPnl0003Pipe, line_port_2_properties: ThermodynamicProperties, boundary_properties: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> TestMqlTwoStateOrificeLineFlows: return TestMqlTwoStateOrificeLineFlows( line_center_flow=line.resistance_mass_flow(), line_to_boundary_flow=self._line_to_p4_flow( line=line_port_2_properties, p4_boundary=boundary_properties, orifice=orifice, ), ) @staticmethod def _resistance_flow( *, resistance: AmesimPnl00rPipe, port_1_properties: ThermodynamicProperties, port_2_properties: ThermodynamicProperties, ) -> float: return resistance.mass_flow( port_1_pressure_pa=port_1_properties.p, port_1_temperature_k=port_1_properties.T, port_2_pressure_pa=port_2_properties.p, port_2_temperature_k=port_2_properties.T, ) @staticmethod def _p4_neighborhood_line_flows( *, primary_line: AmesimPnl0001Pipe, primary_chamber_properties: ThermodynamicProperties, port_1_line: AmesimPnl0002Pipe, port_1_properties: ThermodynamicProperties, port_3_line: AmesimPnl0002Pipe, port_3_properties: ThermodynamicProperties, ) -> TestMqlP4NeighborhoodLineFlows: return TestMqlP4NeighborhoodLineFlows( primary_chamber_to_line_flow=primary_line.resistance_mass_flow( port_1_pressure_pa=primary_chamber_properties.p, port_1_temperature_k=primary_chamber_properties.T, ), port_1_line_flow=port_1_line.port_mass_flow( port_pressure_pa=port_1_properties.p, port_temperature_k=port_1_properties.T, ), port_3_line_flow=port_3_line.port_mass_flow( port_pressure_pa=port_3_properties.p, port_temperature_k=port_3_properties.T, ), ) def _fixed_chamber_segment_flows( self, *, chamber_properties: ThermodynamicProperties, inlet_line: AmesimPnl0001Pipe, inlet_line_properties: ThermodynamicProperties, inlet_node_properties: ThermodynamicProperties, inlet_orifice: AmesimPneumaticOrifice, outlet_line: AmesimPnl0001Pipe, outlet_line_properties: ThermodynamicProperties, outlet_node_properties: ThermodynamicProperties, outlet_orifice: AmesimPneumaticOrifice, ) -> TestMqlFixedChamberSegmentFlows: return TestMqlFixedChamberSegmentFlows( inlet_node_to_line_flow=inlet_line.resistance_mass_flow( port_1_pressure_pa=inlet_node_properties.p, port_1_temperature_k=inlet_node_properties.T, ), inlet_line_to_chamber_flow=self._line_to_chamber_flow( line=inlet_line_properties, chamber=chamber_properties, orifice=inlet_orifice, ), outlet_node_to_line_flow=outlet_line.resistance_mass_flow( port_1_pressure_pa=outlet_node_properties.p, port_1_temperature_k=outlet_node_properties.T, ), outlet_line_to_chamber_flow=self._line_to_chamber_flow( line=outlet_line_properties, chamber=chamber_properties, orifice=outlet_orifice, ), ) def _pn3_node_balance( self, *, node: TestMqlPneumaticNode3, primary_properties: ThermodynamicProperties, port_1: TestMqlPn3NodeBalancePort, port_3: TestMqlPn3NodeBalancePort, ) -> TestMqlPneumaticNode3Balance: return node.balance( port_2_temperature_k=primary_properties.T, port_2_pressure_pa=primary_properties.p, port_1_enthalpy_flow_w=self._enthalpy_flow_for_node_port( flow_kg_s=port_1.flow_kg_s, node_h=port_1.node_h, connected_h=port_1.connected_h, port_mass_flow_kg_s=port_1.port_mass_flow_kg_s, ), port_1_mass_flow_g_s=port_1.port_mass_flow_kg_s * 1.0e3, port_3_enthalpy_flow_w=self._enthalpy_flow_for_node_port( flow_kg_s=port_3.flow_kg_s, node_h=port_3.node_h, connected_h=port_3.connected_h, port_mass_flow_kg_s=port_3.port_mass_flow_kg_s, ), port_3_mass_flow_g_s=port_3.port_mass_flow_kg_s * 1.0e3, ) @staticmethod def _pn3_node_port_2_connected_h( *, balance: TestMqlPneumaticNode3Balance, fallback_h: float, ) -> float: mass_flow_kg_s = balance.port_2_mass_flow_g_s * 1.0e-3 if abs(mass_flow_kg_s) <= 1.0e-12: return fallback_h return balance.port_2_enthalpy_flow_w / mass_flow_kg_s @staticmethod def _p4_node_port_2_connected_h( *, balance: TestMqlPneumaticNode4Balance, fallback_h: float, ) -> float: mass_flow_kg_s = balance.port_2_mass_flow_g_s * 1.0e-3 if abs(mass_flow_kg_s) <= 1.0e-12: return fallback_h return balance.port_2_enthalpy_flow_w / mass_flow_kg_s @staticmethod def _reference_enthalpy_flow_for_node_port( *, gas, node_properties: ThermodynamicProperties, connected_properties: ThermodynamicProperties, flow_kg_s: float, port_mass_flow_kg_s: float, reference_temperature_k: float = 298.15, ) -> float: stream_properties = ( node_properties if flow_kg_s >= 0.0 else connected_properties ) return port_mass_flow_kg_s * gas.pressure_reference_enthalpy( stream_properties.p, stream_properties.T, reference_temperature=reference_temperature_k, ) def _p4_port3_remote_port_2_reference_h( self, *, snapshot: TestMqlPn3P4NodeChamberSegmentSnapshot, reference_temperature_k: float = 298.15, ) -> float: gas = self.components.p4_port3_remote_primary_line.gas port_2_mass_flow = snapshot.p4_port3_remote_balance.port_2_mass_flow_g_s * 1.0e-3 if abs(port_2_mass_flow) <= 1.0e-12: return gas.pressure_reference_enthalpy( snapshot.p4_port3_remote_primary_line.p, snapshot.p4_port3_remote_primary_line.T, reference_temperature=reference_temperature_k, ) port_2_enthalpy_flow = sum( ( self._reference_enthalpy_flow_for_node_port( gas=gas, node_properties=snapshot.p4_port3_remote_primary_line, connected_properties=snapshot.p4_port3_line, flow_kg_s=snapshot.p4_port3_remote_node_to_line_flow, port_mass_flow_kg_s=-snapshot.p4_port3_remote_node_to_line_flow, reference_temperature_k=reference_temperature_k, ), self._reference_enthalpy_flow_for_node_port( gas=gas, node_properties=snapshot.p4_port3_remote_primary_line, connected_properties=snapshot.p4_port3_remote_port3_line, flow_kg_s=snapshot.p4_port3_remote_to_port3_line_flow, port_mass_flow_kg_s=-snapshot.p4_port3_remote_to_port3_line_flow, reference_temperature_k=reference_temperature_k, ), self._reference_enthalpy_flow_for_node_port( gas=gas, node_properties=snapshot.p4_port3_remote_orifice_line_port_2, connected_properties=snapshot.p4_port3_remote_primary_line, flow_kg_s=snapshot.p4_port3_remote_orifice_to_node_flow, port_mass_flow_kg_s=snapshot.p4_port3_remote_orifice_to_node_flow, reference_temperature_k=reference_temperature_k, ), ) ) return port_2_enthalpy_flow / port_2_mass_flow def _p4_node_balance( self, *, node: TestMqlPneumaticNode4, primary_properties: ThermodynamicProperties, port_1: TestMqlP4NodeBalancePort, port_3: TestMqlP4NodeBalancePort, port_4: TestMqlP4NodeBalancePort, ) -> TestMqlPneumaticNode4Balance: return node.balance( port_2_temperature_k=primary_properties.T, port_2_pressure_pa=primary_properties.p, port_1_enthalpy_flow_w=self._enthalpy_flow_for_node_port( flow_kg_s=port_1.flow_kg_s, node_h=port_1.node_h, connected_h=port_1.connected_h, port_mass_flow_kg_s=port_1.port_mass_flow_kg_s, ), port_1_mass_flow_g_s=port_1.port_mass_flow_kg_s * 1.0e3, port_3_enthalpy_flow_w=self._enthalpy_flow_for_node_port( flow_kg_s=port_3.flow_kg_s, node_h=port_3.node_h, connected_h=port_3.connected_h, port_mass_flow_kg_s=port_3.port_mass_flow_kg_s, ), port_3_mass_flow_g_s=port_3.port_mass_flow_kg_s * 1.0e3, port_4_enthalpy_flow_w=self._enthalpy_flow_for_node_port( flow_kg_s=port_4.flow_kg_s, node_h=port_4.node_h, connected_h=port_4.connected_h, port_mass_flow_kg_s=port_4.port_mass_flow_kg_s, ), port_4_mass_flow_g_s=port_4.port_mass_flow_kg_s * 1.0e3, ) def _write_fixed_chamber_segment( self, *, spec: TestMqlPneumaticChamberSegmentSpec, chamber: AmesimPneumaticVolume, chamber_properties: ThermodynamicProperties, inlet_line: AmesimPnl0001Pipe, inlet_line_properties: ThermodynamicProperties, inlet_node_properties: ThermodynamicProperties, inlet_node_to_line_flow: float, inlet_line_to_chamber_flow: float, inlet_orifice: AmesimPneumaticOrifice, outlet_line: AmesimPnl0001Pipe, outlet_line_properties: ThermodynamicProperties, outlet_node_properties: ThermodynamicProperties, outlet_node_to_line_flow: float, outlet_line_to_chamber_flow: float, outlet_orifice: AmesimPneumaticOrifice, ) -> None: chamber_inlet_port = self._port(chamber, spec.volume_inlet_port) chamber_outlet_port = self._port(chamber, spec.volume_outlet_port) TestMqlPnl0001PairChamberSegmentClosure._write_line_side( self, line=inlet_line, line_properties=inlet_line_properties, node_properties=inlet_node_properties, node_to_line_flow=inlet_node_to_line_flow, line_to_chamber_flow=inlet_line_to_chamber_flow, orifice=inlet_orifice, orifice_boundary_port=spec.inlet_orifice_boundary_port, orifice_volume_port=spec.inlet_orifice_volume_port, chamber_port=chamber_inlet_port, chamber_properties=chamber_properties, ) TestMqlPnl0001PairChamberSegmentClosure._write_line_side( self, line=outlet_line, line_properties=outlet_line_properties, node_properties=outlet_node_properties, node_to_line_flow=outlet_node_to_line_flow, line_to_chamber_flow=outlet_line_to_chamber_flow, orifice=outlet_orifice, orifice_boundary_port=spec.outlet_orifice_boundary_port, orifice_volume_port=spec.outlet_orifice_volume_port, chamber_port=chamber_outlet_port, chamber_properties=chamber_properties, ) def _fixed_chamber_segment_derivatives( self, *, spec: TestMqlPneumaticChamberSegmentSpec, chamber: AmesimPneumaticVolume, chamber_properties: ThermodynamicProperties, inlet_line: AmesimPnl0001Pipe, inlet_line_properties: ThermodynamicProperties, inlet_connected_properties: ThermodynamicProperties, inlet_node_to_line_flow: float, inlet_line_to_chamber_flow: float, outlet_line: AmesimPnl0001Pipe, outlet_line_properties: ThermodynamicProperties, outlet_connected_properties: ThermodynamicProperties, outlet_node_to_line_flow: float, outlet_line_to_chamber_flow: float, ) -> tuple[VolumeState, VolumeState, VolumeState]: inlet_derivative = inlet_line.derivatives_from_connections( port_1_m_flow=inlet_node_to_line_flow, connected_h_1=inlet_connected_properties.h, port_2_m_flow=-inlet_line_to_chamber_flow, connected_h_2=chamber_properties.h, ) chamber_derivative = chamber.derivatives_from_two_connections( port_a_m_flow=self._port(chamber, "port_1").m_flow, connected_h_a=( inlet_line_properties.h if spec.volume_inlet_port == "port_1" else outlet_line_properties.h ), port_b_m_flow=self._port(chamber, "port_2").m_flow, connected_h_b=( inlet_line_properties.h if spec.volume_inlet_port == "port_2" else outlet_line_properties.h ), internal_h=chamber_properties.h, ) outlet_derivative = outlet_line.derivatives_from_connections( port_1_m_flow=outlet_node_to_line_flow, connected_h_1=outlet_connected_properties.h, port_2_m_flow=-outlet_line_to_chamber_flow, connected_h_2=chamber_properties.h, ) return inlet_derivative, chamber_derivative, outlet_derivative @staticmethod def _write_primary_chamber_line( *, line: AmesimPnl0001Pipe, line_properties: ThermodynamicProperties, chamber: AmesimPneumaticVolume, chamber_properties: ThermodynamicProperties, chamber_to_line_flow: float, node_to_line_flow: float, ) -> None: line.port_1.p = chamber_properties.p line.port_1.m_flow = chamber_to_line_flow line.port_1.h_outflow = line_properties.h line.port_2.p = line_properties.p line.port_2.m_flow = node_to_line_flow line.port_2.h_outflow = line_properties.h chamber.port_a.p = chamber_properties.p chamber.port_a.m_flow = -chamber_to_line_flow chamber.port_a.h_outflow = chamber_properties.h @staticmethod def _pnl0001_reference_enthalpy_derivative( *, line: AmesimPnl0001Pipe, line_properties: ThermodynamicProperties, port_1_properties: ThermodynamicProperties, port_1_flow: float, port_2_properties: ThermodynamicProperties, port_2_flow: float, port_1_connected_reference_h: float | None = None, port_2_connected_reference_h: float | None = None, reference_temperature_k: float = 298.15, ) -> VolumeState: def specific_reference_h( *, port_flow: float, connected: ThermodynamicProperties, connected_reference_h: float | None, ) -> float: if port_flow > 0.0 and connected_reference_h is not None: return connected_reference_h if port_flow > 0.0: pressure = connected.p temperature = connected.T else: pressure = line_properties.p temperature = line_properties.T return line.gas.pressure_reference_enthalpy( pressure, temperature, reference_temperature=reference_temperature_k, ) def reference_enthalpy_flow( *, port_flow: float, connected: ThermodynamicProperties, connected_reference_h: float | None, ) -> float: return port_flow * specific_reference_h( port_flow=port_flow, connected=connected, connected_reference_h=connected_reference_h, ) mass_derivative = port_1_flow + port_2_flow heat_flow = ( line.heat_transfer_coefficient * line.heat_transfer_area * (line.external_temperature - line_properties.T) ) enthalpy_flow = reference_enthalpy_flow( port_flow=port_1_flow, connected=port_1_properties, connected_reference_h=port_1_connected_reference_h, ) + reference_enthalpy_flow( port_flow=port_2_flow, connected=port_2_properties, connected_reference_h=port_2_connected_reference_h, ) reference_offset_flow = ( line.gas.cp * reference_temperature_k - line.gas.cv * line_properties.T ) * mass_derivative temperature_derivative = ( enthalpy_flow + reference_offset_flow + heat_flow ) / (line.state.m * line.gas.cv) return VolumeState( m=mass_derivative, U=line.gas.cv * (line.state.m * temperature_derivative + line_properties.T * mass_derivative), ) @staticmethod def _primary_chamber_line_derivatives( *, line: AmesimPnl0001Pipe, line_properties: ThermodynamicProperties, chamber: AmesimPneumaticVolume, chamber_properties: ThermodynamicProperties, chamber_to_line_flow: float, node_to_line_flow: float, node_connected_h: float | None = None, ) -> tuple[VolumeState, VolumeState]: derivative_method = ( line.derivatives_from_connections if node_connected_h is None else line.derivatives_from_transport_enthalpy_connections ) line_derivative = derivative_method( port_1_m_flow=chamber_to_line_flow, connected_h_1=chamber_properties.h, port_2_m_flow=node_to_line_flow, connected_h_2=( line_properties.h if node_connected_h is None else node_connected_h ), ) chamber_derivative = chamber.derivatives_from_two_connections( port_a_m_flow=-chamber_to_line_flow, connected_h_a=line_properties.h, port_b_m_flow=0.0, connected_h_b=chamber_properties.h, internal_h=chamber_properties.h, ) return line_derivative, chamber_derivative @staticmethod def _write_connection_line( *, line: AmesimPnl0001Pipe, line_properties: ThermodynamicProperties, port_1_properties: ThermodynamicProperties, port_1_flow: float, port_2_properties: ThermodynamicProperties, port_2_flow: float, ) -> None: line.port_1.p = port_1_properties.p line.port_1.m_flow = port_1_flow line.port_1.h_outflow = line_properties.h line.port_2.p = port_2_properties.p line.port_2.m_flow = port_2_flow line.port_2.h_outflow = line_properties.h @staticmethod def _connection_line_derivative( *, line: AmesimPnl0001Pipe, port_1_properties: ThermodynamicProperties, port_1_flow: float, port_2_properties: ThermodynamicProperties, port_2_flow: float, ) -> VolumeState: return line.derivatives_from_connections( port_1_m_flow=port_1_flow, connected_h_1=port_1_properties.h, port_2_m_flow=port_2_flow, connected_h_2=port_2_properties.h, ) @staticmethod def _write_two_state_connection_line( *, line: AmesimPnl0003Pipe, port_1_properties: ThermodynamicProperties, port_1_flow: float, port_2_properties: ThermodynamicProperties, port_2_flow: float, ) -> None: line.port_1.p = port_1_properties.p line.port_1.m_flow = port_1_flow line.port_1.h_outflow = port_1_properties.h line.port_2.p = port_2_properties.p line.port_2.m_flow = port_2_flow line.port_2.h_outflow = port_2_properties.h @staticmethod def _write_orifice_ports( *, orifice: AmesimPneumaticOrifice, port_a_properties: ThermodynamicProperties, port_a_flow: float, port_b_properties: ThermodynamicProperties, port_b_flow: float, ) -> None: orifice.port_a.p = port_a_properties.p orifice.port_a.m_flow = port_a_flow orifice.port_a.h_outflow = port_a_properties.h orifice.port_b.p = port_b_properties.p orifice.port_b.m_flow = port_b_flow orifice.port_b.h_outflow = port_b_properties.h @staticmethod def _write_resistance_ports( *, resistance: AmesimPnl00rPipe, port_1_properties: ThermodynamicProperties, port_1_flow: float, port_2_properties: ThermodynamicProperties, port_2_flow: float, ) -> None: resistance.port_1.p = port_1_properties.p resistance.port_1.m_flow = port_1_flow resistance.port_1.h_outflow = port_1_properties.h resistance.port_2.p = port_2_properties.p resistance.port_2.m_flow = port_2_flow resistance.port_2.h_outflow = port_2_properties.h @staticmethod def _two_state_connection_line_derivatives( *, line: AmesimPnl0003Pipe, port_1_properties: ThermodynamicProperties, port_1_flow: float, port_2_connected_properties: ThermodynamicProperties, port_2_flow: float, port_1_connected_h: float | None = None, ) -> tuple[VolumeState, VolumeState]: return line.derivatives_from_connections( port_1_m_flow=port_1_flow, connected_h_1=( port_1_properties.h if port_1_connected_h is None else port_1_connected_h ), port_2_m_flow=port_2_flow, connected_h_2=port_2_connected_properties.h, ) def _write_port_states( self, snapshot: TestMqlPn3P4NodeChamberSegmentSnapshot, ) -> None: self._write_fixed_chamber_segment( spec=self.components.spec, chamber=self.components.volume, chamber_properties=snapshot.chamber, inlet_line=self.components.inlet_line, inlet_line_properties=snapshot.inlet_line, inlet_node_properties=snapshot.p4_port3_remote_orifice_line_port_1, inlet_node_to_line_flow=snapshot.inlet_node_to_line_flow, inlet_line_to_chamber_flow=snapshot.inlet_line_to_chamber_flow, inlet_orifice=self.components.inlet_orifice, outlet_line=self.components.outlet_line, outlet_line_properties=snapshot.outlet_line, outlet_node_properties=snapshot.node_line_port_1, outlet_node_to_line_flow=snapshot.outlet_node_to_line_flow, outlet_line_to_chamber_flow=snapshot.outlet_line_to_chamber_flow, outlet_orifice=self.components.outlet_orifice, ) self._write_two_state_connection_line( line=self.components.node_line, port_1_properties=snapshot.node_line_port_1, port_1_flow=snapshot.node_to_pnl0003_flow, port_2_properties=snapshot.node_line_port_2, port_2_flow=-snapshot.pnl0003_to_p4_flow, ) self._write_orifice_ports( orifice=self.components.node_orifice, port_a_properties=snapshot.node_line_port_2, port_a_flow=snapshot.pnl0003_to_p4_flow, port_b_properties=snapshot.p4_primary_line, port_b_flow=-snapshot.pnl0003_to_p4_flow, ) self._write_resistance_ports( resistance=self.components.node_resistance, port_1_properties=snapshot.node_line_port_1, port_1_flow=snapshot.node_to_resistance_flow, port_2_properties=snapshot.p4_port1_remote_orifice_line_port_1, port_2_flow=-snapshot.node_to_resistance_flow, ) self._write_primary_chamber_line( line=self.components.p4_primary_line, line_properties=snapshot.p4_primary_line, chamber=self.components.p4_primary_chamber, chamber_properties=snapshot.p4_primary_chamber, chamber_to_line_flow=snapshot.p4_primary_chamber_to_line_flow, node_to_line_flow=snapshot.p4_node_to_primary_line_flow, ) self._write_connection_line( line=self.components.p4_port1_line, line_properties=snapshot.p4_port1_line, port_1_properties=snapshot.p4_primary_line, port_1_flow=snapshot.p4_to_port1_line_flow, port_2_properties=snapshot.p4_port1_remote_primary_line, port_2_flow=snapshot.p4_port1_remote_node_to_line_flow, ) self._write_primary_chamber_line( line=self.components.p4_port1_remote_primary_line, line_properties=snapshot.p4_port1_remote_primary_line, chamber=self.components.p4_port1_remote_primary_chamber, chamber_properties=snapshot.p4_port1_remote_primary_chamber, chamber_to_line_flow=snapshot.p4_port1_remote_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port1_remote_node_to_primary_line_flow, ) self._write_connection_line( line=self.components.p4_port1_remote_port1_line, line_properties=snapshot.p4_port1_remote_port1_line, port_1_properties=snapshot.p4_port1_remote_primary_line, port_1_flow=snapshot.p4_port1_remote_to_port1_line_flow, port_2_properties=snapshot.p4_port1_far_primary_line, port_2_flow=snapshot.p4_port1_far_node_to_line_flow, ) self._write_primary_chamber_line( line=self.components.p4_port1_far_primary_line, line_properties=snapshot.p4_port1_far_primary_line, chamber=self.components.p4_port1_far_primary_chamber, chamber_properties=snapshot.p4_port1_far_primary_chamber, chamber_to_line_flow=snapshot.p4_port1_far_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port1_far_node_to_primary_line_flow, ) self._write_connection_line( line=self.components.p4_port1_far_port1_line, line_properties=snapshot.p4_port1_far_port1_line, port_1_properties=snapshot.p4_port1_far_primary_line, port_1_flow=snapshot.p4_port1_far_to_next_line_flow, port_2_properties=snapshot.p4_port1_next_primary_line, port_2_flow=snapshot.p4_port1_next_node_to_line_flow, ) self._write_primary_chamber_line( line=self.components.p4_port1_next_primary_line, line_properties=snapshot.p4_port1_next_primary_line, chamber=self.components.p4_port1_next_primary_chamber, chamber_properties=snapshot.p4_port1_next_primary_chamber, chamber_to_line_flow=snapshot.p4_port1_next_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port1_next_node_to_primary_line_flow, ) self._write_connection_line( line=self.components.p4_port1_next_port1_line, line_properties=snapshot.p4_port1_next_port1_line, port_1_properties=snapshot.p4_port1_next_primary_line, port_1_flow=snapshot.p4_port1_next_to_bridge_line_flow, port_2_properties=snapshot.p4_bridge_primary_line, port_2_flow=snapshot.p4_bridge_to_port1_next_line_flow, ) self._write_two_state_connection_line( line=self.components.p4_port1_next_orifice_line, port_1_properties=snapshot.p4_port1_next_orifice_line_port_1, port_1_flow=snapshot.p4_port1_next_orifice_node_to_line_flow, port_2_properties=snapshot.p4_port1_next_orifice_line_port_2, port_2_flow=-snapshot.p4_port1_next_orifice_to_output_line_flow, ) self._write_orifice_ports( orifice=self.components.p4_port1_next_orifice, port_a_properties=snapshot.p4_port1_next_orifice_line_port_2, port_a_flow=snapshot.p4_port1_next_orifice_to_output_line_flow, port_b_properties=snapshot.p4_port1_next_orifice_output_line, port_b_flow=-snapshot.p4_port1_next_orifice_to_output_line_flow, ) self._write_connection_line( line=self.components.p4_port1_next_orifice_output_line, line_properties=snapshot.p4_port1_next_orifice_output_line, port_1_properties=snapshot.p4_port1_next_primary_line, port_1_flow=snapshot.p4_port1_next_orifice_p4_to_output_line_flow, port_2_properties=snapshot.p4_port1_next_orifice_output_line, port_2_flow=snapshot.p4_port1_next_orifice_to_output_line_flow, ) self._write_resistance_ports( resistance=self.components.p4_port1_next_orifice_resistance, port_1_properties=snapshot.p4_port1_next_orifice_resistance_line_port_1, port_1_flow=( snapshot.p4_port1_next_orifice_resistance_node_to_next_flow ), port_2_properties=snapshot.p4_port1_next_orifice_line_port_1, port_2_flow=( -snapshot.p4_port1_next_orifice_resistance_node_to_next_flow ), ) self._write_two_state_connection_line( line=self.components.p4_port1_next_orifice_resistance_line, port_1_properties=snapshot.p4_port1_next_orifice_resistance_line_port_1, port_1_flow=snapshot.p4_port1_next_orifice_resistance_node_to_line_flow, port_2_properties=snapshot.p4_port1_next_orifice_resistance_line_port_2, port_2_flow=-snapshot.p4_port1_next_orifice_resistance_to_p4_flow, ) self._write_orifice_ports( orifice=self.components.p4_port1_next_orifice_resistance_orifice, port_a_properties=snapshot.p4_port1_next_orifice_resistance_line_port_2, port_a_flow=snapshot.p4_port1_next_orifice_resistance_to_p4_flow, port_b_properties=snapshot.p4_port1_far_primary_line, port_b_flow=-snapshot.p4_port1_next_orifice_resistance_to_p4_flow, ) self._write_fixed_chamber_segment( spec=self.components.p4_port1_next_orifice_resistance_chamber_spec, chamber=self.components.p4_port1_next_orifice_resistance_chamber, chamber_properties=snapshot.p4_port1_next_orifice_resistance_chamber, inlet_line=self.components.p4_port1_next_orifice_resistance_chamber_inlet_line, inlet_line_properties=( snapshot.p4_port1_next_orifice_resistance_chamber_inlet_line ), inlet_node_properties=snapshot.p4_port1_remote_orifice_line_port_1, inlet_node_to_line_flow=( snapshot.p4_port1_next_orifice_resistance_chamber_inlet_node_to_line_flow ), inlet_line_to_chamber_flow=( snapshot.p4_port1_next_orifice_resistance_chamber_inlet_line_to_chamber_flow ), inlet_orifice=( self.components.p4_port1_next_orifice_resistance_chamber_inlet_orifice ), outlet_line=( self.components.p4_port1_next_orifice_resistance_chamber_outlet_line ), outlet_line_properties=( snapshot.p4_port1_next_orifice_resistance_chamber_outlet_line ), outlet_node_properties=( snapshot.p4_port1_next_orifice_resistance_line_port_1 ), outlet_node_to_line_flow=( snapshot.p4_port1_next_orifice_resistance_chamber_outlet_node_to_line_flow ), outlet_line_to_chamber_flow=( snapshot.p4_port1_next_orifice_resistance_chamber_outlet_line_to_chamber_flow ), outlet_orifice=( self.components.p4_port1_next_orifice_resistance_chamber_outlet_orifice ), ) self._write_primary_chamber_line( line=self.components.p4_bridge_primary_line, line_properties=snapshot.p4_bridge_primary_line, chamber=self.components.p4_bridge_primary_chamber, chamber_properties=snapshot.p4_bridge_primary_chamber, chamber_to_line_flow=snapshot.p4_bridge_chamber_to_line_flow, node_to_line_flow=snapshot.p4_bridge_node_to_primary_line_flow, ) self._write_two_state_connection_line( line=self.components.p4_port1_remote_orifice_line, port_1_properties=snapshot.p4_port1_remote_orifice_line_port_1, port_1_flow=snapshot.p4_port1_remote_node_to_orifice_line_flow, port_2_properties=snapshot.p4_port1_remote_orifice_line_port_2, port_2_flow=-snapshot.p4_port1_remote_orifice_to_node_flow, ) self._write_orifice_ports( orifice=self.components.p4_port1_remote_orifice, port_a_properties=snapshot.p4_port1_remote_orifice_line_port_2, port_a_flow=snapshot.p4_port1_remote_orifice_to_node_flow, port_b_properties=snapshot.p4_port1_remote_primary_line, port_b_flow=-snapshot.p4_port1_remote_orifice_to_node_flow, ) self._write_connection_line( line=self.components.p4_port3_line, line_properties=snapshot.p4_port3_line, port_1_properties=snapshot.p4_port3_remote_primary_line, port_1_flow=snapshot.p4_port3_remote_node_to_line_flow, port_2_properties=snapshot.p4_primary_line, port_2_flow=snapshot.p4_to_port3_line_flow, ) self._write_primary_chamber_line( line=self.components.p4_port3_remote_primary_line, line_properties=snapshot.p4_port3_remote_primary_line, chamber=self.components.p4_port3_remote_primary_chamber, chamber_properties=snapshot.p4_port3_remote_primary_chamber, chamber_to_line_flow=snapshot.p4_port3_remote_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port3_remote_node_to_primary_line_flow, ) self._write_connection_line( line=self.components.p4_port3_remote_port3_line, line_properties=snapshot.p4_port3_remote_port3_line, port_1_properties=snapshot.p4_port3_far_primary_line, port_1_flow=snapshot.p4_port3_far_node_to_line_flow, port_2_properties=snapshot.p4_port3_remote_primary_line, port_2_flow=snapshot.p4_port3_remote_to_port3_line_flow, ) self._write_primary_chamber_line( line=self.components.p4_port3_far_primary_line, line_properties=snapshot.p4_port3_far_primary_line, chamber=self.components.p4_port3_far_primary_chamber, chamber_properties=snapshot.p4_port3_far_primary_chamber, chamber_to_line_flow=snapshot.p4_port3_far_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port3_far_node_to_primary_line_flow, ) self._write_connection_line( line=self.components.p4_port3_far_port3_line, line_properties=snapshot.p4_port3_far_port3_line, port_1_properties=snapshot.p4_port3_next_primary_line, port_1_flow=snapshot.p4_port3_next_node_to_line_flow, port_2_properties=snapshot.p4_port3_far_primary_line, port_2_flow=snapshot.p4_port3_far_to_next_line_flow, ) self._write_primary_chamber_line( line=self.components.p4_port3_next_primary_line, line_properties=snapshot.p4_port3_next_primary_line, chamber=self.components.p4_port3_next_primary_chamber, chamber_properties=snapshot.p4_port3_next_primary_chamber, chamber_to_line_flow=snapshot.p4_port3_next_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port3_next_node_to_primary_line_flow, ) self._write_connection_line( line=self.components.p4_port3_next_port3_line, line_properties=snapshot.p4_port3_next_port3_line, port_1_properties=snapshot.p4_bridge_primary_line, port_1_flow=snapshot.p4_bridge_to_port3_next_line_flow, port_2_properties=snapshot.p4_port3_next_primary_line, port_2_flow=snapshot.p4_port3_next_to_bridge_line_flow, ) self._write_two_state_connection_line( line=self.components.p4_port3_next_orifice_line, port_1_properties=snapshot.p4_port3_next_orifice_line_port_1, port_1_flow=snapshot.p4_port3_next_orifice_node_to_line_flow, port_2_properties=snapshot.p4_port3_next_orifice_line_port_2, port_2_flow=-snapshot.p4_port3_next_orifice_to_output_line_flow, ) self._write_orifice_ports( orifice=self.components.p4_port3_next_orifice, port_a_properties=snapshot.p4_port3_next_orifice_line_port_2, port_a_flow=snapshot.p4_port3_next_orifice_to_output_line_flow, port_b_properties=snapshot.p4_port3_next_orifice_output_line, port_b_flow=-snapshot.p4_port3_next_orifice_to_output_line_flow, ) self._write_connection_line( line=self.components.p4_port3_next_orifice_output_line, line_properties=snapshot.p4_port3_next_orifice_output_line, port_1_properties=snapshot.p4_port3_next_orifice_line_port_2, port_1_flow=snapshot.p4_port3_next_orifice_to_output_line_flow, port_2_properties=snapshot.p4_port3_next_orifice_output_line, port_2_flow=-snapshot.p4_port3_next_orifice_output_to_p4_flow, ) self._write_fixed_chamber_segment( spec=self.components.p4_port3_next_chamber_spec, chamber=self.components.p4_port3_next_chamber, chamber_properties=snapshot.p4_port3_next_chamber, inlet_line=self.components.p4_port3_next_chamber_inlet_line, inlet_line_properties=snapshot.p4_port3_next_chamber_inlet_line, inlet_node_properties=snapshot.p4_port3_next_orifice_line_port_1, inlet_node_to_line_flow=( snapshot.p4_port3_next_chamber_inlet_node_to_line_flow ), inlet_line_to_chamber_flow=( snapshot.p4_port3_next_chamber_inlet_line_to_chamber_flow ), inlet_orifice=self.components.p4_port3_next_chamber_inlet_orifice, outlet_line=self.components.p4_port3_next_chamber_outlet_line, outlet_line_properties=snapshot.p4_port3_next_chamber_outlet_line, outlet_node_properties=snapshot.p4_port3_remote_resistance_node_line_port_1, outlet_node_to_line_flow=( snapshot.p4_port3_next_chamber_outlet_node_to_line_flow ), outlet_line_to_chamber_flow=( snapshot.p4_port3_next_chamber_outlet_line_to_chamber_flow ), outlet_orifice=self.components.p4_port3_next_chamber_outlet_orifice, ) self._write_resistance_ports( resistance=self.components.p4_port3_next_orifice_resistance, port_1_properties=snapshot.p4_port3_next_resistance_node_line_port_1, port_1_flow=snapshot.p4_port3_next_resistance_node_to_next_flow, port_2_properties=snapshot.p4_port3_next_orifice_line_port_1, port_2_flow=-snapshot.p4_port3_next_resistance_node_to_next_flow, ) self._write_two_state_connection_line( line=self.components.p4_port3_next_resistance_node_line, port_1_properties=snapshot.p4_port3_next_resistance_node_line_port_1, port_1_flow=snapshot.p4_port3_next_resistance_node_to_line_flow, port_2_properties=snapshot.p4_port3_next_resistance_node_line_port_2, port_2_flow=-snapshot.p4_port3_next_resistance_to_output_line_flow, ) self._write_orifice_ports( orifice=self.components.p4_port3_next_resistance_orifice, port_a_properties=snapshot.p4_port3_next_resistance_node_line_port_2, port_a_flow=snapshot.p4_port3_next_resistance_to_output_line_flow, port_b_properties=snapshot.p4_port3_next_resistance_output_line, port_b_flow=-snapshot.p4_port3_next_resistance_to_output_line_flow, ) self._write_connection_line( line=self.components.p4_port3_next_resistance_output_line, line_properties=snapshot.p4_port3_next_resistance_output_line, port_1_properties=snapshot.p4_port3_next_resistance_node_line_port_2, port_1_flow=snapshot.p4_port3_next_resistance_to_output_line_flow, port_2_properties=snapshot.p4_port3_next_resistance_output_line, port_2_flow=-snapshot.p4_port3_next_resistance_output_to_p4_flow, ) self._write_fixed_chamber_segment( spec=self.components.p4_port3_next_resistance_chamber_spec, chamber=self.components.p4_port3_next_resistance_chamber, chamber_properties=snapshot.p4_port3_next_resistance_chamber, inlet_line=self.components.p4_port3_next_resistance_chamber_inlet_line, inlet_line_properties=( snapshot.p4_port3_next_resistance_chamber_inlet_line ), inlet_node_properties=snapshot.p4_port1_next_orifice_line_port_1, inlet_node_to_line_flow=( snapshot.p4_port3_next_resistance_chamber_inlet_node_to_line_flow ), inlet_line_to_chamber_flow=( snapshot.p4_port3_next_resistance_chamber_inlet_line_to_chamber_flow ), inlet_orifice=( self.components.p4_port3_next_resistance_chamber_inlet_orifice ), outlet_line=self.components.p4_port3_next_resistance_chamber_outlet_line, outlet_line_properties=( snapshot.p4_port3_next_resistance_chamber_outlet_line ), outlet_node_properties=snapshot.p4_port3_next_resistance_node_line_port_1, outlet_node_to_line_flow=( snapshot.p4_port3_next_resistance_chamber_outlet_node_to_line_flow ), outlet_line_to_chamber_flow=( snapshot.p4_port3_next_resistance_chamber_outlet_line_to_chamber_flow ), outlet_orifice=( self.components.p4_port3_next_resistance_chamber_outlet_orifice ), ) self._write_two_state_connection_line( line=self.components.p4_port3_remote_orifice_line, port_1_properties=snapshot.p4_port3_remote_orifice_line_port_1, port_1_flow=snapshot.p4_port3_remote_node_to_orifice_line_flow, port_2_properties=snapshot.p4_port3_remote_orifice_line_port_2, port_2_flow=-snapshot.p4_port3_remote_orifice_to_node_flow, ) self._write_resistance_ports( resistance=self.components.p4_port3_remote_orifice_resistance, port_1_properties=snapshot.p4_port3_remote_orifice_line_port_1, port_1_flow=snapshot.p4_port3_remote_node_to_resistance_flow, port_2_properties=snapshot.p4_port3_remote_resistance_node_line_port_1, port_2_flow=-snapshot.p4_port3_remote_node_to_resistance_flow, ) self._write_two_state_connection_line( line=self.components.p4_port3_remote_resistance_node_line, port_1_properties=snapshot.p4_port3_remote_resistance_node_line_port_1, port_1_flow=snapshot.p4_port3_remote_resistance_node_to_line_flow, port_2_properties=snapshot.p4_port3_remote_resistance_node_line_port_2, port_2_flow=-snapshot.p4_port3_remote_resistance_to_output_line_flow, ) self._write_orifice_ports( orifice=self.components.p4_port3_remote_resistance_orifice, port_a_properties=snapshot.p4_port3_remote_resistance_node_line_port_2, port_a_flow=snapshot.p4_port3_remote_resistance_to_output_line_flow, port_b_properties=snapshot.p4_port3_remote_resistance_output_line, port_b_flow=-snapshot.p4_port3_remote_resistance_to_output_line_flow, ) self._write_connection_line( line=self.components.p4_port3_remote_resistance_output_line, line_properties=snapshot.p4_port3_remote_resistance_output_line, port_1_properties=snapshot.p4_port3_remote_resistance_node_line_port_2, port_1_flow=snapshot.p4_port3_remote_resistance_to_output_line_flow, port_2_properties=snapshot.p4_port3_remote_resistance_output_line, port_2_flow=-snapshot.p4_port3_remote_resistance_output_to_p4_flow, ) self._write_orifice_ports( orifice=self.components.p4_port3_remote_orifice, port_a_properties=snapshot.p4_port3_remote_orifice_line_port_2, port_a_flow=snapshot.p4_port3_remote_orifice_to_node_flow, port_b_properties=snapshot.p4_port3_remote_primary_line, port_b_flow=-snapshot.p4_port3_remote_orifice_to_node_flow, ) def rhs(self, state_vector: list[float]) -> list[float]: snapshot = self.snapshot(state_vector) ( inlet_derivative, chamber_derivative, outlet_derivative, ) = self._fixed_chamber_segment_derivatives( spec=self.components.spec, chamber=self.components.volume, chamber_properties=snapshot.chamber, inlet_line=self.components.inlet_line, inlet_line_properties=snapshot.inlet_line, inlet_connected_properties=snapshot.p4_port3_remote_orifice_line_port_1, inlet_node_to_line_flow=snapshot.inlet_node_to_line_flow, inlet_line_to_chamber_flow=snapshot.inlet_line_to_chamber_flow, outlet_line=self.components.outlet_line, outlet_line_properties=snapshot.outlet_line, outlet_connected_properties=snapshot.node_line_port_1, outlet_node_to_line_flow=snapshot.outlet_node_to_line_flow, outlet_line_to_chamber_flow=snapshot.outlet_line_to_chamber_flow, ) if self.use_inlet_line_reference_rhs: inlet_derivative = self._pnl0001_reference_enthalpy_derivative( line=self.components.inlet_line, line_properties=snapshot.inlet_line, port_1_properties=snapshot.p4_port3_remote_orifice_line_port_1, port_1_flow=snapshot.inlet_node_to_line_flow, port_2_properties=snapshot.chamber, port_2_flow=-snapshot.inlet_line_to_chamber_flow, ) ( node_line_derivative_1, node_line_derivative_2, ) = self._two_state_connection_line_derivatives( line=self.components.node_line, port_1_properties=snapshot.node_line_port_1, port_1_flow=snapshot.node_to_pnl0003_flow, port_2_connected_properties=snapshot.p4_primary_line, port_2_flow=-snapshot.pnl0003_to_p4_flow, ) ( p4_primary_derivative, p4_primary_chamber_derivative, ) = self._primary_chamber_line_derivatives( line=self.components.p4_primary_line, line_properties=snapshot.p4_primary_line, chamber=self.components.p4_primary_chamber, chamber_properties=snapshot.p4_primary_chamber, chamber_to_line_flow=snapshot.p4_primary_chamber_to_line_flow, node_to_line_flow=snapshot.p4_node_to_primary_line_flow, ) p4_port1_derivative = self._connection_line_derivative( line=self.components.p4_port1_line, port_1_properties=snapshot.p4_primary_line, port_1_flow=snapshot.p4_to_port1_line_flow, port_2_properties=snapshot.p4_port1_remote_primary_line, port_2_flow=snapshot.p4_port1_remote_node_to_line_flow, ) ( p4_port1_remote_primary_derivative, p4_port1_remote_chamber_derivative, ) = self._primary_chamber_line_derivatives( line=self.components.p4_port1_remote_primary_line, line_properties=snapshot.p4_port1_remote_primary_line, chamber=self.components.p4_port1_remote_primary_chamber, chamber_properties=snapshot.p4_port1_remote_primary_chamber, chamber_to_line_flow=snapshot.p4_port1_remote_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port1_remote_node_to_primary_line_flow, ) p4_port1_remote_port1_derivative = self._connection_line_derivative( line=self.components.p4_port1_remote_port1_line, port_1_properties=snapshot.p4_port1_remote_primary_line, port_1_flow=snapshot.p4_port1_remote_to_port1_line_flow, port_2_properties=snapshot.p4_port1_far_primary_line, port_2_flow=snapshot.p4_port1_far_node_to_line_flow, ) ( p4_port1_far_primary_derivative, p4_port1_far_chamber_derivative, ) = self._primary_chamber_line_derivatives( line=self.components.p4_port1_far_primary_line, line_properties=snapshot.p4_port1_far_primary_line, chamber=self.components.p4_port1_far_primary_chamber, chamber_properties=snapshot.p4_port1_far_primary_chamber, chamber_to_line_flow=snapshot.p4_port1_far_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port1_far_node_to_primary_line_flow, ) p4_port1_far_port1_derivative = self._connection_line_derivative( line=self.components.p4_port1_far_port1_line, port_1_properties=snapshot.p4_port1_far_primary_line, port_1_flow=snapshot.p4_port1_far_to_next_line_flow, port_2_properties=snapshot.p4_port1_next_primary_line, port_2_flow=snapshot.p4_port1_next_node_to_line_flow, ) ( p4_port1_next_primary_derivative, p4_port1_next_chamber_derivative, ) = self._primary_chamber_line_derivatives( line=self.components.p4_port1_next_primary_line, line_properties=snapshot.p4_port1_next_primary_line, chamber=self.components.p4_port1_next_primary_chamber, chamber_properties=snapshot.p4_port1_next_primary_chamber, chamber_to_line_flow=snapshot.p4_port1_next_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port1_next_node_to_primary_line_flow, ) p4_port1_next_port1_derivative = self._connection_line_derivative( line=self.components.p4_port1_next_port1_line, port_1_properties=snapshot.p4_port1_next_primary_line, port_1_flow=snapshot.p4_port1_next_to_bridge_line_flow, port_2_properties=snapshot.p4_bridge_primary_line, port_2_flow=snapshot.p4_bridge_to_port1_next_line_flow, ) ( p4_bridge_primary_derivative, p4_bridge_chamber_derivative, ) = self._primary_chamber_line_derivatives( line=self.components.p4_bridge_primary_line, line_properties=snapshot.p4_bridge_primary_line, chamber=self.components.p4_bridge_primary_chamber, chamber_properties=snapshot.p4_bridge_primary_chamber, chamber_to_line_flow=snapshot.p4_bridge_chamber_to_line_flow, node_to_line_flow=snapshot.p4_bridge_node_to_primary_line_flow, ) ( p4_port1_remote_orifice_derivative_1, p4_port1_remote_orifice_derivative_2, ) = self._two_state_connection_line_derivatives( line=self.components.p4_port1_remote_orifice_line, port_1_properties=snapshot.p4_port1_remote_orifice_line_port_1, port_1_flow=snapshot.p4_port1_remote_node_to_orifice_line_flow, port_2_connected_properties=snapshot.p4_port1_remote_primary_line, port_2_flow=-snapshot.p4_port1_remote_orifice_to_node_flow, ) p4_port3_derivative = self._connection_line_derivative( line=self.components.p4_port3_line, port_1_properties=snapshot.p4_port3_remote_primary_line, port_1_flow=snapshot.p4_port3_remote_node_to_line_flow, port_2_properties=snapshot.p4_primary_line, port_2_flow=snapshot.p4_to_port3_line_flow, ) p4_port3_remote_node_connected_h = self._p4_node_port_2_connected_h( balance=snapshot.p4_port3_remote_balance, fallback_h=snapshot.p4_port3_remote_primary_line.h, ) ( p4_port3_remote_primary_derivative, p4_port3_remote_chamber_derivative, ) = self._primary_chamber_line_derivatives( line=self.components.p4_port3_remote_primary_line, line_properties=snapshot.p4_port3_remote_primary_line, chamber=self.components.p4_port3_remote_primary_chamber, chamber_properties=snapshot.p4_port3_remote_primary_chamber, chamber_to_line_flow=snapshot.p4_port3_remote_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port3_remote_node_to_primary_line_flow, node_connected_h=p4_port3_remote_node_connected_h, ) if self.use_p4_port3_remote_primary_reference_rhs: p4_port3_remote_primary_derivative = ( self._pnl0001_reference_enthalpy_derivative( line=self.components.p4_port3_remote_primary_line, line_properties=snapshot.p4_port3_remote_primary_line, port_1_properties=snapshot.p4_port3_remote_primary_chamber, port_1_flow=snapshot.p4_port3_remote_chamber_to_line_flow, port_2_properties=snapshot.p4_port3_remote_primary_line, port_2_flow=snapshot.p4_port3_remote_node_to_primary_line_flow, port_2_connected_reference_h=( self._p4_port3_remote_port_2_reference_h( snapshot=snapshot ) ), ) ) p4_port3_remote_port3_derivative = self._connection_line_derivative( line=self.components.p4_port3_remote_port3_line, port_1_properties=snapshot.p4_port3_far_primary_line, port_1_flow=snapshot.p4_port3_far_node_to_line_flow, port_2_properties=snapshot.p4_port3_remote_primary_line, port_2_flow=snapshot.p4_port3_remote_to_port3_line_flow, ) ( p4_port3_far_primary_derivative, p4_port3_far_chamber_derivative, ) = self._primary_chamber_line_derivatives( line=self.components.p4_port3_far_primary_line, line_properties=snapshot.p4_port3_far_primary_line, chamber=self.components.p4_port3_far_primary_chamber, chamber_properties=snapshot.p4_port3_far_primary_chamber, chamber_to_line_flow=snapshot.p4_port3_far_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port3_far_node_to_primary_line_flow, ) p4_port3_far_port3_derivative = self._connection_line_derivative( line=self.components.p4_port3_far_port3_line, port_1_properties=snapshot.p4_port3_next_primary_line, port_1_flow=snapshot.p4_port3_next_node_to_line_flow, port_2_properties=snapshot.p4_port3_far_primary_line, port_2_flow=snapshot.p4_port3_far_to_next_line_flow, ) ( p4_port3_next_primary_derivative, p4_port3_next_chamber_derivative, ) = self._primary_chamber_line_derivatives( line=self.components.p4_port3_next_primary_line, line_properties=snapshot.p4_port3_next_primary_line, chamber=self.components.p4_port3_next_primary_chamber, chamber_properties=snapshot.p4_port3_next_primary_chamber, chamber_to_line_flow=snapshot.p4_port3_next_chamber_to_line_flow, node_to_line_flow=snapshot.p4_port3_next_node_to_primary_line_flow, ) p4_port3_next_port3_derivative = self._connection_line_derivative( line=self.components.p4_port3_next_port3_line, port_1_properties=snapshot.p4_bridge_primary_line, port_1_flow=snapshot.p4_bridge_to_port3_next_line_flow, port_2_properties=snapshot.p4_port3_next_primary_line, port_2_flow=snapshot.p4_port3_next_to_bridge_line_flow, ) ( p4_port3_remote_resistance_derivative_1, p4_port3_remote_resistance_derivative_2, ) = self._two_state_connection_line_derivatives( line=self.components.p4_port3_remote_resistance_node_line, port_1_properties=snapshot.p4_port3_remote_resistance_node_line_port_1, port_1_flow=snapshot.p4_port3_remote_resistance_node_to_line_flow, port_2_connected_properties=snapshot.p4_port3_remote_resistance_output_line, port_2_flow=-snapshot.p4_port3_remote_resistance_to_output_line_flow, ) p4_port3_remote_resistance_output_derivative = self._connection_line_derivative( line=self.components.p4_port3_remote_resistance_output_line, port_1_properties=snapshot.p4_port3_remote_resistance_node_line_port_2, port_1_flow=snapshot.p4_port3_remote_resistance_to_output_line_flow, port_2_properties=snapshot.p4_port3_far_primary_line, port_2_flow=-snapshot.p4_port3_remote_resistance_output_to_p4_flow, ) ( p4_port3_remote_orifice_derivative_1, p4_port3_remote_orifice_derivative_2, ) = self._two_state_connection_line_derivatives( line=self.components.p4_port3_remote_orifice_line, port_1_properties=snapshot.p4_port3_remote_orifice_line_port_1, port_1_flow=snapshot.p4_port3_remote_node_to_orifice_line_flow, port_2_connected_properties=snapshot.p4_port3_remote_primary_line, port_2_flow=-snapshot.p4_port3_remote_orifice_to_node_flow, port_1_connected_h=self._pn3_node_port_2_connected_h( balance=snapshot.p4_port3_remote_orifice_node_balance, fallback_h=snapshot.p4_port3_remote_orifice_line_port_1.h, ), ) ( p4_port3_next_orifice_derivative_1, p4_port3_next_orifice_derivative_2, ) = self._two_state_connection_line_derivatives( line=self.components.p4_port3_next_orifice_line, port_1_properties=snapshot.p4_port3_next_orifice_line_port_1, port_1_flow=snapshot.p4_port3_next_orifice_node_to_line_flow, port_2_connected_properties=snapshot.p4_port3_next_orifice_output_line, port_2_flow=-snapshot.p4_port3_next_orifice_to_output_line_flow, ) p4_port3_next_orifice_output_derivative = self._connection_line_derivative( line=self.components.p4_port3_next_orifice_output_line, port_1_properties=snapshot.p4_port3_next_orifice_line_port_2, port_1_flow=snapshot.p4_port3_next_orifice_to_output_line_flow, port_2_properties=snapshot.p4_port3_next_primary_line, port_2_flow=-snapshot.p4_port3_next_orifice_output_to_p4_flow, ) ( p4_port3_next_chamber_inlet_derivative, p4_port3_next_fixed_chamber_derivative, p4_port3_next_chamber_outlet_derivative, ) = self._fixed_chamber_segment_derivatives( spec=self.components.p4_port3_next_chamber_spec, chamber=self.components.p4_port3_next_chamber, chamber_properties=snapshot.p4_port3_next_chamber, inlet_line=self.components.p4_port3_next_chamber_inlet_line, inlet_line_properties=snapshot.p4_port3_next_chamber_inlet_line, inlet_connected_properties=snapshot.p4_port3_next_orifice_line_port_1, inlet_node_to_line_flow=( snapshot.p4_port3_next_chamber_inlet_node_to_line_flow ), inlet_line_to_chamber_flow=( snapshot.p4_port3_next_chamber_inlet_line_to_chamber_flow ), outlet_line=self.components.p4_port3_next_chamber_outlet_line, outlet_line_properties=snapshot.p4_port3_next_chamber_outlet_line, outlet_connected_properties=( snapshot.p4_port3_remote_resistance_node_line_port_1 ), outlet_node_to_line_flow=( snapshot.p4_port3_next_chamber_outlet_node_to_line_flow ), outlet_line_to_chamber_flow=( snapshot.p4_port3_next_chamber_outlet_line_to_chamber_flow ), ) ( p4_port3_next_resistance_derivative_1, p4_port3_next_resistance_derivative_2, ) = self._two_state_connection_line_derivatives( line=self.components.p4_port3_next_resistance_node_line, port_1_properties=snapshot.p4_port3_next_resistance_node_line_port_1, port_1_flow=snapshot.p4_port3_next_resistance_node_to_line_flow, port_2_connected_properties=snapshot.p4_port3_next_resistance_output_line, port_2_flow=-snapshot.p4_port3_next_resistance_to_output_line_flow, ) p4_port3_next_resistance_output_derivative = self._connection_line_derivative( line=self.components.p4_port3_next_resistance_output_line, port_1_properties=snapshot.p4_port3_next_resistance_node_line_port_2, port_1_flow=snapshot.p4_port3_next_resistance_to_output_line_flow, port_2_properties=snapshot.p4_bridge_primary_line, port_2_flow=-snapshot.p4_port3_next_resistance_output_to_p4_flow, ) ( p4_port3_next_resistance_chamber_inlet_derivative, p4_port3_next_resistance_fixed_chamber_derivative, p4_port3_next_resistance_chamber_outlet_derivative, ) = self._fixed_chamber_segment_derivatives( spec=self.components.p4_port3_next_resistance_chamber_spec, chamber=self.components.p4_port3_next_resistance_chamber, chamber_properties=snapshot.p4_port3_next_resistance_chamber, inlet_line=self.components.p4_port3_next_resistance_chamber_inlet_line, inlet_line_properties=( snapshot.p4_port3_next_resistance_chamber_inlet_line ), inlet_connected_properties=snapshot.p4_port1_next_orifice_line_port_1, inlet_node_to_line_flow=( snapshot.p4_port3_next_resistance_chamber_inlet_node_to_line_flow ), inlet_line_to_chamber_flow=( snapshot.p4_port3_next_resistance_chamber_inlet_line_to_chamber_flow ), outlet_line=self.components.p4_port3_next_resistance_chamber_outlet_line, outlet_line_properties=( snapshot.p4_port3_next_resistance_chamber_outlet_line ), outlet_connected_properties=snapshot.p4_port3_next_resistance_node_line_port_1, outlet_node_to_line_flow=( snapshot.p4_port3_next_resistance_chamber_outlet_node_to_line_flow ), outlet_line_to_chamber_flow=( snapshot.p4_port3_next_resistance_chamber_outlet_line_to_chamber_flow ), ) ( p4_port1_next_orifice_derivative_1, p4_port1_next_orifice_derivative_2, ) = self._two_state_connection_line_derivatives( line=self.components.p4_port1_next_orifice_line, port_1_properties=snapshot.p4_port1_next_orifice_line_port_1, port_1_flow=snapshot.p4_port1_next_orifice_node_to_line_flow, port_2_connected_properties=snapshot.p4_port1_next_orifice_output_line, port_2_flow=-snapshot.p4_port1_next_orifice_to_output_line_flow, ) p4_port1_next_orifice_output_derivative = self._connection_line_derivative( line=self.components.p4_port1_next_orifice_output_line, port_1_properties=snapshot.p4_port1_next_primary_line, port_1_flow=snapshot.p4_port1_next_orifice_p4_to_output_line_flow, port_2_properties=snapshot.p4_port1_next_orifice_line_port_2, port_2_flow=snapshot.p4_port1_next_orifice_to_output_line_flow, ) ( p4_port1_next_orifice_resistance_derivative_1, p4_port1_next_orifice_resistance_derivative_2, ) = self._two_state_connection_line_derivatives( line=self.components.p4_port1_next_orifice_resistance_line, port_1_properties=snapshot.p4_port1_next_orifice_resistance_line_port_1, port_1_flow=snapshot.p4_port1_next_orifice_resistance_node_to_line_flow, port_2_connected_properties=snapshot.p4_port1_far_primary_line, port_2_flow=-snapshot.p4_port1_next_orifice_resistance_to_p4_flow, ) ( p4_port1_next_orifice_resistance_chamber_inlet_derivative, p4_port1_next_orifice_resistance_fixed_chamber_derivative, p4_port1_next_orifice_resistance_chamber_outlet_derivative, ) = self._fixed_chamber_segment_derivatives( spec=self.components.p4_port1_next_orifice_resistance_chamber_spec, chamber=self.components.p4_port1_next_orifice_resistance_chamber, chamber_properties=snapshot.p4_port1_next_orifice_resistance_chamber, inlet_line=( self.components.p4_port1_next_orifice_resistance_chamber_inlet_line ), inlet_line_properties=( snapshot.p4_port1_next_orifice_resistance_chamber_inlet_line ), inlet_connected_properties=snapshot.p4_port1_remote_orifice_line_port_1, inlet_node_to_line_flow=( snapshot.p4_port1_next_orifice_resistance_chamber_inlet_node_to_line_flow ), inlet_line_to_chamber_flow=( snapshot.p4_port1_next_orifice_resistance_chamber_inlet_line_to_chamber_flow ), outlet_line=( self.components.p4_port1_next_orifice_resistance_chamber_outlet_line ), outlet_line_properties=( snapshot.p4_port1_next_orifice_resistance_chamber_outlet_line ), outlet_connected_properties=( snapshot.p4_port1_next_orifice_resistance_line_port_1 ), outlet_node_to_line_flow=( snapshot.p4_port1_next_orifice_resistance_chamber_outlet_node_to_line_flow ), outlet_line_to_chamber_flow=( snapshot.p4_port1_next_orifice_resistance_chamber_outlet_line_to_chamber_flow ), ) return [ *inlet_derivative.as_vector(), *chamber_derivative.as_vector(), *outlet_derivative.as_vector(), *node_line_derivative_1.as_vector(), *node_line_derivative_2.as_vector(), *p4_primary_derivative.as_vector(), *p4_primary_chamber_derivative.as_vector(), *p4_port1_derivative.as_vector(), *p4_port1_remote_primary_derivative.as_vector(), *p4_port1_remote_chamber_derivative.as_vector(), *p4_port1_remote_port1_derivative.as_vector(), *p4_port1_far_primary_derivative.as_vector(), *p4_port1_far_chamber_derivative.as_vector(), *p4_port1_far_port1_derivative.as_vector(), *p4_port1_next_primary_derivative.as_vector(), *p4_port1_next_chamber_derivative.as_vector(), *p4_port1_next_port1_derivative.as_vector(), *p4_bridge_primary_derivative.as_vector(), *p4_bridge_chamber_derivative.as_vector(), *p4_port1_remote_orifice_derivative_1.as_vector(), *p4_port1_remote_orifice_derivative_2.as_vector(), *p4_port3_derivative.as_vector(), *p4_port3_remote_primary_derivative.as_vector(), *p4_port3_remote_chamber_derivative.as_vector(), *p4_port3_remote_port3_derivative.as_vector(), *p4_port3_far_primary_derivative.as_vector(), *p4_port3_far_chamber_derivative.as_vector(), *p4_port3_far_port3_derivative.as_vector(), *p4_port3_next_primary_derivative.as_vector(), *p4_port3_next_chamber_derivative.as_vector(), *p4_port3_next_port3_derivative.as_vector(), *p4_port3_remote_resistance_derivative_1.as_vector(), *p4_port3_remote_resistance_derivative_2.as_vector(), *p4_port3_remote_resistance_output_derivative.as_vector(), *p4_port3_remote_orifice_derivative_1.as_vector(), *p4_port3_remote_orifice_derivative_2.as_vector(), *p4_port3_next_orifice_derivative_1.as_vector(), *p4_port3_next_orifice_derivative_2.as_vector(), *p4_port3_next_orifice_output_derivative.as_vector(), *p4_port3_next_chamber_inlet_derivative.as_vector(), *p4_port3_next_fixed_chamber_derivative.as_vector(), *p4_port3_next_chamber_outlet_derivative.as_vector(), *p4_port3_next_resistance_derivative_1.as_vector(), *p4_port3_next_resistance_derivative_2.as_vector(), *p4_port3_next_resistance_output_derivative.as_vector(), *p4_port3_next_resistance_chamber_inlet_derivative.as_vector(), *p4_port3_next_resistance_fixed_chamber_derivative.as_vector(), *p4_port3_next_resistance_chamber_outlet_derivative.as_vector(), *p4_port1_next_orifice_derivative_1.as_vector(), *p4_port1_next_orifice_derivative_2.as_vector(), *p4_port1_next_orifice_output_derivative.as_vector(), *p4_port1_next_orifice_resistance_derivative_1.as_vector(), *p4_port1_next_orifice_resistance_derivative_2.as_vector(), *p4_port1_next_orifice_resistance_chamber_inlet_derivative.as_vector(), *p4_port1_next_orifice_resistance_fixed_chamber_derivative.as_vector(), *p4_port1_next_orifice_resistance_chamber_outlet_derivative.as_vector(), ] @dataclass(frozen=True) class TestMqlPneumaticBranchComponents: name: str upstream_volume: AmesimPneumaticVolume orifice: AmesimPneumaticOrifice downstream_volume: AmesimPneumaticVolume spec: TestMqlPneumaticBranchSpec | None = None @dataclass(frozen=True) class TestMqlPneumaticBranchState: name: str upstream: ThermodynamicProperties downstream: ThermodynamicProperties flow: float upstream_inlet_h: float downstream_inlet_h: float @dataclass(frozen=True) class TestMqlPneumaticSnapshot: branch: TestMqlPneumaticBranchState @property def flow(self) -> float: return self.branch.flow @property def upstream(self) -> ThermodynamicProperties: return self.branch.upstream @property def downstream(self) -> ThermodynamicProperties: return self.branch.downstream class TestMqlPneumaticClosure: """Minimal test_mql pneumatic closure following the existing Testmodel pattern. The canonical branch flow is positive from ``upstream_volume`` through the orifice port_a/port_b into ``downstream_volume``. Port ``m_flow`` values are written with Modelica-style signs: positive means flow into that component. """ def __init__( self, *, components: TestMqlPneumaticBranchComponents, initial_state_vector: Callable[[], list[float]], apply_state_vector: Callable[[list[float]], None], ) -> None: self.components = components self._initial_state_vector = initial_state_vector self._apply_state_vector = apply_state_vector def initial_state_vector(self) -> list[float]: return self._initial_state_vector() def apply_state_vector(self, values: list[float]) -> None: self._apply_state_vector(values) def snapshot( self, state_vector: list[float] | None = None, ) -> TestMqlPneumaticSnapshot: if state_vector is not None: self._apply_state_vector(state_vector) upstream = self.components.upstream_volume.properties() downstream = self.components.downstream_volume.properties() flow = self._solve_branch_flow(upstream, downstream) upstream_inlet_h = self.components.upstream_volume.connection_inlet_enthalpy( port_m_flow=-flow, connected_h=downstream.h, internal_h=upstream.h, ) downstream_inlet_h = self.components.downstream_volume.connection_inlet_enthalpy( port_m_flow=flow, connected_h=upstream.h, internal_h=downstream.h, ) branch = TestMqlPneumaticBranchState( name=self.components.name, upstream=upstream, downstream=downstream, flow=flow, upstream_inlet_h=upstream_inlet_h, downstream_inlet_h=downstream_inlet_h, ) self._write_port_states(branch) return TestMqlPneumaticSnapshot(branch=branch) def _solve_branch_flow( self, upstream: ThermodynamicProperties, downstream: ThermodynamicProperties, ) -> float: upstream_temperature = upstream.T if upstream.p >= downstream.p else downstream.T return self.components.orifice.mass_flow( upstream.p, downstream.p, upstream_temperature, ) def _write_port_states(self, branch: TestMqlPneumaticBranchState) -> None: upstream_volume = self.components.upstream_volume downstream_volume = self.components.downstream_volume orifice = self.components.orifice upstream_volume.port_a.p = branch.upstream.p upstream_volume.port_a.m_flow = -branch.flow upstream_volume.port_a.h_outflow = branch.upstream.h orifice.port_a.p = branch.upstream.p orifice.port_a.m_flow = branch.flow orifice.port_a.h_outflow = branch.upstream.h orifice.port_b.p = branch.downstream.p orifice.port_b.m_flow = -branch.flow orifice.port_b.h_outflow = branch.downstream.h downstream_volume.port_a.p = branch.downstream.p downstream_volume.port_a.m_flow = branch.flow downstream_volume.port_a.h_outflow = branch.downstream.h def branch_derivatives( self, snapshot: TestMqlPneumaticSnapshot, ) -> tuple[VolumeState, VolumeState]: flow = snapshot.flow upstream_derivative = self.components.upstream_volume.derivatives( inlet_h=snapshot.branch.upstream_inlet_h, m_flow=-flow, ) downstream_derivative = self.components.downstream_volume.derivatives( inlet_h=snapshot.branch.downstream_inlet_h, m_flow=flow, ) return upstream_derivative, downstream_derivative def rhs(self, state_vector: list[float]) -> list[float]: snapshot = self.snapshot(state_vector) upstream_derivative, downstream_derivative = self.branch_derivatives(snapshot) return [ *upstream_derivative.as_vector(), *downstream_derivative.as_vector(), ] class TestMqlPneumaticChamberSegmentClosure: """Boundary-reduced fixed chamber segment discovered from AMESim topology. The two PNL0001 lines remain prescribed boundary interfaces in this first closure. Their aliases are retained in the spec so line dynamics can be inserted later without rediscovering the component path. """ def __init__( self, *, components: TestMqlPneumaticChamberSegmentComponents, inlet_boundary: TestMqlPneumaticBoundaryCondition, outlet_boundary: TestMqlPneumaticBoundaryCondition, ) -> None: self.components = components self.inlet_boundary = inlet_boundary self.outlet_boundary = outlet_boundary def initial_state_vector(self) -> list[float]: return self.components.volume.get_state_vector() def apply_state_vector(self, values: list[float]) -> None: if len(values) != 2: raise ValueError("single-chamber segment state vector requires two values") self.components.volume.set_state_vector(values) def snapshot( self, state_vector: list[float] | None = None, ) -> TestMqlPneumaticChamberSegmentSnapshot: if state_vector is not None: self.apply_state_vector(state_vector) chamber = self.components.volume.properties() inlet_boundary = self.inlet_boundary.properties(self.components.volume.gas) outlet_boundary = self.outlet_boundary.properties(self.components.volume.gas) inlet_temperature = ( inlet_boundary.T if inlet_boundary.p >= chamber.p else chamber.T ) outlet_temperature = ( chamber.T if chamber.p >= outlet_boundary.p else outlet_boundary.T ) inlet_flow = self.components.inlet_orifice.mass_flow( inlet_boundary.p, chamber.p, inlet_temperature, ) outlet_flow = self.components.outlet_orifice.mass_flow( chamber.p, outlet_boundary.p, outlet_temperature, ) snapshot = TestMqlPneumaticChamberSegmentSnapshot( chamber=chamber, inlet_boundary=inlet_boundary, outlet_boundary=outlet_boundary, inlet_flow=inlet_flow, outlet_flow=outlet_flow, ) self._write_port_states(snapshot) return snapshot @staticmethod def _port( component: AmesimPneumaticVolume | AmesimPneumaticOrifice, port_name: str, ) -> PortState: if port_name == "port_1": return component.port_a if port_name == "port_2": return component.port_b raise ValueError(f"unsupported pneumatic port: {port_name}") def _write_port_states( self, snapshot: TestMqlPneumaticChamberSegmentSnapshot, ) -> None: spec = self.components.spec chamber = self.components.volume inlet_orifice = self.components.inlet_orifice outlet_orifice = self.components.outlet_orifice inlet_boundary_port = self._port( inlet_orifice, spec.inlet_orifice_boundary_port, ) inlet_volume_port = self._port(inlet_orifice, spec.inlet_orifice_volume_port) inlet_boundary_port.p = snapshot.inlet_boundary.p inlet_boundary_port.m_flow = snapshot.inlet_flow inlet_boundary_port.h_outflow = snapshot.inlet_boundary.h inlet_volume_port.p = snapshot.chamber.p inlet_volume_port.m_flow = -snapshot.inlet_flow inlet_volume_port.h_outflow = snapshot.chamber.h chamber_inlet_port = self._port(chamber, spec.volume_inlet_port) chamber_outlet_port = self._port(chamber, spec.volume_outlet_port) chamber_inlet_port.m_flow = snapshot.inlet_flow chamber_outlet_port.m_flow = -snapshot.outlet_flow outlet_volume_port = self._port( outlet_orifice, spec.outlet_orifice_volume_port, ) outlet_boundary_port = self._port( outlet_orifice, spec.outlet_orifice_boundary_port, ) outlet_volume_port.p = snapshot.chamber.p outlet_volume_port.m_flow = snapshot.outlet_flow outlet_volume_port.h_outflow = snapshot.chamber.h outlet_boundary_port.p = snapshot.outlet_boundary.p outlet_boundary_port.m_flow = -snapshot.outlet_flow outlet_boundary_port.h_outflow = snapshot.outlet_boundary.h def rhs(self, state_vector: list[float]) -> list[float]: snapshot = self.snapshot(state_vector) spec = self.components.spec chamber = self.components.volume derivative = chamber.derivatives_from_two_connections( port_a_m_flow=self._port(chamber, "port_1").m_flow, connected_h_a=( snapshot.inlet_boundary.h if spec.volume_inlet_port == "port_1" else snapshot.outlet_boundary.h ), port_b_m_flow=self._port(chamber, "port_2").m_flow, connected_h_b=( snapshot.inlet_boundary.h if spec.volume_inlet_port == "port_2" else snapshot.outlet_boundary.h ), internal_h=snapshot.chamber.h, ) return derivative.as_vector() class TestMqlPnl0001ChamberSegmentClosure: """Fixed chamber segment with the topology-derived inlet PNL0001 state. The inlet line has a closed causal boundary here: port-1 pressure and temperature come from the PN3 node boundary, while port-2 flow comes from the fixed orifice. The outlet line remains a boundary until its three-line PN3 node balance is assembled. """ def __init__( self, *, components: TestMqlPnl0001ChamberSegmentComponents, inlet_node: TestMqlPneumaticBoundaryCondition, outlet_boundary: TestMqlPneumaticBoundaryCondition, ) -> None: self.components = components self.inlet_node = inlet_node self.outlet_boundary = outlet_boundary def initial_state_vector(self) -> list[float]: return [ *self.components.inlet_line.get_state_vector(), *self.components.volume.get_state_vector(), ] def apply_state_vector(self, values: list[float]) -> None: if len(values) != 4: raise ValueError("PNL0001/chamber segment state vector requires four values") self.components.inlet_line.set_state_vector(values[:2]) self.components.volume.set_state_vector(values[2:]) def snapshot( self, state_vector: list[float] | None = None, ) -> TestMqlPnl0001ChamberSegmentSnapshot: if state_vector is not None: self.apply_state_vector(state_vector) line = self.components.inlet_line.properties() chamber = self.components.volume.properties() inlet_node = self.inlet_node.properties(self.components.inlet_line.gas) outlet_boundary = self.outlet_boundary.properties(self.components.volume.gas) node_to_line_flow = self.components.inlet_line.resistance_mass_flow( port_1_pressure_pa=inlet_node.p, port_1_temperature_k=inlet_node.T, ) inlet_temperature = line.T if line.p >= chamber.p else chamber.T line_to_chamber_flow = self.components.inlet_orifice.mass_flow( line.p, chamber.p, inlet_temperature, ) outlet_temperature = ( chamber.T if chamber.p >= outlet_boundary.p else outlet_boundary.T ) outlet_flow = self.components.outlet_orifice.mass_flow( chamber.p, outlet_boundary.p, outlet_temperature, ) snapshot = TestMqlPnl0001ChamberSegmentSnapshot( inlet_line=line, chamber=chamber, inlet_node=inlet_node, outlet_boundary=outlet_boundary, node_to_line_flow=node_to_line_flow, line_to_chamber_flow=line_to_chamber_flow, outlet_flow=outlet_flow, ) self._write_port_states(snapshot) return snapshot @staticmethod def _line_to_p4_flow( *, line: ThermodynamicProperties, p4_boundary: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> float: upstream_temperature = line.T if line.p >= p4_boundary.p else p4_boundary.T return orifice.mass_flow(line.p, p4_boundary.p, upstream_temperature) @staticmethod def _port( component: AmesimPneumaticVolume | AmesimPneumaticOrifice, port_name: str, ) -> PortState: return TestMqlPneumaticChamberSegmentClosure._port(component, port_name) def _write_port_states( self, snapshot: TestMqlPnl0001ChamberSegmentSnapshot, ) -> None: spec = self.components.spec line = self.components.inlet_line chamber = self.components.volume inlet_orifice = self.components.inlet_orifice outlet_orifice = self.components.outlet_orifice line.port_1.p = snapshot.inlet_node.p line.port_1.m_flow = snapshot.node_to_line_flow line.port_1.h_outflow = snapshot.inlet_line.h line.port_2.p = snapshot.inlet_line.p line.port_2.m_flow = -snapshot.line_to_chamber_flow inlet_boundary_port = self._port( inlet_orifice, spec.inlet_orifice_boundary_port, ) inlet_volume_port = self._port(inlet_orifice, spec.inlet_orifice_volume_port) inlet_boundary_port.p = snapshot.inlet_line.p inlet_boundary_port.m_flow = snapshot.line_to_chamber_flow inlet_boundary_port.h_outflow = snapshot.inlet_line.h inlet_volume_port.p = snapshot.chamber.p inlet_volume_port.m_flow = -snapshot.line_to_chamber_flow inlet_volume_port.h_outflow = snapshot.chamber.h chamber_inlet_port = self._port(chamber, spec.volume_inlet_port) chamber_outlet_port = self._port(chamber, spec.volume_outlet_port) chamber_inlet_port.m_flow = snapshot.line_to_chamber_flow chamber_outlet_port.m_flow = -snapshot.outlet_flow outlet_volume_port = self._port( outlet_orifice, spec.outlet_orifice_volume_port, ) outlet_boundary_port = self._port( outlet_orifice, spec.outlet_orifice_boundary_port, ) outlet_volume_port.p = snapshot.chamber.p outlet_volume_port.m_flow = snapshot.outlet_flow outlet_volume_port.h_outflow = snapshot.chamber.h outlet_boundary_port.p = snapshot.outlet_boundary.p outlet_boundary_port.m_flow = -snapshot.outlet_flow outlet_boundary_port.h_outflow = snapshot.outlet_boundary.h def rhs(self, state_vector: list[float]) -> list[float]: snapshot = self.snapshot(state_vector) line_derivative = self.components.inlet_line.derivatives_from_connections( port_1_m_flow=snapshot.node_to_line_flow, connected_h_1=snapshot.inlet_node.h, port_2_m_flow=-snapshot.line_to_chamber_flow, connected_h_2=snapshot.chamber.h, ) chamber = self.components.volume spec = self.components.spec chamber_derivative = chamber.derivatives_from_two_connections( port_a_m_flow=self._port(chamber, "port_1").m_flow, connected_h_a=( snapshot.inlet_line.h if spec.volume_inlet_port == "port_1" else snapshot.outlet_boundary.h ), port_b_m_flow=self._port(chamber, "port_2").m_flow, connected_h_b=( snapshot.inlet_line.h if spec.volume_inlet_port == "port_2" else snapshot.outlet_boundary.h ), internal_h=snapshot.chamber.h, ) return [*line_derivative.as_vector(), *chamber_derivative.as_vector()] class TestMqlPnl0001PairChamberSegmentClosure: """Six-state fixed chamber segment with both PNL0001 compliance states. Generated C shows that both line instances receive ``t1/p1`` from their PN3 nodes and send their explicit ``t2/p2`` states to the fixed orifices. The reduced closure therefore prescribes node pressure/temperature at both resistive port-1 boundaries while keeping both line storage states native. """ def __init__( self, *, components: TestMqlPnl0001PairChamberSegmentComponents, inlet_node: TestMqlPneumaticBoundaryCondition, outlet_node: TestMqlPneumaticBoundaryCondition, ) -> None: self.components = components self.inlet_node = inlet_node self.outlet_node = outlet_node def initial_state_vector(self) -> list[float]: return [ *self.components.inlet_line.get_state_vector(), *self.components.volume.get_state_vector(), *self.components.outlet_line.get_state_vector(), ] def apply_state_vector(self, values: list[float]) -> None: if len(values) != 6: raise ValueError("PNL0001 pair/chamber state vector requires six values") self.components.inlet_line.set_state_vector(values[:2]) self.components.volume.set_state_vector(values[2:4]) self.components.outlet_line.set_state_vector(values[4:]) def snapshot( self, state_vector: list[float] | None = None, ) -> TestMqlPnl0001PairChamberSegmentSnapshot: if state_vector is not None: self.apply_state_vector(state_vector) inlet_line = self.components.inlet_line.properties() chamber = self.components.volume.properties() outlet_line = self.components.outlet_line.properties() inlet_node = self.inlet_node.properties(self.components.inlet_line.gas) outlet_node = self.outlet_node.properties(self.components.outlet_line.gas) inlet_node_to_line_flow = self.components.inlet_line.resistance_mass_flow( port_1_pressure_pa=inlet_node.p, port_1_temperature_k=inlet_node.T, ) outlet_node_to_line_flow = self.components.outlet_line.resistance_mass_flow( port_1_pressure_pa=outlet_node.p, port_1_temperature_k=outlet_node.T, ) inlet_line_to_chamber_flow = self._line_to_chamber_flow( line=inlet_line, chamber=chamber, orifice=self.components.inlet_orifice, ) outlet_line_to_chamber_flow = self._line_to_chamber_flow( line=outlet_line, chamber=chamber, orifice=self.components.outlet_orifice, ) snapshot = TestMqlPnl0001PairChamberSegmentSnapshot( inlet_line=inlet_line, chamber=chamber, outlet_line=outlet_line, inlet_node=inlet_node, outlet_node=outlet_node, inlet_node_to_line_flow=inlet_node_to_line_flow, inlet_line_to_chamber_flow=inlet_line_to_chamber_flow, outlet_node_to_line_flow=outlet_node_to_line_flow, outlet_line_to_chamber_flow=outlet_line_to_chamber_flow, ) self._write_port_states(snapshot) return snapshot @staticmethod def _line_to_chamber_flow( *, line: ThermodynamicProperties, chamber: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> float: upstream_temperature = line.T if line.p >= chamber.p else chamber.T return orifice.mass_flow(line.p, chamber.p, upstream_temperature) @staticmethod def _line_to_p4_flow( *, line: ThermodynamicProperties, p4_boundary: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> float: upstream_temperature = line.T if line.p >= p4_boundary.p else p4_boundary.T return orifice.mass_flow(line.p, p4_boundary.p, upstream_temperature) @staticmethod def _port( component: AmesimPneumaticVolume | AmesimPneumaticOrifice, port_name: str, ) -> PortState: return TestMqlPneumaticChamberSegmentClosure._port(component, port_name) def _write_port_states( self, snapshot: TestMqlPnl0001PairChamberSegmentSnapshot, ) -> None: spec = self.components.spec chamber = self.components.volume chamber_inlet_port = self._port(chamber, spec.volume_inlet_port) chamber_outlet_port = self._port(chamber, spec.volume_outlet_port) self._write_line_side( line=self.components.inlet_line, line_properties=snapshot.inlet_line, node_properties=snapshot.inlet_node, node_to_line_flow=snapshot.inlet_node_to_line_flow, line_to_chamber_flow=snapshot.inlet_line_to_chamber_flow, orifice=self.components.inlet_orifice, orifice_boundary_port=spec.inlet_orifice_boundary_port, orifice_volume_port=spec.inlet_orifice_volume_port, chamber_port=chamber_inlet_port, chamber_properties=snapshot.chamber, ) self._write_line_side( line=self.components.outlet_line, line_properties=snapshot.outlet_line, node_properties=snapshot.outlet_node, node_to_line_flow=snapshot.outlet_node_to_line_flow, line_to_chamber_flow=snapshot.outlet_line_to_chamber_flow, orifice=self.components.outlet_orifice, orifice_boundary_port=spec.outlet_orifice_boundary_port, orifice_volume_port=spec.outlet_orifice_volume_port, chamber_port=chamber_outlet_port, chamber_properties=snapshot.chamber, ) def _write_line_side( self, *, line: AmesimPnl0001Pipe, line_properties: ThermodynamicProperties, node_properties: ThermodynamicProperties, node_to_line_flow: float, line_to_chamber_flow: float, orifice: AmesimPneumaticOrifice, orifice_boundary_port: str, orifice_volume_port: str, chamber_port: PortState, chamber_properties: ThermodynamicProperties, ) -> None: line.port_1.p = node_properties.p line.port_1.m_flow = node_to_line_flow line.port_1.h_outflow = line_properties.h line.port_2.p = line_properties.p line.port_2.m_flow = -line_to_chamber_flow boundary_port = self._port(orifice, orifice_boundary_port) volume_port = self._port(orifice, orifice_volume_port) boundary_port.p = line_properties.p boundary_port.m_flow = line_to_chamber_flow boundary_port.h_outflow = line_properties.h volume_port.p = chamber_properties.p volume_port.m_flow = -line_to_chamber_flow volume_port.h_outflow = chamber_properties.h chamber_port.m_flow = line_to_chamber_flow def rhs(self, state_vector: list[float]) -> list[float]: snapshot = self.snapshot(state_vector) inlet_derivative = self.components.inlet_line.derivatives_from_connections( port_1_m_flow=snapshot.inlet_node_to_line_flow, connected_h_1=snapshot.inlet_node.h, port_2_m_flow=-snapshot.inlet_line_to_chamber_flow, connected_h_2=snapshot.chamber.h, ) outlet_derivative = self.components.outlet_line.derivatives_from_connections( port_1_m_flow=snapshot.outlet_node_to_line_flow, connected_h_1=snapshot.outlet_node.h, port_2_m_flow=-snapshot.outlet_line_to_chamber_flow, connected_h_2=snapshot.chamber.h, ) chamber = self.components.volume spec = self.components.spec chamber_derivative = chamber.derivatives_from_two_connections( port_a_m_flow=self._port(chamber, "port_1").m_flow, connected_h_a=( snapshot.inlet_line.h if spec.volume_inlet_port == "port_1" else snapshot.outlet_line.h ), port_b_m_flow=self._port(chamber, "port_2").m_flow, connected_h_b=( snapshot.inlet_line.h if spec.volume_inlet_port == "port_2" else snapshot.outlet_line.h ), internal_h=snapshot.chamber.h, ) return [ *inlet_derivative.as_vector(), *chamber_derivative.as_vector(), *outlet_derivative.as_vector(), ] class TestMqlPn3NodeChamberSegmentClosure: """Boundary-reduced chamber segment closed by one real PN3 node. ``pneumatic_88`` supplies the PN3 primary pressure/temperature from its port-1 compliance. The node has no storage, so the sum of the port-1 PNL00R flow and port-3 PNL0001 flow is written as the opposite port-1 flow into the PNL0003 state. """ def __init__( self, *, components: TestMqlPn3NodeChamberSegmentComponents, inlet_node: TestMqlPneumaticBoundaryCondition, resistance_boundary: TestMqlPneumaticBoundaryCondition, p4_boundary: TestMqlPneumaticBoundaryCondition, ) -> None: self.components = components self.inlet_node = inlet_node self.resistance_boundary = resistance_boundary self.p4_boundary = p4_boundary def initial_state_vector(self) -> list[float]: return [ *self.components.inlet_line.get_state_vector(), *self.components.volume.get_state_vector(), *self.components.outlet_line.get_state_vector(), *self.components.node_line.get_state_vector(), ] def apply_state_vector(self, values: list[float]) -> None: if len(values) != 10: raise ValueError("PN3 node/chamber segment state vector requires ten values") self.components.inlet_line.set_state_vector(values[:2]) self.components.volume.set_state_vector(values[2:4]) self.components.outlet_line.set_state_vector(values[4:6]) self.components.node_line.set_state_vector(values[6:]) def snapshot( self, state_vector: list[float] | None = None, ) -> TestMqlPn3NodeChamberSegmentSnapshot: if state_vector is not None: self.apply_state_vector(state_vector) inlet_line = self.components.inlet_line.properties() chamber = self.components.volume.properties() outlet_line = self.components.outlet_line.properties() node_line_port_1 = self.components.node_line.properties_1() node_line_port_2 = self.components.node_line.properties_2() inlet_node = self.inlet_node.properties(self.components.inlet_line.gas) resistance_boundary = self.resistance_boundary.properties( self.components.node_resistance.gas ) p4_boundary = self.p4_boundary.properties(self.components.node_line.gas) inlet_node_to_line_flow = self.components.inlet_line.resistance_mass_flow( port_1_pressure_pa=inlet_node.p, port_1_temperature_k=inlet_node.T, ) outlet_node_to_line_flow = self.components.outlet_line.resistance_mass_flow( port_1_pressure_pa=node_line_port_1.p, port_1_temperature_k=node_line_port_1.T, ) inlet_line_to_chamber_flow = self._line_to_chamber_flow( line=inlet_line, chamber=chamber, orifice=self.components.inlet_orifice, ) outlet_line_to_chamber_flow = self._line_to_chamber_flow( line=outlet_line, chamber=chamber, orifice=self.components.outlet_orifice, ) node_to_resistance_flow = self.components.node_resistance.mass_flow( port_1_pressure_pa=node_line_port_1.p, port_1_temperature_k=node_line_port_1.T, port_2_pressure_pa=resistance_boundary.p, port_2_temperature_k=resistance_boundary.T, ) node_balance = self.components.node.balance( port_2_temperature_k=node_line_port_1.T, port_2_pressure_pa=node_line_port_1.p, port_1_enthalpy_flow_w=self._enthalpy_flow_from_node( flow_kg_s=node_to_resistance_flow, node_h=node_line_port_1.h, connected_h=resistance_boundary.h, ), port_1_mass_flow_g_s=node_to_resistance_flow * 1.0e3, port_3_enthalpy_flow_w=self._enthalpy_flow_from_node( flow_kg_s=outlet_node_to_line_flow, node_h=node_line_port_1.h, connected_h=outlet_line.h, ), port_3_mass_flow_g_s=outlet_node_to_line_flow * 1.0e3, ) node_to_pnl0003_flow = -node_balance.port_2_mass_flow_g_s * 1.0e-3 pnl0003_center_flow = self.components.node_line.resistance_mass_flow() pnl0003_to_p4_flow = self._line_to_p4_flow( line=node_line_port_2, p4_boundary=p4_boundary, orifice=self.components.node_orifice, ) snapshot = TestMqlPn3NodeChamberSegmentSnapshot( inlet_line=inlet_line, chamber=chamber, outlet_line=outlet_line, node_line_port_1=node_line_port_1, node_line_port_2=node_line_port_2, inlet_node=inlet_node, resistance_boundary=resistance_boundary, p4_boundary=p4_boundary, node_balance=node_balance, inlet_node_to_line_flow=inlet_node_to_line_flow, inlet_line_to_chamber_flow=inlet_line_to_chamber_flow, outlet_node_to_line_flow=outlet_node_to_line_flow, outlet_line_to_chamber_flow=outlet_line_to_chamber_flow, node_to_resistance_flow=node_to_resistance_flow, node_to_pnl0003_flow=node_to_pnl0003_flow, pnl0003_center_flow=pnl0003_center_flow, pnl0003_to_p4_flow=pnl0003_to_p4_flow, ) self._write_port_states(snapshot) return snapshot @staticmethod def _line_to_chamber_flow( *, line: ThermodynamicProperties, chamber: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> float: return TestMqlPnl0001PairChamberSegmentClosure._line_to_chamber_flow( line=line, chamber=chamber, orifice=orifice, ) @staticmethod def _line_to_p4_flow( *, line: ThermodynamicProperties, p4_boundary: ThermodynamicProperties, orifice: AmesimPneumaticOrifice, ) -> float: upstream_temperature = line.T if line.p >= p4_boundary.p else p4_boundary.T return orifice.mass_flow(line.p, p4_boundary.p, upstream_temperature) @staticmethod def _port( component: AmesimPneumaticVolume | AmesimPneumaticOrifice, port_name: str, ) -> PortState: return TestMqlPneumaticChamberSegmentClosure._port(component, port_name) @staticmethod def _enthalpy_flow_from_node( *, flow_kg_s: float, node_h: float, connected_h: float, ) -> float: return flow_kg_s * (node_h if flow_kg_s >= 0.0 else connected_h) def _write_port_states( self, snapshot: TestMqlPn3NodeChamberSegmentSnapshot, ) -> None: spec = self.components.spec chamber = self.components.volume chamber_inlet_port = self._port(chamber, spec.volume_inlet_port) chamber_outlet_port = self._port(chamber, spec.volume_outlet_port) TestMqlPnl0001PairChamberSegmentClosure._write_line_side( self, line=self.components.inlet_line, line_properties=snapshot.inlet_line, node_properties=snapshot.inlet_node, node_to_line_flow=snapshot.inlet_node_to_line_flow, line_to_chamber_flow=snapshot.inlet_line_to_chamber_flow, orifice=self.components.inlet_orifice, orifice_boundary_port=spec.inlet_orifice_boundary_port, orifice_volume_port=spec.inlet_orifice_volume_port, chamber_port=chamber_inlet_port, chamber_properties=snapshot.chamber, ) TestMqlPnl0001PairChamberSegmentClosure._write_line_side( self, line=self.components.outlet_line, line_properties=snapshot.outlet_line, node_properties=snapshot.node_line_port_1, node_to_line_flow=snapshot.outlet_node_to_line_flow, line_to_chamber_flow=snapshot.outlet_line_to_chamber_flow, orifice=self.components.outlet_orifice, orifice_boundary_port=spec.outlet_orifice_boundary_port, orifice_volume_port=spec.outlet_orifice_volume_port, chamber_port=chamber_outlet_port, chamber_properties=snapshot.chamber, ) node_line = self.components.node_line node_line.port_1.p = snapshot.node_line_port_1.p node_line.port_1.m_flow = snapshot.node_to_pnl0003_flow node_line.port_1.h_outflow = snapshot.node_line_port_1.h node_line.port_2.p = snapshot.node_line_port_2.p node_line.port_2.m_flow = -snapshot.pnl0003_to_p4_flow node_line.port_2.h_outflow = snapshot.node_line_port_2.h node_orifice = self.components.node_orifice node_orifice.port_a.p = snapshot.node_line_port_2.p node_orifice.port_a.m_flow = snapshot.pnl0003_to_p4_flow node_orifice.port_a.h_outflow = snapshot.node_line_port_2.h node_orifice.port_b.p = snapshot.p4_boundary.p node_orifice.port_b.m_flow = -snapshot.pnl0003_to_p4_flow node_orifice.port_b.h_outflow = snapshot.p4_boundary.h resistance = self.components.node_resistance resistance.port_1.p = snapshot.node_line_port_1.p resistance.port_1.m_flow = snapshot.node_to_resistance_flow resistance.port_1.h_outflow = snapshot.node_line_port_1.h resistance.port_2.p = snapshot.resistance_boundary.p resistance.port_2.m_flow = -snapshot.node_to_resistance_flow resistance.port_2.h_outflow = snapshot.resistance_boundary.h def rhs(self, state_vector: list[float]) -> list[float]: snapshot = self.snapshot(state_vector) inlet_derivative = self.components.inlet_line.derivatives_from_connections( port_1_m_flow=snapshot.inlet_node_to_line_flow, connected_h_1=snapshot.inlet_node.h, port_2_m_flow=-snapshot.inlet_line_to_chamber_flow, connected_h_2=snapshot.chamber.h, ) outlet_derivative = self.components.outlet_line.derivatives_from_connections( port_1_m_flow=snapshot.outlet_node_to_line_flow, connected_h_1=snapshot.node_line_port_1.h, port_2_m_flow=-snapshot.outlet_line_to_chamber_flow, connected_h_2=snapshot.chamber.h, ) chamber = self.components.volume spec = self.components.spec chamber_derivative = chamber.derivatives_from_two_connections( port_a_m_flow=self._port(chamber, "port_1").m_flow, connected_h_a=( snapshot.inlet_line.h if spec.volume_inlet_port == "port_1" else snapshot.outlet_line.h ), port_b_m_flow=self._port(chamber, "port_2").m_flow, connected_h_b=( snapshot.inlet_line.h if spec.volume_inlet_port == "port_2" else snapshot.outlet_line.h ), internal_h=snapshot.chamber.h, ) node_line_derivative_1, node_line_derivative_2 = ( self.components.node_line.derivatives_from_connections( port_1_m_flow=snapshot.node_to_pnl0003_flow, connected_h_1=snapshot.node_line_port_1.h, port_2_m_flow=-snapshot.pnl0003_to_p4_flow, connected_h_2=snapshot.p4_boundary.h, ) ) return [ *inlet_derivative.as_vector(), *chamber_derivative.as_vector(), *outlet_derivative.as_vector(), *node_line_derivative_1.as_vector(), *node_line_derivative_2.as_vector(), ]