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
|
secondary_pumps: dict[int, bool] | None = None
|
||||||
generator_units: dict[int, bool] | None = None
|
generator_units: dict[int, bool] | None = None
|
||||||
generator_auto: bool | None = None
|
generator_auto: bool | None = None
|
||||||
|
primary_relief: bool | None = None
|
||||||
|
secondary_relief: bool | None = None
|
||||||
maintenance_components: tuple[str, ...] = tuple()
|
maintenance_components: tuple[str, ...] = tuple()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ class ReactorDashboard:
|
|||||||
[
|
[
|
||||||
DashboardKey("b/v", "Toggle generator 1/2"),
|
DashboardKey("b/v", "Toggle generator 1/2"),
|
||||||
DashboardKey("x", "Toggle generator auto"),
|
DashboardKey("x", "Toggle generator auto"),
|
||||||
|
DashboardKey("l/;", "Toggle relief primary/secondary"),
|
||||||
DashboardKey("B/V", "Maintain generator 1/2"),
|
DashboardKey("B/V", "Maintain generator 1/2"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -162,6 +163,10 @@ class ReactorDashboard:
|
|||||||
self._toggle_generator_unit(0)
|
self._toggle_generator_unit(0)
|
||||||
elif ch in (ord("v"), ord("V")):
|
elif ch in (ord("v"), ord("V")):
|
||||||
self._toggle_generator_unit(1)
|
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")):
|
elif ch in (ord("x"), ord("X")):
|
||||||
self._queue_command(ReactorCommand(generator_auto=not self.reactor.generator_auto))
|
self._queue_command(ReactorCommand(generator_auto=not self.reactor.generator_auto))
|
||||||
elif ch in (ord("t"), ord("T")):
|
elif ch in (ord("t"), ord("T")):
|
||||||
@@ -375,6 +380,7 @@ class ReactorDashboard:
|
|||||||
("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 (Target {constants.PRIMARY_OUTLET_TARGET_K:4.0f})"),
|
("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"),
|
("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(
|
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})"),
|
("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"),
|
("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"),
|
("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
|
shutdown: bool = False
|
||||||
meltdown: bool = False
|
meltdown: bool = False
|
||||||
generator_auto: bool = False
|
generator_auto: bool = False
|
||||||
|
primary_relief_open: bool = False
|
||||||
|
secondary_relief_open: bool = False
|
||||||
poison_alerts: set[str] = field(default_factory=set)
|
poison_alerts: set[str] = field(default_factory=set)
|
||||||
maintenance_active: set[str] = field(default_factory=set)
|
maintenance_active: set[str] = field(default_factory=set)
|
||||||
|
|
||||||
@@ -96,6 +98,8 @@ class Reactor:
|
|||||||
self.shutdown = True
|
self.shutdown = True
|
||||||
self.meltdown = False
|
self.meltdown = False
|
||||||
self.generator_auto = False
|
self.generator_auto = False
|
||||||
|
self.primary_relief_open = False
|
||||||
|
self.secondary_relief_open = False
|
||||||
self.primary_pump_active = False
|
self.primary_pump_active = False
|
||||||
self.secondary_pump_active = False
|
self.secondary_pump_active = False
|
||||||
self.primary_pump_units = [False] * len(self.primary_pump_units)
|
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.pressure = state.secondary_loop.pressure
|
||||||
pump_state.status = "STOPPING" if pump_state.flow_rate > 1.0 else "OFF"
|
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)
|
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:
|
if not self.secondary_pump_active or state.secondary_loop.mass_flow_rate <= 1.0:
|
||||||
transferred = 0.0
|
transferred = 0.0
|
||||||
@@ -459,6 +468,10 @@ class Reactor:
|
|||||||
self._set_turbine_state(False)
|
self._set_turbine_state(False)
|
||||||
if command.generator_auto is not None:
|
if command.generator_auto is not None:
|
||||||
self.generator_auto = command.generator_auto
|
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:
|
if command.power_setpoint is not None:
|
||||||
self.control.set_power_setpoint(command.power_setpoint)
|
self.control.set_power_setpoint(command.power_setpoint)
|
||||||
if command.rod_manual is not None:
|
if command.rod_manual is not None:
|
||||||
@@ -699,6 +712,8 @@ class Reactor:
|
|||||||
"shutdown": self.shutdown,
|
"shutdown": self.shutdown,
|
||||||
"meltdown": self.meltdown,
|
"meltdown": self.meltdown,
|
||||||
"generator_auto": self.generator_auto,
|
"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),
|
"maintenance_active": list(self.maintenance_active),
|
||||||
"generators": [
|
"generators": [
|
||||||
{
|
{
|
||||||
@@ -732,6 +747,8 @@ class Reactor:
|
|||||||
self.shutdown = metadata.get("shutdown", self.shutdown)
|
self.shutdown = metadata.get("shutdown", self.shutdown)
|
||||||
self.meltdown = metadata.get("meltdown", self.meltdown)
|
self.meltdown = metadata.get("meltdown", self.meltdown)
|
||||||
self.generator_auto = metadata.get("generator_auto", self.generator_auto)
|
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")
|
maint = metadata.get("maintenance_active")
|
||||||
if maint is not None:
|
if maint is not None:
|
||||||
self.maintenance_active = set(maint)
|
self.maintenance_active = set(maint)
|
||||||
|
|||||||
Reference in New Issue
Block a user