diff --git a/PythonModels/scripts/run_test_mql_full_state_comparison.py b/PythonModels/scripts/run_test_mql_full_state_comparison.py index 8b6a4ca..c3419ed 100644 --- a/PythonModels/scripts/run_test_mql_full_state_comparison.py +++ b/PythonModels/scripts/run_test_mql_full_state_comparison.py @@ -573,6 +573,41 @@ class TestMqlPnch012EnergyEquationDiagnostic: reference_temperature_k: float +@dataclass(frozen=True) +class TestMqlPneumatic96InletLineDiagnostic: + line_alias: str + node_alias: str + orifice_alias: str + chamber_alias: str + time_s: float + amesim_line_pressure_pa: float + amesim_line_temperature_k: float + amesim_line_mass_g: float + amesim_line_mass_derivative_fd_g_s: float + amesim_line_to_node_mass_flow_g_s: float + amesim_orifice_to_line_mass_flow_g_s: float + amesim_storage_mass_derivative_from_ports_g_s: float + amesim_storage_mass_derivative_residual_g_s: float + amesim_chamber_pressure_pa: float + amesim_chamber_temperature_k: float + python_line_pressure_pa: float + python_line_temperature_k: float + python_line_mass_g: float + python_line_pressure_error_pa: float + python_line_temperature_error_k: float + python_line_mass_error_g: float + python_line_to_node_mass_flow_g_s: float + python_line_to_node_mass_flow_error_g_s: float + python_orifice_to_line_mass_flow_g_s: float + python_orifice_to_line_mass_flow_error_g_s: float + python_storage_mass_derivative_g_s: float + python_storage_mass_derivative_error_g_s: float + python_chamber_pressure_pa: float + python_chamber_temperature_k: float + python_chamber_pressure_error_pa: float + python_chamber_temperature_error_k: float + + @dataclass(frozen=True) class TestMqlPnvoEventWindowSampleDiagnostic: time_s: float @@ -602,6 +637,9 @@ class TestMqlPnvoEventWindowSampleDiagnostic: pnl0003_energy_diagnostics: tuple[ TestMqlPnl0003EnergyDiagnostic, ... ] = field(default_factory=tuple) + pneumatic_96_inlet_line_diagnostics: tuple[ + TestMqlPneumatic96InletLineDiagnostic, ... + ] = field(default_factory=tuple) pnch012_energy_equation_diagnostics: tuple[ TestMqlPnch012EnergyEquationDiagnostic, ... ] = field(default_factory=tuple) @@ -2424,6 +2462,109 @@ def _pnl0003_energy_diagnostic( ) +def _pneumatic_96_inlet_line_diagnostic( + *, + closure: object, + amesim_results: AmesimResults, + state_vector: list[float], + line_alias: str, + node_alias: str, + orifice_alias: str, + chamber_alias: str, + time_s: float, +) -> TestMqlPneumatic96InletLineDiagnostic: + if line_alias != "pneumatic_96": + raise KeyError(f"Unsupported inlet line diagnostic: {line_alias}") + if node_alias != "pn_node3_8" or orifice_alias != "pn_orifice_18": + raise KeyError( + f"Unsupported inlet path diagnostic: {node_alias}/{orifice_alias}" + ) + + snapshot = closure.snapshot_at(time_s, state_vector).pneumatic + line = closure.pneumatic_closure.components.inlet_line + + def amesim_value(data_path: str) -> float: + return interpolate_series_value( + amesim_results.times, + amesim_results.series(data_path), + time_s, + ) + + amesim_line_pressure = ( + amesim_value(f"p2@{line_alias}") + AMESIM_REFERENCE_PRESSURE_PA + ) + amesim_line_temperature = amesim_value(f"t2@{line_alias}") + amesim_line_mass = amesim_value(f"mgas@{line_alias}") + amesim_line_mass_fd = _series_finite_difference_at( + times=amesim_results.times, + values=amesim_results.series(f"mgas@{line_alias}"), + time_s=time_s, + ) + amesim_line_to_node_flow = amesim_value(f"dm1@{line_alias}") + amesim_orifice_to_line_flow = amesim_value(f"dm2@{orifice_alias}") + amesim_storage_from_ports = ( + amesim_orifice_to_line_flow - amesim_line_to_node_flow + ) + amesim_chamber_pressure = ( + amesim_value(f"press@{chamber_alias}") + AMESIM_REFERENCE_PRESSURE_PA + ) + amesim_chamber_temperature = amesim_value(f"temp@{chamber_alias}") + + python_line_to_node_flow = -snapshot.inlet_node_to_line_flow * 1.0e3 + python_orifice_to_line_flow = -snapshot.inlet_line_to_chamber_flow * 1.0e3 + python_storage_derivative = ( + snapshot.inlet_node_to_line_flow - snapshot.inlet_line_to_chamber_flow + ) * 1.0e3 + + return TestMqlPneumatic96InletLineDiagnostic( + line_alias=line_alias, + node_alias=node_alias, + orifice_alias=orifice_alias, + chamber_alias=chamber_alias, + time_s=time_s, + amesim_line_pressure_pa=amesim_line_pressure, + amesim_line_temperature_k=amesim_line_temperature, + amesim_line_mass_g=amesim_line_mass, + amesim_line_mass_derivative_fd_g_s=amesim_line_mass_fd, + amesim_line_to_node_mass_flow_g_s=amesim_line_to_node_flow, + amesim_orifice_to_line_mass_flow_g_s=amesim_orifice_to_line_flow, + amesim_storage_mass_derivative_from_ports_g_s=amesim_storage_from_ports, + amesim_storage_mass_derivative_residual_g_s=( + amesim_storage_from_ports - amesim_line_mass_fd + ), + amesim_chamber_pressure_pa=amesim_chamber_pressure, + amesim_chamber_temperature_k=amesim_chamber_temperature, + python_line_pressure_pa=snapshot.inlet_line.p, + python_line_temperature_k=snapshot.inlet_line.T, + python_line_mass_g=line.state.m * 1.0e3, + python_line_pressure_error_pa=snapshot.inlet_line.p - amesim_line_pressure, + python_line_temperature_error_k=( + snapshot.inlet_line.T - amesim_line_temperature + ), + python_line_mass_error_g=line.state.m * 1.0e3 - amesim_line_mass, + python_line_to_node_mass_flow_g_s=python_line_to_node_flow, + python_line_to_node_mass_flow_error_g_s=( + python_line_to_node_flow - amesim_line_to_node_flow + ), + python_orifice_to_line_mass_flow_g_s=python_orifice_to_line_flow, + python_orifice_to_line_mass_flow_error_g_s=( + python_orifice_to_line_flow - amesim_orifice_to_line_flow + ), + python_storage_mass_derivative_g_s=python_storage_derivative, + python_storage_mass_derivative_error_g_s=( + python_storage_derivative - amesim_storage_from_ports + ), + python_chamber_pressure_pa=snapshot.chamber.p, + python_chamber_temperature_k=snapshot.chamber.T, + python_chamber_pressure_error_pa=( + snapshot.chamber.p - amesim_chamber_pressure + ), + python_chamber_temperature_error_k=( + snapshot.chamber.T - amesim_chamber_temperature + ), + ) + + def _pnch012_energy_equation_diagnostic( *, closure: object, @@ -2836,6 +2977,18 @@ def run_test_mql_pnvo_event_window_diagnostic( time_s=sample_time, ), ) + pneumatic_96_inlet_line_diagnostics = ( + _pneumatic_96_inlet_line_diagnostic( + closure=closure, + amesim_results=amesim_results, + state_vector=state_vector_by_sample_time[sample_time], + line_alias="pneumatic_96", + node_alias="pn_node3_8", + orifice_alias="pn_orifice_18", + chamber_alias="pn_general_chamber", + time_s=sample_time, + ), + ) pnch012_rhs_diagnostics = ( closure.variable_chamber_rhs_diagnostic( chamber_alias="pn_c1_8", @@ -2878,6 +3031,9 @@ def run_test_mql_pnvo_event_window_diagnostic( pnvo_upstream_enthalpy_diagnostics ), pnl0003_energy_diagnostics=pnl0003_energy_diagnostics, + pneumatic_96_inlet_line_diagnostics=( + pneumatic_96_inlet_line_diagnostics + ), pnch012_energy_equation_diagnostics=( pnch012_energy_equation_diagnostics ), @@ -3037,6 +3193,39 @@ def format_test_mql_pnvo_event_window_summary( f"python_real_ref_dh2_error=" f"{pnvo_enthalpy.python_real_gas_reference_port_2_enthalpy_error_w}" ) + for inlet_line in sample.pneumatic_96_inlet_line_diagnostics: + lines.append( + f" - inlet_line@{inlet_line.line_alias}: " + f"node={inlet_line.node_alias}, " + f"orifice={inlet_line.orifice_alias}, " + f"chamber={inlet_line.chamber_alias}, " + f"amesim_p2_abs={inlet_line.amesim_line_pressure_pa}, " + f"amesim_t2={inlet_line.amesim_line_temperature_k}, " + f"amesim_mgas={inlet_line.amesim_line_mass_g}, " + f"amesim_fd_dmgas={inlet_line.amesim_line_mass_derivative_fd_g_s}, " + f"amesim_line_to_node_dm1={inlet_line.amesim_line_to_node_mass_flow_g_s}, " + f"amesim_orifice_to_line_dm2={inlet_line.amesim_orifice_to_line_mass_flow_g_s}, " + f"amesim_storage_dm_ports={inlet_line.amesim_storage_mass_derivative_from_ports_g_s}, " + f"amesim_storage_dm_residual={inlet_line.amesim_storage_mass_derivative_residual_g_s}, " + f"amesim_chamber_p_abs={inlet_line.amesim_chamber_pressure_pa}, " + f"amesim_chamber_t={inlet_line.amesim_chamber_temperature_k}, " + f"python_p2_abs={inlet_line.python_line_pressure_pa}, " + f"python_t2={inlet_line.python_line_temperature_k}, " + f"python_mgas={inlet_line.python_line_mass_g}, " + f"python_p2_error={inlet_line.python_line_pressure_error_pa}, " + f"python_t2_error={inlet_line.python_line_temperature_error_k}, " + f"python_mgas_error={inlet_line.python_line_mass_error_g}, " + f"python_line_to_node_dm={inlet_line.python_line_to_node_mass_flow_g_s}, " + f"python_line_to_node_dm_error={inlet_line.python_line_to_node_mass_flow_error_g_s}, " + f"python_orifice_to_line_dm={inlet_line.python_orifice_to_line_mass_flow_g_s}, " + f"python_orifice_to_line_dm_error={inlet_line.python_orifice_to_line_mass_flow_error_g_s}, " + f"python_storage_dm={inlet_line.python_storage_mass_derivative_g_s}, " + f"python_storage_dm_error={inlet_line.python_storage_mass_derivative_error_g_s}, " + f"python_chamber_p_abs={inlet_line.python_chamber_pressure_pa}, " + f"python_chamber_t={inlet_line.python_chamber_temperature_k}, " + f"python_chamber_p_error={inlet_line.python_chamber_pressure_error_pa}, " + f"python_chamber_t_error={inlet_line.python_chamber_temperature_error_k}" + ) for pnl0003_energy in sample.pnl0003_energy_diagnostics: lines.append( f" - pnl0003_energy@{pnl0003_energy.line_alias}: " diff --git a/tests/test_run_test_mql_full_state_comparison.py b/tests/test_run_test_mql_full_state_comparison.py index c7b8f90..a57320e 100644 --- a/tests/test_run_test_mql_full_state_comparison.py +++ b/tests/test_run_test_mql_full_state_comparison.py @@ -14,6 +14,7 @@ from PythonModels.scripts.run_test_mql_full_state_comparison import ( TestMqlPnl0001EnergyFlowDiagnostic, TestMqlP4NodeEnthalpyBreakdownDiagnostic, TestMqlPnl0003EnergyDiagnostic, + TestMqlPneumatic96InletLineDiagnostic, TestMqlPnch012EnergyEquationDiagnostic, TestMqlPnvoUpstreamEnthalpyDiagnostic, TestMqlPnl0001PressureLossCalibrationDiagnostic, @@ -493,6 +494,41 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase): python_port_2_temperature_error_to_amesim_k=-5.5, ), ), + pneumatic_96_inlet_line_diagnostics=( + TestMqlPneumatic96InletLineDiagnostic( + line_alias="pneumatic_96", + node_alias="pn_node3_8", + orifice_alias="pn_orifice_18", + chamber_alias="pn_general_chamber", + time_s=0.05, + amesim_line_pressure_pa=14256386.8, + amesim_line_temperature_k=289.8, + amesim_line_mass_g=3.51, + amesim_line_mass_derivative_fd_g_s=-6.0, + amesim_line_to_node_mass_flow_g_s=452.2, + amesim_orifice_to_line_mass_flow_g_s=446.2, + amesim_storage_mass_derivative_from_ports_g_s=-6.0, + amesim_storage_mass_derivative_residual_g_s=0.0, + amesim_chamber_pressure_pa=15131788.1, + amesim_chamber_temperature_k=291.9, + python_line_pressure_pa=14257000.0, + python_line_temperature_k=290.1, + python_line_mass_g=3.52, + python_line_pressure_error_pa=613.2, + python_line_temperature_error_k=0.3, + python_line_mass_error_g=0.01, + python_line_to_node_mass_flow_g_s=453.0, + python_line_to_node_mass_flow_error_g_s=0.8, + python_orifice_to_line_mass_flow_g_s=447.0, + python_orifice_to_line_mass_flow_error_g_s=0.8, + python_storage_mass_derivative_g_s=-6.0, + python_storage_mass_derivative_error_g_s=0.0, + python_chamber_pressure_pa=15131800.0, + python_chamber_temperature_k=292.0, + python_chamber_pressure_error_pa=11.9, + python_chamber_temperature_error_k=0.1, + ), + ), pnl0001_energy_flow_diagnostics=( TestMqlPnl0001EnergyFlowDiagnostic( line_alias="pneumatic_69", @@ -655,6 +691,14 @@ class RunTestMqlFullStateComparisonScriptTests(unittest.TestCase): self.assertIn("python_current_dh2=679490.8", summary) self.assertIn("python_ref_dh2=-38478.5", summary) self.assertIn("python_real_ref_dh2=-32998.5", summary) + self.assertIn("inlet_line@pneumatic_96", summary) + self.assertIn("node=pn_node3_8", summary) + self.assertIn("orifice=pn_orifice_18", summary) + self.assertIn("amesim_line_to_node_dm1=452.2", summary) + self.assertIn("amesim_orifice_to_line_dm2=446.2", summary) + self.assertIn("python_line_to_node_dm=453.0", summary) + self.assertIn("python_line_to_node_dm_error=0.8", summary) + self.assertIn("python_storage_dm_error=0.0", summary) self.assertIn("pnl0003_energy@pneumatic_87", summary) self.assertIn("amesim_sdm1=-462.7", summary) self.assertIn("amesim_sdh2=3028.0", summary)