diff --git a/src/reactor_sim/failures.py b/src/reactor_sim/failures.py index 1342d95..76972c3 100644 --- a/src/reactor_sim/failures.py +++ b/src/reactor_sim/failures.py @@ -89,12 +89,18 @@ class HealthMonitor: sec_units = list(secondary_units) prim_states = state.primary_pumps or [] sec_states = state.secondary_pumps or [] + primary_temp = getattr(state.primary_loop, "temperature_out", 295.0) + secondary_temp = getattr(state.secondary_loop, "temperature_out", 295.0) + primary_heat_factor = max(0.0, (primary_temp - 600.0) / 400.0) # harsher wear only when very hot + secondary_heat_factor = max(0.0, (secondary_temp - 520.0) / 300.0) for idx, active in enumerate(prim_units): comp = self.component(f"primary_pump_{idx + 1}") if idx < len(prim_states) and active: flow = prim_states[idx].flow_rate flow_ratio = 0.0 if flow <= 0 else min(1.0, flow / 9_000.0) - comp.degrade((0.0002 + (1 - flow_ratio) * 0.005) * dt) + low_flow_penalty = (1 - flow_ratio) * 0.001 + rate = (0.0001 + low_flow_penalty) * (1 + primary_heat_factor) + comp.degrade(rate * dt) else: comp.degrade(0.0) for idx, active in enumerate(sec_units): @@ -102,7 +108,9 @@ class HealthMonitor: if idx < len(sec_states) and active: flow = sec_states[idx].flow_rate flow_ratio = 0.0 if flow <= 0 else min(1.0, flow / 8_000.0) - comp.degrade((0.0002 + (1 - flow_ratio) * 0.004) * dt) + low_flow_penalty = (1 - flow_ratio) * 0.0008 + rate = (0.0001 + low_flow_penalty) * (1 + secondary_heat_factor) + comp.degrade(rate * dt) else: comp.degrade(0.0)