diff --git a/PythonModels/systems/test_mql.py b/PythonModels/systems/test_mql.py index d949fa1..62f5af0 100644 --- a/PythonModels/systems/test_mql.py +++ b/PythonModels/systems/test_mql.py @@ -4480,8 +4480,6 @@ class TestMqlSystem: resistance_boundary_pressure_pa: float, inlet_node_temperature_k: float = 293.15, resistance_boundary_temperature_k: float = 293.15, - p4_primary_boundary_pressure_pa: float = 100_000.0, - p4_primary_boundary_temperature_k: float = 293.15, p4_port1_boundary_pressure_pa: float = 100_000.0, p4_port1_boundary_temperature_k: float = 293.15, p4_port3_boundary_pressure_pa: float = 100_000.0, @@ -4523,7 +4521,17 @@ class TestMqlSystem: ) node = self.node3_assembly[spec.outlet_node_alias] p4_node = self.node4_assembly[p4_node_alias] - p4_primary_line = self._pnl0001_line_for_node_port(p4_node_alias, "port_2") + p4_primary_line_spec = self._pnl0001_spec_for_node_port( + p4_node_alias, + "port_2", + ) + p4_primary_line = self.pnl0001_assembly.lines[p4_primary_line_spec.alias] + p4_primary_chamber_alias = ( + p4_primary_line_spec.target_component + if p4_primary_line_spec.source_component == p4_node_alias + else p4_primary_line_spec.source_component + ) + p4_primary_chamber = self.network.components[p4_primary_chamber_alias] p4_port1_line = self._pnl0002_line_for_node_port(p4_node_alias, "port_1") p4_port3_line = self._pnl0002_line_for_node_port(p4_node_alias, "port_3") volume = self.network.components[spec.volume_alias] @@ -4531,6 +4539,10 @@ class TestMqlSystem: outlet_orifice = self.network.components[spec.outlet_orifice_alias] if not isinstance(volume, AmesimPneumaticVolume): raise TypeError(f"{spec.volume_alias} is not an AMESim pneumatic volume") + if not isinstance(p4_primary_chamber, AmesimPneumaticVolume): + raise TypeError( + f"{p4_primary_chamber_alias} is not an AMESim pneumatic volume" + ) if not isinstance(inlet_orifice, AmesimPneumaticOrifice): raise TypeError( f"{spec.inlet_orifice_alias} is not an AMESim pneumatic orifice" @@ -4549,6 +4561,7 @@ class TestMqlSystem: node=node, p4_node=p4_node, p4_primary_line=p4_primary_line, + p4_primary_chamber=p4_primary_chamber, p4_port1_line=p4_port1_line, p4_port3_line=p4_port3_line, volume=volume, @@ -4564,10 +4577,6 @@ class TestMqlSystem: pressure_pa=resistance_boundary_pressure_pa, temperature_k=resistance_boundary_temperature_k, ), - p4_primary_boundary=TestMqlPneumaticBoundaryCondition( - pressure_pa=p4_primary_boundary_pressure_pa, - temperature_k=p4_primary_boundary_temperature_k, - ), p4_port1_boundary=TestMqlPneumaticBoundaryCondition( pressure_pa=p4_port1_boundary_pressure_pa, temperature_k=p4_port1_boundary_temperature_k, @@ -4586,8 +4595,6 @@ class TestMqlSystem: resistance_boundary_pressure_pa: float, inlet_node_temperature_k: float = 293.15, resistance_boundary_temperature_k: float = 293.15, - p4_primary_boundary_pressure_pa: float = 100_000.0, - p4_primary_boundary_temperature_k: float = 293.15, p4_port1_boundary_pressure_pa: float = 100_000.0, p4_port1_boundary_temperature_k: float = 293.15, p4_port3_boundary_pressure_pa: float = 100_000.0, @@ -4601,8 +4608,6 @@ class TestMqlSystem: resistance_boundary_pressure_pa=resistance_boundary_pressure_pa, inlet_node_temperature_k=inlet_node_temperature_k, resistance_boundary_temperature_k=resistance_boundary_temperature_k, - p4_primary_boundary_pressure_pa=p4_primary_boundary_pressure_pa, - p4_primary_boundary_temperature_k=p4_primary_boundary_temperature_k, p4_port1_boundary_pressure_pa=p4_port1_boundary_pressure_pa, p4_port1_boundary_temperature_k=p4_port1_boundary_temperature_k, p4_port3_boundary_pressure_pa=p4_port3_boundary_pressure_pa, diff --git a/PythonModels/systems/test_mql_closure.py b/PythonModels/systems/test_mql_closure.py index 3637405..7a7726f 100644 --- a/PythonModels/systems/test_mql_closure.py +++ b/PythonModels/systems/test_mql_closure.py @@ -198,6 +198,7 @@ class TestMqlPn3P4NodeChamberSegmentComponents: node: TestMqlPneumaticNode3 p4_node: TestMqlPneumaticNode4 p4_primary_line: AmesimPnl0001Pipe + p4_primary_chamber: AmesimPneumaticVolume p4_port1_line: AmesimPnl0002Pipe p4_port3_line: AmesimPnl0002Pipe volume: AmesimPneumaticVolume @@ -215,11 +216,11 @@ class TestMqlPn3P4NodeChamberSegmentSnapshot: node_line_port_2: ThermodynamicProperties p4_primary_line: ThermodynamicProperties p4_boundary: ThermodynamicProperties + p4_primary_chamber: ThermodynamicProperties p4_port1_line: ThermodynamicProperties p4_port3_line: ThermodynamicProperties inlet_node: ThermodynamicProperties resistance_boundary: ThermodynamicProperties - p4_primary_boundary: ThermodynamicProperties p4_port1_boundary: ThermodynamicProperties p4_port3_boundary: ThermodynamicProperties node_balance: TestMqlPneumaticNode3Balance @@ -232,7 +233,7 @@ class TestMqlPn3P4NodeChamberSegmentSnapshot: node_to_pnl0003_flow: float pnl0003_center_flow: float pnl0003_to_p4_flow: float - p4_boundary_to_primary_line_flow: float + p4_primary_chamber_to_line_flow: float p4_node_to_primary_line_flow: float p4_to_port1_line_flow: float p4_port1_boundary_to_line_flow: float @@ -254,14 +255,12 @@ class TestMqlPn3P4NodeChamberSegmentClosure: components: TestMqlPn3P4NodeChamberSegmentComponents, inlet_node: TestMqlPneumaticBoundaryCondition, resistance_boundary: TestMqlPneumaticBoundaryCondition, - p4_primary_boundary: TestMqlPneumaticBoundaryCondition, p4_port1_boundary: TestMqlPneumaticBoundaryCondition, p4_port3_boundary: TestMqlPneumaticBoundaryCondition, ) -> None: self.components = components self.inlet_node = inlet_node self.resistance_boundary = resistance_boundary - self.p4_primary_boundary = p4_primary_boundary self.p4_port1_boundary = p4_port1_boundary self.p4_port3_boundary = p4_port3_boundary @@ -272,20 +271,22 @@ class TestMqlPn3P4NodeChamberSegmentClosure: *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_port3_line.get_state_vector(), ] def apply_state_vector(self, values: list[float]) -> None: - if len(values) != 16: - raise ValueError("PN3/P4 node chamber segment state vector requires sixteen values") + if len(values) != 18: + raise ValueError("PN3/P4 node chamber segment state vector requires eighteen 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_port1_line.set_state_vector(values[12:14]) - self.components.p4_port3_line.set_state_vector(values[14:]) + 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_port3_line.set_state_vector(values[16:]) def snapshot( self, @@ -299,15 +300,13 @@ class TestMqlPn3P4NodeChamberSegmentClosure: 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_port3_line = self.components.p4_port3_line.properties() inlet_node = self.inlet_node.properties(self.components.inlet_line.gas) resistance_boundary = self.resistance_boundary.properties( self.components.node_resistance.gas ) - p4_primary_boundary = self.p4_primary_boundary.properties( - self.components.p4_primary_line.gas - ) p4_port1_boundary = self.p4_port1_boundary.properties( self.components.p4_port1_line.gas ) @@ -363,10 +362,10 @@ class TestMqlPn3P4NodeChamberSegmentClosure: orifice=self.components.node_orifice, ) - p4_boundary_to_primary_line_flow = ( + p4_primary_chamber_to_line_flow = ( self.components.p4_primary_line.resistance_mass_flow( - port_1_pressure_pa=p4_primary_boundary.p, - port_1_temperature_k=p4_primary_boundary.T, + port_1_pressure_pa=p4_primary_chamber.p, + port_1_temperature_k=p4_primary_chamber.T, ) ) p4_to_port1_line_flow = self.components.p4_port1_line.port_mass_flow( @@ -417,11 +416,11 @@ class TestMqlPn3P4NodeChamberSegmentClosure: 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_port3_line=p4_port3_line, inlet_node=inlet_node, resistance_boundary=resistance_boundary, - p4_primary_boundary=p4_primary_boundary, p4_port1_boundary=p4_port1_boundary, p4_port3_boundary=p4_port3_boundary, node_balance=node_balance, @@ -434,7 +433,7 @@ class TestMqlPn3P4NodeChamberSegmentClosure: node_to_pnl0003_flow=node_to_pnl0003_flow, pnl0003_center_flow=pnl0003_center_flow, pnl0003_to_p4_flow=pnl0003_to_p4_flow, - p4_boundary_to_primary_line_flow=p4_boundary_to_primary_line_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_boundary_to_line_flow=p4_port1_boundary_to_line_flow, @@ -497,13 +496,18 @@ class TestMqlPn3P4NodeChamberSegmentClosure: TestMqlPn3NodeChamberSegmentClosure._write_port_states(self, snapshot) p4_primary_line = self.components.p4_primary_line - p4_primary_line.port_1.p = snapshot.p4_primary_boundary.p - p4_primary_line.port_1.m_flow = snapshot.p4_boundary_to_primary_line_flow + p4_primary_line.port_1.p = snapshot.p4_primary_chamber.p + p4_primary_line.port_1.m_flow = snapshot.p4_primary_chamber_to_line_flow p4_primary_line.port_1.h_outflow = snapshot.p4_primary_line.h p4_primary_line.port_2.p = snapshot.p4_primary_line.p p4_primary_line.port_2.m_flow = snapshot.p4_node_to_primary_line_flow p4_primary_line.port_2.h_outflow = snapshot.p4_primary_line.h + p4_primary_chamber = self.components.p4_primary_chamber + p4_primary_chamber.port_a.p = snapshot.p4_primary_chamber.p + p4_primary_chamber.port_a.m_flow = -snapshot.p4_primary_chamber_to_line_flow + p4_primary_chamber.port_a.h_outflow = snapshot.p4_primary_chamber.h + p4_port1_line = self.components.p4_port1_line p4_port1_line.port_1.p = snapshot.p4_primary_line.p p4_port1_line.port_1.m_flow = snapshot.p4_to_port1_line_flow @@ -525,12 +529,21 @@ class TestMqlPn3P4NodeChamberSegmentClosure: base_rhs = TestMqlPn3NodeChamberSegmentClosure.rhs(self, state_vector)[:10] p4_primary_derivative = ( self.components.p4_primary_line.derivatives_from_connections( - port_1_m_flow=snapshot.p4_boundary_to_primary_line_flow, - connected_h_1=snapshot.p4_primary_boundary.h, + port_1_m_flow=snapshot.p4_primary_chamber_to_line_flow, + connected_h_1=snapshot.p4_primary_chamber.h, port_2_m_flow=snapshot.p4_node_to_primary_line_flow, connected_h_2=snapshot.p4_primary_line.h, ) ) + p4_primary_chamber_derivative = ( + self.components.p4_primary_chamber.derivatives_from_two_connections( + port_a_m_flow=-snapshot.p4_primary_chamber_to_line_flow, + connected_h_a=snapshot.p4_primary_line.h, + port_b_m_flow=0.0, + connected_h_b=snapshot.p4_primary_chamber.h, + internal_h=snapshot.p4_primary_chamber.h, + ) + ) p4_port1_derivative = self.components.p4_port1_line.derivatives_from_connections( port_1_m_flow=snapshot.p4_to_port1_line_flow, connected_h_1=snapshot.p4_primary_line.h, @@ -546,6 +559,7 @@ class TestMqlPn3P4NodeChamberSegmentClosure: return [ *base_rhs, *p4_primary_derivative.as_vector(), + *p4_primary_chamber_derivative.as_vector(), *p4_port1_derivative.as_vector(), *p4_port3_derivative.as_vector(), ] diff --git a/tests/test_test_mql_pnl0001_segment.py b/tests/test_test_mql_pnl0001_segment.py index dec16fd..631f871 100644 --- a/tests/test_test_mql_pnl0001_segment.py +++ b/tests/test_test_mql_pnl0001_segment.py @@ -264,10 +264,11 @@ class TestMqlPn3P4NodeChamberSegmentTests(unittest.TestCase): self.assertEqual(closure.components.node_orifice.name, "pn_morifice_9") self.assertEqual(closure.components.p4_node.alias, "pnnode4_17") self.assertEqual(closure.components.p4_primary_line.name, "pneumatic_68") + self.assertEqual(closure.components.p4_primary_chamber.name, "pn_c1_9") self.assertEqual(closure.components.p4_port1_line.name, "pneumatic_86") self.assertEqual(closure.components.p4_port3_line.name, "pneumatic_83") - self.assertEqual(len(closure.initial_state_vector()), 16) - self.assertEqual(len(rhs), 16) + self.assertEqual(len(closure.initial_state_vector()), 18) + self.assertEqual(len(rhs), 18) self.assertAlmostEqual( snapshot.p4_balance.pressure_pa, snapshot.p4_primary_line.p, @@ -309,20 +310,19 @@ class TestMqlPn3P4NodeChamberSegmentTests(unittest.TestCase): 0.0, delta=1.0e-12, ) - mass_derivative_sum = sum(rhs[index] for index in range(0, 16, 2)) + mass_derivative_sum = sum(rhs[index] for index in range(0, 18, 2)) self.assertAlmostEqual( mass_derivative_sum, ( snapshot.inlet_node_to_line_flow - snapshot.node_to_resistance_flow - + snapshot.p4_boundary_to_primary_line_flow + snapshot.p4_port1_boundary_to_line_flow + snapshot.p4_port3_boundary_to_line_flow ), delta=1.0e-12, ) - def test_simulates_sixteen_state_pn3_p4_node_chamber_segment(self) -> None: + def test_simulates_eighteen_state_pn3_p4_node_chamber_segment(self) -> None: solution = self.system.simulate_pn3_p4_node_chamber_segment_from_spec( self.spec, inlet_node_pressure_pa=15.31e6, @@ -337,8 +337,8 @@ class TestMqlPn3P4NodeChamberSegmentTests(unittest.TestCase): self.assertTrue(solution.success) self.assertEqual(len(solution.t), 3) - self.assertEqual(len(solution.y), 16) - self.assertEqual([len(row) for row in solution.y], [3] * 16) + self.assertEqual(len(solution.y), 18) + self.assertEqual([len(row) for row in solution.y], [3] * 18) if __name__ == "__main__":