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