拆解test_mql变容气室RHS

This commit is contained in:
huojiarong committed 2026-07-20 10:12:07 +00:00
1 parent a6e1faa2d8
commit 2c2952cff1
4 files changed
+205

No files matched your search

+115
View File
@@ -3856,6 +3856,23 @@ class TestMqlFullStateSnapshot:
return self.mechanical.state_count
@dataclass(frozen=True)
class TestMqlVariableChamberRhsDiagnostic:
chamber_alias: str
piston_alias: str
chamber_pressure_pa: float
chamber_temperature_k: float
chamber_volume_m3: float
chamber_volume_rate_m3_s: float
port_a_mass_flow_kg_s: float
port_b_mass_flow_kg_s: float
mass_derivative_kg_s: float
port_a_energy_flow_w: float
port_b_energy_flow_w: float
boundary_work_w: float
energy_derivative_w: float
_PISTON_FORCE_BINDINGS = (
("mass_friction_endstops_10", "pn_brp2_8", "p4_port3_remote_primary_chamber"),
("mass_friction_endstops_11", "pn_brp2_9", "p4_primary_chamber"),
@@ -3906,6 +3923,50 @@ _PNCH012_ALIAS_BY_SNAPSHOT_FIELD = {
}
_PRIMARY_CHAMBER_DIAGNOSTIC_FIELDS = {
"pn_c1_8": (
"p4_port3_remote_primary_chamber",
"p4_port3_remote_primary_line",
"p4_port3_remote_chamber_to_line_flow",
),
"pn_c1_9": (
"p4_primary_chamber",
"p4_primary_line",
"p4_primary_chamber_to_line_flow",
),
"pn_c1_10": (
"p4_port1_remote_primary_chamber",
"p4_port1_remote_primary_line",
"p4_port1_remote_chamber_to_line_flow",
),
"pn_c1_11": (
"p4_port1_far_primary_chamber",
"p4_port1_far_primary_line",
"p4_port1_far_chamber_to_line_flow",
),
"pn_c1_12": (
"p4_port1_next_primary_chamber",
"p4_port1_next_primary_line",
"p4_port1_next_chamber_to_line_flow",
),
"pn_c1_13": (
"p4_bridge_primary_chamber",
"p4_bridge_primary_line",
"p4_bridge_chamber_to_line_flow",
),
"pn_c1_14": (
"p4_port3_next_primary_chamber",
"p4_port3_next_primary_line",
"p4_port3_next_chamber_to_line_flow",
),
"pn_c1_15": (
"p4_port3_far_primary_chamber",
"p4_port3_far_primary_line",
"p4_port3_far_chamber_to_line_flow",
),
}
class TestMqlFullStateClosure:
def __init__(self, *, pneumatic_closure: object, mechanical_closure: object) -> None:
self.pneumatic_closure = pneumatic_closure
@@ -3988,6 +4049,60 @@ class TestMqlFullStateClosure:
),
)
def variable_chamber_rhs_diagnostic(
self,
*,
chamber_alias: str,
state_vector: list[float],
) -> TestMqlVariableChamberRhsDiagnostic:
if chamber_alias not in _PRIMARY_CHAMBER_DIAGNOSTIC_FIELDS:
raise KeyError(chamber_alias)
chamber_field, line_field, flow_field = _PRIMARY_CHAMBER_DIAGNOSTIC_FIELDS[
chamber_alias
]
piston_alias = next(
piston_alias
for _mass_alias, piston_alias, bound_chamber_field in _PISTON_FORCE_BINDINGS
if bound_chamber_field == chamber_field
)
snapshot = self.snapshot(state_vector)
chamber = getattr(self.pneumatic_closure.components, chamber_field)
chamber_properties = getattr(snapshot.pneumatic, chamber_field)
line_properties = getattr(snapshot.pneumatic, line_field)
chamber_to_line_flow = getattr(snapshot.pneumatic, flow_field)
port_a_mass_flow = -chamber_to_line_flow
port_b_mass_flow = 0.0
port_a_inlet_h = chamber.connection_inlet_enthalpy(
port_m_flow=port_a_mass_flow,
connected_h=line_properties.h,
internal_h=chamber_properties.h,
)
port_b_inlet_h = chamber.connection_inlet_enthalpy(
port_m_flow=port_b_mass_flow,
connected_h=chamber_properties.h,
internal_h=chamber_properties.h,
)
port_a_energy_flow = port_a_mass_flow * port_a_inlet_h
port_b_energy_flow = port_b_mass_flow * port_b_inlet_h
boundary_work = -chamber_properties.p * chamber.volume_rate_m3_s()
return TestMqlVariableChamberRhsDiagnostic(
chamber_alias=chamber_alias,
piston_alias=piston_alias,
chamber_pressure_pa=chamber_properties.p,
chamber_temperature_k=chamber_properties.T,
chamber_volume_m3=chamber.volume,
chamber_volume_rate_m3_s=chamber.volume_rate_m3_s(),
port_a_mass_flow_kg_s=port_a_mass_flow,
port_b_mass_flow_kg_s=port_b_mass_flow,
mass_derivative_kg_s=port_a_mass_flow + port_b_mass_flow,
port_a_energy_flow_w=port_a_energy_flow,
port_b_energy_flow_w=port_b_energy_flow,
boundary_work_w=boundary_work,
energy_derivative_w=(
port_a_energy_flow + port_b_energy_flow + boundary_work
),
)
def data_path_values(
self,
*,