Add delayed kinetics and steam-drum balance

This commit is contained in:
Codex Agent
2025-11-24 00:06:08 +01:00
parent 9dc4ca7733
commit f6ff6fc618
9 changed files with 163 additions and 16 deletions

View File

@@ -43,3 +43,15 @@ def test_xenon_penalty_caps():
assert dynamics.xenon_penalty(state) == 0.05
state.xenon_inventory = 0.2
assert dynamics.xenon_penalty(state) == pytest.approx(0.01)
def test_delayed_precursors_follow_rod_banks():
dynamics = NeutronDynamics()
state = _core_state(power=600.0, flux=5e6)
dynamics.step(state, control_fraction=0.2, dt=1.0, rod_banks=[0.2, 0.2, 0.2])
initial_sum = sum(state.delayed_precursors)
assert len(state.delayed_precursors) == 3
assert initial_sum > 0.0
dynamics.step(state, control_fraction=0.95, dt=2.0, rod_banks=[0.95, 0.95, 0.95])
assert sum(state.delayed_precursors) < initial_sum

37
tests/test_thermal.py Normal file
View File

@@ -0,0 +1,37 @@
import pytest
from reactor_sim import constants
from reactor_sim.state import CoolantLoopState
from reactor_sim.thermal import ThermalSolver, saturation_temperature
def _secondary_loop(temp_in: float = 350.0, pressure: float = 0.5, flow: float = 200.0) -> CoolantLoopState:
nominal_mass = constants.SECONDARY_LOOP_VOLUME_M3 * constants.COOLANT_DENSITY
return CoolantLoopState(
temperature_in=temp_in,
temperature_out=temp_in,
pressure=pressure,
mass_flow_rate=flow,
steam_quality=0.0,
inventory_kg=nominal_mass,
level=constants.SECONDARY_INVENTORY_TARGET,
)
def test_secondary_heats_to_saturation_before_boiling():
solver = ThermalSolver()
loop = _secondary_loop(temp_in=330.0, flow=180.0, pressure=0.5)
sat_temp = saturation_temperature(loop.pressure)
solver.step_secondary(loop, transferred_mw=50.0, dt=1.0)
assert loop.steam_quality == pytest.approx(0.0)
assert loop.temperature_out < sat_temp
def test_secondary_generates_steam_when_energy_exceeds_sensible_heat():
solver = ThermalSolver()
loop = _secondary_loop(temp_in=330.0, flow=180.0, pressure=0.5)
sat_temp = saturation_temperature(loop.pressure)
solver.step_secondary(loop, transferred_mw=120.0, dt=1.0)
assert loop.temperature_out == pytest.approx(sat_temp, rel=0.02)
assert loop.steam_quality > 0.0
assert loop.steam_quality < 1.0