Inflexible source node
Inflexible sources represent energy sources with fixed capacity usage that cannot be varied operationally. Unlike flexible sources (e.g., like RefSource) that can adjust output based on system needs, inflexible sources operate at their full installed capacity in every operational period. Examples include must-run generation units, baseload power plants with operational constraints, or heat that must be either cooled down or utilized.
The InflexibleSource is implemented as a simplified variant of the RefSource that enforces constant capacity utilization.
Introduced type and its fields
The InflexibleSource extends the Source type with fixed operational characteristics.
Standard fields
The InflexibleSource has the same standard fields as the RefSource:
id:
The fieldidis only used for providing a name to the node. This is similar to the approach utilized inEnergyModelsBase.cap::TimeProfile:
The installed capacity corresponds to the forced capacity usage of the node.
If the node should contain investments through the application ofEnergyModelsInvestments, it is important to note that you can only useFixedProfileorStrategicProfilefor the capacity, but notRepresentativeProfileorOperationalProfile. 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 specifiedoutputratios. The variable operating expenses can be provided asOperationalProfileas 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 useFixedProfileorStrategicProfilefor the fixed OPEX, but notRepresentativeProfileorOperationalProfile. In addition, all values have to be non-negative.output::Dict{<:Resource, <:Real}:
The fieldoutputincludesResources with their corresponding conversion factors as dictionaries. In the case of a non-dispatchable renewable energy source,outputshould always include your electricity resource. In practice, you should use a value of 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 whenEnergyModelsInvestmentsis used.Using `CaptureData` If you plan to use
CaptureDatafor aInflexibleSourcenode, it is crucial that you specify your CO₂ resource in theoutputdictionary. The chosen value is however not important as the CO₂ flow is automatically calculated based on the process utilization and the provided process emission value. The reason for this necessity is that flow variables are declared through the keys of theoutputdictionary. Hence, not specifying CO₂ asoutputresource results in not creating the corresponding flow variable and subsequent problems in the design.We plan to remove this necessity in the future. As it would most likely correspond to breaking changes, we have to be careful to avoid requiring major changes in other packages.
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 inflexible source node type utilize all standard variables from the RefSource node type, 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{emissions\_node}$ if
EmissionsDatais added to the fielddata.
Constraints
The following sections omit the direct inclusion of the vector of inflexible source nodes. Instead, it is implicitly assumed that the constraints are valid $\forall n ∈ N^{\text{inflexiblesource}\_source}$ for all InflexibleSource 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
Inflexible source nodes utilize in general the standard constraints described on Constraint functions. In fact, they use the same create_node function as a RefSource node. These standard constraints are:
constraints_capacity_installed:\[\texttt{cap\_inst}[n, t] = capacity(n, t)\]
Using investments The function
constraints_capacity_installedis also used inEnergyModelsInvestmentsto 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 variables $\texttt{cap\_inst}$ are 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 capacities 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_data: This function is only called for specified additional data, see above.
The function constraints_capacity is extended with a new method for inflexible source nodes to allow the fixing of the $\texttt{cap\_use}[n, t]$ to the variable $\texttt{cap\_inst}[n, t]$ (only replacing inequality with equality compared to RefSource). It now includes the individual constraint:
\[\texttt{cap\_use}[n, t] = \texttt{cap\_inst}[n, t]\]
This function still calls the subfunction constraints_capacity_installed to limit the variable $\texttt{cap\_inst}[n, t]$ or provide capacity investment options.
Additional constraints
InflexibleSource nodes do not add additional constraints.