接入AMESim help文档与PNVO流量诊断

This commit is contained in:
huojiarong committed 2026-07-22 08:56:04 +00:00
1 parent f0f8f40c7a
commit 84d1675292
17 files changed
+450 -7

No files matched your search

+11
View File
@@ -137,6 +137,17 @@ class AmesimPneumaticComponentsTest(unittest.TestCase):
self.assertAlmostEqual(derivative.m, 0.0)
self.assertAlmostEqual(derivative.U, -props.p * 2.0e-6)
def test_orifice_effective_area_clamps_opening(self) -> None:
orifice = AmesimPneumaticOrifice.from_mm2(
name="pn_variable_orifice",
area_mm2=78.5,
opening=1.4,
)
self.assertAlmostEqual(orifice.effective_area, 78.5e-6)
orifice.opening = -0.25
self.assertAlmostEqual(orifice.effective_area, 0.0)
def test_orifice_returns_signed_mass_flow(self) -> None:
orifice = AmesimPneumaticOrifice.from_mm2(
name="pn_orifice_18",
+30
View File
@@ -39,6 +39,26 @@ class AmesimPnl0001PipeTests(unittest.TestCase):
self.assertLess(reverse, 0.0)
self.assertAlmostEqual(abs(forward), abs(reverse), delta=abs(forward) * 0.01)
def test_calibrated_linear_conductance_overrides_darcy_flow(self) -> None:
pipe = AmesimPnl0001Pipe(
name="linear",
diameter_mm=20.0,
length_m=1.0,
relative_roughness=0.045 / 20.0,
calibrated_linear_conductance=5.5636e-6,
p0=200000.0,
T0=293.15,
)
flow = pipe.resistance_mass_flow(
port_1_pressure_pa=180000.0,
port_1_temperature_k=293.15,
)
self.assertAlmostEqual(
flow,
5.5636e-6 * (180000.0 - 200000.0) / (293.15 ** 0.5),
)
def test_diagnostics_reproduce_laminar_friction_contract(self) -> None:
diagnostics = self.pipe.diagnostics(mass_flow_kg_s=8.90603914774626e-6)
@@ -51,6 +71,16 @@ class AmesimPnl0001PipeTests(unittest.TestCase):
self.assertGreater(diagnostics.gas_velocity_m_s, 0.0)
self.assertGreater(diagnostics.pressure_drop_pa, 0.0)
def test_darcy_pressure_drop_for_state_uses_supplied_density_state(self) -> None:
diagnostics = self.pipe.diagnostics(mass_flow_kg_s=8.90603914774626e-6)
pressure_drop = self.pipe.darcy_pressure_drop_for_state(
mass_flow_kg_s=8.90603914774626e-6,
pressure_pa=self.pipe.properties().p,
temperature_k=self.pipe.properties().T,
)
self.assertAlmostEqual(pressure_drop, diagnostics.pressure_drop_pa)
def test_connection_derivative_preserves_mass_and_stream_direction(self) -> None:
internal = self.pipe.properties()
derivative = self.pipe.derivatives_from_connections(
@@ -11,9 +11,11 @@ from PythonModels.scripts.run_test_mql_full_state_comparison import (
TestMqlFullStateComparisonExecutionConfig,
TestMqlFullStateComparisonPathConfig,
TestMqlFullStateComparisonScriptConfig,
TestMqlPnl0001PressureLossCalibrationDiagnostic,
TestMqlPnvoEventBoundaryDiagnostic,
TestMqlPnvoEventWindowDiagnostic,
TestMqlPnvoEventWindowSampleDiagnostic,
TestMqlPnvoFlowParameterDiagnostic,
TestMqlPnvoEventWindowSegmentDiagnostic,
format_test_mql_full_state_comparison_summary,
format_test_mql_pnvo_event_boundary_summary,
@@ -241,6 +243,45 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
energy_derivative_w=-20000.0,
),
),
pnl0001_pressure_loss_diagnostics=(
TestMqlPnl0001PressureLossCalibrationDiagnostic(
line_alias="pneumatic_69",
chamber_alias="pn_c1_8",
time_s=0.05,
amesim_cm=0.0159,
amesim_dm1_g_s=419.9,
amesim_mass_flow_magnitude_kg_s=0.4199,
amesim_line_gauge_pressure_pa=1484689.6,
amesim_chamber_gauge_pressure_pa=187060.0,
amesim_line_temperature_k=296.1,
amesim_pressure_drop_pa=1297629.6,
current_darcy_pressure_drop_pa=422633.2,
pressure_drop_multiplier=3.07,
amesim_linear_conductance_kg_s_sqrt_k_per_pa=5.56e-6,
python_linear_conductance_kg_s_sqrt_k_per_pa=1.06e-5,
python_to_amesim_linear_conductance_ratio=1.91,
),
),
pnvo_flow_parameter_diagnostics=(
TestMqlPnvoFlowParameterDiagnostic(
orifice_alias="pn_morifice_1",
time_s=0.05,
amesim_cm=0.0158,
amesim_dm2_g_s=456.8,
amesim_opening=1.0,
amesim_gas_velocity_m_s=885.9,
python_opening=1.0,
python_flow_coefficient=0.45,
python_effective_area_m2=78.5e-6,
python_line_pressure_pa=15310000.0,
python_boundary_pressure_pa=1586000.0,
python_upstream_pressure_pa=15310000.0,
python_upstream_temperature_k=293.15,
python_mass_flow_kg_s=0.4637,
python_cm=0.0147,
python_to_amesim_cm_ratio=0.93,
),
),
)
diagnostic = TestMqlPnvoEventWindowDiagnostic(
orifice_alias="pn_morifice_1",
@@ -275,6 +316,17 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
self.assertIn("rhs=8154", summary)
self.assertIn("rhs@pneumatic_69", summary)
self.assertIn("dm_dt=-0.0222", summary)
self.assertIn("pressure_loss@pneumatic_69", summary)
self.assertIn("cm=0.0159", summary)
self.assertIn("dp_multiplier=3.07", summary)
self.assertIn("amesim_linear_k=5.56e-06", summary)
self.assertIn("python_linear_k=1.06e-05", summary)
self.assertIn("linear_k_ratio=1.91", summary)
self.assertIn("flow_parameter@pn_morifice_1", summary)
self.assertIn("amesim_cm=0.0158", summary)
self.assertIn("python_cm=0.0147", summary)
self.assertIn("cm_ratio=0.93", summary)
self.assertIn("amesim_gasvel=885.9", summary)
self.assertIn("Final comparison:", summary)
self.assertTrue(summary.endswith("\n"))
+33
View File
@@ -6,6 +6,7 @@ from pathlib import Path
from PythonModels.reporting.amesim_results import load_test_mql_amesim_results
from PythonModels.systems.test_mql_line_parameters import load_test_mql_pnl0001_specs
from PythonModels.systems.test_mql_pneumatic_lines import (
TEST_MQL_PNL0001_D20_L1_LINEAR_CONDUCTANCE,
build_test_mql_pnl0001_assembly,
)
@@ -44,6 +45,38 @@ class TestMqlPnl0001Tests(unittest.TestCase):
all(len(line.get_state_vector()) == 2 for line in self.assembly.lines.values())
)
def test_calibrates_primary_d20_chamber_lines_only(self) -> None:
calibrated_aliases = {
alias
for alias, line in self.assembly.lines.items()
if line.calibrated_linear_conductance is not None
}
self.assertEqual(
calibrated_aliases,
{
"pneumatic_65",
"pneumatic_66",
"pneumatic_68",
"pneumatic_69",
"pneumatic_71",
"pneumatic_72",
"pneumatic_73",
"pneumatic_74",
},
)
for alias in calibrated_aliases:
self.assertAlmostEqual(
self.assembly.lines[alias].calibrated_linear_conductance,
TEST_MQL_PNL0001_D20_L1_LINEAR_CONDUCTANCE,
)
self.assertIsNone(
self.assembly.lines["pneumatic_70"].calibrated_linear_conductance
)
self.assertIsNone(
self.assembly.lines["pneumatic_96"].calibrated_linear_conductance
)
def test_pneumatic_96_initial_observables_match_amesim_baseline(self) -> None:
pipe = self.assembly.lines["pneumatic_96"]