From afa8997614a810ddfb8ec9232c0b867588665add Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Mon, 24 Nov 2025 22:41:36 +0100 Subject: [PATCH] Reduce secondary pump head and ease secondary heating --- src/reactor_sim/constants.py | 2 +- src/reactor_sim/reactor.py | 8 +++++--- src/reactor_sim/state.py | 9 +++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/reactor_sim/constants.py b/src/reactor_sim/constants.py index d0a0efe..5ab5734 100644 --- a/src/reactor_sim/constants.py +++ b/src/reactor_sim/constants.py @@ -24,7 +24,7 @@ MEV_TO_J = 1.602_176_634e-13 ELECTRON_FISSION_CROSS_SECTION = 5e-16 # cm^2, tuned for simulation scale PUMP_SPOOL_TIME = 5.0 # seconds to reach commanded flow PRIMARY_PUMP_SHUTOFF_HEAD_MPA = 8.0 # approximate shutoff head for primary pumps -SECONDARY_PUMP_SHUTOFF_HEAD_MPA = 7.0 +SECONDARY_PUMP_SHUTOFF_HEAD_MPA = 3.0 TURBINE_SPOOL_TIME = 12.0 # seconds to reach steady output # Turbine/condenser parameters diff --git a/src/reactor_sim/reactor.py b/src/reactor_sim/reactor.py index c9a9b34..205d636 100644 --- a/src/reactor_sim/reactor.py +++ b/src/reactor_sim/reactor.py @@ -324,7 +324,7 @@ class Reactor: pump_state.status = "STOPPING" if pump_state.flow_rate > 0.1 else "OFF" if self.secondary_pump_active: total_flow = 0.0 - base_flow, base_head = self.secondary_pump.performance(0.75) + base_flow, base_head = self.secondary_pump.performance(0.5) target_pressure = max(0.5, base_head * power_ratio) loop_pressure = max(0.1, saturation_pressure(state.secondary_loop.temperature_out)) target_flow = base_flow * power_ratio @@ -428,8 +428,10 @@ class Reactor: ) state.secondary_loop.temperature_in = state.secondary_loop.temperature_out else: - secondary_cooling = max(0.0, state.secondary_loop.temperature_out - env - 40.0) - state.secondary_loop.temperature_in = max(env, state.secondary_loop.temperature_out - max(20.0, secondary_cooling)) + # Allow the secondary to retain more heat so it can approach saturation and form steam. + excess = max(0.0, state.secondary_loop.temperature_out - env) + cooling_drop = min(40.0, max(10.0, 0.2 * excess)) + state.secondary_loop.temperature_in = max(env, state.secondary_loop.temperature_out - cooling_drop) state.primary_to_secondary_delta_t = max(0.0, state.primary_loop.temperature_out - state.secondary_loop.temperature_in) state.heat_exchanger_efficiency = 0.0 if total_power <= 0 else min(1.0, max(0.0, transferred / max(1e-6, total_power))) diff --git a/src/reactor_sim/state.py b/src/reactor_sim/state.py index 3238f23..0625b31 100644 --- a/src/reactor_sim/state.py +++ b/src/reactor_sim/state.py @@ -18,12 +18,17 @@ class CoreState: reactivity_margin: float # delta rho power_output_mw: float # MW thermal burnup: float # fraction of fuel consumed + clad_temperature: float | None = None # Kelvin xenon_inventory: float = 0.0 iodine_inventory: float = 0.0 delayed_precursors: list[float] = field(default_factory=list) fission_product_inventory: dict[str, float] = field(default_factory=dict) emitted_particles: dict[str, float] = field(default_factory=dict) + def __post_init__(self) -> None: + if self.clad_temperature is None: + self.clad_temperature = self.fuel_temperature + def update_burnup(self, dt: float) -> None: produced_energy_mwh = self.power_output_mw * (dt / 3600.0) self.burnup = clamp(self.burnup + produced_energy_mwh * 1e-5, 0.0, 0.99) @@ -111,6 +116,10 @@ class PlantState: core_blob = dict(data["core"]) inventory = core_blob.pop("fission_product_inventory", {}) particles = core_blob.pop("emitted_particles", {}) + # Backwards/forwards compatibility for optional core fields. + core_blob.pop("dnb_margin", None) + core_blob.pop("subcooling_margin", None) + core_blob.setdefault("clad_temperature", core_blob.get("fuel_temperature", 295.0)) turbines_blob = data.get("turbines") if turbines_blob is None: # Compatibility with previous single-turbine snapshots.