from __future__ import annotations import unittest from pathlib import Path from PythonModels.reporting.amesim_results import load_test_mql_amesim_results from PythonModels.systems.test_mql import TestMqlSystem from PythonModels.systems.test_mql_line_parameters import load_test_mql_pnl0002_specs from PythonModels.systems.test_mql_pneumatic_lines import build_test_mql_pnl0002_assembly REPO_ROOT = Path(__file__).resolve().parents[1] TEST_MQL_AME = REPO_ROOT / "AmesimModels" / "test_mql.ame" class TestMqlPnl0002Tests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.pnl0002_specs = load_test_mql_pnl0002_specs(TEST_MQL_AME) cls.pnl0002_assembly = build_test_mql_pnl0002_assembly(TEST_MQL_AME) cls.results = load_test_mql_amesim_results(TEST_MQL_AME) def test_loads_all_real_pnl0002_parameters_from_cir(self) -> None: self.assertEqual(len(self.pnl0002_specs), 8) spec = self.pnl0002_assembly.spec("pneumatic_86") self.assertEqual(spec.source_component, "pnnode4_17") self.assertEqual(spec.source_port, "port_1") self.assertEqual(spec.target_component, "pnnode4_18") self.assertEqual(spec.target_port, "port_3") self.assertEqual(spec.diameter_mm, 20.0) self.assertEqual(spec.length_m, 2.0) self.assertAlmostEqual(spec.relative_roughness, 0.045 / 20.0) self.assertEqual(spec.gas_type_index, 1) self.assertEqual(spec.mode, 2) self.assertAlmostEqual(spec.initial_center_temperature_k, 293.15) self.assertAlmostEqual(spec.initial_center_gauge_pressure_pa, -1300.0) self.assertAlmostEqual(spec.initial_center_absolute_pressure_pa, 100_000.0) def test_builds_pnl0002_center_compliance_line_components(self) -> None: self.assertEqual(len(self.pnl0002_assembly.lines), 8) self.assertTrue( all(len(line.get_state_vector()) == 2 for line in self.pnl0002_assembly.lines.values()) ) def test_pneumatic_86_initial_observables_match_amesim_baseline(self) -> None: pipe = self.pnl0002_assembly.lines["pneumatic_86"] properties = pipe.properties() self.assertAlmostEqual( properties.p - 101_300.0, self.results.series("pctr@pneumatic_86")[0], delta=1.0e-6, ) self.assertAlmostEqual( properties.T, self.results.series("tctr@pneumatic_86")[0], delta=1.0e-12, ) self.assertAlmostEqual( pipe.gas_mass_g(), self.results.series("mgas@pneumatic_86")[0], delta=0.001, ) def test_amesim_mass_balance_uses_opposite_saved_port_flow_signs(self) -> None: index = 500 times = self.results.times mass = self.results.series("mgas@pneumatic_86") finite_difference_g_s = ( mass[index + 1] - mass[index - 1] ) / (times[index + 1] - times[index - 1]) saved_port_flow_g_s = ( self.results.series("dm1@pneumatic_86")[index] + self.results.series("dm2@pneumatic_86")[index] ) self.assertAlmostEqual( finite_difference_g_s, -saved_port_flow_g_s, delta=1.0e-5, ) def test_system_exposes_real_pnl0002_assembly(self) -> None: system = TestMqlSystem() self.assertEqual(system.typed_pnl0002_line_count, 8) self.assertIn("pneumatic_86", system.pnl0002_assembly.lines) if __name__ == "__main__": unittest.main()