from __future__ import annotations import unittest from app.simulation.components.amesim.storage.chambers import AmesimPnch012 from app.simulation.core.medium import IdealGasMedium from app.simulation.registry import COMPONENT_MODEL_REGISTRY class AmesimPnch012ComponentTests(unittest.TestCase): def setUp(self) -> None: self.medium = IdealGasMedium() def test_default_create_preserves_parameterized_volume_contract(self) -> None: chamber = COMPONENT_MODEL_REGISTRY["amesim_pnch012"].create( "chamber_1", self.medium, {}, ) self.assertIsInstance(chamber, AmesimPnch012) self.assertEqual(set(chamber.ports), {"port_1", "port_2", "port_3", "port_4"}) self.assertEqual(len(chamber.get_state_vector()), 2) self.assertEqual(chamber.parameter_values["cvol0"], 0.015) self.assertAlmostEqual(chamber.total_volume(), 0.015) def test_total_volume_adds_four_external_volume_parameters(self) -> None: chamber = AmesimPnch012( "chamber_1", self.medium, cvol0=0.015, vol1=0.001, vol2=0.002, vol3=0.003, vol4=0.004, dvol1=1.0e-6, dvol2=2.0e-6, dvol3=-1.0e-6, dvol4=0.0, ) self.assertAlmostEqual(chamber.total_volume(), 0.025) self.assertAlmostEqual(chamber.total_volume_rate(), 2.0e-6) def test_initial_state_uses_total_volume_pressure_and_temperature(self) -> None: chamber = AmesimPnch012( "chamber_1", self.medium, cvol0=0.015, vol1=0.010, p0=200000.0, T0=300.0, ) props = chamber.properties() self.assertAlmostEqual(props.p, 200000.0, delta=1.0e-8) self.assertAlmostEqual(props.T, 300.0) self.assertAlmostEqual(chamber.port_1.p, props.p) self.assertAlmostEqual(chamber.port_4.p, props.p) def test_pressure_flow_residuals_bind_all_ports_to_chamber_state(self) -> None: chamber = AmesimPnch012("chamber_1", self.medium) chamber.properties() residuals = { residual.id.rsplit(":", 1)[1]: residual for residual in chamber.pressure_flow_equation_residuals() } self.assertEqual( set(residuals), { "port_1_pressure_state", "port_2_pressure_state", "port_3_pressure_state", "port_4_pressure_state", }, ) self.assertTrue(all(abs(residual.value) < 1.0e-9 for residual in residuals.values())) def test_derivative_sums_four_mass_flows_and_boundary_work(self) -> None: chamber = AmesimPnch012( "chamber_1", self.medium, dvol1=1.0e-6, kth=2.0, sth=0.5, extemp=310.0, ) props = chamber.properties() chamber.port_1.m_flow = 0.2 chamber.port_2.m_flow = -0.1 chamber.port_3.m_flow = 0.05 chamber.port_4.m_flow = 0.0 derivative = chamber.state_derivative_from_ports( { "port_1": props.h + 1000.0, "port_2": props.h - 1000.0, "port_3": props.h + 500.0, "port_4": props.h, } ) self.assertAlmostEqual(derivative[0], 0.15) self.assertLess(derivative[1], 0.2 * (props.h + 1000.0) + 0.05 * (props.h + 500.0)) def test_results_include_total_volume_and_volume_rate(self) -> None: chamber = AmesimPnch012("chamber_1", self.medium, vol1=0.001, dvol1=1.0e-6) values = chamber.component_result_values() self.assertIn("vol", values) self.assertIn("dvol", values) self.assertAlmostEqual(values["vol"], 0.016) self.assertAlmostEqual(values["dvol"], 1.0e-6) if __name__ == "__main__": unittest.main()