Add pressure relief valve controls and indicators
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"),
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user