接入test_mql PNVO阶跃控制与流量诊断
This commit is contained in:
1 parent
65f6d6dd87
commit
7c68caed27
7 files changed
+298
-24
No files matched your search
@@ -29,7 +29,11 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
|
||||
output_dir=output_dir,
|
||||
),
|
||||
execution=TestMqlFullStateComparisonExecutionConfig(
|
||||
data_paths=("press@pn_c1_8", "vol1@pn_brp2_8"),
|
||||
data_paths=(
|
||||
"press@pn_c1_8",
|
||||
"vol1@pn_brp2_8",
|
||||
"dm1@pneumatic_69",
|
||||
),
|
||||
solver=SolveIVPConfig(t_start=0.0, t_stop=0.0),
|
||||
t_eval=(0.0,),
|
||||
),
|
||||
@@ -44,7 +48,7 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
|
||||
|
||||
self.assertEqual(returned_output_dir, output_dir)
|
||||
self.assertEqual(run.sample_count, 1)
|
||||
self.assertEqual(run.signal_count, 2)
|
||||
self.assertEqual(run.signal_count, 3)
|
||||
self.assertAlmostEqual(run.comparison.max_abs_error, 0.0, delta=1.0e-8)
|
||||
self.assertEqual(
|
||||
run.metrics_by_max_abs_error()[0].data_path,
|
||||
@@ -59,6 +63,14 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
|
||||
run.diagnostics_by_final_abs_error()[0].data_path,
|
||||
"press@pn_c1_8",
|
||||
)
|
||||
flow_diagnostic = run.pnl0001_mass_flow_diagnostic()
|
||||
self.assertEqual(flow_diagnostic.data_path, "dm1@pneumatic_69")
|
||||
self.assertAlmostEqual(flow_diagnostic.initial_python_dm1_g_s, 0.0)
|
||||
self.assertAlmostEqual(flow_diagnostic.initial_amesim_dm1_g_s, 0.0)
|
||||
self.assertAlmostEqual(
|
||||
flow_diagnostic.initial_python_canonical_kg_s,
|
||||
-flow_diagnostic.initial_python_dm1_g_s * 1.0e-3,
|
||||
)
|
||||
chamber_diagnostic = run.chamber_rhs_diagnostic("pn_c1_8")
|
||||
self.assertEqual(chamber_diagnostic.chamber_alias, "pn_c1_8")
|
||||
self.assertEqual(chamber_diagnostic.piston_alias, "pn_brp2_8")
|
||||
@@ -71,11 +83,16 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
|
||||
)
|
||||
self.assertTrue(csv_summary_exists)
|
||||
self.assertIn("Mode: Python 132 full-state closure comparison", summary)
|
||||
self.assertIn("Compared signals: 2", summary)
|
||||
self.assertIn("Compared signals: 3", summary)
|
||||
self.assertIn("Largest absolute error: press@pn_c1_8=", summary)
|
||||
self.assertIn("Largest final endpoint error: press@pn_c1_8=", summary)
|
||||
self.assertIn("Metrics by max absolute error:", summary)
|
||||
self.assertIn("Endpoint diagnostics by final absolute error:", summary)
|
||||
self.assertIn(
|
||||
"PNL0001 canonical mass-flow diagnostic: dm1@pneumatic_69",
|
||||
summary,
|
||||
)
|
||||
self.assertIn("equals -AMESim dm1 * 1e-3", summary)
|
||||
self.assertIn("Largest endpoint chamber RHS breakdown: pn_c1_8", summary)
|
||||
self.assertIn("piston_alias=pn_brp2_8", summary)
|
||||
self.assertIn("mass_derivative_kg_s=", summary)
|
||||
@@ -84,6 +101,7 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase):
|
||||
self.assertIn("final_amesim=", summary)
|
||||
self.assertIn("python.press@pn_c1_8", csv_header)
|
||||
self.assertIn("amesim.vol1@pn_brp2_8", csv_header)
|
||||
self.assertIn("python.dm1@pneumatic_69", csv_header)
|
||||
|
||||
def test_full_state_script_can_skip_artifact_files(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
|
||||
@@ -69,6 +69,14 @@ class TestMqlPneumaticAssemblyTests(unittest.TestCase):
|
||||
self.assertAlmostEqual(fixed_orifice.flow_coefficient, 0.9)
|
||||
self.assertAlmostEqual(variable_orifice.area, 78.5e-6)
|
||||
self.assertAlmostEqual(variable_orifice.flow_coefficient, 0.45)
|
||||
self.assertAlmostEqual(variable_orifice.opening, 0.0)
|
||||
self.assertEqual(assembly.variable_orifice_control_count, 8)
|
||||
control = assembly.variable_orifice_controls["pn_morifice_11"]
|
||||
self.assertEqual(control.step.alias, "step_8")
|
||||
self.assertAlmostEqual(control.opening_at(0.0), 0.0)
|
||||
self.assertAlmostEqual(control.opening_at(0.039), 0.0)
|
||||
self.assertAlmostEqual(control.opening_at(0.04), 1.0)
|
||||
assembly.set_variable_orifice_openings(0.04)
|
||||
self.assertAlmostEqual(variable_orifice.opening, 1.0)
|
||||
|
||||
def test_chamber_initial_observables_match_amesim_results(self) -> None:
|
||||
|
||||
@@ -199,6 +199,8 @@ class TestMqlPn3NodeChamberSegmentTests(unittest.TestCase):
|
||||
state = closure.initial_state_vector()
|
||||
state[4] *= 0.99
|
||||
state[5] *= 0.99
|
||||
self.assertAlmostEqual(closure.components.node_orifice.opening, 0.0)
|
||||
closure.components.node_orifice.opening = 1.0
|
||||
|
||||
snapshot = closure.snapshot(state)
|
||||
rhs = closure.rhs(state)
|
||||
@@ -710,6 +712,39 @@ class TestMqlPn3P4NodeChamberSegmentTests(unittest.TestCase):
|
||||
+ diagnostic.boundary_work_w,
|
||||
)
|
||||
|
||||
def test_full_state_closure_applies_step_controls_to_variable_orifices(self) -> None:
|
||||
closure = self.system.full_state_closure_from_spec(
|
||||
self.spec,
|
||||
inlet_node_pressure_pa=15.31e6,
|
||||
resistance_boundary_pressure_pa=15.29e6,
|
||||
)
|
||||
state = closure.initial_state_vector()
|
||||
|
||||
closed_snapshot = closure.snapshot_at(0.0, state).pneumatic
|
||||
open_snapshot = closure.snapshot_at(0.04, state).pneumatic
|
||||
|
||||
self.assertAlmostEqual(
|
||||
closed_snapshot.p4_port3_remote_node_to_primary_line_flow,
|
||||
0.0,
|
||||
)
|
||||
self.assertGreater(
|
||||
open_snapshot.p4_port3_remote_node_to_primary_line_flow,
|
||||
0.0,
|
||||
)
|
||||
self.assertAlmostEqual(
|
||||
self.system.pneumatic_assembly.variable_orifices[
|
||||
"pn_morifice_1"
|
||||
].opening,
|
||||
1.0,
|
||||
)
|
||||
closure.snapshot_at(0.0, state)
|
||||
self.assertAlmostEqual(
|
||||
self.system.pneumatic_assembly.variable_orifices[
|
||||
"pn_morifice_1"
|
||||
].opening,
|
||||
0.0,
|
||||
)
|
||||
|
||||
def test_simulates_full_state_key_data_paths_for_amesim_comparison(self) -> None:
|
||||
data_paths = (
|
||||
"press@pn_c1_8",
|
||||
@@ -1105,6 +1140,8 @@ class TestMqlPn3P4NodeChamberSegmentTests(unittest.TestCase):
|
||||
resistance_boundary_pressure_pa=15.29e6,
|
||||
)
|
||||
|
||||
self.assertAlmostEqual(closure.components.node_orifice.opening, 0.0)
|
||||
closure.components.node_orifice.opening = 1.0
|
||||
snapshot = closure.snapshot()
|
||||
rhs = closure.rhs(closure.initial_state_vector())
|
||||
|
||||
|
||||
Reference in new issue
Block a user