diff --git a/src/reactor_sim/constants.py b/src/reactor_sim/constants.py index bc2fc5d..72164aa 100644 --- a/src/reactor_sim/constants.py +++ b/src/reactor_sim/constants.py @@ -27,6 +27,7 @@ PUMP_POWER_MW = 12.0 # MW draw per pump unit BASE_AUX_LOAD_MW = 5.0 # control, instrumentation, misc. NORMAL_CORE_POWER_MW = 3_000.0 TEST_MAX_POWER_MW = 4_000.0 +PRIMARY_OUTLET_TARGET_K = 580.0 # Threshold inventories (event counts) for flagging common poisons in diagnostics. KEY_POISON_THRESHOLDS = { "Xe": 1e20, # xenon diff --git a/src/reactor_sim/dashboard.py b/src/reactor_sim/dashboard.py index 0682870..29144f7 100644 --- a/src/reactor_sim/dashboard.py +++ b/src/reactor_sim/dashboard.py @@ -373,8 +373,8 @@ class ReactorDashboard: f"{state.primary_loop.mass_flow_rate:7.0f}/{self.reactor.primary_pump.nominal_flow * len(self.reactor.primary_pump_units):.0f} kg/s", ), ("Inlet Temp", f"{state.primary_loop.temperature_in:7.1f} K"), - ("Outlet Temp", f"{state.primary_loop.temperature_out:7.1f} K"), - ("Pressure", f"{state.primary_loop.pressure:5.2f} MPa"), + ("Outlet Temp", f"{state.primary_loop.temperature_out:7.1f} K (Target {constants.PRIMARY_OUTLET_TARGET_K:4.0f})"), + ("Pressure", f"{state.primary_loop.pressure:5.2f}/{constants.MAX_PRESSURE:4.1f} MPa"), ], ) self._draw_section( @@ -384,10 +384,13 @@ class ReactorDashboard: [ ("Pump1", self._pump_status(state.secondary_pumps, 0)), ("Pump2", self._pump_status(state.secondary_pumps, 1)), - ("Flow", f"{state.secondary_loop.mass_flow_rate:7.0f} kg/s"), - ("Inlet Temp", f"{state.secondary_loop.temperature_in:7.1f} K"), - ("Pressure", f"{state.secondary_loop.pressure:5.2f} MPa"), - ("Steam Quality", f"{state.secondary_loop.steam_quality:5.2f}"), + ( + "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", + ), + ("Inlet Temp", f"{state.secondary_loop.temperature_in:7.1f} K (Max {constants.PRIMARY_OUTLET_TARGET_K:4.0f})"), + ("Pressure", f"{state.secondary_loop.pressure:5.2f}/{constants.MAX_PRESSURE:4.1f} MPa"), + ("Steam Quality", f"{state.secondary_loop.steam_quality:5.2f}/1.00"), ], ) diff --git a/src/reactor_sim/reactor.py b/src/reactor_sim/reactor.py index b67f205..0d49793 100644 --- a/src/reactor_sim/reactor.py +++ b/src/reactor_sim/reactor.py @@ -230,23 +230,25 @@ class Reactor: unit_enabled = ( self.primary_pump_active and idx < len(self.primary_pump_units) and self.primary_pump_units[idx] ) + powered = power_ratio > 0.1 desired_flow = target_flow if unit_enabled else 0.0 desired_pressure = target_pressure if unit_enabled else 0.5 + if not powered: + desired_flow = 0.0 + desired_pressure = 0.5 pump_state.flow_rate = self._ramp_value( pump_state.flow_rate, desired_flow, dt, self.primary_pump.spool_time ) pump_state.pressure = self._ramp_value( pump_state.pressure, desired_pressure, dt, self.primary_pump.spool_time ) - pump_state.active = (unit_enabled and power_ratio > 0.05) or pump_state.flow_rate > 1.0 - if unit_enabled and pump_state.flow_rate < max(1.0, desired_flow * 0.8): + pump_state.active = unit_enabled and powered and pump_state.flow_rate > 1.0 + if not powered or not unit_enabled: + pump_state.status = "STOPPING" if pump_state.flow_rate > 1.0 else "OFF" + elif pump_state.flow_rate < max(1.0, desired_flow * 0.8): pump_state.status = "STARTING" - elif not unit_enabled and pump_state.flow_rate > 1.0: - pump_state.status = "STOPPING" - elif pump_state.active: - pump_state.status = "RUN" else: - pump_state.status = "OFF" + pump_state.status = "RUN" total_flow += pump_state.flow_rate loop_pressure = max(loop_pressure, pump_state.pressure) state.primary_loop.mass_flow_rate = total_flow @@ -273,28 +275,30 @@ class Reactor: total_flow = 0.0 target_pressure = 12.0 * 0.75 + 2.0 loop_pressure = 0.5 - target_flow = self.secondary_pump.flow_rate(0.75) + target_flow = self.secondary_pump.flow_rate(0.75) * power_ratio for idx, pump_state in enumerate(state.secondary_pumps): unit_enabled = ( self.secondary_pump_active and idx < len(self.secondary_pump_units) and self.secondary_pump_units[idx] ) + powered = power_ratio > 0.1 desired_flow = target_flow if unit_enabled else 0.0 desired_pressure = target_pressure if unit_enabled else 0.5 + if not powered: + desired_flow = 0.0 + desired_pressure = 0.5 pump_state.flow_rate = self._ramp_value( pump_state.flow_rate, desired_flow, dt, self.secondary_pump.spool_time ) pump_state.pressure = self._ramp_value( pump_state.pressure, desired_pressure, dt, self.secondary_pump.spool_time ) - pump_state.active = unit_enabled or pump_state.flow_rate > 1.0 - if unit_enabled and pump_state.flow_rate < max(1.0, desired_flow * 0.8): + pump_state.active = unit_enabled and powered and pump_state.flow_rate > 1.0 + if not powered or not unit_enabled: + pump_state.status = "STOPPING" if pump_state.flow_rate > 1.0 else "OFF" + elif pump_state.flow_rate < max(1.0, desired_flow * 0.8): pump_state.status = "STARTING" - elif not unit_enabled and pump_state.flow_rate > 1.0: - pump_state.status = "STOPPING" - elif pump_state.active: - pump_state.status = "RUN" else: - pump_state.status = "OFF" + pump_state.status = "RUN" total_flow += pump_state.flow_rate loop_pressure = max(loop_pressure, pump_state.pressure) state.secondary_loop.mass_flow_rate = total_flow