HeatPump
The HeatPump
node models a technology that converts low-temperature heat into higher-temperature heat using an exergy driving force. The most common form of exergy driving force is electricity, but the same node could be used to model heat-driven heat pumps, where the exergy input comes in the form of high temperature heat. For simplicity, the term "electricity" is used to represent the exergy driving force in the following. The HeatPump
node supports dynamic coefficients of performance (COP) based on the source and sink temperatures and Carnot efficiency. The Carnot efficiency describes the ratio of the theoretical maximum achievable COP (Carnot COP), which is based solely on the temperature lift between the source and sink temperature, and the actual COP. This allows for a straightforward calculation of the relation between heat and electricity input. While the Carnot efficiency in practice depends on several factors beyond the source and sink temperatures and is typically not constant across all operating conditions, it is provided here as an exogenous parameter by the user in the form of a TimeProfile
. The user can analyze the sink and source temperature profiles and can predetermine a theoretical Carnot efficiency profile based on that. A lower capacity bound can be defined, restricting how much the heat pump can be regulated down.
Introduced type and its fields
The HeatPump
is a subtype of the NetworkNode
. It uses the same functions as NetworkNode
in EnergyModelsBase
.
Standard fields
id
:
The fieldid
is only used for providing a name to the node. This is similar to the approach utilized inEnergyModelsBase
.cap::TimeProfile
:
Specifies the installed heating capacity, that is the heat the heat pump can deliver.
If the node should contain investments through the application ofEnergyModelsInvestments
, it is important to note that you can only useFixedProfile
orStrategicProfile
for the capacity, but notRepresentativeProfile
orOperationalProfile
.
In addition, all values have to be non-negative.opex_var::TimeProfile
:
The variable operational expenses are based on the capacity utilization through the variable:cap_use
. Hence, it is directly related to the specifiedoutput
ratios. The variable operating expenses can be provided asOperationalProfile
as well.opex_fixed::TimeProfile
:
The fixed operating expenses are relative to the installed capacity (through the fieldcap
) and the chosen duration of a strategic period as outlined on UtilizeTimeStruct
.
It is important to note that you can only useFixedProfile
orStrategicProfile
for the fixed OPEX, but notRepresentativeProfile
orOperationalProfile
. In addition, all values have to be non-negative.output::Dict{<:Resource, <:Real}
:
The fieldoutput
includes the outputResource
s with their corresponding conversion factors as dictionaries. In the case of a heat pump,output
should always include the heat resource used within the energy system. The value of the heat resource is in general 1. It is also possible to include other resources which are produced with a given correlation with the heat.
All values have to be non-negative.data::Vector{<:ExtensionData}
:
An entry for providing additional data to the model. In the current version, it is only relevant for additional investment data whenEnergyModelsInvestments
is used or for additional emission data throughEmissionsProcess
. The latter would correspond to uncaptured CO₂ that should be included in the analyses.
New fields
cap_lower_bound::Real
:
The lower bound for the capacity is the minimum operating point of theHeatPump
. It can be included for limiting the flexibility of the heat pump.t_source::TimeProfile
:
The source temperature is the temperature of the source in °C. This temperature represents the temperature at which the heat pump absorbs heat, e.g., the air temperature. The used heat is given by the fieldinput_heat
.t_sink::TimeProfile
:
The sink temperature is the temperature at which the heat pump delivers heat in °C. It is directly related to the temperature of theoutput
resource corresponding to heat.eff_carnot::TimeProfile
:
The Carnot efficiency is the ratio bnbetween the real and the Carnot COP, and hence, the relation between the maximum theoretical efficiency and the real efficiency of the heat pump. The effective Carnot efficiency depends on the specific heat pump model as well as its operational conditions.Usage dependent efficiencies The capacity use cannot be included as an influencing factor on the Carnot efficiency as it is implemented as an optimization variable. This would then result in a bilinear term of a piecewise linear representation and a continuous variable. However, the user can utilize the known temperature lifts to adjust the Carnot efficiency profile according to the technical specifications of the heat pump.
input_heat::Resource
:
The heat input resource corresponds to the lower temperature heat reservoir from which heat is transfered to a higher temperature. In most approaches, the input_heat is corresponding to the surrounding (e.g., the air), but it can also correspond to a lower temperature water stream.driving_force:Resource
:
The driving force resource provides the energy for transfering the heat from the lower temperature (given byt_source
) to the higher temperature (given byt_sink
). The driving force is in general electricity.
Mathematical description
In the following mathematical equations, we use the name for variables and functions used in the model. Variables are in general represented as
$\texttt{var\_example}[index_1, index_2]$
with square brackets, while functions are represented as
$func\_example(index_1, index_2)$
with paranthesis.
Variables
The HeatPump
node uses standard NetworkNode
variables, as described on the page Optimization variables. The variables include:
- $\texttt{opex\_var}$
- $\texttt{opex\_fixed}$
- $\texttt{cap\_use}$
- $\texttt{cap\_inst}$
- $\texttt{flow\_in}$
- $\texttt{flow\_out}$
Constraints
The following sections omit the direct inclusion of the vector of heat pump nodes. Instead, it is implicitly assumed that the constraints are valid $\forall n ∈ N^{HeatPump}$ for all HeatPump
types if not stated differently. In addition, all constraints are valid $\forall t \in T$ (that is in all operational periods) or $\forall t_{inv} \in T^{Inv}$ (that is in all strategic periods).
Standard constraints
Heat pump nodes utilize in general the standard constraints described on Constraint functions for NetworkNode
s. These standard constraints are:
constraints_capacity_installed
:\[\texttt{cap\_inst}[n, t] = capacity(n, t)\]
Using investments The function
constraints_capacity_installed
is also used inEnergyModelsInvestments
to incorporate the potential for investment. Nodes with investments are then no longer constrained by the parameter capacity.constraints_flow_out
:\[\texttt{flow\_out}[n, t, p] = outputs(n, p) \times \texttt{cap\_use}[n, t] \qquad \forall p \in outputs(n) \setminus \{\text{CO}_2\}\]
constraints_opex_fixed
:\[\texttt{opex\_fixed}[n, t_{inv}] = opex\_fixed(n, t_{inv}) \times \texttt{cap\_inst}[n, first(t_{inv})]\]
Why do we use `first()` The variable $\texttt{cap\_inst}$ is declared over all operational periods (see the section on Capacity variables for further explanations). Hence, we use the function $first(t_{inv})$ to retrieve the installed capacity in the first operational period of a given strategic period $t_{inv}$ in the function
constraints_opex_fixed
.constraints_opex_var
:\[\texttt{opex\_var}[n, t_{inv}] = \sum_{t \in t_{inv}} opex\_var(n, t) \times \texttt{cap\_use}[n, t] \times scale\_op\_sp(t_{inv}, t)\]
The function `scale_op_sp` The function $scale\_op\_sp(t_{inv}, t)$ calculates the scaling factor between operational and strategic periods. It also takes into account potential operational scenarios and their probability as well as representative periods.
constraints_ext_data
:
This function is only called for specified data of the storage node, see above.
The constraints_capacity
function is extended by implementing the lower capacity bound to limit the lowest possible capacity use:
\[\texttt{cap\_use}[n, t] \geq cap\_lower\_bound(n) \times \texttt{cap\_inst}[n, t]\]
The original constraints limiting the capacity to the installed capacity:
\[\texttt{cap\_use}[n, t] \leq \texttt{cap\_inst}[n, t]\]
and calling the subfunction constraints_capacity_installed
to provide bounds for the variable $\texttt{cap\_inst}[n, t]$ are still called within the function.
The input flow constraint for a HeatPump
node is calculated differently to a NetworkNode
as the relationship between heat_in_resource
and driving_force_resource
is reflecting the COP of the heat pump. Since the input resources are specified via the fields heat_in_resource
and driving_force_resource
, and the conversion factors are calculated seperately, the field inputs
is not required. The determination of conversion factors is achieved by extending the constraints_flow_in
function, separating the calculation for the input flow of heat source and driving force. All temperatures are specified in degree Celsius, so the values must be converted into Kelvin by adding 273.15 °C.
Given a heat resource $p_{heat} = heat\_in\_resource(n)$, we can calculate the heat input as:
\[\begin{aligned} \texttt{flow\_in}&[n, t, p_{heat}] = \texttt{cap\_use}[n, t] \times \\ & \left( 1 - \frac{t\_sink(n, t) - t\_source(n, t)}{eff\_carnot(n,t) \times (t\_sink(n, t) + 273.15)} \right) \end{aligned}\]
The input for the $p_{df} = driving\_force\_resource(n)$
\[\begin{aligned} \texttt{flow\_in}&[n, t, p_{df}] = \texttt{cap\_use}[n, t] \times \\ & \frac{t\_sink(n, t) - t\_source(n, t)}{eff\_carnot(n,t) \times (t\_sink(n, t) + 273.15)} \end{aligned}\]
Additional constraints
HeatPump
nodes do not add additional constraint functions or constraints in the create_node
function.