AbstractMultipleInputSinkStrat node
AbstractMultipleInputSinkStrat
are Sink
nodes that models flexible energy service demands that can be met by a combination of multiple input resources. Unlike MultipleInputSink
nodes, we enforce that the ratio between the different input resources is the same in all operational periods of an investment period. The AbstractMultipleInputSinkStrat
introduces strategic-period-based input fractions, used to proportionally allocate resource inflows across each operational period. This allows for continuous blending of energy carriers in a flexible and cost-optimal way.
The current implementation does not allow for the incorporation of investment data as this would lead to bilinear constraints.
Introduced types and their fields
We implement two types of AbstractMultipleInputSinkStrat
nodes:
ContinuousMultipleInputSinkStrat
allows for a continuous blend between the different input resources while BinaryMultipleInputSinkStrat
requires that either one or the other resource is utilized.
ContinuousMultipleInputSinkStrat
: Use this node for fuel-flexible technologies where optimal blending between input sources (e.g., electricity and biomass) is required over longer-term strategic decisions.
BinaryMultipleInputSinkStrat
: This node is ideal for modeling strategic switching between fuels where only one option can be used at a time (e.g., policy-driven exclusivity, binary retrofitting, or fuel-type switching).
If you use BinaryMultipleInputSinkStrat
, you introduce binary decision variables, making it a mixed-integer optimization problem. Be aware of the increased computational complexity.
Both nodes have the same fields. These fields are:
id
:
The fieldid
is only used for providing a name to the node.cap::TimeProfile
:
The installed capacity corresponds to the nominal demand of the node.
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.penalty::Dict{Symbol,<:TimeProfile}
:
The penalty dictionary is used for providing penalties for soft constraints to allow for both over and under delivering the demand.
It must include the fields:surplus
and:deficit
. In addition, it is crucial that the sum of both values is larger than 0 to avoid an unconstrained model.input::Dict{<:Resource,<:Real}
:
The fieldinput
includesResource
s with their corresponding conversion factors as dictionaries.
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 used for both providingEmissionsData
and additional investment data whenEnergyModelsInvestments
is used.Included constructor The field
data
is not required as we include a constructor when the value is excluded.Using `CaptureData` As a
Sink
node does not have any output, it is not possible to utilizeCaptureData
. If you still plan to specify it, you will receive an error in the model building.
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
Standard variables
The AbstractMultipleInputSinkStrat
nodes utilize all standard variables from a Sink
node, as described on the page Optimization variables. The variables include:
- $\texttt{opex\_var}$
- $\texttt{opex\_fixed}$
- $\texttt{cap\_use}$
- $\texttt{cap\_inst}$
- $\texttt{flow\_out}$
- $\texttt{sink\_surplus}$
- $\texttt{sink\_deficit}$
- $\texttt{emissions\_node}$ if
EmissionsData
is added to the fielddata
It does not add any additional variables.
Additional variables
AbstractMultipleInputSinkStrat
nodes declare in addition several variables through dispatching on the method EnergyModelsBase.variables_element()
for including constraints for deficits and surplus for individual resources as well as what the fraction satisfied by each resource. These variables are for an AbstractMultipleInputSinkStrat
node $n$ in operational period $t$:
- $\texttt{input\_frac\_strat}[n, t_{inv}, p]$:
Fraction of the demand satisfied by input resource $p$ in strategic period $t_{inv}$. The fraction is limited between 0 and 1 in the case ofContinuousMultipleInputSinkStrat
and is binary in the case ofBinaryMultipleInputSinkStrat
. - $\texttt{sink\_surplus\_p}[n, t, p]$:
Surplus of input resource $p$ in node $n$ in operational period $t$. - $\texttt{sink\_deficit\_p}[n, t, p]$:
Deficit of input resource $p$ in node $n$ in operational period $t$.
Constraints
The following sections omit the direct inclusion of the vector of AbstractMultipleInputSinkStrat
nodes. Instead, it is implicitly assumed that the constraints are valid $\forall n ∈ N$ for all AbstractMultipleInputSinkStrat
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 investment periods).
Standard constraints
AbstractMultipleInputSinkStrat
utilize in general the standard constraints that are implemented for a Sink
node as described in the documentation of EnergyModelsBase
. These standard constraints are:
constraints_capacity_installed
:\[\texttt{cap\_inst}[n, t] = capacity(n, t)\]
constraints_opex_fixed
:
The current implementation fixes the fixed operating expenses of a sink to 0.\[\texttt{opex\_fixed}[n, t_{inv}] = 0\]
constraints_opex_var
:\[\begin{aligned} \texttt{opex\_var}[n, t_{inv}] = & \\ \sum_{t \in t_{inv}} & surplus\_penalty(n, t) \times \texttt{sink\_surplus}[n, t] + \\ & deficit\_penalty(n, t) \times \texttt{sink\_deficit}[n, t] \times \\ & scale\_op\_sp(t_{inv}, t) \end{aligned}\]
The function `scale_op_sp` The function $scale\_op\_sp(t_{inv}, t)$ calculates the scaling factor between operational and investment periods. It also takes into account potential operational scenarios and their probability as well as representative periods.
constraints_data
:
This function is only called for specified additional data, see above.
The function constraints_capacity
is extended with a new method as we moved the capacity constraint to the function constraints_flow_in
as outlined below. As a consequence, it only calls the function constraints_capacity_installed
.
The function constraints_flow_in
is extended with a new method to account for the potential of supplying the demand with multiple resources. The inlet overall flow balance is given by
\[\sum_{p \in P^{in}} \frac{\texttt{flow\_in}[n, t, p]}{inputs(n, p)} = \texttt{cap\_use}[n, t]\]
The inlet flow is linked to the binary choice and the capacity through the following function:
\[\begin{aligned} \frac{\texttt{flow\_in}[n, t, p]}{inputs(n, p)} + & \texttt{sink\_deficit\_p}[n, t, p] = \\ & capacity(n, {t_{inv}}) \times \texttt{input\_frac\_strat}[n, t_{inv}, p] + \texttt{sink\_surplus\_p}[n, t, p] \end{aligned}\]
The variable $\texttt{input\_frac\_strat}$ must sum up to one to avoid problems with the overall mass balance.
\[\sum_{p \in P^{in}} \texttt{input\_frac\_strat}[n, t_{inv}, p] = 1\]
The sum of the individual surplus and deficits of each resource represent then subsequently the complete surplus and deficit.
\[\begin{aligned} \sum_{p \in P^{in}} \texttt{sink\_surplus\_p}[n, t, p] = & \texttt{sink\_surplus}[n, t] \\ \sum_{p \in P^{in}} \texttt{sink\_deficit\_p}[n, t, p] = & \texttt{sink\_deficit}[n, t] \\ \end{aligned}\]