Physics

class chiller_sim.physics.cop.CopFn(*args, **kwargs)[source]

Bases: Protocol

Protocol for a callable that computes effective COP given operating conditions.

__init__(*args, **kwargs)
chiller_sim.physics.cop.default_cop_fn(alpha, cop_loss_per_year=0.012)[source]

Return the default COP function with thermal and age-based degradation.

Parameters:
  • alpha (float) – Sensitivity of COP to condenser inlet temperature rise (K⁻¹).

  • cop_loss_per_year (float) – Fractional COP loss per year of chiller age. Default 1.2 %/yr reflects typical centrifugal chiller performance decline due to refrigerant leakage, fouling, and mechanical wear (ASHRAE 2021 Handbook, Chapter 38).

Return type:

CopFn

class chiller_sim.physics.degradation.DegradationFn(*args, **kwargs)[source]

Bases: Protocol

Protocol for a callable that returns a capacity multiplier based on chiller age.

__init__(*args, **kwargs)
chiller_sim.physics.degradation.default_capacity_degradation_fn(years_to_80_pct)[source]

Return a capacity degradation function that reaches 80% at years_to_80_pct years.

Parameters:

years_to_80_pct (float)

Return type:

DegradationFn

class chiller_sim.physics.ramp.RampFn(*args, **kwargs)[source]

Bases: Protocol

Protocol for a callable that returns a startup ramp multiplier.

__init__(*args, **kwargs)
chiller_sim.physics.ramp.default_ramp_fn(initial_ramp=0.1, startup_time_hours=2.0)[source]

Return a linear ramp function that starts at initial_ramp and reaches 1.0 after startup_time_hours. The multiplier stays at 1.0 beyond that point.

Parameters:
Return type:

RampFn

class chiller_sim.physics.load.LoadFn(*args, **kwargs)[source]

Bases: Protocol

Protocol for a callable that returns total facility load (kW) at a given time.

__init__(*args, **kwargs)
class chiller_sim.physics.ambient_temp.AmbientTempFn(*args, **kwargs)[source]

Bases: Protocol

Protocol for a callable that returns ambient temperature (K) at a given time.

__init__(*args, **kwargs)
class chiller_sim.physics.gaussian_plume.GaussianPlumeModel(dispersion_coeff=1.2, u_min_m_per_s=0.1, heat_rejection_scale=10.0)[source]

Bases: object

Gaussian plume model for chiller thermal interaction.

With σ_y held constant (dispersion_coeff), the per-pair influence is a simplified constant-σ form of the standard ground-level Gaussian plume:

\[\begin{split}I_{k \to m} = \begin{cases} 0 & u < u_{\min} \\ \dfrac{1}{u\,(x + 1)} \exp\!\left(-\dfrac{y^2}{\sigma\,(x + 1)}\right) & x > 0,\ u \ge u_{\min} \\ 0 & \text{otherwise} \end{cases}\end{split}\]

where \(x\) is the along-wind distance from chiller k to chiller m, \(y\) is the cross-wind distance, \(u\) is wind.speed_m_per_s, \(\sigma\) is dispersion_coeff, and \(u_{\min}\) is u_min_m_per_s. The \(1/u\) factor is the physical dilution term from the full Gaussian plume equation.

u_min_m_per_s is a hard cutoff, not a floor: when the wind speed falls below it, the interaction matrix is returned as zero at every distance.

Parameters:
  • dispersion_coeff (float) – Controls lateral plume spread; larger = wider dispersion.

  • u_min_m_per_s (float) – Minimum wind speed threshold; below this the interaction matrix is zero.

  • heat_rejection_scale (float) – Converts the dimensionless geometric influence into an effective temperature rise in Kelvin. Physically, this absorbs the heat rejection rate of each chiller, the condenser air-flow rate, and ambient mixing — factors that would otherwise require a full CFD model. A value of 8–15 produces realistic 1–5 K rises for typical data-center chiller arrays (ASHRAE 2021, Ch. 39).

dispersion_coeff: float = 1.2
u_min_m_per_s: float = 0.1
heat_rejection_scale: float = 10.0
compute_interaction_matrix(positions_m, wind)[source]

Return N×N matrix where entry [k, m] is thermal influence of chiller k on chiller m.

Parameters:
Return type:

ndarray[tuple[Any, …], dtype[float64]]

__init__(dispersion_coeff=1.2, u_min_m_per_s=0.1, heat_rejection_scale=10.0)
Parameters:
  • dispersion_coeff (float)

  • u_min_m_per_s (float)

  • heat_rejection_scale (float)

Return type:

None