112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
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, "must be one of"):
|
|
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_exact_repeated_flow_characteristics_are_cached(self) -> None:
|
|
orifice = AmesimPnor001("pnor_1", self.medium)
|
|
orifice._one_way_flow_characteristics.cache_clear()
|
|
|
|
first = orifice._one_way_flow_characteristics(
|
|
upstream_pressure=500000.0,
|
|
downstream_pressure=100000.0,
|
|
upstream_temperature=293.15,
|
|
)
|
|
after_first = orifice._one_way_flow_characteristics.cache_info()
|
|
second = orifice._one_way_flow_characteristics(
|
|
upstream_pressure=500000.0,
|
|
downstream_pressure=100000.0,
|
|
upstream_temperature=293.15,
|
|
)
|
|
|
|
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_high_pressure_near_equal_flow_is_continuous(self) -> None:
|
|
orifice = AmesimPnor001("pnor_1", self.medium)
|
|
orifice.port_1.p = 15.3e6
|
|
orifice.port_2.p = 15.3e6
|
|
|
|
small = orifice.mass_flow(15.3e6 + 0.1, 15.3e6)
|
|
larger = orifice.mass_flow(15.3e6 + 1.0, 15.3e6)
|
|
|
|
self.assertGreater(small, 0.0)
|
|
self.assertGreater(larger, small)
|
|
|
|
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()
|