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 field id is only used for providing a name to the node. This is similar to the approach utilized in EnergyModelsBase.

  • 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 of EnergyModelsInvestments, it is important to note that you can only use FixedProfile or StrategicProfile for the capacity, but not RepresentativeProfile or OperationalProfile.
    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 specified output ratios. The variable operating expenses can be provided as OperationalProfile as well.

  • opex_fixed::TimeProfile:
    The fixed operating expenses are relative to the installed capacity (through the field cap) and the chosen duration of a strategic period as outlined on Utilize TimeStruct.
    It is important to note that you can only use FixedProfile or StrategicProfile for the fixed OPEX, but not RepresentativeProfile or OperationalProfile. In addition, all values have to be non-negative.

  • input::Dict{<:Resource, <:Real}:
    The field input includes the input Resources 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 field output includes the output Resources 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{<:ExtensionData}:
    An entry for providing additional data to the model. In the current version, it is only relevant for additional investment data when EnergyModelsInvestments is used or for additional emission data through EmissionsProcess. 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:

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 NetworkNodes. 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 in EnergyModelsInvestments 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.

  • constraints_ext_data:
    This function is only called for specified data of the storage node, see above.

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.