Adjust pump statuses for power loss and add nominal displays

This commit is contained in:
Codex Agent
2025-11-22 23:17:06 +01:00
parent d6655a7984
commit 60c5e68ac4
3 changed files with 29 additions and 21 deletions

View File

@@ -27,6 +27,7 @@ PUMP_POWER_MW = 12.0 # MW draw per pump unit
BASE_AUX_LOAD_MW = 5.0 # control, instrumentation, misc. BASE_AUX_LOAD_MW = 5.0 # control, instrumentation, misc.
NORMAL_CORE_POWER_MW = 3_000.0 NORMAL_CORE_POWER_MW = 3_000.0
TEST_MAX_POWER_MW = 4_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. # Threshold inventories (event counts) for flagging common poisons in diagnostics.
KEY_POISON_THRESHOLDS = { KEY_POISON_THRESHOLDS = {
"Xe": 1e20, # xenon "Xe": 1e20, # xenon

View File

@@ -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", 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"), ("Inlet Temp", f"{state.primary_loop.temperature_in:7.1f} K"),
("Outlet Temp", f"{state.primary_loop.temperature_out:7.1f} K"), ("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} MPa"), ("Pressure", f"{state.primary_loop.pressure:5.2f}/{constants.MAX_PRESSURE:4.1f} MPa"),
], ],
) )
self._draw_section( self._draw_section(
@@ -384,10 +384,13 @@ class ReactorDashboard:
[ [
("Pump1", self._pump_status(state.secondary_pumps, 0)), ("Pump1", self._pump_status(state.secondary_pumps, 0)),
("Pump2", self._pump_status(state.secondary_pumps, 1)), ("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"), "Flow",
("Pressure", f"{state.secondary_loop.pressure:5.2f} MPa"), f"{state.secondary_loop.mass_flow_rate:7.0f}/{self.reactor.secondary_pump.nominal_flow * len(self.reactor.secondary_pump_units):.0f} kg/s",
("Steam Quality", f"{state.secondary_loop.steam_quality:5.2f}"), ),
("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"),
], ],
) )

View File

@@ -230,23 +230,25 @@ class Reactor:
unit_enabled = ( unit_enabled = (
self.primary_pump_active and idx < len(self.primary_pump_units) and self.primary_pump_units[idx] 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_flow = target_flow if unit_enabled else 0.0
desired_pressure = target_pressure if unit_enabled else 0.5 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 = self._ramp_value(
pump_state.flow_rate, desired_flow, dt, self.primary_pump.spool_time pump_state.flow_rate, desired_flow, dt, self.primary_pump.spool_time
) )
pump_state.pressure = self._ramp_value( pump_state.pressure = self._ramp_value(
pump_state.pressure, desired_pressure, dt, self.primary_pump.spool_time 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 pump_state.active = unit_enabled and powered and pump_state.flow_rate > 1.0
if unit_enabled and pump_state.flow_rate < max(1.0, desired_flow * 0.8): 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" 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: else:
pump_state.status = "OFF" pump_state.status = "RUN"
total_flow += pump_state.flow_rate total_flow += pump_state.flow_rate
loop_pressure = max(loop_pressure, pump_state.pressure) loop_pressure = max(loop_pressure, pump_state.pressure)
state.primary_loop.mass_flow_rate = total_flow state.primary_loop.mass_flow_rate = total_flow
@@ -273,28 +275,30 @@ class Reactor:
total_flow = 0.0 total_flow = 0.0
target_pressure = 12.0 * 0.75 + 2.0 target_pressure = 12.0 * 0.75 + 2.0
loop_pressure = 0.5 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): for idx, pump_state in enumerate(state.secondary_pumps):
unit_enabled = ( unit_enabled = (
self.secondary_pump_active and idx < len(self.secondary_pump_units) and self.secondary_pump_units[idx] 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_flow = target_flow if unit_enabled else 0.0
desired_pressure = target_pressure if unit_enabled else 0.5 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 = self._ramp_value(
pump_state.flow_rate, desired_flow, dt, self.secondary_pump.spool_time pump_state.flow_rate, desired_flow, dt, self.secondary_pump.spool_time
) )
pump_state.pressure = self._ramp_value( pump_state.pressure = self._ramp_value(
pump_state.pressure, desired_pressure, dt, self.secondary_pump.spool_time pump_state.pressure, desired_pressure, dt, self.secondary_pump.spool_time
) )
pump_state.active = unit_enabled or pump_state.flow_rate > 1.0 pump_state.active = unit_enabled and powered and pump_state.flow_rate > 1.0
if unit_enabled and pump_state.flow_rate < max(1.0, desired_flow * 0.8): 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" 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: else:
pump_state.status = "OFF" pump_state.status = "RUN"
total_flow += pump_state.flow_rate total_flow += pump_state.flow_rate
loop_pressure = max(loop_pressure, pump_state.pressure) loop_pressure = max(loop_pressure, pump_state.pressure)
state.secondary_loop.mass_flow_rate = total_flow state.secondary_loop.mass_flow_rate = total_flow