接入test_mql真实固定气室拓扑

This commit is contained in:
huojiarong committed 2026-07-17 02:49:06 +00:00
1 parent c0f28520b4
commit 2d33a8f4bc
8 files changed
+747 -5

No files matched your search

+24
View File
@@ -55,6 +55,30 @@ class AmesimPneumaticComponentsTest(unittest.TestCase):
)
self.assertGreater(volume.gas_mass_g(), 1300.0)
def test_volume_balances_two_connections_with_stream_enthalpy(self) -> None:
volume = AmesimPneumaticVolume.from_liters(
name="pn_general_chamber",
volume_liters=57.0,
p0=15.3e6,
T0=293.15,
)
internal_h = volume.properties().h
derivative = volume.derivatives_from_two_connections(
port_a_m_flow=0.2,
connected_h_a=internal_h + 1000.0,
port_b_m_flow=-0.1,
connected_h_b=internal_h - 1000.0,
internal_h=internal_h,
)
self.assertAlmostEqual(derivative.m, 0.1)
self.assertAlmostEqual(
derivative.U,
0.2 * (internal_h + 1000.0) - 0.1 * internal_h,
)
self.assertAlmostEqual(volume.port_a.p, volume.port_b.p)
def test_variable_volume_tracks_external_volume(self) -> None:
volume = AmesimVariablePneumaticVolume.from_liters(
name="pn_c1_8",
+92
View File
@@ -0,0 +1,92 @@
from __future__ import annotations
import unittest
from PythonModels.core.solver import SolveIVPConfig
from PythonModels.systems.test_mql import TestMqlSystem
class TestMqlPneumaticChamberSegmentTests(unittest.TestCase):
def setUp(self) -> None:
self.system = TestMqlSystem()
self.discovery = self.system.discover_pneumatic_branch_topology()
self.spec = self.discovery.chamber_segment_specs[0]
def test_discovers_four_fixed_chamber_segments_from_real_topology(self) -> None:
self.assertEqual(len(self.discovery.chamber_segment_specs), 4)
self.assertEqual(self.spec.volume_alias, "pn_general_chamber")
self.assertEqual(self.spec.inlet_node_alias, "pn_node3_8")
self.assertEqual(self.spec.inlet_line_alias, "pneumatic_96")
self.assertEqual(self.spec.inlet_orifice_alias, "pn_orifice_18")
self.assertEqual(self.spec.volume_inlet_port, "port_2")
self.assertEqual(self.spec.outlet_orifice_alias, "pn_orifice_19")
self.assertEqual(self.spec.outlet_line_alias, "pneumatic_97")
self.assertEqual(self.spec.outlet_node_alias, "pn_node3_9")
self.assertEqual(self.spec.source, "amesim-cir-topology")
def test_segment_closure_writes_real_amesim_port_directions(self) -> None:
closure = self.system.pneumatic_chamber_segment_closure_from_spec(
self.spec,
inlet_pressure_pa=16.0e6,
outlet_pressure_pa=1.0e6,
)
snapshot = closure.snapshot()
rhs = closure.rhs(closure.initial_state_vector())
self.assertGreater(snapshot.inlet_flow, 0.0)
self.assertGreater(snapshot.outlet_flow, 0.0)
self.assertAlmostEqual(
closure.components.volume.port_b.m_flow,
snapshot.inlet_flow,
)
self.assertAlmostEqual(
closure.components.volume.port_a.m_flow,
-snapshot.outlet_flow,
)
self.assertAlmostEqual(
closure.components.inlet_orifice.port_b.m_flow,
snapshot.inlet_flow,
)
self.assertAlmostEqual(
closure.components.outlet_orifice.port_a.m_flow,
-snapshot.outlet_flow,
)
self.assertEqual(len(rhs), 2)
self.assertAlmostEqual(rhs[0], snapshot.inlet_flow - snapshot.outlet_flow)
def test_segment_closure_handles_reverse_boundary_pressures(self) -> None:
closure = self.system.pneumatic_chamber_segment_closure_from_spec(
self.spec,
inlet_pressure_pa=1.0e6,
outlet_pressure_pa=16.0e6,
)
snapshot = closure.snapshot()
rhs = closure.rhs(closure.initial_state_vector())
self.assertLess(snapshot.inlet_flow, 0.0)
self.assertLess(snapshot.outlet_flow, 0.0)
self.assertAlmostEqual(rhs[0], snapshot.inlet_flow - snapshot.outlet_flow)
def test_simulates_topology_derived_segment_with_prescribed_boundaries(self) -> None:
solution = self.system.simulate_pneumatic_chamber_segment_from_spec(
self.spec,
inlet_pressure_pa=16.0e6,
outlet_pressure_pa=14.0e6,
config=SolveIVPConfig(
t_start=0.0,
t_stop=1.0e-5,
max_step=1.0e-6,
),
t_eval=[0.0, 5.0e-6, 1.0e-5],
)
self.assertTrue(solution.success)
self.assertEqual(len(solution.t), 3)
self.assertEqual(len(solution.y), 2)
self.assertEqual([len(row) for row in solution.y], [3, 3])
if __name__ == "__main__":
unittest.main()
+45
View File
@@ -0,0 +1,45 @@
from __future__ import annotations
import unittest
from pathlib import Path
from PythonModels.systems.test_mql_topology import load_test_mql_cir_topology
REPO_ROOT = Path(__file__).resolve().parents[1]
TEST_MQL_AME = REPO_ROOT / "AmesimModels" / "test_mql.ame"
class TestMqlCirTopologyTests(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.topology = load_test_mql_cir_topology(TEST_MQL_AME)
def test_recovers_direct_component_contacts_omitted_from_line_specs(self) -> None:
self.assertEqual(len(self.topology.component_contacts), 54)
contacts = self.topology.contacts_for("pn_general_chamber")
self.assertEqual(len(contacts), 2)
self.assertEqual(
{
(
contact.port_for("pn_general_chamber"),
*contact.other_endpoint("pn_general_chamber"),
)
for contact in contacts
},
{
("port_1", "pn_orifice_19", "port_2"),
("port_2", "pn_orifice_18", "port_1"),
},
)
def test_component_contact_lookup_rejects_unrelated_alias(self) -> None:
contact = self.topology.contacts_for("pn_general_chamber")[0]
with self.assertRaises(KeyError):
contact.other_endpoint("not-an-endpoint")
if __name__ == "__main__":
unittest.main()