Add turbine throttle mapping and back-pressure penalty

This commit is contained in:
Codex Agent
2025-11-23 20:02:03 +01:00
parent 9d4bc17971
commit d6bb0543b6
6 changed files with 38 additions and 8 deletions

View File

@@ -27,6 +27,7 @@ class Turbine:
mechanical_efficiency: float = constants.STEAM_TURBINE_EFFICIENCY
rated_output_mw: float = 400.0 # cap per unit electrical output
spool_time: float = constants.TURBINE_SPOOL_TIME
throttle: float = 1.0 # 0-1 valve position
def step(
self,
@@ -46,11 +47,15 @@ class Turbine:
state.condenser_temperature = max(305.0, loop.temperature_in - 20.0)
return
throttle = min(constants.TURBINE_THROTTLE_MAX, max(constants.TURBINE_THROTTLE_MIN, self.throttle))
throttle_eff = 1.0 - constants.TURBINE_THROTTLE_EFFICIENCY_DROP * (constants.TURBINE_THROTTLE_MAX - throttle)
enthalpy = 2_700.0 + loop.steam_quality * 600.0
mass_flow = effective_mass_flow * 0.6
mass_flow = effective_mass_flow * 0.6 * throttle
computed_power = (enthalpy * mass_flow / 1_000.0) / 1_000.0
available_power = steam_power_mw if steam_power_mw > 0 else computed_power
shaft_power_mw = available_power * self.mechanical_efficiency
backpressure_loss = 1.0 - _backpressure_penalty(loop)
shaft_power_mw = available_power * self.mechanical_efficiency * throttle_eff * backpressure_loss
electrical = shaft_power_mw * self.generator_efficiency
if electrical > self.rated_output_mw:
electrical = self.rated_output_mw
@@ -71,5 +76,15 @@ class Turbine:
def _ramp(current: float, target: float, dt: float, time_constant: float) -> float:
if time_constant <= 0.0:
return target
alpha = min(1.0, max(0.0, dt / time_constant))
alpha = min(1.0, max(0.0, dt / max(1e-6, time_constant)))
return current + (target - current) * alpha
def _backpressure_penalty(loop: CoolantLoopState) -> float:
base = constants.CONDENSER_BASE_PRESSURE_MPA
max_p = constants.CONDENSER_MAX_PRESSURE_MPA
pressure = max(base, min(max_p, loop.pressure))
if pressure <= base:
return 0.0
frac = (pressure - base) / max(1e-6, max_p - base)
return min(constants.CONDENSER_BACKPRESSURE_PENALTY, frac * constants.CONDENSER_BACKPRESSURE_PENALTY)