From 001d8b7171f920c69877f0bd10f2ba48ab8cc005 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Sun, 23 Nov 2025 00:28:07 +0100 Subject: [PATCH] Let auto rod control clear shutdown and adjust rods --- src/reactor_sim/reactor.py | 8 ++++++++ tests/test_simulation.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/reactor_sim/reactor.py b/src/reactor_sim/reactor.py index 0107f57..e0e1750 100644 --- a/src/reactor_sim/reactor.py +++ b/src/reactor_sim/reactor.py @@ -171,6 +171,8 @@ class Reactor: if command: overrides = self._apply_command(command, state) rod_fraction = overrides.get("rod_fraction", rod_fraction) + if not self.shutdown and not self.control.manual_control: + rod_fraction = self.control.update_rods(state.core, dt) decay_power, decay_neutron_source, decay_products, decay_particles = self.fuel.decay_reaction_effects( state.core @@ -476,6 +478,8 @@ class Reactor: self.control.set_power_setpoint(command.power_setpoint) if command.rod_manual is not None: self.control.set_manual_mode(command.rod_manual) + if command.rod_manual is False and not self.meltdown: + self.shutdown = False if command.rod_position is not None: self.control.set_manual_mode(True) overrides["rod_fraction"] = self.control.set_rods(command.rod_position) @@ -505,6 +509,10 @@ class Reactor: overrides["coolant_demand"] = max(0.0, min(1.0, command.coolant_demand)) for component in command.maintenance_components: self._toggle_maintenance(component) + if not self.meltdown and not command.scram: + rod_target = overrides.get("rod_fraction", self.control.rod_fraction) + if rod_target < 0.95: + self.shutdown = False return overrides def _set_primary_pump(self, active: bool) -> None: diff --git a/tests/test_simulation.py b/tests/test_simulation.py index 483457e..ff1a17a 100644 --- a/tests/test_simulation.py +++ b/tests/test_simulation.py @@ -253,3 +253,17 @@ def test_meltdown_triggers_shutdown(): assert reactor.shutdown is True assert reactor.meltdown is True + + +def test_auto_control_resets_shutdown_and_moves_rods(): + reactor = Reactor.default() + state = reactor.initial_state() + reactor.shutdown = True + reactor.control.manual_control = True + reactor.control.rod_fraction = 0.95 + + reactor.step(state, dt=1.0, command=ReactorCommand(rod_manual=False)) + + assert reactor.shutdown is False + assert reactor.control.manual_control is False + assert reactor.control.rod_fraction < 0.95