Expose xenon reactivity impact on dashboard
This commit is contained in:
@@ -557,6 +557,11 @@ class ReactorDashboard:
|
|||||||
lines.append(fmt("Xe", "Xe (xenon)", getattr(state.core, "xenon_inventory", 0.0)))
|
lines.append(fmt("Xe", "Xe (xenon)", getattr(state.core, "xenon_inventory", 0.0)))
|
||||||
lines.append(fmt("Sm", "Sm (samarium)", inventory.get("Sm", 0.0)))
|
lines.append(fmt("Sm", "Sm (samarium)", inventory.get("Sm", 0.0)))
|
||||||
lines.append(fmt("I", "I (iodine)", getattr(state.core, "iodine_inventory", 0.0)))
|
lines.append(fmt("I", "I (iodine)", getattr(state.core, "iodine_inventory", 0.0)))
|
||||||
|
try:
|
||||||
|
xe_penalty = -self.reactor.neutronics.xenon_penalty(state.core)
|
||||||
|
lines.append(("Xe Δρ", f"{xe_penalty:+.4f}"))
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
lines.append(("Neutrons (src)", f"{particles.get('n', 0.0):9.2e}"))
|
lines.append(("Neutrons (src)", f"{particles.get('n', 0.0):9.2e}"))
|
||||||
lines.append(("Gammas", f"{particles.get('gamma', 0.0):9.2e}"))
|
lines.append(("Gammas", f"{particles.get('gamma', 0.0):9.2e}"))
|
||||||
lines.append(("Alphas", f"{particles.get('alpha', 0.0):9.2e}"))
|
lines.append(("Alphas", f"{particles.get('alpha', 0.0):9.2e}"))
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class NeutronDynamics:
|
|||||||
rod_term
|
rod_term
|
||||||
+ temperature_feedback(state.fuel_temperature)
|
+ temperature_feedback(state.fuel_temperature)
|
||||||
- fuel_reactivity_penalty(state.burnup)
|
- fuel_reactivity_penalty(state.burnup)
|
||||||
- self._xenon_penalty(state)
|
- self.xenon_penalty(state)
|
||||||
)
|
)
|
||||||
return rho
|
return rho
|
||||||
|
|
||||||
@@ -96,5 +96,9 @@ class NeutronDynamics:
|
|||||||
decay_Xe = state.xenon_inventory * self.xenon_decay_const
|
decay_Xe = state.xenon_inventory * self.xenon_decay_const
|
||||||
state.xenon_inventory = max(0.0, state.xenon_inventory + (prod_Xe - decay_Xe - burn_Xe) * dt)
|
state.xenon_inventory = max(0.0, state.xenon_inventory + (prod_Xe - decay_Xe - burn_Xe) * dt)
|
||||||
|
|
||||||
|
def xenon_penalty(self, state: CoreState) -> float:
|
||||||
|
"""Return delta-rho penalty from xenon inventory (positive magnitude)."""
|
||||||
|
return self._xenon_penalty(state)
|
||||||
|
|
||||||
def _xenon_penalty(self, state: CoreState) -> float:
|
def _xenon_penalty(self, state: CoreState) -> float:
|
||||||
return min(0.03, state.xenon_inventory * self.xenon_reactivity_coeff)
|
return min(0.03, state.xenon_inventory * self.xenon_reactivity_coeff)
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
from reactor_sim.neutronics import NeutronDynamics
|
from reactor_sim.neutronics import NeutronDynamics
|
||||||
from reactor_sim.state import CoreState
|
from reactor_sim.state import CoreState
|
||||||
|
|
||||||
@@ -32,3 +34,12 @@ def test_poisons_accumulate_under_power():
|
|||||||
dynamics.update_poisons(state, dt=100.0)
|
dynamics.update_poisons(state, dt=100.0)
|
||||||
assert state.iodine_inventory > 0.0
|
assert state.iodine_inventory > 0.0
|
||||||
assert state.xenon_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.03
|
||||||
|
state.xenon_inventory = 5.0
|
||||||
|
assert dynamics.xenon_penalty(state) == pytest.approx(0.01)
|
||||||
|
|||||||
Reference in New Issue
Block a user