diff --git a/src/reactor_sim/commands.py b/src/reactor_sim/commands.py index c1a7ec3..99cd0df 100644 --- a/src/reactor_sim/commands.py +++ b/src/reactor_sim/commands.py @@ -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 diff --git a/src/reactor_sim/dashboard.py b/src/reactor_sim/dashboard.py index f4b38f7..74706c1 100644 --- a/src/reactor_sim/dashboard.py +++ b/src/reactor_sim/dashboard.py @@ -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"), ], ) diff --git a/src/reactor_sim/reactor.py b/src/reactor_sim/reactor.py index 7949948..9c4f174 100644 --- a/src/reactor_sim/reactor.py +++ b/src/reactor_sim/reactor.py @@ -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)