from __future__ import annotations import unittest from app.simulation.components.amesim.flow.orifices import AmesimPnor001 from app.simulation.core.medium import IdealGasMedium from app.simulation.registry import COMPONENT_MODEL_REGISTRY class AmesimPnor001ComponentTests(unittest.TestCase): def setUp(self) -> None: self.medium = IdealGasMedium() def test_default_create_preserves_amesim_parameter_contract(self) -> None: orifice = COMPONENT_MODEL_REGISTRY["amesim_pnor001"].create( "pnor_1", self.medium, {}, ) self.assertIsInstance(orifice, AmesimPnor001) self.assertEqual(set(orifice.ports), {"port_1", "port_2"}) self.assertEqual( set(orifice.parameter_values), {"cq", "area", "Cv", "Kv", "gi", "flowset"}, ) self.assertEqual(orifice.parameter_values["area"], 5.0e-6) self.assertEqual(orifice.flowset, 1) def test_rejects_fractional_integer_parameters(self) -> None: with self.assertRaisesRegex(ValueError, "flowset must be an integer"): COMPONENT_MODEL_REGISTRY["amesim_pnor001"].create( "pnor_1", self.medium, {"flowset": 1.5}, ) def test_zero_pressure_drop_has_zero_flow_and_finite_results(self) -> None: orifice = AmesimPnor001("pnor_1", self.medium) orifice.port_1.p = 100000.0 orifice.port_2.p = 100000.0 orifice.port_1.m_flow = 0.0 orifice.port_2.m_flow = 0.0 residuals = { residual.id.rsplit(":", 1)[1]: residual for residual in orifice.pressure_flow_equation_residuals() } self.assertEqual(orifice.mass_flow(100000.0, 100000.0), 0.0) self.assertEqual(residuals["mass_flow_balance"].value, 0.0) self.assertEqual(residuals["pressure_flow_relation"].value, 0.0) self.assertEqual(set(orifice.component_result_values()), {"cm", "gasvel"}) def test_mass_flow_is_bidirectional_by_pressure_order(self) -> None: orifice = AmesimPnor001("pnor_1", self.medium) forward = orifice.mass_flow(500000.0, 100000.0) reverse = orifice.mass_flow(100000.0, 500000.0) self.assertGreater(forward, 0.0) self.assertLess(reverse, 0.0) self.assertAlmostEqual(forward, -reverse) def test_cv_and_kv_modes_produce_positive_equivalent_area(self) -> None: cv_orifice = AmesimPnor001( "pnor_cv", self.medium, flowset=2.0, Cv=0.5, ) kv_orifice = AmesimPnor001( "pnor_kv", self.medium, flowset=3.0, Kv=0.4, ) self.assertGreater(cv_orifice.effective_area, 0.0) self.assertGreater(kv_orifice.effective_area, 0.0) if __name__ == "__main__": unittest.main()