From a2afbabe49e1805433ea4c63aa1c161bf2fc4155 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Fri, 28 Nov 2025 19:53:26 +0100 Subject: [PATCH] Surface feedwater and governor telemetry on dashboard --- src/reactor_sim/dashboard.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/reactor_sim/dashboard.py b/src/reactor_sim/dashboard.py index 49a4187..3c1cc7e 100644 --- a/src/reactor_sim/dashboard.py +++ b/src/reactor_sim/dashboard.py @@ -464,7 +464,11 @@ class ReactorDashboard: "Flow", f"{state.secondary_loop.mass_flow_rate:7.0f}/{self.reactor.secondary_pump.nominal_flow * len(self.reactor.secondary_pump_units):.0f} kg/s", ), - ("Level", f"{state.secondary_loop.level*100:6.1f}%"), + ("Level", f"{state.secondary_loop.level*100:6.1f}% (Target {constants.SECONDARY_INVENTORY_TARGET*100:4.0f}%)"), + ( + "Feedwater", + f"valve {self.reactor.feedwater_valve*100:5.1f}% steam {state.secondary_loop.mass_flow_rate * max(0.0, state.secondary_loop.steam_quality):6.0f} kg/s", + ), ("Inlet Temp", f"{state.secondary_loop.temperature_in:7.1f} K (Target {constants.SECONDARY_OUTLET_TARGET_K:4.0f})"), ("Outlet Temp", f"{state.secondary_loop.temperature_out:7.1f} K (Target {constants.SECONDARY_OUTLET_TARGET_K:4.0f})"), ("Pressure", f"{state.secondary_loop.pressure:5.2f}/{constants.MAX_PRESSURE:4.1f} MPa"), @@ -497,7 +501,15 @@ class ReactorDashboard: "Units Elec", " ".join([f"{t.electrical_output_mw:6.1f}MW" for t in state.turbines]) if state.turbines else "n/a", ), - ("Throttle", f"{self.reactor.turbines[0].throttle:5.2f}" if self.reactor.turbines else "n/a"), + ( + "Governor", + ( + f"thr {self.reactor.turbines[0].throttle:4.2f}→{self._desired_throttle(state.turbines[0]):4.2f} " + f"ΔP {(state.turbines[0].load_demand_mw - state.turbines[0].electrical_output_mw):6.1f} MW" + ) + if state.turbines + else "n/a", + ), ( "Condenser", ( @@ -786,6 +798,13 @@ class ReactorDashboard: enthalpy_kjkg = (constants.STEAM_LATENT_HEAT / 1_000.0) return (enthalpy_kjkg * mass_flow) / 1_000.0 + def _desired_throttle(self, turbine_state) -> float: + if not self.reactor.turbines: + return 0.0 + turbine = self.reactor.turbines[0] + demand = turbine_state.load_demand_mw + return 0.4 if demand <= 0 else min(1.0, 0.4 + demand / max(1e-6, turbine.rated_output_mw)) + def _update_trends(self, state: PlantState) -> None: self._trend_history.append((state.time_elapsed, state.core.fuel_temperature, state.core.power_output_mw))