接入test_mql PNVO阶跃控制与流量诊断

This commit is contained in:
huojiarong committed 2026-07-21 07:28:28 +00:00
1 parent 65f6d6dd87
commit 7c68caed27
7 files changed
+298 -24

No files matched your search

@@ -34,6 +34,7 @@ DEFAULT_FULL_STATE_COMPARISON_DATA_PATHS = (
"x1@mass_friction_endstops_18",
"v1@mass_friction_endstops_18",
"acc1@mass_friction_endstops_18",
"dm1@pneumatic_69",
)
@@ -50,6 +51,23 @@ class TestMqlFullStateSignalDiagnostic:
final_abs_error: float
@dataclass(frozen=True)
class TestMqlFullStateFlowDiagnostic:
data_path: str
initial_time_s: float
final_time_s: float
initial_python_dm1_g_s: float
initial_amesim_dm1_g_s: float
initial_python_canonical_kg_s: float
initial_amesim_canonical_kg_s: float
initial_canonical_abs_error_kg_s: float
final_python_dm1_g_s: float
final_amesim_dm1_g_s: float
final_python_canonical_kg_s: float
final_amesim_canonical_kg_s: float
final_canonical_abs_error_kg_s: float
@dataclass(frozen=True)
class TestMqlFullStateComparisonRun:
system: TestMqlSystem
@@ -112,6 +130,35 @@ class TestMqlFullStateComparisonRun:
final_abs_error=abs(final_python - final_amesim),
)
def pnl0001_mass_flow_diagnostic(
self,
data_path: str = "dm1@pneumatic_69",
) -> TestMqlFullStateFlowDiagnostic:
diagnostic = self.signal_diagnostic(data_path)
initial_python_canonical = -diagnostic.initial_python_value * 1.0e-3
initial_amesim_canonical = -diagnostic.initial_amesim_value * 1.0e-3
final_python_canonical = -diagnostic.final_python_value * 1.0e-3
final_amesim_canonical = -diagnostic.final_amesim_value * 1.0e-3
return TestMqlFullStateFlowDiagnostic(
data_path=data_path,
initial_time_s=diagnostic.initial_time_s,
final_time_s=diagnostic.final_time_s,
initial_python_dm1_g_s=diagnostic.initial_python_value,
initial_amesim_dm1_g_s=diagnostic.initial_amesim_value,
initial_python_canonical_kg_s=initial_python_canonical,
initial_amesim_canonical_kg_s=initial_amesim_canonical,
initial_canonical_abs_error_kg_s=abs(
initial_python_canonical - initial_amesim_canonical
),
final_python_dm1_g_s=diagnostic.final_python_value,
final_amesim_dm1_g_s=diagnostic.final_amesim_value,
final_python_canonical_kg_s=final_python_canonical,
final_amesim_canonical_kg_s=final_amesim_canonical,
final_canonical_abs_error_kg_s=abs(
final_python_canonical - final_amesim_canonical
),
)
def diagnostics_by_final_abs_error(self):
return tuple(
sorted(
@@ -134,6 +181,7 @@ class TestMqlFullStateComparisonRun:
return self.closure.variable_chamber_rhs_diagnostic(
chamber_alias=chamber_alias,
state_vector=state_vector,
time_s=float(self.result.t[sample_index]),
)
@@ -298,6 +346,28 @@ def format_test_mql_full_state_comparison_summary(
f"final_amesim={diagnostic.final_amesim_value}, "
f"final_abs_error={diagnostic.final_abs_error}"
)
flow_diagnostic = _pneumatic_69_flow_diagnostic(run)
if flow_diagnostic is not None:
lines.append(
"PNL0001 canonical mass-flow diagnostic: "
f"{flow_diagnostic.data_path}"
)
lines.extend(
[
" - convention=Python chamber-to-line flow "
"equals -AMESim dm1 * 1e-3",
f" - initial_python_kg_s="
f"{flow_diagnostic.initial_python_canonical_kg_s}",
f" - initial_amesim_kg_s="
f"{flow_diagnostic.initial_amesim_canonical_kg_s}",
f" - final_python_kg_s="
f"{flow_diagnostic.final_python_canonical_kg_s}",
f" - final_amesim_kg_s="
f"{flow_diagnostic.final_amesim_canonical_kg_s}",
f" - final_abs_error_kg_s="
f"{flow_diagnostic.final_canonical_abs_error_kg_s}",
]
)
chamber_diagnostic = _largest_chamber_rhs_diagnostic(run)
if chamber_diagnostic is not None:
lines.append(
@@ -319,6 +389,13 @@ def format_test_mql_full_state_comparison_summary(
return "\n".join(lines) + "\n"
def _pneumatic_69_flow_diagnostic(run: TestMqlFullStateComparisonRun):
try:
return run.pnl0001_mass_flow_diagnostic()
except KeyError:
return None
def _largest_chamber_rhs_diagnostic(run: TestMqlFullStateComparisonRun):
diagnostic = run.largest_final_abs_error_diagnostic
if diagnostic is None or "@" not in diagnostic.data_path: