Compressor reference state¶
Every compressor-based model – tmhp.AirSourceHeatPump,
tmhp.GroundSourceHeatPump, tmhp.AirSourceHeatPumpBoiler,
tmhp.GroundSourceHeatPumpBoiler, tmhp.WaterSourceHeatPumpBoiler
and the composed variants built on them – derives rated speed and refrigerant
mass flow from one physical reference state:
rps_ratedidentifies the nominal-capacity operating point and the reported speed ratio,n* = rps / rps_rated. BITZER efficiencies use actual shaft speed in rev/s, without relative-speed normalization;m_dot_ref_ratednormalizes the refrigerant-side ground-HX resistance,m_dot_ref / m_dot_ref_rated(variable_ground_hx_UA=True).
The constructor builds that state from the inputs every model already needs,
so hp_capacity and the refrigerant are enough:
hp_capacity
-> V_cmp_ref (given, or capacity-scaled default)
-> rating condition (family standard, or rated_condition=...)
-> rps_rated Q_model(rps) = hp_capacity
-> m_dot_ref_rated refrigerant mass flow of the same state
-> normal simulation
from tmhp import GroundSourceHeatPump
hp = GroundSourceHeatPump(hp_capacity=8000, variable_ground_hx_UA=True)
hp.rps_rated # solved rated speed [rev/s]
hp.m_dot_ref_rated # solved rated refrigerant flow [kg/s]
hp.reference_state.cop # load duty / compressor input at rating
hp.rated_condition.standard # which rating point was used
Capacity-only initialization constructs a representative compressor; it does not identify the exact manufacturer compressor.
When manufacturer compressor data are unavailable, V_cmp_ref is estimated
from nominal heat-pump capacity
(tmhp.compressor_speed.default_displacement()). The rated compressor
speed and reference refrigerant mass flow are then solved self-consistently at
the model’s standard/reference rating condition.
What each symbol means¶
Symbol |
Meaning (identical in every model) |
|---|---|
|
Rated/reference capacity: load-side duty at the rating condition. |
|
Compressor swept displacement [m3/rev]. |
|
Speed that delivers |
|
Hardware/control speed limits. |
|
Refrigerant mass flow of the same reference state. |
Explicit values always win. V_cmp_ref, rps_rated and
m_dot_ref_rated given to the constructor are used as they are; only the
ones left as None are solved. With an explicit rps_rated the model
behaves exactly as before this feature (baseline correlations built at that
speed), and m_dot_ref_rated is still derived from the rating condition.
Scalar and callable efficiency inputs are unchanged; the reference solve
evaluates a caller’s callable as given and the baseline correlations at the
actual candidate shaft speed.
Rating conditions¶
The rating point is not the condition being simulated. Each family has a standard rating point; air coils in TMHP are dry, so wet-bulb conditions of the standards are not used. The boiler models’ condenser is immersed in a lumped tank whose temperature is set to the standard’s water outlet temperature.
Family |
Mode |
Source inlet |
Load inlet |
Standard |
|---|---|---|---|---|
ASHP |
cooling |
outdoor air 35 °C |
indoor air 27 °C |
ISO 5151:2017 T1 (heating: H1, 7 °C / 20 °C) |
GSHP |
cooling |
ground-loop liquid 25 °C |
indoor air 27 °C |
ISO 13256-1:2021 ground-loop (heating: 0 °C / 20 °C) |
ASHPB |
heating |
outdoor air 7 °C |
tank 55 °C |
EN 14511-2:2022 A7/W55 |
GSHPB |
heating |
brine 0 °C |
tank 55 °C |
EN 14511-2:2022 B0/W55 |
WSHPB |
heating |
water 10 °C |
tank 55 °C |
EN 14511-2:2022 W10/W55 |
Secondary flows are each model’s own reference flows (dV_*_fan_a_ref,
ground_flow_ref_lpm, dV_b_f_lpm) and both heat exchangers use their
rated UA. A manufacturer or user rating point replaces the standard one:
from tmhp import AirSourceHeatPump, AirSourceHeatPumpBoiler
AirSourceHeatPump(rated_condition={"mode": "heating"}) # ISO 5151 H1
AirSourceHeatPumpBoiler(rated_condition={"source_T_C": 2.0, "load_T_C": 50.0})
Accepted keys are mode, source_T_C, load_T_C and standard; a
complete tmhp.reference_state.RatingCondition is also accepted.
How it is solved¶
At the rating point the load-side duty is hp_capacity, so the load-side
saturation temperature follows from that heat exchanger directly. In heating,
the solver tries actual speeds inside [rps_min, rps_max]. At each speed it
closes the source evaporator’s mass-flow and heat-exchanger balance, then solves
Q_cond(rps) - hp_capacity = 0 over evaluable speed intervals. This avoids
assuming condenser duty increases from the minimum speed: raw speed-dependent
efficiencies can produce a decreasing segment and multiple mass-flow branches.
In cooling, the known evaporator duty fixes mass flow and speed, then an outer
root closes the source condenser. Every efficiency is evaluated at the actual
candidate speed, and both final heat-exchanger balances are verified. The solve uses
fixed rated UA: variable ground-HX UA needs m_dot_ref_rated, which is what
is being solved for, so it is activated only afterwards. Each object solves
once; identical machines share a cached result.
The interval search refines a bounded set of actual, finite evaluations; invalid points split a bracket rather than supplying extrapolated duties. A custom fit with an arbitrarily narrow valid domain can still evade this finite search. An error saying that no finite balance could be bracketed reports that search limitation; it does not prove that every possible custom-fit state is physically infeasible. Declare the supported speed interval or supply an explicit rated speed and refrigerant mass flow when such a fit requires a narrower search.
When it fails¶
A rated capacity the machine cannot reach is an inconsistent machine
definition, not a numerical event. The constructor raises
tmhp.reference_state.ReferenceStateError (a ValueError) whose
message starts with reference_capacity_inconsistent when
the speed needed is outside
[rps_min, rps_max]– typically a displacement that does not match the capacity, e.g. a low-pressure fluid such as R600a with the R32-based default displacement;the rating point requires a supercritical condenser – e.g. R744 at a W55 boiler rating point, since TMHP cycles are subcritical;
the rated heat exchangers cannot carry the rated duty.
The speed is never clamped onto a bound: that would deliver a different
capacity and silently redefine the machine. Supply V_cmp_ref,
rps_rated or a reachable rated_condition. With an explicit
rps_rated an unreachable rating point only leaves m_dot_ref_rated
unset (with a RuntimeWarning), which matters only if
variable_ground_hx_UA=True.
The pressure-ratio envelope (PR_cycle_min / PR_cycle_max) is an
operating limit and is not imposed on the rating point;
reference_state.pressure_ratio reports it.