Files
Reactor-Sim/tests/test_neutronics.py
2025-11-24 00:06:08 +01:00

58 lines
1.7 KiB
Python

import pytest
from reactor_sim.neutronics import NeutronDynamics
from reactor_sim.state import CoreState
def _core_state(
temperature: float = 950.0,
flux: float = 2e7,
burnup: float = 0.01,
power: float = 500.0,
) -> CoreState:
return CoreState(
fuel_temperature=temperature,
neutron_flux=flux,
reactivity_margin=0.0,
power_output_mw=power,
burnup=burnup,
)
def test_reactivity_increases_with_rod_withdrawal():
dynamics = NeutronDynamics()
state = _core_state()
rho_full_out = dynamics.reactivity(state, control_fraction=0.0)
rho_half = dynamics.reactivity(state, control_fraction=0.5)
assert rho_full_out > rho_half
def test_poisons_accumulate_under_power():
dynamics = NeutronDynamics()
state = _core_state(power=800.0, flux=1e6)
dynamics.update_poisons(state, dt=100.0)
dynamics.update_poisons(state, dt=100.0)
assert state.iodine_inventory > 0.0
assert state.xenon_inventory > 0.0
def test_xenon_penalty_caps():
dynamics = NeutronDynamics()
state = _core_state()
state.xenon_inventory = 50.0
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