from __future__ import annotations import unittest from pathlib import Path from PythonModels.reporting.amesim_results import load_test_mql_amesim_results from PythonModels.reporting.test_mql_orifice_observations import ( G_PER_S_TO_KG_PER_S, build_test_mql_orifice_observation_catalog, ) REPO_ROOT = Path(__file__).resolve().parents[1] TEST_MQL_AME = REPO_ROOT / "AmesimModels" / "test_mql.ame" class TestMqlOrificeObservationCatalogTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.amesim_results = load_test_mql_amesim_results(TEST_MQL_AME) cls.catalog = build_test_mql_orifice_observation_catalog(cls.amesim_results) def test_builds_expected_orifice_observation_bindings(self) -> None: self.assertEqual(len(self.catalog.bindings), 16) self.assertEqual(self.catalog.fixed_count, 8) self.assertEqual(self.catalog.variable_count, 8) fixed = self.catalog.by_alias("pn_orifice_18") variable = self.catalog.by_alias("pn_morifice_11") self.assertEqual(fixed.submodel, "PNOR001") self.assertEqual(fixed.primary_mass_flow_path, "dm1@pn_orifice_18") self.assertEqual(fixed.reversed_mass_flow_path, "dm2@pn_orifice_18") self.assertEqual(fixed.primary_enthalpy_flow_path, "dh1@pn_orifice_18") self.assertEqual(fixed.reversed_enthalpy_flow_path, "dh2@pn_orifice_18") self.assertIsNone(fixed.opening_path) self.assertEqual(variable.submodel, "PNVO001") self.assertEqual(variable.primary_mass_flow_path, "dm2@pn_morifice_11") self.assertEqual(variable.reversed_mass_flow_path, "dm3@pn_morifice_11") self.assertEqual(variable.opening_path, "xv@pn_morifice_11") def test_fixed_orifice_opening_defaults_to_full_area(self) -> None: binding = self.catalog.by_alias("pn_orifice_18") opening = binding.opening_series(self.amesim_results) effective_area = binding.effective_area_series(self.amesim_results) self.assertEqual(opening[0], 1.0) self.assertEqual(opening[-1], 1.0) self.assertAlmostEqual(effective_area[0], 78.5e-6) self.assertAlmostEqual(effective_area[-1], 78.5e-6) def test_variable_orifice_opening_controls_effective_area(self) -> None: binding = self.catalog.by_alias("pn_morifice_11") first = binding.observation_at(self.amesim_results, 0) last = binding.observation_at(self.amesim_results, -1) self.assertAlmostEqual(binding.nominal_area_m2, 78.5e-6) self.assertAlmostEqual(binding.flow_coefficient, 0.45) self.assertEqual(first.opening, 0.0) self.assertEqual(first.effective_area_m2, 0.0) self.assertEqual(last.opening, 1.0) self.assertAlmostEqual(last.effective_area_m2, 78.5e-6) def test_mass_flow_series_is_converted_to_si_units(self) -> None: binding = self.catalog.by_alias("pn_orifice_18") mass_flow = binding.mass_flow_kg_s_series(self.amesim_results) self.assertAlmostEqual( mass_flow[-1], self.amesim_results.series("dm1@pn_orifice_18")[-1] * G_PER_S_TO_KG_PER_S, ) self.assertAlmostEqual(mass_flow[-1], 9.097746783809915e-6) self.assertAlmostEqual(min(mass_flow), -0.4462054699031737) def test_reversed_duplicate_mass_and_enthalpy_flow_signs_match_amesim(self) -> None: for binding in self.catalog.bindings: primary_mass = self.amesim_results.series(binding.primary_mass_flow_path) reversed_mass = self.amesim_results.series(binding.reversed_mass_flow_path) primary_enthalpy = self.amesim_results.series(binding.primary_enthalpy_flow_path) reversed_enthalpy = self.amesim_results.series(binding.reversed_enthalpy_flow_path) with self.subTest(alias=binding.alias): self.assertEqual(len(primary_mass), len(reversed_mass)) self.assertEqual(len(primary_enthalpy), len(reversed_enthalpy)) self.assertLess( max(abs(a + b) for a, b in zip(primary_mass, reversed_mass)), 1.0e-12, ) self.assertLess( max(abs(a + b) for a, b in zip(primary_enthalpy, reversed_enthalpy)), 1.0e-9, ) def test_observation_exposes_amesim_cm_and_gas_velocity(self) -> None: fixed = self.catalog.by_alias("pn_orifice_18").observation_at(self.amesim_results, -1) variable = self.catalog.by_alias("pn_morifice_11").observation_at(self.amesim_results, -1) self.assertAlmostEqual(fixed.mass_flow_parameter, 4.831077004227076e-07) self.assertAlmostEqual(fixed.gas_velocity_m_s, 0.016760630907703977) self.assertAlmostEqual(variable.mass_flow_parameter, 9.302013872202105e-07) self.assertAlmostEqual(variable.gas_velocity_m_s, -0.03277314382613749) if __name__ == "__main__": unittest.main()