from __future__ import annotations import unittest from pathlib import Path from app.simulation.reporting.amesim_results import load_test_mql_amesim_results from app.simulation.examples.test_mql.system import TestMqlSystem from app.simulation.examples.test_mql.line_parameters import ( load_test_mql_pnl0003_specs, load_test_mql_pnl00r_specs, ) from app.simulation.examples.test_mql.pneumatic_lines import ( build_test_mql_pnl0003_assembly, build_test_mql_pnl00r_assembly, ) REPO_ROOT = Path(__file__).resolve().parents[1] TEST_MQL_AME = REPO_ROOT / "AmesimModels" / "test_mql.ame" class TestMqlPnl0003AndPnl00rTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.pnl0003_specs = load_test_mql_pnl0003_specs(TEST_MQL_AME) cls.pnl00r_specs = load_test_mql_pnl00r_specs(TEST_MQL_AME) cls.pnl0003_assembly = build_test_mql_pnl0003_assembly(TEST_MQL_AME) cls.pnl00r_assembly = build_test_mql_pnl00r_assembly(TEST_MQL_AME) cls.results = load_test_mql_amesim_results(TEST_MQL_AME) def test_loads_all_real_pnl0003_parameters_from_cir(self) -> None: self.assertEqual(len(self.pnl0003_specs), 8) spec = self.pnl0003_assembly.spec("pneumatic_88") self.assertEqual(spec.source_component, "pn_node3_9") self.assertEqual(spec.target_component, "pn_morifice_9") self.assertEqual(spec.diameter_mm, 20.0) self.assertEqual(spec.length_m, 0.3) 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_gauge_pressure_1_pa, 15_198_700.0) self.assertAlmostEqual(spec.initial_gauge_pressure_2_pa, 15_198_700.0) self.assertAlmostEqual(spec.initial_absolute_pressure_1_pa, 15_300_000.0) self.assertAlmostEqual(spec.initial_absolute_pressure_2_pa, 15_300_000.0) def test_loads_all_real_pnl00r_parameters_from_cir(self) -> None: self.assertEqual(len(self.pnl00r_specs), 4) spec = self.pnl00r_assembly.spec("pneumatic_100") self.assertEqual(spec.source_component, "pn_node3_9") self.assertEqual(spec.target_component, "pn_node3_10") self.assertEqual(spec.diameter_mm, 14.0) self.assertEqual(spec.length_m, 1.0) self.assertAlmostEqual(spec.relative_roughness, 0.045 / 14.0) self.assertEqual(spec.gas_type_index, 1) def test_builds_pnl0003_and_pnl00r_physical_line_components(self) -> None: self.assertEqual(len(self.pnl0003_assembly.lines), 8) self.assertEqual(len(self.pnl00r_assembly.lines), 4) self.assertTrue( all(len(line.get_state_vector()) == 4 for line in self.pnl0003_assembly.lines.values()) ) def test_pneumatic_88_initial_observables_match_amesim_baseline(self) -> None: pipe = self.pnl0003_assembly.lines["pneumatic_88"] self.assertAlmostEqual( pipe.properties_1().p - 101_300.0, self.results.series("p1@pneumatic_88")[0], delta=1.0e-5, ) self.assertAlmostEqual( pipe.properties_2().p - 101_300.0, self.results.series("p2@pneumatic_88")[0], delta=1.0e-5, ) self.assertAlmostEqual( pipe.gas_mass_g(), self.results.series("mgas@pneumatic_88")[0], delta=0.005, ) def test_system_exposes_real_pnl0003_and_pnl00r_assemblies(self) -> None: system = TestMqlSystem() self.assertEqual(system.typed_pnl0003_line_count, 8) self.assertEqual(system.typed_pnl00r_line_count, 4) self.assertIn("pneumatic_88", system.pnl0003_assembly.lines) self.assertIn("pneumatic_100", system.pnl00r_assembly.lines) if __name__ == "__main__": unittest.main()