Base math
Complete base mathematical formulation for a Calliope model.
This math is always applied but can be overridden using custom math .
Download the base math formulation as a YAML file
Objective
min_cost_optimisation
Minimise the total cost of installing and operating all technologies in the system. If multiple cost classes are present (e.g., monetary and co2 emissions), the weighted sum of total costs is minimised. Cost class weights can be defined in the indexed parameter objective_cost_weights
.
\[
\begin{array}{r}
\min{}
\end{array}
\begin{cases}
\sum\limits_{\text{cost} \in \text{costs}} (\sum\limits_{\text{[nodes,techs]} \in \text{[nodes,techs]}} (\textbf{cost}_\text{node,tech,cost}) \times \textit{objective\_cost\_weights}) + \sum\limits_{\text{timestep} \in \text{timesteps}} (\sum\limits_{\text{[carriers,nodes]} \in \text{[carriers,nodes]}} (\textbf{unmet\_demand}_\text{node,carrier,timestep} - \textbf{unused\_supply}_\text{node,carrier,timestep}) \times \textit{timestep\_weights}_\text{timestep}) \times \textit{bigM}&\quad
\text{if } (\bigvee\limits_{\substack{\text{node} \in \text{nodes} \\ \text{tech} \in \text{techs} \\ \text{cost} \in \text{costs}}} (cost))\land{}(\text{config.ensure\_feasibility}\mathord{=}\text{true})
\\
\sum\limits_{\text{cost} \in \text{costs}} (\sum\limits_{\text{[nodes,techs]} \in \text{[nodes,techs]}} (\textbf{cost}_\text{node,tech,cost}) \times \textit{objective\_cost\_weights})&\quad
\text{if } (\bigvee\limits_{\substack{\text{node} \in \text{nodes} \\ \text{tech} \in \text{techs} \\ \text{cost} \in \text{costs}}} (cost))\land{}(\neg (\text{config.ensure\_feasibility}\mathord{=}\text{true}))
\\
\sum\limits_{\text{timestep} \in \text{timesteps}} (\sum\limits_{\text{[carriers,nodes]} \in \text{[carriers,nodes]}} (\textbf{unmet\_demand}_\text{node,carrier,timestep} - \textbf{unused\_supply}_\text{node,carrier,timestep}) \times \textit{timestep\_weights}_\text{timestep}) \times \textit{bigM}&\quad
\text{if } (\neg (\bigvee\limits_{\substack{\text{node} \in \text{nodes} \\ \text{tech} \in \text{techs} \\ \text{cost} \in \text{costs}}} (cost)))\land{}(\text{config.ensure\_feasibility}\mathord{=}\text{true})
\\
0&\quad
\text{if } (\neg (\bigvee\limits_{\substack{\text{node} \in \text{nodes} \\ \text{tech} \in \text{techs} \\ \text{cost} \in \text{costs}}} (cost)))\land{}(\neg (\text{config.ensure\_feasibility}\mathord{=}\text{true}))
\\
\end{cases}
\]
Subject to
flow_capacity_per_storage_capacity_min
Set the lower bound of storage flow capacity relative to its storage capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textbf{storage\_cap}_\text{node,tech}) \land \exists (\textit{flow\_cap\_per\_storage\_cap\_min}_\text{tech}))
\end{array}
\begin{cases}
\textbf{flow\_cap}_\text{node,tech,carrier} \geq \textbf{storage\_cap}_\text{node,tech} \times \textit{flow\_cap\_per\_storage\_cap\_min}_\text{tech}&\quad
\\
\end{cases}
\]
flow_capacity_per_storage_capacity_max
Set the upper bound of storage flow capacity relative to its storage capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textbf{storage\_cap}_\text{node,tech}) \land \exists (\textit{flow\_cap\_per\_storage\_cap\_max}_\text{tech}))
\end{array}
\begin{cases}
\textbf{flow\_cap}_\text{node,tech,carrier} \leq \textbf{storage\_cap}_\text{node,tech} \times \textit{flow\_cap\_per\_storage\_cap\_max}_\text{tech}&\quad
\\
\end{cases}
\]
source_capacity_equals_flow_capacity
Set a supply
technology's flow capacity to equal its source capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textbf{source\_cap}_\text{node,tech}) \land \textit{source\_cap\_equals\_flow\_cap}_\text{tech}\mathord{=}\text{true})
\end{array}
\begin{cases}
\textbf{source\_cap}_\text{node,tech} = \textbf{flow\_cap}_\text{node,tech,carrier}&\quad
\\
\end{cases}
\]
force_zero_area_use
Set a technology's area use to zero if its flow capacity upper bound is zero.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\text{if } (\exists (\textbf{area\_use}_\text{node,tech}) \land \textit{flow\_cap\_max}_\text{tech}\mathord{=}\text{0})
\end{array}
\begin{cases}
\textbf{area\_use}_\text{node,tech} = 0&\quad
\\
\end{cases}
\]
area_use_per_flow_capacity
Set a fixed relationship between a technology's flow capacity and its area use.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textbf{area\_use}_\text{node,tech}) \land \exists (\textit{area\_use\_per\_flow\_cap}_\text{tech}))
\end{array}
\begin{cases}
\textbf{area\_use}_\text{node,tech} = \textbf{flow\_cap}_\text{node,tech,carrier} \times \textit{area\_use\_per\_flow\_cap}_\text{tech}&\quad
\\
\end{cases}
\]
area_use_capacity_per_loc
Set an upper bound on the total area that all technologies with area_use
can occupy at a given node.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes }
\\
\text{if } (\exists (\textbf{area\_use}_\text{node,tech}) \land \exists (\textit{available\_area}_\text{node}))
\end{array}
\begin{cases}
\sum\limits_{\text{tech} \in \text{techs}} (\textbf{area\_use}_\text{node,tech}) \leq \textit{available\_area}_\text{node}&\quad
\\
\end{cases}
\]
flow_capacity_systemwide_max
Set an upper bound on flow capacity of a technology across all nodes in which the technology exists.
\[
\begin{array}{r}
\forall{}
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textit{flow\_cap\_max\_systemwide}_\text{tech}))
\end{array}
\begin{cases}
\sum\limits_{\text{node} \in \text{nodes}} (\textbf{flow\_cap}_\text{node,tech,carrier}) \leq \textit{flow\_cap\_max\_systemwide}_\text{tech}&\quad
\\
\end{cases}
\]
flow_capacity_systemwide_min
Set a lower bound on flow capacity of a technology across all nodes in which the technology exists.
\[
\begin{array}{r}
\forall{}
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textit{flow\_cap\_min\_systemwide}_\text{tech}))
\end{array}
\begin{cases}
\sum\limits_{\text{node} \in \text{nodes}} (\textbf{flow\_cap}_\text{node,tech,carrier}) \geq \textit{flow\_cap\_min\_systemwide}_\text{tech}&\quad
\\
\end{cases}
\]
balance_conversion
Fix the relationship between a conversion
technology's outflow and consumption.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{conversion} \land \neg (\textit{include\_storage}_\text{tech}\mathord{=}\text{true}))
\end{array}
\begin{cases}
\sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep}) = \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep})&\quad
\\
\end{cases}
\]
flow_out_max
Set the upper bound of a technology's outflow.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textit{carrier\_out}_\text{node,tech,carrier}) \land \neg (\exists (\textbf{operating\_units}_\text{node,tech,timestep})))
\end{array}
\begin{cases}
\textbf{flow\_out}_\text{node,tech,carrier,timestep} \leq \textbf{flow\_cap}_\text{node,tech,carrier} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_out\_parasitic\_eff}_\text{tech}&\quad
\\
\end{cases}
\]
flow_out_min
Set the lower bound of a technology's outflow.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textit{flow\_out\_min\_relative}_\text{tech}) \land \neg (\exists (\textbf{operating\_units}_\text{node,tech,timestep})))
\end{array}
\begin{cases}
\textbf{flow\_out}_\text{node,tech,carrier,timestep} \geq \textbf{flow\_cap}_\text{node,tech,carrier} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_out\_min\_relative}_\text{tech}&\quad
\\
\end{cases}
\]
flow_in_max
Set the upper bound of a technology's inflow.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \neg (\exists (\textbf{operating\_units}_\text{node,tech,timestep})))
\end{array}
\begin{cases}
\textbf{flow\_in}_\text{node,tech,carrier,timestep} \leq \textbf{flow\_cap}_\text{node,tech,carrier} \times \textit{timestep\_resolution}_\text{timestep}&\quad
\\
\end{cases}
\]
source_max
Set the upper bound of a supply
technology's source consumption.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{source\_cap}_\text{node,tech}))
\end{array}
\begin{cases}
\textbf{source\_use}_\text{node,tech,timestep} \leq \textit{timestep\_resolution}_\text{timestep} \times \textbf{source\_cap}_\text{node,tech}&\quad
\\
\end{cases}
\]
storage_max
Set the upper bound of the amount of carrier a technology can store.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep}))
\end{array}
\begin{cases}
\textbf{storage}_\text{node,tech,timestep} \leq \textbf{storage\_cap}_\text{node,tech}&\quad
\\
\end{cases}
\]
storage_discharge_depth_limit
Set the lower bound of the stored carrier a technology must keep in reserve at all times.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep}) \land \exists (\textit{storage\_discharge\_depth}_\text{tech}))
\end{array}
\begin{cases}
\textbf{storage}_\text{node,tech,timestep} - (\textit{storage\_discharge\_depth}_\text{tech} \times \textbf{storage\_cap}_\text{node,tech}) \geq 0&\quad
\\
\end{cases}
\]
system_balance
Set the global carrier balance of the optimisation problem by fixing the total production of a given carrier to equal the total consumption of that carrier at every node in every timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\end{array}
\begin{cases}
\sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_export}_\text{node,tech,carrier,timestep}) + \textbf{unmet\_demand}_\text{node,carrier,timestep} + \textbf{unused\_supply}_\text{node,carrier,timestep} = 0&\quad
\text{if } (\text{config.ensure\_feasibility}\mathord{=}\text{true})\land{}(\bigvee\limits_{\text{tech} \in \text{techs}} (carrier_export))
\\
\sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep}) + \textbf{unmet\_demand}_\text{node,carrier,timestep} + \textbf{unused\_supply}_\text{node,carrier,timestep} = 0&\quad
\text{if } (\text{config.ensure\_feasibility}\mathord{=}\text{true})\land{}(\neg (\bigvee\limits_{\text{tech} \in \text{techs}} (carrier_export)))
\\
\sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_export}_\text{node,tech,carrier,timestep}) = 0&\quad
\text{if } (\neg (\text{config.ensure\_feasibility}\mathord{=}\text{true}))\land{}(\bigvee\limits_{\text{tech} \in \text{techs}} (carrier_export))
\\
\sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep}) = 0&\quad
\text{if } (\neg (\text{config.ensure\_feasibility}\mathord{=}\text{true}))\land{}(\neg (\bigvee\limits_{\text{tech} \in \text{techs}} (carrier_export)))
\\
\end{cases}
\]
balance_demand
Set the upper bound on, or a fixed total of, that a demand technology must dump to its sink in each timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{demand})
\end{array}
\begin{cases}
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} = \textit{sink\_use\_equals} \times \textbf{area\_use}_\text{node,tech}&\quad
\text{if } (\exists (\textit{sink\_use\_equals}))\land{}(\textit{sink\_unit}_\text{tech}\mathord{=}\text{per\_area})
\\
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} = \textit{sink\_use\_equals} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier})&\quad
\text{if } (\exists (\textit{sink\_use\_equals}))\land{}(\textit{sink\_unit}_\text{tech}\mathord{=}\text{per\_cap})
\\
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} = \textit{sink\_use\_equals} \times 1&\quad
\text{if } (\exists (\textit{sink\_use\_equals}))\land{}(\textit{sink\_unit}_\text{tech}\mathord{=}\text{absolute})
\\
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} \leq \textit{sink\_use\_max}_\text{tech,timestep} \times \textbf{area\_use}_\text{node,tech}&\quad
\text{if } (\neg (\exists (\textit{sink\_use\_equals})) \land \exists (\textit{sink\_use\_max}_\text{tech,timestep}))\land{}(\textit{sink\_unit}_\text{tech}\mathord{=}\text{per\_area})
\\
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} \leq \textit{sink\_use\_max}_\text{tech,timestep} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier})&\quad
\text{if } (\neg (\exists (\textit{sink\_use\_equals})) \land \exists (\textit{sink\_use\_max}_\text{tech,timestep}))\land{}(\textit{sink\_unit}_\text{tech}\mathord{=}\text{per\_cap})
\\
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} \leq \textit{sink\_use\_max}_\text{tech,timestep} \times 1&\quad
\text{if } (\neg (\exists (\textit{sink\_use\_equals})) \land \exists (\textit{sink\_use\_max}_\text{tech,timestep}))\land{}(\textit{sink\_unit}_\text{tech}\mathord{=}\text{absolute})
\\
\end{cases}
\]
balance_demand_min_use
Set the lower bound on the quantity of flow a demand
technology must dump to its sink in each timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textit{sink\_use\_min}_\text{tech}) \land \neg (\exists (\textit{sink\_use\_equals})) \land \textit{base\_tech}_\text{tech}\mathord{=}\text{demand})
\end{array}
\begin{cases}
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} \geq \textit{sink\_use\_min}_\text{tech} \times \textbf{area\_use}_\text{node,tech}&\quad
\text{if } (\textit{sink\_unit}_\text{tech}\mathord{=}\text{per\_area})
\\
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} \geq \textit{sink\_use\_min}_\text{tech} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier})&\quad
\text{if } (\textit{sink\_unit}_\text{tech}\mathord{=}\text{per\_cap})
\\
\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep} \geq \textit{sink\_use\_min}_\text{tech} \times 1&\quad
\text{if } (\textit{sink\_unit}_\text{tech}\mathord{=}\text{absolute})
\\
\end{cases}
\]
balance_supply_no_storage
Fix the outflow of a supply
technology to its consumption of the available source.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply} \land \neg (\textit{include\_storage}_\text{tech}\mathord{=}\text{true}))
\end{array}
\begin{cases}
\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep} = \textbf{source\_use}_\text{node,tech,timestep} \times \textit{source\_eff}_\text{tech}&\quad
\\
\end{cases}
\]
balance_supply_with_storage
Fix the outflow of a supply
technology to its consumption of the available source, with a storage buffer to temporally offset the outflow from source consumption.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep}) \land \textit{base\_tech}_\text{tech}\mathord{=}\text{supply})
\end{array}
\begin{cases}
\textbf{storage}_\text{node,tech,timestep} = \textit{storage\_initial}_\text{tech} \times \textbf{storage\_cap}_\text{node,tech} + (\textbf{source\_use}_\text{node,tech,timestep} \times \textit{source\_eff}_\text{tech}) - \textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep}&\quad
\text{if } (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]} \land \neg (\textit{cyclic\_storage}\mathord{=}\text{true}))
\\
\textbf{storage}_\text{node,tech,timestep} = ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep-1}}) \times \textbf{storage}_\text{node,tech,timestep-1} + (\textbf{source\_use}_\text{node,tech,timestep} \times \textit{source\_eff}_\text{tech}) - \textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep}&\quad
\text{if } (((\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]} \land \textit{cyclic\_storage}\mathord{=}\text{true}) \lor \neg (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]})) \land \neg (\textit{lookup\_cluster\_first\_timestep}\mathord{=}\text{true}))
\\
\textbf{storage}_\text{node,tech,timestep} = ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep=lookup\_cluster\_last\_timestep[timestep]}}) \times \textbf{storage}_\text{node,tech,timestep=lookup\_cluster\_last\_timestep[timestep]} + (\textbf{source\_use}_\text{node,tech,timestep} \times \textit{source\_eff}_\text{tech}) - \textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep}&\quad
\text{if } (\textit{lookup\_cluster\_first\_timestep}\mathord{=}\text{true} \land \neg (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]} \land \neg (\textit{cyclic\_storage}\mathord{=}\text{true})))
\\
\end{cases}
\]
source_availability_supply
Set the upper bound on, or a fixed total of, a supply
technology's ability to consume its available resource.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{source\_use}_\text{node,tech,timestep}) \land (\exists (\textit{source\_use\_equals}) \lor \exists (\textit{source\_use\_max}_\text{tech})))
\end{array}
\begin{cases}
\textbf{source\_use}_\text{node,tech,timestep} = \textit{source\_use\_equals} \times \textbf{area\_use}_\text{node,tech}&\quad
\text{if } (\exists (\textit{source\_use\_equals}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_area})
\\
\textbf{source\_use}_\text{node,tech,timestep} = \textit{source\_use\_equals} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier})&\quad
\text{if } (\exists (\textit{source\_use\_equals}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_cap})
\\
\textbf{source\_use}_\text{node,tech,timestep} = \textit{source\_use\_equals} \times 1&\quad
\text{if } (\exists (\textit{source\_use\_equals}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{absolute})
\\
\textbf{source\_use}_\text{node,tech,timestep} \leq \textit{source\_use\_max}_\text{tech} \times \textbf{area\_use}_\text{node,tech}&\quad
\text{if } (\neg (\exists (\textit{source\_use\_equals})) \land \exists (\textit{source\_use\_max}_\text{tech}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_area})
\\
\textbf{source\_use}_\text{node,tech,timestep} \leq \textit{source\_use\_max}_\text{tech} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier})&\quad
\text{if } (\neg (\exists (\textit{source\_use\_equals})) \land \exists (\textit{source\_use\_max}_\text{tech}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_cap})
\\
\textbf{source\_use}_\text{node,tech,timestep} \leq \textit{source\_use\_max}_\text{tech} \times 1&\quad
\text{if } (\neg (\exists (\textit{source\_use\_equals})) \land \exists (\textit{source\_use\_max}_\text{tech}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{absolute})
\\
\end{cases}
\]
balance_supply_min_use
Set the lower bound on the quantity of its source a supply
technology must use in each timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textit{source\_use\_min}_\text{tech}) \land \neg (\exists (\textit{source\_use\_equals})) \land \textit{base\_tech}_\text{tech}\mathord{=}\text{supply})
\end{array}
\begin{cases}
\textbf{source\_use}_\text{node,tech,timestep} \geq \textit{source\_use\_min}_\text{tech} \times \textbf{area\_use}_\text{node,tech}&\quad
\text{if } (\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_area})
\\
\textbf{source\_use}_\text{node,tech,timestep} \geq \textit{source\_use\_min}_\text{tech} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier})&\quad
\text{if } (\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_cap})
\\
\textbf{source\_use}_\text{node,tech,timestep} \geq \textit{source\_use\_min}_\text{tech} \times 1&\quad
\text{if } (\textit{source\_unit}_\text{tech}\mathord{=}\text{absolute})
\\
\end{cases}
\]
balance_storage
Fix the quantity of carrier stored in a storage
technology at the end of each timestep based on the net flow of carrier charged and discharged and the quantity of carrier stored at the start of the timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } ((\textit{include\_storage}_\text{tech}\mathord{=}\text{true} \lor \textit{base\_tech}_\text{tech}\mathord{=}\text{storage}) \land \neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply} \lor \textit{base\_tech}_\text{tech}\mathord{=}\text{demand}))
\end{array}
\begin{cases}
\textbf{storage}_\text{node,tech,timestep} = \textit{storage\_initial}_\text{tech} \times \textbf{storage\_cap}_\text{node,tech} - \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep})&\quad
\text{if } (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]} \land \neg (\textit{cyclic\_storage}\mathord{=}\text{true}))
\\
\textbf{storage}_\text{node,tech,timestep} = ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep-1}}) \times \textbf{storage}_\text{node,tech,timestep-1} - \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep})&\quad
\text{if } (((\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]} \land \textit{cyclic\_storage}\mathord{=}\text{true}) \lor \neg (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]})) \land \neg (\textit{lookup\_cluster\_first\_timestep}\mathord{=}\text{true}))
\\
\textbf{storage}_\text{node,tech,timestep} = ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep=lookup\_cluster\_last\_timestep[timestep]}}) \times \textbf{storage}_\text{node,tech,timestep=lookup\_cluster\_last\_timestep[timestep]} - \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep})&\quad
\text{if } (\textit{lookup\_cluster\_first\_timestep}\mathord{=}\text{true} \land \neg (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]} \land \neg (\textit{cyclic\_storage}\mathord{=}\text{true})))
\\
\end{cases}
\]
set_storage_initial
Fix the relationship between carrier stored in a storage
technology at the start and end of the whole model period.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep}) \land \exists (\textit{storage\_initial}_\text{tech}) \land \textit{cyclic\_storage}\mathord{=}\text{true})
\end{array}
\begin{cases}
\textbf{storage}_\text{node,tech,timestep=timesteps[-1]} \times ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep=timesteps[-1]}}) = \textit{storage\_initial}_\text{tech} \times \textbf{storage\_cap}_\text{node,tech}&\quad
\\
\end{cases}
\]
balance_transmission
Fix the relationship between between carrier flowing into and out of a transmission
link in each timestep.
\[
\begin{array}{r}
\forall{}
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})
\end{array}
\begin{cases}
\sum\limits_{\text{[nodes,carriers]} \in \text{[nodes,carriers]}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep}) = \sum\limits_{\text{[nodes,carriers]} \in \text{[nodes,carriers]}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep})&\quad
\\
\end{cases}
\]
symmetric_transmission
Fix the flow capacity of two transmission
technologies representing the same link in the system.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})
\end{array}
\begin{cases}
\sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier}) = \textbf{link\_flow\_cap}_\text{tech}&\quad
\\
\end{cases}
\]
export_balance
Set the lower bound of a technology's outflow to a technology's carrier export, for any technologies that can export carriers out of the system.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep}))
\end{array}
\begin{cases}
\textbf{flow\_out}_\text{node,tech,carrier,timestep} \geq \textbf{flow\_export}_\text{node,tech,carrier,timestep}&\quad
\\
\end{cases}
\]
flow_export_max
Set the upper bound of a technology's carrier export, for any technologies that can export carriers out of the system.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep}) \land \exists (\textit{export\_max}_\text{tech}))
\end{array}
\begin{cases}
\textbf{flow\_export}_\text{node,tech,carrier,timestep} \leq \textit{export\_max}_\text{tech} \times \textbf{operating\_units}_\text{node,tech,timestep}&\quad
\text{if } (\exists (\textbf{operating\_units}_\text{node,tech,timestep}))
\\
\textbf{flow\_export}_\text{node,tech,carrier,timestep} \leq \textit{export\_max}_\text{tech}&\quad
\text{if } (\neg (\exists (\textbf{operating\_units}_\text{node,tech,timestep})))
\\
\end{cases}
\]
unit_commitment_milp
Set the upper bound of the number of integer units of technology that can exist, for any technology using integer units to define its capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{operating\_units}_\text{node,tech,timestep}) \land \exists (\textbf{purchased\_units}_\text{node,tech}))
\end{array}
\begin{cases}
\textbf{operating\_units}_\text{node,tech,timestep} \leq \textbf{purchased\_units}_\text{node,tech}&\quad
\\
\end{cases}
\]
available_flow_cap_binary
Limit flow capacity to zero if the technology is not operating in a given timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep}))
\end{array}
\begin{cases}
\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep} \leq \textit{flow\_cap\_max}_\text{tech} \times \textbf{operating\_units}_\text{node,tech,timestep}&\quad
\\
\end{cases}
\]
available_flow_cap_continuous
Limit flow capacity to the value of the flow_cap
decision variable when the technology is operating in a given timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep}))
\end{array}
\begin{cases}
\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep} \leq \textbf{flow\_cap}_\text{node,tech,carrier}&\quad
\\
\end{cases}
\]
available_flow_cap_max_binary_continuous_switch
Force flow capacity to equal the value of the flow_cap
decision variable if the technology is operating in a given timestep, zero otherwise.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep}))
\end{array}
\begin{cases}
\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep} \geq \textbf{flow\_cap}_\text{node,tech,carrier} + ((\textbf{operating\_units}_\text{node,tech,timestep} - \textbf{purchased\_units}_\text{node,tech}) \times \textit{flow\_cap\_max}_\text{tech})&\quad
\\
\end{cases}
\]
flow_out_max_milp
Set the upper bound of a technology's ability to produce carriers, for any technology using integer units to define its capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{flow\_out}_\text{node,tech,carrier,timestep}) \land \exists (\textbf{operating\_units}_\text{node,tech,timestep}) \land \exists (\textit{flow\_cap\_per\_unit}_\text{tech}))
\end{array}
\begin{cases}
\textbf{flow\_out}_\text{node,tech,carrier,timestep} \leq \textbf{operating\_units}_\text{node,tech,timestep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_cap\_per\_unit}_\text{tech} \times \textit{flow\_out\_parasitic\_eff}_\text{tech}&\quad
\\
\end{cases}
\]
flow_in_max_milp
Set the upper bound of a technology's ability to consume carriers, for any technology using integer units to define its capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{flow\_in}_\text{node,tech,carrier,timestep}) \land \exists (\textbf{operating\_units}_\text{node,tech,timestep}) \land \exists (\textit{flow\_cap\_per\_unit}_\text{tech}))
\end{array}
\begin{cases}
\textbf{flow\_in}_\text{node,tech,carrier,timestep} \leq \textbf{operating\_units}_\text{node,tech,timestep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_cap\_per\_unit}_\text{tech}&\quad
\\
\end{cases}
\]
flow_out_min_milp
Set the lower bound of a technology's ability to produce carriers, for any technology using integer units to define its capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{flow\_out}_\text{node,tech,carrier,timestep}) \land \exists (\textbf{operating\_units}_\text{node,tech,timestep}) \land \exists (\textit{flow\_out\_min\_relative}_\text{tech}))
\end{array}
\begin{cases}
\textbf{flow\_out}_\text{node,tech,carrier,timestep} \geq \textbf{operating\_units}_\text{node,tech,timestep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_cap\_per\_unit}_\text{tech} \times \textit{flow\_out\_min\_relative}_\text{tech}&\quad
\text{if } (\exists (\textit{flow\_cap\_per\_unit}_\text{tech}))
\\
\textbf{flow\_out}_\text{node,tech,carrier,timestep} \geq \textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_out\_min\_relative}_\text{tech}&\quad
\text{if } (\exists (\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep}))
\\
\end{cases}
\]
storage_capacity_units_milp
Fix the storage capacity of any technology using integer units to define its capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep}) \land \exists (\textbf{purchased\_units}_\text{node,tech}) \land \exists (\textit{storage\_cap\_per\_unit}_\text{tech}))
\end{array}
\begin{cases}
\textbf{storage\_cap}_\text{node,tech} = \textbf{purchased\_units}_\text{node,tech} \times \textit{storage\_cap\_per\_unit}_\text{tech}&\quad
\\
\end{cases}
\]
flow_capacity_units_milp
Fix the flow capacity of any technology using integer units to define its capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textbf{operating\_units}_\text{node,tech,timestep}))
\end{array}
\begin{cases}
\textbf{flow\_cap}_\text{node,tech,carrier} = \textbf{purchased\_units}_\text{node,tech} \times \textit{flow\_cap\_per\_unit}_\text{tech}&\quad
\text{if } (\exists (\textit{flow\_cap\_per\_unit}_\text{tech}))
\\
\textbf{flow\_cap}_\text{node,tech,carrier} \leq \textbf{purchased\_units}_\text{node,tech} \times \textit{bigM}&\quad
\text{if } (\neg (\exists (\textit{flow\_cap\_per\_unit}_\text{tech})))
\\
\end{cases}
\]
flow_capacity_max_purchase_milp
Set the upper bound on a technology's flow capacity, for any technology with integer capacity purchasing.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textbf{purchased\_units}_\text{node,tech}) \land \exists (\textit{flow\_cap\_max}_\text{tech}))
\end{array}
\begin{cases}
\textbf{flow\_cap}_\text{node,tech,carrier} \leq \textit{flow\_cap\_max}_\text{tech} \times \textbf{purchased\_units}_\text{node,tech}&\quad
\\
\end{cases}
\]
flow_capacity_min_purchase_milp
Set the lower bound on a technology's flow capacity, for any technology with integer capacity purchasing.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\text{if } (\exists (\textbf{purchased\_units}_\text{node,tech}) \land \exists (\textit{flow\_cap\_min}_\text{tech}))
\end{array}
\begin{cases}
\textbf{flow\_cap}_\text{node,tech,carrier} \geq \textit{flow\_cap\_min}_\text{tech} \times \textbf{purchased\_units}_\text{node,tech}&\quad
\\
\end{cases}
\]
storage_capacity_max_purchase_milp
Set the upper bound on a technology's storage capacity, for any technology with integer capacity purchasing.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\text{if } (\exists (\textbf{purchased\_units}_\text{node,tech}) \land \exists (\textit{storage\_cap\_max}_\text{tech}))
\end{array}
\begin{cases}
\textbf{storage\_cap}_\text{node,tech} \leq \textit{storage\_cap\_max}_\text{tech} \times \textbf{purchased\_units}_\text{node,tech}&\quad
\\
\end{cases}
\]
storage_capacity_min_purchase_milp
Set the lower bound on a technology's storage capacity, for any technology with integer capacity purchasing.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\text{if } (\exists (\textbf{purchased\_units}_\text{node,tech}) \land \exists (\textit{storage\_cap\_min}_\text{tech}))
\end{array}
\begin{cases}
\textbf{storage\_cap}_\text{node,tech} \geq \textit{storage\_cap\_min}_\text{tech} \times \textbf{purchased\_units}_\text{node,tech}&\quad
\\
\end{cases}
\]
unit_capacity_max_systemwide_milp
Set the upper bound on the total number of units of a technology that can be purchased across all nodes where the technology can exist, for any technology using integer units to define its capacity.
\[
\begin{array}{r}
\forall{}
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\text{if } (\exists (\textbf{purchased\_units}_\text{node,tech}) \land \exists (\textit{purchased\_units\_max\_systemwide}))
\end{array}
\begin{cases}
\sum\limits_{\text{node} \in \text{nodes}} (\textbf{purchased\_units}_\text{node,tech}) \leq \textit{purchased\_units\_max\_systemwide}&\quad
\\
\end{cases}
\]
unit_capacity_min_systemwide_milp
Set the lower bound on the total number of units of a technology that can be purchased across all nodes where the technology can exist, for any technology using integer units to define its capacity.
\[
\begin{array}{r}
\forall{}
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\text{if } (\exists (\textbf{purchased\_units}_\text{node,tech}) \land \exists (\textit{purchased\_units\_max\_systemwide}))
\end{array}
\begin{cases}
\sum\limits_{\text{node} \in \text{nodes}} (\textbf{purchased\_units}_\text{node,tech}) \geq \textit{purchased\_units\_min\_systemwide}&\quad
\\
\end{cases}
\]
async_flow_in_milp
Set a technology's ability to have inflow in the same timestep that it has outflow, for any technology using the asynchronous flow binary switch.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{async\_flow\_switch}_\text{node,tech,timestep}))
\end{array}
\begin{cases}
\sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep}) \leq (1 - \textbf{async\_flow\_switch}_\text{node,tech,timestep}) \times \textit{bigM}&\quad
\\
\end{cases}
\]
async_flow_out_milp
Set a technology's ability to have outflow in the same timestep that it has inflow, for any technology using the asynchronous flow binary switch.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{async\_flow\_switch}_\text{node,tech,timestep}))
\end{array}
\begin{cases}
\sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep}) \leq \textbf{async\_flow\_switch}_\text{node,tech,timestep} \times \textit{bigM}&\quad
\\
\end{cases}
\]
ramping_up
Set the upper bound on a technology's ability to ramp outflow up beyond a certain percentage compared to the previous timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textit{flow\_ramping}_\text{tech}) \land \neg (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]}))
\end{array}
\begin{cases}
\frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep} }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep-1} }{ \textit{timestep\_resolution}_\text{timestep-1} } \leq \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier}&\quad
\text{if } (\exists (\textit{carrier\_out}_\text{node,tech,carrier}) \land \neg (\exists (\textit{carrier\_in}_\text{node,tech,carrier})))
\\
\frac{ \textbf{flow\_in}_\text{node,tech,carrier,timestep} }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ \textbf{flow\_in}_\text{node,tech,carrier,timestep-1} }{ \textit{timestep\_resolution}_\text{timestep-1} } \leq \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier}&\quad
\text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \neg (\exists (\textit{carrier\_out}_\text{node,tech,carrier})))
\\
\frac{ (\textbf{flow\_out}_\text{node,tech,carrier,timestep} - \textbf{flow\_in}_\text{node,tech,carrier,timestep}) }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ (\textbf{flow\_out}_\text{node,tech,carrier,timestep-1} - \textbf{flow\_in}_\text{node,tech,carrier,timestep-1}) }{ \textit{timestep\_resolution}_\text{timestep-1} } \leq \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier}&\quad
\text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \exists (\textit{carrier\_out}_\text{node,tech,carrier}))
\\
\end{cases}
\]
ramping_down
Set the upper bound on a technology's ability to ramp outflow down beyond a certain percentage compared to the previous timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textit{flow\_ramping}_\text{tech}) \land \neg (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]}))
\end{array}
\begin{cases}
-1 \times \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier} \leq \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep} }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep-1} }{ \textit{timestep\_resolution}_\text{timestep-1} }&\quad
\text{if } (\exists (\textit{carrier\_out}_\text{node,tech,carrier}) \land \neg (\exists (\textit{carrier\_in}_\text{node,tech,carrier})))
\\
-1 \times \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier} \leq \frac{ \textbf{flow\_in}_\text{node,tech,carrier,timestep} }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ \textbf{flow\_in}_\text{node,tech,carrier,timestep-1} }{ \textit{timestep\_resolution}_\text{timestep-1} }&\quad
\text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \neg (\exists (\textit{carrier\_out}_\text{node,tech,carrier})))
\\
-1 \times \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier} \leq \frac{ (\textbf{flow\_out}_\text{node,tech,carrier,timestep} - \textbf{flow\_in}_\text{node,tech,carrier,timestep}) }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ (\textbf{flow\_out}_\text{node,tech,carrier,timestep-1} - \textbf{flow\_in}_\text{node,tech,carrier,timestep-1}) }{ \textit{timestep\_resolution}_\text{timestep-1} }&\quad
\text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \exists (\textit{carrier\_out}_\text{node,tech,carrier}))
\\
\end{cases}
\]
Where
flow_out_inc_eff
Outflows after taking efficiency losses into account.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{flow\_out}_\text{node,tech,carrier,timestep}))
\end{array}
\begin{cases}
\frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep} }{ (\textit{flow\_out\_eff}_\text{tech} \times \textit{flow\_out\_parasitic\_eff}_\text{tech} \times (\textit{flow\_out\_eff\_per\_distance}_\text{tech}^{(\textit{distance}\vee{}1)})) }&\quad
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})
\\
\frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep} }{ (\textit{flow\_out\_eff}_\text{tech} \times \textit{flow\_out\_parasitic\_eff}_\text{tech}) }&\quad
\text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission}))
\\
\end{cases}
\]
flow_in_inc_eff
Inflows after taking efficiency losses into account.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textbf{flow\_in}_\text{node,tech,carrier,timestep}))
\end{array}
\begin{cases}
\textbf{flow\_in}_\text{node,tech,carrier,timestep} \times \textit{flow\_in\_eff}_\text{tech} \times (\textit{flow\_in\_eff\_per\_distance}_\text{tech}^{(\textit{distance}\vee{}1)})&\quad
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})
\\
\textbf{flow\_in}_\text{node,tech,carrier,timestep} \times \textit{flow\_in\_eff}_\text{tech}&\quad
\text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission}))
\\
\end{cases}
\]
cost_var
The operating costs per timestep of a technology.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\text{if } (\exists (\textit{cost\_export}_\text{cost,tech}) \lor \exists (\textit{cost\_flow\_in}_\text{cost,tech}) \lor \exists (\textit{cost\_flow\_out}_\text{cost,tech}))
\end{array}
\begin{cases}
\textit{timestep\_weights}_\text{timestep} \times (\sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_export}_\text{cost,tech} \times (\textbf{flow\_export}_\text{node,tech,carrier,timestep}\vee{}0)) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_out}_\text{cost,tech} \times (\textbf{flow\_out}_\text{node,tech,carrier,timestep}\vee{}0)) + \textit{cost\_flow\_in}_\text{cost,tech} \times \textbf{source\_use}_\text{node,tech,timestep})&\quad
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply})\land{}(\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep}))
\\
\textit{timestep\_weights}_\text{timestep} \times (\sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_out}_\text{cost,tech} \times (\textbf{flow\_out}_\text{node,tech,carrier,timestep}\vee{}0)) + \textit{cost\_flow\_in}_\text{cost,tech} \times \textbf{source\_use}_\text{node,tech,timestep})&\quad
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply})\land{}(\neg (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep})))
\\
\textit{timestep\_weights}_\text{timestep} \times (\sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_export}_\text{cost,tech} \times (\textbf{flow\_export}_\text{node,tech,carrier,timestep}\vee{}0)) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_out}_\text{cost,tech} \times (\textbf{flow\_out}_\text{node,tech,carrier,timestep}\vee{}0)) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_in}_\text{cost,tech} \times (\textbf{flow\_in}_\text{node,tech,carrier,timestep}\vee{}0)))&\quad
\text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply}))\land{}(\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep}))
\\
\textit{timestep\_weights}_\text{timestep} \times (\sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_out}_\text{cost,tech} \times (\textbf{flow\_out}_\text{node,tech,carrier,timestep}\vee{}0)) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_in}_\text{cost,tech} \times (\textbf{flow\_in}_\text{node,tech,carrier,timestep}\vee{}0)))&\quad
\text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply}))\land{}(\neg (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep})))
\\
\end{cases}
\]
cost_investment_flow_cap
The investment costs associated with the nominal/rated capacity of a technology.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs }
\\
\text{if } (\exists (\textbf{flow\_cap}_\text{node,tech,carrier}) \land (\exists (\textit{cost\_flow\_cap}_\text{cost,tech}) \lor \exists (\textit{cost\_flow\_cap\_per\_distance})))
\end{array}
\begin{cases}
(\textit{cost\_flow\_cap}_\text{cost,tech} + (\textit{cost\_flow\_cap\_per\_distance} \times (\textit{distance}\vee{}0))) \times 0.5 \times \textbf{flow\_cap}_\text{node,tech,carrier}&\quad
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})
\\
\textit{cost\_flow\_cap}_\text{cost,tech} \times \textbf{flow\_cap}_\text{node,tech,carrier}&\quad
\text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission}))
\\
\end{cases}
\]
cost_investment_storage_cap
The investment costs associated with the storage capacity of a technology.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs }
\\
\text{if } (\exists (\textit{cost\_storage\_cap}_\text{cost,tech}) \land \exists (\textbf{storage\_cap}_\text{node,tech}))
\end{array}
\begin{cases}
\textit{cost\_storage\_cap}_\text{cost,tech} \times \textbf{storage\_cap}_\text{node,tech}&\quad
\\
\end{cases}
\]
cost_investment_source_cap
The investment costs associated with the source consumption capacity of a technology.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs }
\\
\text{if } (\exists (\textit{cost\_source\_cap}_\text{cost,tech}) \land \exists (\textbf{source\_cap}_\text{node,tech}))
\end{array}
\begin{cases}
\textit{cost\_source\_cap}_\text{cost,tech} \times \textbf{source\_cap}_\text{node,tech}&\quad
\\
\end{cases}
\]
cost_investment_area_use
The investment costs associated with the area used by a technology.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs }
\\
\text{if } (\exists (\textit{cost\_area\_use}_\text{cost,tech}) \land \exists (\textbf{area\_use}_\text{node,tech}))
\end{array}
\begin{cases}
\textit{cost\_area\_use}_\text{cost,tech} \times \textbf{area\_use}_\text{node,tech}&\quad
\\
\end{cases}
\]
cost_investment_purchase
The investment costs associated with the binary purchase of a technology.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs }
\\
\text{if } (\exists (\textit{cost\_purchase}_\text{cost,tech}) \land \exists (\textbf{purchased\_units}_\text{node,tech}))
\end{array}
\begin{cases}
((\textit{cost\_purchase}_\text{cost,tech} + (\textit{cost\_purchase\_per\_distance} \times (\textit{distance}\vee{}0))) \times \textbf{purchased\_units}_\text{node,tech}) \times 0.5&\quad
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})
\\
\textit{cost\_purchase}_\text{cost,tech} \times \textbf{purchased\_units}_\text{node,tech}&\quad
\text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission}))
\\
\end{cases}
\]
cost_investment
The installation costs of a technology, including annualised investment costs and annual maintenance costs.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs }
\\
\text{if } (\exists (\textbf{cost\_investment\_flow\_cap}_\text{node,tech,carrier,cost}) \lor \exists (\textbf{cost\_investment\_storage\_cap}_\text{node,tech,cost}) \lor \exists (\textbf{cost\_investment\_source\_cap}_\text{node,tech,cost}) \lor \exists (\textbf{cost\_investment\_area\_use}_\text{node,tech,cost}) \lor \exists (\textbf{cost\_investment\_purchase}_\text{node,tech,cost}))
\end{array}
\begin{cases}
\frac{ \sum\limits_{\text{timestep} \in \text{timesteps}} (\textit{timestep\_resolution}_\text{timestep} \times \textit{timestep\_weights}_\text{timestep}) }{ 8760 } \times ((\textit{cost\_depreciation\_rate}_\text{cost,tech} \times (\sum\limits_{\text{carrier} \in \text{carriers}} ((\textbf{cost\_investment\_flow\_cap}_\text{node,tech,carrier,cost}\vee{}0)) + (\textbf{cost\_investment\_storage\_cap}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_source\_cap}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_area\_use}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_purchase}_\text{node,tech,cost}\vee{}0)) \times (1 + \textit{cost\_om\_annual\_investment\_fraction}_\text{cost,tech})) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_om\_annual}_\text{cost,tech} \times (\textbf{flow\_cap}_\text{node,tech,carrier}\vee{}0)))&\quad
\text{if } (\exists (\textit{cost\_depreciation\_rate}_\text{cost,tech}))
\\
\frac{ \sum\limits_{\text{timestep} \in \text{timesteps}} (\textit{timestep\_resolution}_\text{timestep} \times \textit{timestep\_weights}_\text{timestep}) }{ 8760 } \times ((\frac{ 1 }{ \textit{lifetime}_\text{tech} } \times (\sum\limits_{\text{carrier} \in \text{carriers}} ((\textbf{cost\_investment\_flow\_cap}_\text{node,tech,carrier,cost}\vee{}0)) + (\textbf{cost\_investment\_storage\_cap}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_source\_cap}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_area\_use}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_purchase}_\text{node,tech,cost}\vee{}0)) \times (1 + \textit{cost\_om\_annual\_investment\_fraction}_\text{cost,tech})) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_om\_annual}_\text{cost,tech} \times (\textbf{flow\_cap}_\text{node,tech,carrier}\vee{}0)))&\quad
\text{if } (\neg (\exists (\textit{cost\_depreciation\_rate}_\text{cost,tech})) \land \textit{cost\_interest\_rate}_\text{cost,tech}\mathord{=}\text{0})
\\
\frac{ \sum\limits_{\text{timestep} \in \text{timesteps}} (\textit{timestep\_resolution}_\text{timestep} \times \textit{timestep\_weights}_\text{timestep}) }{ 8760 } \times ((\frac{ (\textit{cost\_interest\_rate}_\text{cost,tech} \times ((1 + \textit{cost\_interest\_rate}_\text{cost,tech})^{\textit{lifetime}_\text{tech}})) }{ (((1 + \textit{cost\_interest\_rate}_\text{cost,tech})^{\textit{lifetime}_\text{tech}}) - 1) } \times (\sum\limits_{\text{carrier} \in \text{carriers}} ((\textbf{cost\_investment\_flow\_cap}_\text{node,tech,carrier,cost}\vee{}0)) + (\textbf{cost\_investment\_storage\_cap}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_source\_cap}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_area\_use}_\text{node,tech,cost}\vee{}0) + (\textbf{cost\_investment\_purchase}_\text{node,tech,cost}\vee{}0)) \times (1 + \textit{cost\_om\_annual\_investment\_fraction}_\text{cost,tech})) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_om\_annual}_\text{cost,tech} \times (\textbf{flow\_cap}_\text{node,tech,carrier}\vee{}0)))&\quad
\text{if } (\neg (\exists (\textit{cost\_depreciation\_rate}_\text{cost,tech})) \land \textit{cost\_interest\_rate}_\text{cost,tech}\mathord{>}\text{0})
\\
\end{cases}
\]
cost
The total annualised costs of a technology, including installation and operation costs.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs }
\\
\text{if } (\exists (\textbf{cost\_investment}_\text{node,tech,cost}) \lor \exists (\textbf{cost\_var}_\text{node,tech,cost,timestep}))
\end{array}
\begin{cases}
\textbf{cost\_investment}_\text{node,tech,cost} + \sum\limits_{\text{timestep} \in \text{timesteps}} (\textbf{cost\_var}_\text{node,tech,cost,timestep})&\quad
\text{if } (\exists (\textbf{cost\_investment}_\text{node,tech,cost}))\land{}(\exists (\textbf{cost\_var}_\text{node,tech,cost,timestep}))
\\
\textbf{cost\_investment}_\text{node,tech,cost}&\quad
\text{if } (\exists (\textbf{cost\_investment}_\text{node,tech,cost}))\land{}(\neg (\exists (\textbf{cost\_var}_\text{node,tech,cost,timestep})))
\\
\sum\limits_{\text{timestep} \in \text{timesteps}} (\textbf{cost\_var}_\text{node,tech,cost,timestep})&\quad
\text{if } (\neg (\exists (\textbf{cost\_investment}_\text{node,tech,cost})))\land{}(\exists (\textbf{cost\_var}_\text{node,tech,cost,timestep}))
\\
0&\quad
\text{if } (\neg (\exists (\textbf{cost\_investment}_\text{node,tech,cost})))\land{}(\neg (\exists (\textbf{cost\_var}_\text{node,tech,cost,timestep})))
\\
\end{cases}
\]
Decision Variables
flow_cap
A technology's flow capacity, also known as its nominal or nameplate capacity.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers }
\\
\forall\mathbb{R}\;
\end{array}
\begin{cases}
\textit{flow\_cap\_min}_\text{tech} \leq \textbf{flow\_cap}_\text{node,tech,carrier}&\quad
\\
\textbf{flow\_cap}_\text{node,tech,carrier} \leq \textit{flow\_cap\_max}_\text{tech}&\quad
\\
\end{cases}
\]
link_flow_cap
A transmission technology's flow capacity, also known as its nominal or nameplate capacity.
\[
\begin{array}{r}
\forall{}
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\forall\mathbb{R}\;
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})
\end{array}
\begin{cases}
0 \leq \textbf{link\_flow\_cap}_\text{tech}&\quad
\\
\textbf{link\_flow\_cap}_\text{tech} \leq inf&\quad
\\
\end{cases}
\]
flow_out
The outflow of a technology per timestep, also known as the flow discharged (from storage
technologies) or the flow received (by transmission
technologies) on a link.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{R}\;
\text{if } (\exists (\textit{carrier\_out}_\text{node,tech,carrier}))
\end{array}
\begin{cases}
0 \leq \textbf{flow\_out}_\text{node,tech,carrier,timestep}&\quad
\\
\textbf{flow\_out}_\text{node,tech,carrier,timestep} \leq inf&\quad
\\
\end{cases}
\]
flow_in
The inflow to a technology per timestep, also known as the flow consumed (by storage
technologies) or the flow sent (by transmission
technologies) on a link.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{R}\;
\text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}))
\end{array}
\begin{cases}
0 \leq \textbf{flow\_in}_\text{node,tech,carrier,timestep}&\quad
\\
\textbf{flow\_in}_\text{node,tech,carrier,timestep} \leq inf&\quad
\\
\end{cases}
\]
flow_export
The flow of a carrier exported outside the system boundaries by a technology per timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{R}\;
\text{if } (\exists (\textit{carrier\_export}))
\end{array}
\begin{cases}
0 \leq \textbf{flow\_export}_\text{node,tech,carrier,timestep}&\quad
\\
\textbf{flow\_export}_\text{node,tech,carrier,timestep} \leq inf&\quad
\\
\end{cases}
\]
area_use
The area in space utilised directly (e.g., solar PV panels) or indirectly (e.g., biofuel crops) by a technology.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\forall\mathbb{R}\;
\text{if } (\exists (\textit{area\_use\_min}_\text{tech}) \lor \exists (\textit{area\_use\_max}_\text{tech}) \lor \exists (\textit{area\_use\_per\_flow\_cap}_\text{tech}) \lor \textit{sink\_unit}_\text{tech}\mathord{=}\text{per\_area} \lor \textit{source\_unit}_\text{tech}\mathord{=}\text{per\_area})
\end{array}
\begin{cases}
\textit{area\_use\_min}_\text{tech} \leq \textbf{area\_use}_\text{node,tech}&\quad
\\
\textbf{area\_use}_\text{node,tech} \leq \textit{area\_use\_max}_\text{tech}&\quad
\\
\end{cases}
\]
source_use
The carrier flow consumed from outside the system boundaries by a supply
technology.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{R}\;
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply})
\end{array}
\begin{cases}
0 \leq \textbf{source\_use}_\text{node,tech,timestep}&\quad
\\
\textbf{source\_use}_\text{node,tech,timestep} \leq inf&\quad
\\
\end{cases}
\]
source_cap
The upper limit on a flow that can be consumed from outside the system boundaries by a supply
technology in each timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\forall\mathbb{R}\;
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply})
\end{array}
\begin{cases}
\textit{source\_cap\_min}_\text{tech} \leq \textbf{source\_cap}_\text{node,tech}&\quad
\\
\textbf{source\_cap}_\text{node,tech} \leq \textit{source\_cap\_max}_\text{tech}&\quad
\\
\end{cases}
\]
storage_cap
The upper limit on a carrier that can be stored by a technology in any timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\forall\mathbb{R}\;
\text{if } (\textit{include\_storage}_\text{tech}\mathord{=}\text{true} \lor \textit{base\_tech}_\text{tech}\mathord{=}\text{storage})
\end{array}
\begin{cases}
\textit{storage\_cap\_min}_\text{tech} \leq \textbf{storage\_cap}_\text{node,tech}&\quad
\\
\textbf{storage\_cap}_\text{node,tech} \leq \textit{storage\_cap\_max}_\text{tech}&\quad
\\
\end{cases}
\]
storage
The carrier stored by a storage
technology in each timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{R}\;
\text{if } (\textit{include\_storage}_\text{tech}\mathord{=}\text{true} \lor \textit{base\_tech}_\text{tech}\mathord{=}\text{storage})
\end{array}
\begin{cases}
0 \leq \textbf{storage}_\text{node,tech,timestep}&\quad
\\
\textbf{storage}_\text{node,tech,timestep} \leq inf&\quad
\\
\end{cases}
\]
purchased_units
Integer number of a technology that has been purchased,
for any technology set to require integer capacity purchasing.
This is used to allow installation of fixed capacity units of technologies (
if flow_cap_max
== flow_cap_min
) and/or to set a fixed cost for a technology,
irrespective of its installed capacity.
On top of a fixed technology cost,
a continuous cost for the quantity of installed capacity can still be applied.
Since technology capacity is no longer a continuous decision variable,
it is possible for these technologies to have a lower bound set on outflow/consumption
which will only be enforced in those timesteps that the technology is operating.
Otherwise, the same lower bound forces the technology to produce/consume
that minimum amount of carrier in every timestep.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs }
\\
\forall\mathbb{Z}\;
\text{if } (\textit{cap\_method}_\text{tech}\mathord{=}\text{integer})
\end{array}
\begin{cases}
\textit{purchased\_units\_min}_\text{tech} \leq \textbf{purchased\_units}_\text{node,tech}&\quad
\\
\textbf{purchased\_units}_\text{node,tech} \leq \textit{purchased\_units\_max}_\text{tech}&\quad
\\
\end{cases}
\]
operating_units
Integer number of a technology that is operating in each timestep, for any technology set to require integer capacity purchasing.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{Z}\;
\text{if } (\textit{integer\_dispatch}_\text{tech}\mathord{=}\text{true} \land \textit{cap\_method}_\text{tech}\mathord{=}\text{integer})
\end{array}
\begin{cases}
0 \leq \textbf{operating\_units}_\text{node,tech,timestep}&\quad
\\
\textbf{operating\_units}_\text{node,tech,timestep} \leq inf&\quad
\\
\end{cases}
\]
available_flow_cap
Flow capacity that will be set to zero if the technology is not operating in a given timestep and will be set to the value of the decision variable flow_cap
otherwise.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{R}\;
\text{if } (\textit{integer\_dispatch}_\text{tech}\mathord{=}\text{true} \land \exists (\textit{flow\_cap\_max}_\text{tech}) \land \neg (\exists (\textit{flow\_cap\_per\_unit}_\text{tech})))
\end{array}
\begin{cases}
0 \leq \textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep}&\quad
\\
\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep} \leq inf&\quad
\\
\end{cases}
\]
async_flow_switch
Binary switch to force asynchronous outflow/consumption of technologies with both flow_in
and flow_out
defined. This ensures that a technology with carrier flow efficiencies < 100% cannot produce and consume a flow simultaneously to remove unwanted carrier from the system.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{Z}\;
\text{if } (\textit{force\_async\_flow}_\text{tech}\mathord{=}\text{true})
\end{array}
\begin{cases}
0 \leq \textbf{async\_flow\_switch}_\text{node,tech,timestep}&\quad
\\
\textbf{async\_flow\_switch}_\text{node,tech,timestep} \leq 1&\quad
\\
\end{cases}
\]
unmet_demand
Virtual source of carrier flow to ensure model feasibility. This should only be considered a debugging rather than a modelling tool as it may distort the model in other ways due to the large impact it has on the objective function value. When present in a model in which it has been requested, it indicates an inability for technologies in the model to reach a sufficient combined supply capacity to meet demand.
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{R}\;
\text{if } (\text{config.ensure\_feasibility}\mathord{=}\text{true})
\end{array}
\begin{cases}
0 \leq \textbf{unmet\_demand}_\text{node,carrier,timestep}&\quad
\\
\textbf{unmet\_demand}_\text{node,carrier,timestep} \leq inf&\quad
\\
\end{cases}
\]
unused_supply
Virtual sink of carrier flow to ensure model feasibility. This should only be considered a debugging rather than a modelling tool as it may distort the model in other ways due to the large impact it has on the objective function value. In model results, the negation of this variable is combined with unmet_demand
and presented as only one variable: unmet_demand
. When present in a model in which it has been requested, it indicates an inability for technologies in the model to reach a sufficient combined consumption capacity to meet required outflow (e.g. from renewables without the possibility of curtailment).
\[
\begin{array}{r}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps }
\\
\forall\mathbb{R}\;
\text{if } (\text{config.ensure\_feasibility}\mathord{=}\text{true})
\end{array}
\begin{cases}
-inf \leq \textbf{unused\_supply}_\text{node,carrier,timestep}&\quad
\\
\textbf{unused\_supply}_\text{node,carrier,timestep} \leq 0&\quad
\\
\end{cases}
\]