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_line_parameters import load_test_mql_pnl0001_specs from PythonModels.systems.test_mql_pneumatic_lines import ( build_test_mql_pnl0001_assembly, ) REPO_ROOT = Path(__file__).resolve().parents[1] TEST_MQL_AME = REPO_ROOT / "AmesimModels" / "test_mql.ame" class TestMqlPnl0001Tests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.specs = load_test_mql_pnl0001_specs(TEST_MQL_AME) cls.assembly = build_test_mql_pnl0001_assembly(TEST_MQL_AME) cls.results = load_test_mql_amesim_results(TEST_MQL_AME) def test_loads_all_real_pnl0001_parameters_from_cir(self) -> None: self.assertEqual(len(self.specs), 20) spec = self.assembly.spec("pneumatic_96") self.assertEqual(spec.source_component, "pn_node3_8") self.assertEqual(spec.target_component, "pn_orifice_18") 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.polytropic_constant, 1.35) self.assertEqual(spec.heat_transfer_coefficient, 0.0) self.assertEqual(spec.external_temperature_k, 293.15) self.assertEqual(spec.gas_type_index, 1) self.assertEqual(spec.mode, 2) self.assertAlmostEqual(spec.initial_gauge_pressure_pa, 15_198_700.0) self.assertAlmostEqual(spec.initial_absolute_pressure_pa, 15_300_000.0) def test_builds_twenty_two_state_physical_line_components(self) -> None: self.assertEqual(len(self.assembly.lines), 20) self.assertTrue( all(len(line.get_state_vector()) == 2 for line in self.assembly.lines.values()) ) def test_pneumatic_96_initial_observables_match_amesim_baseline(self) -> None: pipe = self.assembly.lines["pneumatic_96"] self.assertAlmostEqual( pipe.properties().p - 101_300.0, self.results.series("p2@pneumatic_96")[0], delta=1.0e-5, ) self.assertAlmostEqual( pipe.properties().T, self.results.series("t2@pneumatic_96")[0], ) self.assertAlmostEqual( pipe.gas_mass_g(), self.results.series("mgas@pneumatic_96")[0], delta=0.005, ) def test_baseline_mass_balance_identifies_port_two_input_sign(self) -> None: mass = self.results.series("mgas@pneumatic_96") dm1 = self.results.series("dm1@pneumatic_96") dm2_peer = self.results.series("dm2@pn_orifice_18") index = 500 finite_difference = (mass[index] - mass[index - 1]) / ( self.results.times[index] - self.results.times[index - 1] ) self.assertAlmostEqual( finite_difference, dm2_peer[index] - dm1[index], delta=3.0e-5, ) if __name__ == "__main__": unittest.main()