实现test_mql PNL0003与PNL00R管路
This commit is contained in:
1 parent
c4c1b35dee
commit
568be2e632
6 files changed
+844
-68
No files matched your search
@@ -0,0 +1,109 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from PythonModels.components.amesim_pneumatic_line import (
|
||||
AmesimPnl0003Pipe,
|
||||
AmesimPnl00rPipe,
|
||||
)
|
||||
|
||||
|
||||
class AmesimPnl0003PipeTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.pipe = AmesimPnl0003Pipe(
|
||||
name="pneumatic_88",
|
||||
diameter_mm=20.0,
|
||||
length_m=0.3,
|
||||
relative_roughness=0.045 / 20.0,
|
||||
p1_0=15.3e6,
|
||||
p2_0=15.3e6,
|
||||
T1_0=293.15,
|
||||
T2_0=293.15,
|
||||
)
|
||||
|
||||
def test_initial_state_uses_two_half_volume_compliances(self) -> None:
|
||||
port_1 = self.pipe.properties_1()
|
||||
port_2 = self.pipe.properties_2()
|
||||
|
||||
self.assertAlmostEqual(self.pipe.volume, 9.424777960769381e-5)
|
||||
self.assertAlmostEqual(self.pipe.compliance_volume, self.pipe.volume / 2.0)
|
||||
self.assertEqual(len(self.pipe.get_state_vector()), 4)
|
||||
self.assertAlmostEqual(port_1.p, 15.3e6, delta=1.0e-5)
|
||||
self.assertAlmostEqual(port_2.p, 15.3e6, delta=1.0e-5)
|
||||
self.assertAlmostEqual(port_1.T, 293.15)
|
||||
self.assertAlmostEqual(port_2.T, 293.15)
|
||||
|
||||
def test_center_resistance_flow_follows_end_pressure_gradient(self) -> None:
|
||||
state = self.pipe.get_state_vector()
|
||||
state[0] *= 1.01
|
||||
state[1] *= 1.01
|
||||
self.pipe.set_state_vector(state)
|
||||
|
||||
forward = self.pipe.resistance_mass_flow()
|
||||
state[0] /= 1.01 * 1.01
|
||||
state[1] /= 1.01 * 1.01
|
||||
state[2] *= 1.01
|
||||
state[3] *= 1.01
|
||||
self.pipe.set_state_vector(state)
|
||||
reverse = self.pipe.resistance_mass_flow()
|
||||
|
||||
self.assertGreater(forward, 0.0)
|
||||
self.assertLess(reverse, 0.0)
|
||||
|
||||
def test_connection_derivatives_conserve_internal_center_flow_mass(self) -> None:
|
||||
state = self.pipe.get_state_vector()
|
||||
state[0] *= 1.01
|
||||
state[1] *= 1.01
|
||||
self.pipe.set_state_vector(state)
|
||||
|
||||
d1, d2 = self.pipe.derivatives_from_connections(
|
||||
port_1_m_flow=0.2,
|
||||
connected_h_1=self.pipe.properties_1().h + 1000.0,
|
||||
port_2_m_flow=-0.1,
|
||||
connected_h_2=self.pipe.properties_2().h - 1000.0,
|
||||
)
|
||||
|
||||
self.assertAlmostEqual(d1.m + d2.m, 0.1)
|
||||
|
||||
|
||||
class AmesimPnl00rPipeTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.pipe = AmesimPnl00rPipe(
|
||||
name="pneumatic_100",
|
||||
diameter_mm=14.0,
|
||||
length_m=1.0,
|
||||
relative_roughness=0.045 / 14.0,
|
||||
)
|
||||
|
||||
def test_stateless_resistance_flow_follows_pressure_gradient(self) -> None:
|
||||
forward = self.pipe.mass_flow(
|
||||
port_1_pressure_pa=15.31e6,
|
||||
port_1_temperature_k=293.15,
|
||||
port_2_pressure_pa=15.29e6,
|
||||
port_2_temperature_k=293.15,
|
||||
)
|
||||
reverse = self.pipe.mass_flow(
|
||||
port_1_pressure_pa=15.29e6,
|
||||
port_1_temperature_k=293.15,
|
||||
port_2_pressure_pa=15.31e6,
|
||||
port_2_temperature_k=293.15,
|
||||
)
|
||||
|
||||
self.assertGreater(forward, 0.0)
|
||||
self.assertLess(reverse, 0.0)
|
||||
self.assertAlmostEqual(abs(forward), abs(reverse), delta=abs(forward) * 0.01)
|
||||
|
||||
def test_diagnostics_expose_darcy_terms(self) -> None:
|
||||
diagnostics = self.pipe.diagnostics(
|
||||
mass_flow_kg_s=1.0e-4,
|
||||
pressure_pa=15.3e6,
|
||||
temperature_k=293.15,
|
||||
)
|
||||
|
||||
self.assertGreater(diagnostics.reynolds_number, 0.0)
|
||||
self.assertGreater(diagnostics.gas_velocity_m_s, 0.0)
|
||||
self.assertGreater(diagnostics.pressure_drop_pa, 0.0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -0,0 +1,94 @@
|
||||
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 import TestMqlSystem
|
||||
from PythonModels.systems.test_mql_line_parameters import (
|
||||
load_test_mql_pnl0003_specs,
|
||||
load_test_mql_pnl00r_specs,
|
||||
)
|
||||
from PythonModels.systems.test_mql_pneumatic_lines import (
|
||||
build_test_mql_pnl0003_assembly,
|
||||
build_test_mql_pnl00r_assembly,
|
||||
)
|
||||
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[1]
|
||||
TEST_MQL_AME = REPO_ROOT / "AmesimModels" / "test_mql.ame"
|
||||
|
||||
|
||||
class TestMqlPnl0003AndPnl00rTests(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls) -> None:
|
||||
cls.pnl0003_specs = load_test_mql_pnl0003_specs(TEST_MQL_AME)
|
||||
cls.pnl00r_specs = load_test_mql_pnl00r_specs(TEST_MQL_AME)
|
||||
cls.pnl0003_assembly = build_test_mql_pnl0003_assembly(TEST_MQL_AME)
|
||||
cls.pnl00r_assembly = build_test_mql_pnl00r_assembly(TEST_MQL_AME)
|
||||
cls.results = load_test_mql_amesim_results(TEST_MQL_AME)
|
||||
|
||||
def test_loads_all_real_pnl0003_parameters_from_cir(self) -> None:
|
||||
self.assertEqual(len(self.pnl0003_specs), 8)
|
||||
spec = self.pnl0003_assembly.spec("pneumatic_88")
|
||||
|
||||
self.assertEqual(spec.source_component, "pn_node3_9")
|
||||
self.assertEqual(spec.target_component, "pn_morifice_9")
|
||||
self.assertEqual(spec.diameter_mm, 20.0)
|
||||
self.assertEqual(spec.length_m, 0.3)
|
||||
self.assertAlmostEqual(spec.relative_roughness, 0.045 / 20.0)
|
||||
self.assertEqual(spec.gas_type_index, 1)
|
||||
self.assertEqual(spec.mode, 2)
|
||||
self.assertAlmostEqual(spec.initial_gauge_pressure_1_pa, 15_198_700.0)
|
||||
self.assertAlmostEqual(spec.initial_gauge_pressure_2_pa, 15_198_700.0)
|
||||
self.assertAlmostEqual(spec.initial_absolute_pressure_1_pa, 15_300_000.0)
|
||||
self.assertAlmostEqual(spec.initial_absolute_pressure_2_pa, 15_300_000.0)
|
||||
|
||||
def test_loads_all_real_pnl00r_parameters_from_cir(self) -> None:
|
||||
self.assertEqual(len(self.pnl00r_specs), 4)
|
||||
spec = self.pnl00r_assembly.spec("pneumatic_100")
|
||||
|
||||
self.assertEqual(spec.source_component, "pn_node3_9")
|
||||
self.assertEqual(spec.target_component, "pn_node3_10")
|
||||
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.gas_type_index, 1)
|
||||
|
||||
def test_builds_pnl0003_and_pnl00r_physical_line_components(self) -> None:
|
||||
self.assertEqual(len(self.pnl0003_assembly.lines), 8)
|
||||
self.assertEqual(len(self.pnl00r_assembly.lines), 4)
|
||||
self.assertTrue(
|
||||
all(len(line.get_state_vector()) == 4 for line in self.pnl0003_assembly.lines.values())
|
||||
)
|
||||
|
||||
def test_pneumatic_88_initial_observables_match_amesim_baseline(self) -> None:
|
||||
pipe = self.pnl0003_assembly.lines["pneumatic_88"]
|
||||
|
||||
self.assertAlmostEqual(
|
||||
pipe.properties_1().p - 101_300.0,
|
||||
self.results.series("p1@pneumatic_88")[0],
|
||||
delta=1.0e-5,
|
||||
)
|
||||
self.assertAlmostEqual(
|
||||
pipe.properties_2().p - 101_300.0,
|
||||
self.results.series("p2@pneumatic_88")[0],
|
||||
delta=1.0e-5,
|
||||
)
|
||||
self.assertAlmostEqual(
|
||||
pipe.gas_mass_g(),
|
||||
self.results.series("mgas@pneumatic_88")[0],
|
||||
delta=0.005,
|
||||
)
|
||||
|
||||
def test_system_exposes_real_pnl0003_and_pnl00r_assemblies(self) -> None:
|
||||
system = TestMqlSystem()
|
||||
|
||||
self.assertEqual(system.typed_pnl0003_line_count, 8)
|
||||
self.assertEqual(system.typed_pnl00r_line_count, 4)
|
||||
self.assertIn("pneumatic_88", system.pnl0003_assembly.lines)
|
||||
self.assertIn("pneumatic_100", system.pnl00r_assembly.lines)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user