Add pressure relief valve controls and indicators

This commit is contained in:
Codex Agent
2025-11-23 00:00:18 +01:00
parent aaff08745d
commit 521f5c9186
3 changed files with 26 additions and 0 deletions

View File

@@ -25,6 +25,8 @@ class ReactorCommand:
secondary_pumps: dict[int, bool] | None = None
generator_units: dict[int, bool] | None = None
generator_auto: bool | None = None
primary_relief: bool | None = None
secondary_relief: bool | None = None
maintenance_components: tuple[str, ...] = tuple()
@classmethod

View File

@@ -74,6 +74,7 @@ class ReactorDashboard:
[
DashboardKey("b/v", "Toggle generator 1/2"),
DashboardKey("x", "Toggle generator auto"),
DashboardKey("l/;", "Toggle relief primary/secondary"),
DashboardKey("B/V", "Maintain generator 1/2"),
],
),
@@ -162,6 +163,10 @@ class ReactorDashboard:
self._toggle_generator_unit(0)
elif ch in (ord("v"), ord("V")):
self._toggle_generator_unit(1)
elif ch == ord("l"):
self._queue_command(ReactorCommand(primary_relief=not self.reactor.primary_relief_open))
elif ch == ord(";"):
self._queue_command(ReactorCommand(secondary_relief=not self.reactor.secondary_relief_open))
elif ch in (ord("x"), ord("X")):
self._queue_command(ReactorCommand(generator_auto=not self.reactor.generator_auto))
elif ch in (ord("t"), ord("T")):
@@ -375,6 +380,7 @@ class ReactorDashboard:
("Inlet Temp", f"{state.primary_loop.temperature_in: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}/{constants.MAX_PRESSURE:4.1f} MPa"),
("Relief", "OPEN" if self.reactor.primary_relief_open else "CLOSED"),
],
)
self._draw_section(
@@ -392,6 +398,7 @@ class ReactorDashboard:
("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"),
("Steam Quality", f"{state.secondary_loop.steam_quality:5.2f}/1.00"),
("Relief", "OPEN" if self.reactor.secondary_relief_open else "CLOSED"),
],
)

View File

@@ -45,6 +45,8 @@ class Reactor:
shutdown: bool = False
meltdown: bool = False
generator_auto: bool = False
primary_relief_open: bool = False
secondary_relief_open: bool = False
poison_alerts: set[str] = field(default_factory=set)
maintenance_active: set[str] = field(default_factory=set)
@@ -96,6 +98,8 @@ class Reactor:
self.shutdown = True
self.meltdown = False
self.generator_auto = False
self.primary_relief_open = False
self.secondary_relief_open = False
self.primary_pump_active = False
self.secondary_pump_active = False
self.primary_pump_units = [False] * len(self.primary_pump_units)
@@ -321,6 +325,11 @@ class Reactor:
pump_state.pressure = state.secondary_loop.pressure
pump_state.status = "STOPPING" if pump_state.flow_rate > 1.0 else "OFF"
if self.primary_relief_open:
state.primary_loop.pressure = max(0.1, saturation_pressure(state.primary_loop.temperature_out))
if self.secondary_relief_open:
state.secondary_loop.pressure = max(0.1, saturation_pressure(state.secondary_loop.temperature_out))
self.thermal.step_core(state.core, state.primary_loop, total_power, dt)
if not self.secondary_pump_active or state.secondary_loop.mass_flow_rate <= 1.0:
transferred = 0.0
@@ -459,6 +468,10 @@ class Reactor:
self._set_turbine_state(False)
if command.generator_auto is not None:
self.generator_auto = command.generator_auto
if command.primary_relief is not None:
self.primary_relief_open = command.primary_relief
if command.secondary_relief is not None:
self.secondary_relief_open = command.secondary_relief
if command.power_setpoint is not None:
self.control.set_power_setpoint(command.power_setpoint)
if command.rod_manual is not None:
@@ -699,6 +712,8 @@ class Reactor:
"shutdown": self.shutdown,
"meltdown": self.meltdown,
"generator_auto": self.generator_auto,
"primary_relief_open": self.primary_relief_open,
"secondary_relief_open": self.secondary_relief_open,
"maintenance_active": list(self.maintenance_active),
"generators": [
{
@@ -732,6 +747,8 @@ class Reactor:
self.shutdown = metadata.get("shutdown", self.shutdown)
self.meltdown = metadata.get("meltdown", self.meltdown)
self.generator_auto = metadata.get("generator_auto", self.generator_auto)
self.primary_relief_open = metadata.get("primary_relief_open", self.primary_relief_open)
self.secondary_relief_open = metadata.get("secondary_relief_open", self.secondary_relief_open)
maint = metadata.get("maintenance_active")
if maint is not None:
self.maintenance_active = set(maint)