HeatExchanger
The HeatExchanger
node models a technology that converts higher-temperature heat from a surplus heat source into lower-temperature heat that can be used in a district heating system.
The HeatExchanger
will compute the available energy, given the supply and return temperatures of the heat from the surplus heat circuit, the minimum temperature approach $\Delta T_{min}$ of the HeatExchanger
, and the supply and return temperatures of the district heating circuit. These parameters may all be given as TimeProfile
(which in many cases will be a FixedProfile
).
Introduced type and its fields
The HeatExchanger
is a subtype of the NetworkNode
. It uses the same functions as NetworkNode
in EnergyModelsBase
.
HeatExchanger
are parametric types which allow for the inclusion of different HeatExchangerAssumptions
. This approach is similar to the approach utilized for Storage in EnergyModelsBase
. These assumption determine how the two streams behave towards each other. The strict assumption of EqualMassFlow
enforces that the mass flow of both streams is the same while the assumption DifferentMassFlow
allows for differing mass flows, and hence, optimization of these flows.
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 exchanger 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.input::Dict{<:Resource, <:Real}
:
The fieldinput
includes the inputResource
s with their corresponding conversion factors as dictionaries. In the case of a heat exchanger,input
should always include exactly one resource: the heat resource used in the surplus heat system. The value of the heat resource is in general 1. 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 exchanger,output
should always include exactly one resource: the heat resource used within the district heating system. The value of the heat resource is in general 1. All values have to be non-negative.data::Vector{Data}
:
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
delta_t_min::Real
:
The minimum temperature approach of the heat exchanger. It is in general a design parameter that impacts the size of the heat exchanger and how much heat can be recovered from the hot stream.
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 HeatExchanger
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 exchanger nodes. Instead, it is implicitly assumed that the constraints are valid $\forall n ∈ N^{HeatExchanger}$ for all HeatExchanger
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 exchanger nodes utilize in general the standard constraints described on Constraint functions for NetworkNode
s. These standard constraints are:
constraints_capacity
:\[\texttt{cap\_use}[n, t] \leq \texttt{cap\_inst}[n, t]\]
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_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.
The constraints_flow_out
function is replaced with a new implementation for HeatExchangers
nodes.
The flow out of heat that can be used in the district heating system $p_{DH}$ is limited by the available fraction $dh\_fraction(A, pd, t)$ of the flow of the surplus heat resource $p_{SH}$ flow into the node.
\[\texttt{flow\_out}[n, t, p_{SH}] = dh\_fraction(A, pd, t) \times \texttt{flow\_in}[n, t ,p_{DH}]\]
The available fraction of heat available for the district heating system is calculated using the temperatures of the two resources $p_{SH}$ and $p_{DH}$ as well as the $\Delta T_{min}$ for the heat exchanger.
The default assumption $A$ for a HeatExchanger
in EnergyModelsHeat
is that the medium in both circuits is the same, but mass flows may be adjusted individually in each circuit to optimise heat transfer (DifferentMassFlow
):
\[\frac{\dot{Q}_{\text{DH}}}{\dot{Q}_{\text{SH}}} = \begin{cases} 0, & \text{for} ~ T_{\text{DH}_{\text{hot}}} > T_{\text{SH}_{\text{hot}}} - \Delta T_{\text{min}} \\ \frac{T_{\text{SH}_{\text{hot}}} - (T_{\text{DH}_{\text{cold}}} + \Delta T_{\text{min}} )}{T_{\text{SH}_{\text{hot}}} - T_{\text{SH}_{\text{cold}}}}, & \text{for} ~ T_{\text{SH}_{\text{cold}}} < T_{\text{DH}_{\text{cold}}} + \Delta T_{\text{min}} \\ 1, & \text{otherwise} \end{cases}\]
Alternatively, we can specify the more restrictive assumption that mass flows are the same in both circuits (EqualMassFlow
)
\[\frac{\dot{Q}_{\text{DH}}}{\dot{Q}_{\text{SH}}} = \begin{cases} 0, & \text{for} ~ T_{\text{DH}_{\text{hot}}} - T_{\text{DH}_{\text{cold}}} > T_{\text{SH}_{\text{hot}}} - T_{\text{SH}_{\text{cold}}} \\ 0, & \text{for} ~ T_{\text{SH}_{\text{cold}}} < T_{\text{DH}_{\text{cold}}} + \Delta T_{\text{min}} \ (\text{or}\ T_{\text{DH}_{\text{hot}}} > T_{\text{SH}_{\text{hot}}} - \Delta T_{\text{min}} ) \\ \frac{T_{\text{DH}_{\text{hot}}} - T_{\text{DH}_{\text{cold}}}}{ T_{\text{SH}_{\text{hot}}} - T_{\text{SH}_{\text{cold}}}} , & \text{otherwise} \end{cases}\]
Additional constraints
HeatExchanger
do not add additional constraint functions or constraints in the create_node
function.