National-scale example model math
Complete mathematical formulation for a Calliope pathway optimisation model (based on the national-scale example model).
The downloadable math YAML file only includes additions to the pre-defined base calliope YAML
A guide to math documentation
If a math component's initial conditions are met (the first if statement), it will be applied to a model.
For each objective , constraint and global expression , a number of sub-conditions then apply (the subsequent, indented if statements) to decide on the specific expression to apply at a given iteration of the component dimensions.
In the expressions, terms in bold font are decision variables and terms in italic font are parameters .
The decision variables and parameters are listed at the end of the page; they also refer back to the global expressions / constraints in which they are used.
Those parameters which are defined over time (timesteps) in the expressions can be defined by a user as a single, time invariant value, or as a timeseries that is loaded from file or dataframe .
Note
For every math component in the documentation, we include the YAML snippet that was used to generate the math in a separate tab.
Download the national-scale example model 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.
Math YAML
\[
\begin{array}{l}
\min{}\!\!:\\[2em]
\quad \text{if } (\bigvee\limits_{\substack{\text{node} \in \text{nodes} \\ \text{tech} \in \text{techs} \\ \text{cost} \in \text{costs} \\ \text{investstep} \in \text{investsteps}}} (cost))\land{}(\text{config.ensure\_feasibility}\mathord{=}\text{true})\!\!:\\
\qquad \sum\limits_{\text{cost} \in \text{costs}} (\sum\limits_{\text{investstep} \in \text{investsteps}} (\sum\limits_{\text{[nodes,techs]} \in \text{[nodes,techs]}} (\textbf{cost}_\text{node,tech,cost,investstep}) \times \textit{investstep\_resolution}_\text{investstep}) \times \textit{objective\_cost\_weights}_\text{cost}) + \sum\limits_{\text{investstep} \in \text{investsteps}} (\sum\limits_{\text{timestep} \in \text{timesteps}} (\sum\limits_{\text{[carriers,nodes]} \in \text{[carriers,nodes]}} (\textbf{unmet\_demand}_\text{node,carrier,timestep,investstep} - \textbf{unused\_supply}_\text{node,carrier,timestep,investstep}) \times \textit{timestep\_weights}_\text{timestep}) \times \textit{investstep\_resolution}_\text{investstep}) \times \textit{bigM}\\[2em]
\quad \text{if } (\bigvee\limits_{\substack{\text{node} \in \text{nodes} \\ \text{tech} \in \text{techs} \\ \text{cost} \in \text{costs} \\ \text{investstep} \in \text{investsteps}}} (cost))\land{}(\neg (\text{config.ensure\_feasibility}\mathord{=}\text{true}))\!\!:\\
\qquad \sum\limits_{\text{cost} \in \text{costs}} (\sum\limits_{\text{investstep} \in \text{investsteps}} (\sum\limits_{\text{[nodes,techs]} \in \text{[nodes,techs]}} (\textbf{cost}_\text{node,tech,cost,investstep}) \times \textit{investstep\_resolution}_\text{investstep}) \times \textit{objective\_cost\_weights}_\text{cost})\\[2em]
\quad \text{if } (\neg (\bigvee\limits_{\substack{\text{node} \in \text{nodes} \\ \text{tech} \in \text{techs} \\ \text{cost} \in \text{costs} \\ \text{investstep} \in \text{investsteps}}} (cost)))\land{}(\text{config.ensure\_feasibility}\mathord{=}\text{true})\!\!:\\
\qquad \sum\limits_{\text{investstep} \in \text{investsteps}} (\sum\limits_{\text{timestep} \in \text{timesteps}} (\sum\limits_{\text{[carriers,nodes]} \in \text{[carriers,nodes]}} (\textbf{unmet\_demand}_\text{node,carrier,timestep,investstep} - \textbf{unused\_supply}_\text{node,carrier,timestep,investstep}) \times \textit{timestep\_weights}_\text{timestep}) \times \textit{investstep\_resolution}_\text{investstep}) \times \textit{bigM}\\[2em]
\quad \text{if } (\neg (\bigvee\limits_{\substack{\text{node} \in \text{nodes} \\ \text{tech} \in \text{techs} \\ \text{cost} \in \text{costs} \\ \text{investstep} \in \text{investsteps}}} (cost)))\land{}(\neg (\text{config.ensure\_feasibility}\mathord{=}\text{true}))\!\!:\\
\qquad 0\\[2em]
\end{array}
\]
equations :
- where : any(cost, over=[nodes, techs, costs, investsteps])
expression : "sum(\n sum(\n sum(cost, over=[nodes, techs])\n * investstep_resolution,\n\
\ over=investsteps\n )\n * objective_cost_weights,\n over=costs\n) + $unmet_demand"
- where : NOT any(cost, over=[nodes, techs, costs, investsteps])
expression : $unmet_demand
sub_expressions :
unmet_demand :
- where : config.ensure_feasibility=True
expression : "sum(\n sum(\n sum(unmet_demand - unused_supply, over=[carriers,
nodes]) * timestep_weights,\n over=timesteps\n )\n * investstep_resolution,\n\
\ over=investsteps\n) * bigM"
- where : NOT config.ensure_feasibility=True
expression : '0'
sense : minimise
active : true
Subject to
flow_capacity_per_storage_capacity_min
Set the lower bound of storage flow capacity relative to its storage capacity.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage\_cap}_\text{node,tech,investstep}) \land \exists (\textit{flow\_cap\_per\_storage\_cap\_min}))\!\!:\\[2em]
\quad \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \geq \textbf{storage\_cap}_\text{node,tech,investstep} \times \textit{flow\_cap\_per\_storage\_cap\_min}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
where : storage_cap AND flow_cap_per_storage_cap_min
equations :
- expression : flow_cap >= storage_cap * flow_cap_per_storage_cap_min
flow_capacity_per_storage_capacity_max
Set the upper bound of storage flow capacity relative to its storage capacity.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage\_cap}_\text{node,tech,investstep}) \land \exists (\textit{flow\_cap\_per\_storage\_cap\_max}_\text{tech}))\!\!:\\[2em]
\quad \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \leq \textbf{storage\_cap}_\text{node,tech,investstep} \times \textit{flow\_cap\_per\_storage\_cap\_max}_\text{tech}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
where : storage_cap AND flow_cap_per_storage_cap_max
equations :
- expression : flow_cap <= storage_cap * flow_cap_per_storage_cap_max
source_capacity_equals_flow_capacity
Set a supply technology's flow capacity to equal its source capacity.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{source\_cap}_\text{node,tech,investstep}) \land \textit{source\_cap\_equals\_flow\_cap}\mathord{=}\text{true})\!\!:\\[2em]
\quad \textbf{source\_cap}_\text{node,tech,investstep} = \textbf{flow\_cap}_\text{node,tech,carrier,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
where : source_cap AND source_cap_equals_flow_cap=True
equations :
- expression : source_cap == flow_cap
force_zero_area_use
Set a technology's area use to zero if its flow capacity upper bound is zero.
area_use_per_flow_capacity
Set a fixed relationship between a technology's flow capacity and its area use.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{area\_use}_\text{node,tech,investstep}) \land \exists (\textit{area\_use\_per\_flow\_cap}))\!\!:\\[2em]
\quad \textbf{area\_use}_\text{node,tech,investstep} = \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \times \textit{area\_use\_per\_flow\_cap}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
where : area_use AND area_use_per_flow_cap
equations :
- expression : area_use == flow_cap * area_use_per_flow_cap
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.
flow_capacity_systemwide_max
Set an upper bound on flow capacity of a technology across all nodes in which the technology exists.
flow_capacity_systemwide_min
Set a lower bound on flow capacity of a technology across all nodes in which the technology exists.
balance_conversion
Fix the relationship between a conversion technology's outflow and consumption.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{conversion} \land \neg (\textit{include\_storage}_\text{tech}\mathord{=}\text{true}))\!\!:\\[2em]
\quad \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep}) = \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep})\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : base_tech=conversion AND NOT include_storage=true
equations :
- expression : sum(flow_out_inc_eff, over=carriers) == sum(flow_in_inc_eff, over=carriers)
flow_out_max
Set the upper bound of a technology's outflow.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{carrier\_out}_\text{node,tech,carrier}) \land \neg (\exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep})))\!\!:\\[2em]
\quad \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} \leq \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_out\_parasitic\_eff}_\text{tech}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : carrier_out AND NOT operating_units
equations :
- expression : flow_out <= flow_cap * timestep_resolution * flow_out_parasitic_eff
flow_out_min
Set the lower bound of a technology's outflow.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{flow\_out\_min\_relative}) \land \neg (\exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep})))\!\!:\\[2em]
\quad \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} \geq \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_out\_min\_relative}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_out_min_relative AND NOT operating_units
equations :
- expression : flow_out >= flow_cap * timestep_resolution * flow_out_min_relative
flow_in_max
Set the upper bound of a technology's inflow.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \neg (\exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep})))\!\!:\\[2em]
\quad \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep} \leq \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \times \textit{timestep\_resolution}_\text{timestep}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : carrier_in AND NOT operating_units
equations :
- expression : flow_in <= flow_cap * timestep_resolution
source_max
Set the upper bound of a supply technology's source consumption.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{source\_cap}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \textbf{source\_use}_\text{node,tech,timestep,investstep} \leq \textit{timestep\_resolution}_\text{timestep} \times \textbf{source\_cap}_\text{node,tech,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : source_cap
equations :
- expression : source_use <= timestep_resolution * source_cap
storage_max
Set the upper bound of the amount of carrier a technology can store.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep,investstep}))\!\!:\\[2em]
\quad \textbf{storage}_\text{node,tech,timestep,investstep} \leq \textbf{storage\_cap}_\text{node,tech,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : storage
equations :
- expression : storage <= storage_cap
storage_discharge_depth_limit
Set the lower bound of the stored carrier a technology must keep in reserve at all times.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep,investstep}) \land \exists (\textit{storage\_discharge\_depth}))\!\!:\\[2em]
\quad \textbf{storage}_\text{node,tech,timestep,investstep} - (\textit{storage\_discharge\_depth} \times \textbf{storage\_cap}_\text{node,tech,investstep}) \geq 0\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : storage AND storage_discharge_depth
equations :
- expression : storage - storage_discharge_depth * storage_cap >= 0
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.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!:\\[2em]
\quad \text{if } (\text{config.ensure\_feasibility}\mathord{=}\text{true})\land{}(\bigvee\limits_{\text{tech} \in \text{techs}} (carrier_export))\!\!:\\
\qquad \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}) + \textbf{unmet\_demand}_\text{node,carrier,timestep,investstep} + \textbf{unused\_supply}_\text{node,carrier,timestep,investstep} = 0\\[2em]
\quad \text{if } (\text{config.ensure\_feasibility}\mathord{=}\text{true})\land{}(\neg (\bigvee\limits_{\text{tech} \in \text{techs}} (carrier_export)))\!\!:\\
\qquad \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}) + \textbf{unmet\_demand}_\text{node,carrier,timestep,investstep} + \textbf{unused\_supply}_\text{node,carrier,timestep,investstep} = 0\\[2em]
\quad \text{if } (\neg (\text{config.ensure\_feasibility}\mathord{=}\text{true}))\land{}(\bigvee\limits_{\text{tech} \in \text{techs}} (carrier_export))\!\!:\\
\qquad \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}) = 0\\[2em]
\quad \text{if } (\neg (\text{config.ensure\_feasibility}\mathord{=}\text{true}))\land{}(\neg (\bigvee\limits_{\text{tech} \in \text{techs}} (carrier_export)))\!\!:\\
\qquad \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) - \sum\limits_{\text{tech} \in \text{techs}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}) = 0\\[2em]
\end{array}
\]
foreach :
- nodes
- carriers
- timesteps
- investsteps
equations :
- expression : sum(flow_out, over=techs) - sum(flow_in, over=techs) - $flow_export
+ $unmet_demand_and_unused_supply == 0
sub_expressions :
flow_export :
- where : any(carrier_export, over=techs)
expression : sum(flow_export, over=techs)
- where : NOT any(carrier_export, over=techs)
expression : '0'
unmet_demand_and_unused_supply :
- where : config.ensure_feasibility=True
expression : unmet_demand + unused_supply
- where : NOT config.ensure_feasibility=True
expression : '0'
balance_demand
Set the upper bound on, or a fixed total of, that a demand technology must dump to its sink in each timestep.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{demand})\!\!:\\[2em]
\quad \text{if } (\exists (\textit{sink\_use\_equals}_\text{timestep,node,tech,investstep}))\land{}(\textit{sink\_unit}\mathord{=}\text{per\_area})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} = \textit{sink\_use\_equals}_\text{timestep,node,tech,investstep} \times \textbf{area\_use}_\text{node,tech,investstep}\\[2em]
\quad \text{if } (\exists (\textit{sink\_use\_equals}_\text{timestep,node,tech,investstep}))\land{}(\textit{sink\_unit}\mathord{=}\text{per\_cap})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} = \textit{sink\_use\_equals}_\text{timestep,node,tech,investstep} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier,investstep})\\[2em]
\quad \text{if } (\exists (\textit{sink\_use\_equals}_\text{timestep,node,tech,investstep}))\land{}(\textit{sink\_unit}\mathord{=}\text{absolute})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} = \textit{sink\_use\_equals}_\text{timestep,node,tech,investstep} \times 1\\[2em]
\quad \text{if } (\neg (\exists (\textit{sink\_use\_equals}_\text{timestep,node,tech,investstep})) \land \exists (\textit{sink\_use\_max}))\land{}(\textit{sink\_unit}\mathord{=}\text{per\_area})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} \leq \textit{sink\_use\_max} \times \textbf{area\_use}_\text{node,tech,investstep}\\[2em]
\quad \text{if } (\neg (\exists (\textit{sink\_use\_equals}_\text{timestep,node,tech,investstep})) \land \exists (\textit{sink\_use\_max}))\land{}(\textit{sink\_unit}\mathord{=}\text{per\_cap})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} \leq \textit{sink\_use\_max} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier,investstep})\\[2em]
\quad \text{if } (\neg (\exists (\textit{sink\_use\_equals}_\text{timestep,node,tech,investstep})) \land \exists (\textit{sink\_use\_max}))\land{}(\textit{sink\_unit}\mathord{=}\text{absolute})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} \leq \textit{sink\_use\_max} \times 1\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : base_tech=demand
equations :
- where : sink_use_equals
expression : flow_in_inc_eff == sink_use_equals * $sink_scaler
- where : NOT sink_use_equals AND sink_use_max
expression : flow_in_inc_eff <= sink_use_max * $sink_scaler
sub_expressions :
sink_scaler :
- where : sink_unit=per_area
expression : area_use
- where : sink_unit=per_cap
expression : sum(flow_cap, over=carriers)
- where : sink_unit=absolute
expression : '1'
balance_demand_min_use
Set the lower bound on the quantity of flow a demand technology must dump to its sink in each timestep.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{sink\_use\_min}) \land \neg (\exists (\textit{sink\_use\_equals}_\text{timestep,node,tech,investstep})) \land \textit{base\_tech}_\text{tech}\mathord{=}\text{demand})\!\!:\\[2em]
\quad \text{if } (\textit{sink\_unit}\mathord{=}\text{per\_area})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} \geq \textit{sink\_use\_min} \times \textbf{area\_use}_\text{node,tech,investstep}\\[2em]
\quad \text{if } (\textit{sink\_unit}\mathord{=}\text{per\_cap})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} \geq \textit{sink\_use\_min} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier,investstep})\\[2em]
\quad \text{if } (\textit{sink\_unit}\mathord{=}\text{absolute})\!\!:\\
\qquad \textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} \geq \textit{sink\_use\_min} \times 1\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : sink_use_min AND NOT sink_use_equals AND base_tech=demand
equations :
- expression : flow_in_inc_eff >= sink_use_min * $sink_scaler
sub_expressions :
sink_scaler :
- where : sink_unit=per_area
expression : area_use
- where : sink_unit=per_cap
expression : sum(flow_cap, over=carriers)
- where : sink_unit=absolute
expression : '1'
balance_supply_no_storage
Fix the outflow of a supply technology to its consumption of the available source.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply} \land \neg (\textit{include\_storage}_\text{tech}\mathord{=}\text{true}))\!\!:\\[2em]
\quad \textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep} = \textbf{source\_use}_\text{node,tech,timestep,investstep} \times \textit{source\_eff}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : base_tech=supply AND NOT include_storage=True
equations :
- expression : flow_out_inc_eff == source_use * source_eff
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.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep,investstep}) \land \textit{base\_tech}_\text{tech}\mathord{=}\text{supply})\!\!:\\[2em]
\quad \text{if } (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]} \land \neg (\textit{cyclic\_storage}\mathord{=}\text{true}))\!\!:\\
\qquad \textbf{storage}_\text{node,tech,timestep,investstep} = \textit{storage\_initial} \times \textbf{storage\_cap}_\text{node,tech,investstep} + (\textbf{source\_use}_\text{node,tech,timestep,investstep} \times \textit{source\_eff}) - \textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep}\\[2em]
\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}))\!\!:\\
\qquad \textbf{storage}_\text{node,tech,timestep,investstep} = ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep-1}}) \times \textbf{storage}_\text{node,tech,timestep-1,investstep} + (\textbf{source\_use}_\text{node,tech,timestep,investstep} \times \textit{source\_eff}) - \textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep}\\[2em]
\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})))\!\!:\\
\qquad \textbf{storage}_\text{node,tech,timestep,investstep} = ((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],investstep} + (\textbf{source\_use}_\text{node,tech,timestep,investstep} \times \textit{source\_eff}) - \textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep}\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : storage AND base_tech=supply
equations :
- expression : storage == $storage_previous_step + source_use * source_eff - flow_out_inc_eff
sub_expressions :
storage_previous_step :
- where : timesteps=get_val_at_index(timesteps=0) AND NOT cyclic_storage=True
expression : storage_initial * storage_cap
- where : "(\n (timesteps=get_val_at_index(timesteps=0) AND cyclic_storage=True)\n\
\ OR NOT timesteps=get_val_at_index(timesteps=0)\n) AND NOT lookup_cluster_first_timestep=True"
expression : (1 - storage_loss) ** roll(timestep_resolution, timesteps=1) * roll(storage,
timesteps=1)
- where : lookup_cluster_first_timestep=True AND NOT (timesteps=get_val_at_index(timesteps=0)
AND NOT cyclic_storage=True)
expression : (1 - storage_loss) ** select_from_lookup_arrays(timestep_resolution,
timesteps=lookup_cluster_last_timestep) * select_from_lookup_arrays(storage,
timesteps=lookup_cluster_last_timestep)
source_availability_supply
Set the upper bound on, or a fixed total of, a supply technology's ability to consume its available resource.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{source\_use}_\text{node,tech,timestep,investstep}) \land (\exists (\textit{source\_use\_equals}) \lor \exists (\textit{source\_use\_max}_\text{timestep,node,tech})))\!\!:\\[2em]
\quad \text{if } (\exists (\textit{source\_use\_equals}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_area})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} = \textit{source\_use\_equals} \times \textbf{area\_use}_\text{node,tech,investstep}\\[2em]
\quad \text{if } (\exists (\textit{source\_use\_equals}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_cap})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} = \textit{source\_use\_equals} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier,investstep})\\[2em]
\quad \text{if } (\exists (\textit{source\_use\_equals}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{absolute})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} = \textit{source\_use\_equals} \times 1\\[2em]
\quad \text{if } (\neg (\exists (\textit{source\_use\_equals})) \land \exists (\textit{source\_use\_max}_\text{timestep,node,tech}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_area})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} \leq \textit{source\_use\_max}_\text{timestep,node,tech} \times \textbf{area\_use}_\text{node,tech,investstep}\\[2em]
\quad \text{if } (\neg (\exists (\textit{source\_use\_equals})) \land \exists (\textit{source\_use\_max}_\text{timestep,node,tech}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_cap})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} \leq \textit{source\_use\_max}_\text{timestep,node,tech} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier,investstep})\\[2em]
\quad \text{if } (\neg (\exists (\textit{source\_use\_equals})) \land \exists (\textit{source\_use\_max}_\text{timestep,node,tech}))\land{}(\textit{source\_unit}_\text{tech}\mathord{=}\text{absolute})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} \leq \textit{source\_use\_max}_\text{timestep,node,tech} \times 1\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : source_use AND (source_use_equals OR source_use_max)
equations :
- where : source_use_equals
expression : source_use == source_use_equals * $source_scaler
- where : NOT source_use_equals AND source_use_max
expression : source_use <= source_use_max * $source_scaler
sub_expressions :
source_scaler :
- where : source_unit=per_area
expression : area_use
- where : source_unit=per_cap
expression : sum(flow_cap, over=carriers)
- where : source_unit=absolute
expression : '1'
balance_supply_min_use
Set the lower bound on the quantity of its source a supply technology must use in each timestep.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{source\_use\_min}) \land \neg (\exists (\textit{source\_use\_equals})) \land \textit{base\_tech}_\text{tech}\mathord{=}\text{supply})\!\!:\\[2em]
\quad \text{if } (\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_area})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} \geq \textit{source\_use\_min} \times \textbf{area\_use}_\text{node,tech,investstep}\\[2em]
\quad \text{if } (\textit{source\_unit}_\text{tech}\mathord{=}\text{per\_cap})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} \geq \textit{source\_use\_min} \times \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_cap}_\text{node,tech,carrier,investstep})\\[2em]
\quad \text{if } (\textit{source\_unit}_\text{tech}\mathord{=}\text{absolute})\!\!:\\
\qquad \textbf{source\_use}_\text{node,tech,timestep,investstep} \geq \textit{source\_use\_min} \times 1\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : source_use_min AND NOT source_use_equals AND base_tech=supply
equations :
- expression : source_use >= source_use_min * $source_scaler
sub_expressions :
source_scaler :
- where : source_unit=per_area
expression : area_use
- where : source_unit=per_cap
expression : sum(flow_cap, over=carriers)
- where : source_unit=absolute
expression : '1'
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.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\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}))\!\!:\\[2em]
\quad \text{if } (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]} \land \neg (\textit{cyclic\_storage}\mathord{=}\text{true}))\!\!:\\
\qquad \textbf{storage}_\text{node,tech,timestep,investstep} = \textit{storage\_initial} \times \textbf{storage\_cap}_\text{node,tech,investstep} - \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep})\\[2em]
\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}))\!\!:\\
\qquad \textbf{storage}_\text{node,tech,timestep,investstep} = ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep-1}}) \times \textbf{storage}_\text{node,tech,timestep-1,investstep} - \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep})\\[2em]
\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})))\!\!:\\
\qquad \textbf{storage}_\text{node,tech,timestep,investstep} = ((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],investstep} - \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep})\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : (include_storage=true or base_tech=storage) AND NOT (base_tech=supply OR base_tech=demand)
equations :
- expression : "storage == $storage_previous_step -\n sum(flow_out_inc_eff, over=carriers)
+ sum(flow_in_inc_eff, over=carriers)"
sub_expressions :
storage_previous_step :
- where : timesteps=get_val_at_index(timesteps=0) AND NOT cyclic_storage=True
expression : storage_initial * storage_cap
- where : "(\n (timesteps=get_val_at_index(timesteps=0) AND cyclic_storage=True)\n\
\ OR NOT timesteps=get_val_at_index(timesteps=0)\n) AND NOT lookup_cluster_first_timestep=True"
expression : (1 - storage_loss) ** roll(timestep_resolution, timesteps=1) * roll(storage,
timesteps=1)
- where : lookup_cluster_first_timestep=True AND NOT (timesteps=get_val_at_index(timesteps=0)
AND NOT cyclic_storage=True)
expression : (1 - storage_loss) ** select_from_lookup_arrays(timestep_resolution,
timesteps=lookup_cluster_last_timestep) * select_from_lookup_arrays(storage,
timesteps=lookup_cluster_last_timestep)
set_storage_initial
Fix the relationship between carrier stored in a storage technology at the start and end of the whole model period.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep,investstep}) \land \exists (\textit{storage\_initial}) \land \textit{cyclic\_storage}\mathord{=}\text{true})\!\!:\\[2em]
\quad \textbf{storage}_\text{node,tech,timestep=timesteps[-1],investstep} \times ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep=timesteps[-1]}}) = \textit{storage\_initial} \times \textbf{storage\_cap}_\text{node,tech,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- investsteps
where : storage AND storage_initial AND cyclic_storage=True
equations :
- expression : "storage[timesteps=$final_step] * (\n (1 - storage_loss) ** timestep_resolution[timesteps=$final_step]\n
) == storage_initial * storage_cap"
slices :
final_step :
- expression : get_val_at_index(timesteps=-1)
active : true
balance_transmission
Fix the relationship between between carrier flowing into and out of a transmission link in each timestep.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})\!\!:\\[2em]
\quad \sum\limits_{\text{[nodes,carriers]} \in \text{[nodes,carriers]}} (\textbf{flow\_out\_inc\_eff}_\text{node,tech,carrier,timestep,investstep}) = \sum\limits_{\text{[nodes,carriers]} \in \text{[nodes,carriers]}} (\textbf{flow\_in\_inc\_eff}_\text{node,tech,carrier,timestep,investstep})\\
\end{array}
\]
foreach :
- techs
- timesteps
- investsteps
where : base_tech=transmission
equations :
- expression : sum(flow_out_inc_eff, over=[nodes, carriers]) == sum(flow_in_inc_eff,
over=[nodes, carriers])
symmetric_transmission
Fix the flow capacity of two transmission technologies representing the same link in the system.
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.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}))\!\!:\\[2em]
\quad \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} \geq \textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_export
equations :
- expression : flow_out >= flow_export
flow_export_max
Set the upper bound of a technology's carrier export, for any technologies that can export carriers out of the system.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}) \land \exists (\textit{export\_max}))\!\!:\\[2em]
\quad \text{if } (\exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep}))\!\!:\\
\qquad \textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep} \leq \textit{export\_max} \times \textbf{operating\_units}_\text{node,tech,timestep,investstep}\\[2em]
\quad \text{if } (\neg (\exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep})))\!\!:\\
\qquad \textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep} \leq \textit{export\_max}\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_export AND export_max
equations :
- where : operating_units
expression : flow_export <= export_max * operating_units
- where : NOT operating_units
expression : flow_export <= export_max
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.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep}) \land \exists (\textbf{purchased\_units}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \textbf{operating\_units}_\text{node,tech,timestep,investstep} \leq \textbf{purchased\_units}_\text{node,tech,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : operating_units AND purchased_units
equations :
- expression : operating_units <= purchased_units
available_flow_cap_binary
Limit flow capacity to zero if the technology is not operating in a given timestep.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep}))\!\!:\\[2em]
\quad \textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep} \leq \textit{flow\_cap\_max}_\text{node,tech} \times \textbf{operating\_units}_\text{node,tech,timestep,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : available_flow_cap
equations :
- expression : available_flow_cap <= flow_cap_max * operating_units
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.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep}))\!\!:\\[2em]
\quad \textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep} \leq \textbf{flow\_cap}_\text{node,tech,carrier,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : available_flow_cap
equations :
- expression : available_flow_cap <= flow_cap
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.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep}))\!\!:\\[2em]
\quad \textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep} \geq \textbf{flow\_cap}_\text{node,tech,carrier,investstep} + ((\textbf{operating\_units}_\text{node,tech,timestep,investstep} - \textbf{purchased\_units}_\text{node,tech,investstep}) \times \textit{flow\_cap\_max}_\text{node,tech})\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : available_flow_cap
equations :
- expression : available_flow_cap >= flow_cap + ((operating_units - purchased_units)
* flow_cap_max)
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.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) \land \exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep}) \land \exists (\textit{flow\_cap\_per\_unit}))\!\!:\\[2em]
\quad \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} \leq \textbf{operating\_units}_\text{node,tech,timestep,investstep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_cap\_per\_unit} \times \textit{flow\_out\_parasitic\_eff}_\text{tech}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_out AND operating_units AND flow_cap_per_unit
equations :
- expression : flow_out <= operating_units * timestep_resolution * flow_cap_per_unit
* flow_out_parasitic_eff
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.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}) \land \exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep}) \land \exists (\textit{flow\_cap\_per\_unit}))\!\!:\\[2em]
\quad \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep} \leq \textbf{operating\_units}_\text{node,tech,timestep,investstep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_cap\_per\_unit}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_in AND operating_units AND flow_cap_per_unit
equations :
- expression : flow_in <= operating_units * timestep_resolution * flow_cap_per_unit
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.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) \land \exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep}) \land \exists (\textit{flow\_out\_min\_relative}))\!\!:\\[2em]
\quad \text{if } (\exists (\textit{flow\_cap\_per\_unit}))\!\!:\\
\qquad \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} \geq \textbf{operating\_units}_\text{node,tech,timestep,investstep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_cap\_per\_unit} \times \textit{flow\_out\_min\_relative}\\[2em]
\quad \text{if } (\exists (\textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep}))\!\!:\\
\qquad \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} \geq \textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep} \times \textit{timestep\_resolution}_\text{timestep} \times \textit{flow\_out\_min\_relative}\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_out AND operating_units AND flow_out_min_relative
equations :
- where : flow_cap_per_unit
expression : flow_out >= operating_units * timestep_resolution * flow_cap_per_unit
* flow_out_min_relative
- where : available_flow_cap
expression : flow_out >= available_flow_cap * timestep_resolution * flow_out_min_relative
storage_capacity_units_milp
Fix the storage capacity of any technology using integer units to define its capacity.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep,investstep}) \land \exists (\textbf{purchased\_units}_\text{node,tech,investstep}) \land \exists (\textit{storage\_cap\_per\_unit}))\!\!:\\[2em]
\quad \textbf{storage\_cap}_\text{node,tech,investstep} = \textbf{purchased\_units}_\text{node,tech,investstep} \times \textit{storage\_cap\_per\_unit}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
where : storage AND purchased_units AND storage_cap_per_unit
equations :
- expression : storage_cap == purchased_units * storage_cap_per_unit
flow_capacity_units_milp
Fix the flow capacity of any technology using integer units to define its capacity.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{operating\_units}_\text{node,tech,timestep,investstep}) \land \exists (\textit{flow\_cap\_per\_unit}))\!\!:\\[2em]
\quad \textbf{flow\_cap}_\text{node,tech,carrier,investstep} = \textbf{purchased\_units}_\text{node,tech,investstep} \times \textit{flow\_cap\_per\_unit}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
where : operating_units AND flow_cap_per_unit
equations :
- expression : flow_cap == purchased_units * flow_cap_per_unit
flow_capacity_max_purchase_milp
Set the upper bound on a technology's flow capacity, for any technology with integer capacity purchasing.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{purchased\_units}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \text{if } (\exists (\textit{flow\_cap\_max}_\text{node,tech}))\!\!:\\
\qquad \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \leq \textit{flow\_cap\_max}_\text{node,tech} \times \textbf{purchased\_units}_\text{node,tech,investstep}\\[2em]
\quad \text{if } (\neg (\exists (\textit{flow\_cap\_max}_\text{node,tech})))\!\!:\\
\qquad \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \leq \textit{bigM} \times \textbf{purchased\_units}_\text{node,tech,investstep}\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
where : purchased_units
equations :
- where : flow_cap_max
expression : flow_cap <= flow_cap_max * purchased_units
- where : NOT flow_cap_max
expression : flow_cap <= bigM * purchased_units
flow_capacity_min_purchase_milp
Set the lower bound on a technology's flow capacity, for any technology with integer capacity purchasing.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{purchased\_units}_\text{node,tech,investstep}) \land \exists (\textit{flow\_cap\_min}))\!\!:\\[2em]
\quad \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \geq \textit{flow\_cap\_min} \times \textbf{purchased\_units}_\text{node,tech,investstep}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
where : purchased_units AND flow_cap_min
equations :
- expression : flow_cap >= flow_cap_min * purchased_units
storage_capacity_max_purchase_milp
Set the upper bound on a technology's storage capacity, for any technology with integer capacity purchasing.
storage_capacity_min_purchase_milp
Set the lower bound on a technology's storage capacity, for any technology with integer capacity purchasing.
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.
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.
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.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{async\_flow\_switch}_\text{node,tech,timestep,investstep}))\!\!:\\[2em]
\quad \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}) \leq (1 - \textbf{async\_flow\_switch}_\text{node,tech,timestep,investstep}) \times \textit{bigM}\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : async_flow_switch
equations :
- expression : sum(flow_in, over=carriers) <= (1 - async_flow_switch) * bigM
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.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{async\_flow\_switch}_\text{node,tech,timestep,investstep}))\!\!:\\[2em]
\quad \sum\limits_{\text{carrier} \in \text{carriers}} (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) \leq \textbf{async\_flow\_switch}_\text{node,tech,timestep,investstep} \times \textit{bigM}\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : async_flow_switch
equations :
- expression : sum(flow_out, over=carriers) <= async_flow_switch * bigM
ramping_up
Set the upper bound on a technology's ability to ramp outflow up beyond a certain percentage compared to the previous timestep.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{flow\_ramping}_\text{tech}) \land \neg (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]}))\!\!:\\[2em]
\quad \text{if } (\exists (\textit{carrier\_out}_\text{node,tech,carrier}) \land \neg (\exists (\textit{carrier\_in}_\text{node,tech,carrier})))\!\!:\\
\qquad \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep-1,investstep} }{ \textit{timestep\_resolution}_\text{timestep-1} } \leq \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep}\\[2em]
\quad \text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \neg (\exists (\textit{carrier\_out}_\text{node,tech,carrier})))\!\!:\\
\qquad \frac{ \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep} }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ \textbf{flow\_in}_\text{node,tech,carrier,timestep-1,investstep} }{ \textit{timestep\_resolution}_\text{timestep-1} } \leq \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep}\\[2em]
\quad \text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \exists (\textit{carrier\_out}_\text{node,tech,carrier}))\!\!:\\
\qquad \frac{ (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} - \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}) }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ (\textbf{flow\_out}_\text{node,tech,carrier,timestep-1,investstep} - \textbf{flow\_in}_\text{node,tech,carrier,timestep-1,investstep}) }{ \textit{timestep\_resolution}_\text{timestep-1} } \leq \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep}\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_ramping AND NOT timesteps=get_val_at_index(timesteps=0)
equations :
- expression : $flow - roll($flow, timesteps=1) <= flow_ramping * flow_cap
sub_expressions :
flow :
- where : carrier_out AND NOT carrier_in
expression : flow_out / timestep_resolution
- where : carrier_in AND NOT carrier_out
expression : flow_in / timestep_resolution
- where : carrier_in AND carrier_out
expression : (flow_out - flow_in) / timestep_resolution
ramping_down
Set the upper bound on a technology's ability to ramp outflow down beyond a certain percentage compared to the previous timestep.
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{flow\_ramping}_\text{tech}) \land \neg (\textit{timesteps}_\text{timestep}\mathord{=}\text{timesteps[0]}))\!\!:\\[2em]
\quad \text{if } (\exists (\textit{carrier\_out}_\text{node,tech,carrier}) \land \neg (\exists (\textit{carrier\_in}_\text{node,tech,carrier})))\!\!:\\
\qquad -1 \times \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \leq \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep-1,investstep} }{ \textit{timestep\_resolution}_\text{timestep-1} }\\[2em]
\quad \text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \neg (\exists (\textit{carrier\_out}_\text{node,tech,carrier})))\!\!:\\
\qquad -1 \times \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \leq \frac{ \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep} }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ \textbf{flow\_in}_\text{node,tech,carrier,timestep-1,investstep} }{ \textit{timestep\_resolution}_\text{timestep-1} }\\[2em]
\quad \text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}) \land \exists (\textit{carrier\_out}_\text{node,tech,carrier}))\!\!:\\
\qquad -1 \times \textit{flow\_ramping}_\text{tech} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \leq \frac{ (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} - \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}) }{ \textit{timestep\_resolution}_\text{timestep} } - \frac{ (\textbf{flow\_out}_\text{node,tech,carrier,timestep-1,investstep} - \textbf{flow\_in}_\text{node,tech,carrier,timestep-1,investstep}) }{ \textit{timestep\_resolution}_\text{timestep-1} }\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_ramping AND NOT timesteps=get_val_at_index(timesteps=0)
equations :
- expression : -1 * flow_ramping * flow_cap <= $flow - roll($flow, timesteps=1)
sub_expressions :
flow :
- where : carrier_out AND NOT carrier_in
expression : flow_out / timestep_resolution
- where : carrier_in AND NOT carrier_out
expression : flow_in / timestep_resolution
- where : carrier_in AND carrier_out
expression : (flow_out - flow_in) / timestep_resolution
area_use_bounding
Area use in a given investment period is the area use in the previous period plus the new area used minus old used area that has been decommissioned between the previous period and this one.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{area\_use}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \textbf{area\_use}_\text{node,tech,investstep} = \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} (\textbf{area\_use\_new}_\text{node,tech,vintagestep} \times \textit{available\_vintages}_\text{tech,vintagestep,investstep}) + (\textit{area\_use\_initial}_\text{node,tech} \times \textit{available\_initial\_cap}_\text{tech,investstep})\\
\end{array}
\]
equations :
- expression : area_use == sum(area_use_new * available_vintages, over=vintagesteps)
+ area_use_initial * available_initial_cap
foreach :
- nodes
- techs
- investsteps
where : area_use
flow_cap_bounding
Flow capacity in a given investment period is the capacity in the previous period plus the new capacity installed minus old capacity that has been decommissioned between the previous period and this one.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_cap}_\text{node,tech,carrier,investstep}))\!\!:\\[2em]
\quad \textbf{flow\_cap}_\text{node,tech,carrier,investstep} = \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} (\textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep} \times \textit{available\_vintages}_\text{tech,vintagestep,investstep}) + (\textit{flow\_cap\_initial}_\text{tech,node} \times \textit{available\_initial\_cap}_\text{tech,investstep})\\
\end{array}
\]
equations :
- expression : flow_cap == sum(flow_cap_new * available_vintages, over=vintagesteps)
+ flow_cap_initial * available_initial_cap
foreach :
- nodes
- techs
- carriers
- investsteps
where : flow_cap
limit_flow_cap_new_max_rate
Limit maximum rate of new capacity build-out
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_cap}_\text{node,tech,carrier,investstep}) \land \exists (\textit{flow\_cap\_new\_max\_rate}))\!\!:\\[2em]
\quad \text{if } (\neg (\textit{investsteps}_\text{investstep}\mathord{=}\text{investsteps[0]}))\!\!:\\
\qquad \sum\limits_{\text{[vintagesteps,nodes]} \in \text{[vintagesteps,nodes]}} ((\textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep}\vee{}0) \times \textit{available\_vintages}_\text{tech,vintagestep,investstep}) \leq \sum\limits_{\text{node} \in \text{nodes}} (\textbf{flow\_cap}_\text{node,tech,carrier,investstep-1}) \times \textit{flow\_cap\_new\_max\_rate}\\[2em]
\quad \text{if } (\textit{investsteps}_\text{investstep}\mathord{=}\text{investsteps[0]} \land \textit{flow\_cap\_initial}_\text{tech,node}\mathord{>}\text{0})\!\!:\\
\qquad \sum\limits_{\text{[vintagesteps,nodes]} \in \text{[vintagesteps,nodes]}} ((\textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep}\vee{}0) \times \textit{available\_vintages}_\text{tech,vintagestep,investstep}) \leq \sum\limits_{\text{node} \in \text{nodes}} (\textit{flow\_cap\_initial}_\text{tech,node}) \times \textit{flow\_cap\_new\_max\_rate}\\[2em]
\end{array}
\]
equations :
- expression : sum(default_if_empty(flow_cap_new, 0) * available_vintages, over=[vintagesteps,
nodes]) <= sum($prev_flow_cap, over=nodes) * flow_cap_new_max_rate
foreach :
- techs
- carriers
- investsteps
sub_expressions :
prev_flow_cap :
- where : NOT investsteps=get_val_at_index(investsteps=0)
expression : roll(flow_cap, investsteps=1)
- where : investsteps=get_val_at_index(investsteps=0) AND flow_cap_initial > 0
expression : flow_cap_initial
where : flow_cap AND flow_cap_new_max_rate
link_storage_level
Link the storage level at the end of one investmentstep to the start of the next.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage}_\text{node,tech,timestep,investstep}) \land \neg (\textit{investsteps}_\text{investstep}\mathord{=}\text{investsteps[0]}))\!\!:\\[2em]
\quad \textbf{storage}_\text{node,tech,timestep=timesteps[0],investstep} = \textbf{storage}_\text{node,tech,timestep=timesteps[-1],investstep-1} \times ((1 - \textit{storage\_loss}_\text{tech})^{\textit{timestep\_resolution}_\text{timestep=timesteps[-1]}})\\
\end{array}
\]
equations :
- expression : "storage[timesteps=$initial_step] == roll(\n storage[timesteps=$final_step]
* (\n (1 - storage_loss) ** timestep_resolution[timesteps=$final_step]\n ),\n\
\ investsteps=1\n)"
foreach :
- nodes
- techs
- costs
- investsteps
slices :
final_step :
- expression : get_val_at_index(timesteps=-1)
initial_step :
- expression : get_val_at_index(timesteps=0)
where : storage AND NOT investsteps=get_val_at_index(investsteps=0)
source_cap_bounding
Storage capacity in a given investment period is the capacity in the previous period plus the new capacity installed minus old capacity that has been decommissioned between the previous period and this one.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{source\_cap}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \textbf{source\_cap}_\text{node,tech,investstep} = \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} (\textbf{source\_cap\_new}_\text{node,tech,vintagestep} \times \textit{available\_vintages}_\text{tech,vintagestep,investstep}) + (\textit{source\_cap\_initial}_\text{node,tech} \times \textit{available\_initial\_cap}_\text{tech,investstep})\\
\end{array}
\]
equations :
- expression : source_cap == sum(source_cap_new * available_vintages, over=vintagesteps)
+ source_cap_initial * available_initial_cap
foreach :
- nodes
- techs
- investsteps
where : source_cap
storage_cap_bounding
Storage capacity in a given investment period is the capacity in the previous period plus the new capacity installed minus old capacity that has been decommissioned between the previous period and this one.
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{storage\_cap}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \textbf{storage\_cap}_\text{node,tech,investstep} = \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} (\textbf{storage\_cap\_new}_\text{node,tech,vintagestep} \times \textit{available\_vintages}_\text{tech,vintagestep,investstep}) + (\textit{storage\_cap\_initial}_\text{node,tech} \times \textit{available\_initial\_cap}_\text{tech,investstep})\\
\end{array}
\]
equations :
- expression : storage_cap == sum(storage_cap_new * available_vintages, over=vintagesteps)
+ storage_cap_initial * available_initial_cap
foreach :
- nodes
- techs
- investsteps
where : storage_cap
Where
flow_out_inc_eff
Outflows after taking efficiency losses into account.
Used in :
Default : 0
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}))\!\!:\\[2em]
\quad \text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})\!\!:\\
\qquad \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} }{ (\textit{flow\_out\_eff}_\text{tech} \times \textit{flow\_out\_parasitic\_eff}_\text{tech} \times (\textit{flow\_out\_eff\_per\_distance}^{\textit{distance}_\text{tech}})) }\\[2em]
\quad \text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission}))\!\!:\\
\qquad \frac{ \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} }{ (\textit{flow\_out\_eff}_\text{tech} \times \textit{flow\_out\_parasitic\_eff}_\text{tech}) }\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_out
equations :
- where : base_tech=transmission
expression : "flow_out / (\n flow_out_eff * flow_out_parasitic_eff *\n flow_out_eff_per_distance
** distance\n)"
- where : NOT base_tech=transmission
expression : flow_out / (flow_out_eff * flow_out_parasitic_eff)
flow_in_inc_eff
Inflows after taking efficiency losses into account.
Used in :
Default : 0
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}))\!\!:\\[2em]
\quad \text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})\!\!:\\
\qquad \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep} \times \textit{flow\_in\_eff}_\text{tech} \times (\textit{flow\_in\_eff\_per\_distance}^{\textit{distance}_\text{tech}})\\[2em]
\quad \text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission}))\!\!:\\
\qquad \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep} \times \textit{flow\_in\_eff}_\text{tech}\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : flow_in
equations :
- where : base_tech=transmission
expression : flow_in * flow_in_eff * flow_in_eff_per_distance ** distance
- where : NOT base_tech=transmission
expression : flow_in * flow_in_eff
cost_var
The operating costs per timestep of a technology.
Used in :
Unit : cost_per_time
Default : 0
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{cost\_export}) \lor \exists (\textit{cost\_flow\_in}_\text{tech,cost,investstep}) \lor \exists (\textit{cost\_flow\_out}_\text{tech,cost}))\!\!:\\[2em]
\quad \text{if } (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}))\land{}(\textit{base\_tech}_\text{tech}\mathord{=}\text{supply})\!\!:\\
\qquad \textit{timestep\_weights}_\text{timestep} \times (\sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_export} \times \textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_out}_\text{tech,cost} \times \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) + \textit{cost\_flow\_in}_\text{tech,cost,investstep} \times \textbf{source\_use}_\text{node,tech,timestep,investstep})\\[2em]
\quad \text{if } (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}))\land{}(\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply}))\!\!:\\
\qquad \textit{timestep\_weights}_\text{timestep} \times (\sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_export} \times \textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_out}_\text{tech,cost} \times \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_in}_\text{tech,cost,investstep} \times \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}))\\[2em]
\quad \text{if } (\neg (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep})))\land{}(\textit{base\_tech}_\text{tech}\mathord{=}\text{supply})\!\!:\\
\qquad \textit{timestep\_weights}_\text{timestep} \times (\sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_out}_\text{tech,cost} \times \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) + \textit{cost\_flow\_in}_\text{tech,cost,investstep} \times \textbf{source\_use}_\text{node,tech,timestep,investstep})\\[2em]
\quad \text{if } (\neg (\exists (\textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep})))\land{}(\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply}))\!\!:\\
\qquad \textit{timestep\_weights}_\text{timestep} \times (\sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_out}_\text{tech,cost} \times \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_flow\_in}_\text{tech,cost,investstep} \times \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}))\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- costs
- timesteps
- investsteps
where : cost_export OR cost_flow_in OR cost_flow_out
equations :
- expression : timestep_weights * ($cost_export + $cost_flow_out + $cost_flow_in)
sub_expressions :
cost_export :
- where : flow_export
expression : sum(cost_export * flow_export, over=carriers)
- where : NOT flow_export
expression : '0'
cost_flow_in :
- where : base_tech=supply
expression : cost_flow_in * source_use
- where : NOT base_tech=supply
expression : sum(cost_flow_in * flow_in, over=carriers)
cost_flow_out :
- expression : sum(cost_flow_out * flow_out, over=carriers)
cost_investment_flow_cap
The investment costs associated with the nominal/rated capacity of a technology.
Used in :
Default : 0
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{flow\_cap}_\text{node,tech,carrier,investstep}) \land (\exists (\textit{cost\_flow\_cap}_\text{cost,tech,vintagestep}) \lor \exists (\textit{cost\_flow\_cap\_per\_distance})))\!\!:\\[2em]
\quad \text{if } (\exists (\textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep}))\land{}(\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})\!\!:\\
\qquad \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} ((\textit{cost\_flow\_cap}_\text{cost,tech,vintagestep} + (\textit{cost\_flow\_cap\_per\_distance} \times \textit{distance}_\text{tech})) \times 0.5 \times \textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep})\\[2em]
\quad \text{if } (\exists (\textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep}))\land{}(\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission}))\!\!:\\
\qquad \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} (\textit{cost\_flow\_cap}_\text{cost,tech,vintagestep} \times \textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep})\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- costs
- investsteps
where : flow_cap AND (cost_flow_cap OR cost_flow_cap_per_distance)
equations :
- where : flow_cap_new
expression : sum($cost_sum * flow_cap_new, over=vintagesteps)
sub_expressions :
cost_sum :
- where : base_tech=transmission
expression : (cost_flow_cap + cost_flow_cap_per_distance * distance) * 0.5
- where : NOT base_tech=transmission
expression : cost_flow_cap
cost_investment_storage_cap
The investment costs associated with the storage capacity of a technology.
Used in :
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{cost\_storage\_cap}_\text{cost,tech,vintagestep}) \land \exists (\textbf{storage\_cap}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \text{if } (\exists (\textbf{storage\_cap\_new}_\text{node,tech,vintagestep}))\!\!:\\
\qquad \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} (\textit{cost\_storage\_cap}_\text{cost,tech,vintagestep} \times \textbf{storage\_cap\_new}_\text{node,tech,vintagestep})\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- costs
- investsteps
where : cost_storage_cap AND storage_cap
equations :
- where : storage_cap_new
expression : sum(cost_storage_cap * storage_cap_new, over=vintagesteps)
cost_investment_source_cap
The investment costs associated with the source consumption capacity of a technology.
Used in :
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{cost\_source\_cap}_\text{cost,tech,vintagestep}) \land \exists (\textbf{source\_cap}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \text{if } (\exists (\textbf{source\_cap\_new}_\text{node,tech,vintagestep}))\!\!:\\
\qquad \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} (\textit{cost\_source\_cap}_\text{cost,tech,vintagestep} \times \textbf{source\_cap\_new}_\text{node,tech,vintagestep})\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- costs
- investsteps
where : cost_source_cap AND source_cap
equations :
- where : source_cap_new
expression : sum(cost_source_cap * source_cap_new, over=vintagesteps)
cost_investment_area_use
The investment costs associated with the area used by a technology.
Used in :
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{cost\_area\_use}) \land \exists (\textbf{area\_use}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \text{if } (\exists (\textbf{area\_use\_new}_\text{node,tech,vintagestep}))\!\!:\\
\qquad \sum\limits_{\text{vintagestep} \in \text{vintagesteps}} (\textit{cost\_area\_use} \times \textbf{area\_use\_new}_\text{node,tech,vintagestep})\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- costs
- investsteps
where : cost_area_use AND area_use
equations :
- where : area_use_new
expression : sum(cost_area_use * area_use_new, over=vintagesteps)
cost_investment_purchase
The investment costs associated with the binary purchase of a technology.
Used in :
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textit{cost\_purchase}) \land \exists (\textbf{purchased\_units}_\text{node,tech,investstep}))\!\!:\\[2em]
\quad \text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission})\!\!:\\
\qquad ((\textit{cost\_purchase} + (\textit{cost\_purchase\_per\_distance} \times \textit{distance}_\text{tech})) \times \textbf{purchased\_units}_\text{node,tech,investstep}) \times 0.5\\[2em]
\quad \text{if } (\neg (\textit{base\_tech}_\text{tech}\mathord{=}\text{transmission}))\!\!:\\
\qquad \textit{cost\_purchase} \times \textbf{purchased\_units}_\text{node,tech,investstep}\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- costs
- investsteps
where : cost_purchase AND purchased_units
equations :
- where : base_tech=transmission
expression : (cost_purchase + cost_purchase_per_distance * distance) * purchased_units
* 0.5
- where : NOT base_tech=transmission
expression : cost_purchase * purchased_units
cost_investment
The installation costs of a technology, including annualised investment costs and annual maintenance costs.
Used in :
Unit : cost
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{cost\_investment\_flow\_cap}_\text{node,tech,carrier,cost,investstep}) \lor \exists (\textbf{cost\_investment\_storage\_cap}_\text{node,tech,cost,investstep}) \lor \exists (\textbf{cost\_investment\_source\_cap}_\text{node,tech,cost,investstep}) \lor \exists (\textbf{cost\_investment\_area\_use}_\text{node,tech,cost,investstep}) \lor \exists (\textbf{cost\_investment\_purchase}_\text{node,tech,cost,investstep}))\!\!:\\[2em]
\quad \text{if } (\exists (\textit{cost\_depreciation\_rate}))\!\!:\\
\qquad \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} \times (\sum\limits_{\text{carrier} \in \text{carriers}} ((\textbf{cost\_investment\_flow\_cap}_\text{node,tech,carrier,cost,investstep}\vee{}0)) + (\textbf{cost\_investment\_storage\_cap}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_source\_cap}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_area\_use}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_purchase}_\text{node,tech,cost,investstep}\vee{}0)) \times (1 + \textit{cost\_om\_annual\_investment\_fraction})) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_om\_annual} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep}))\\[2em]
\quad \text{if } (\neg (\exists (\textit{cost\_depreciation\_rate})) \land \textit{cost\_interest\_rate}_\text{tech,cost}\mathord{=}\text{0})\!\!:\\
\qquad \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,investstep}\vee{}0)) + (\textbf{cost\_investment\_storage\_cap}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_source\_cap}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_area\_use}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_purchase}_\text{node,tech,cost,investstep}\vee{}0)) \times (1 + \textit{cost\_om\_annual\_investment\_fraction})) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_om\_annual} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep}))\\[2em]
\quad \text{if } (\neg (\exists (\textit{cost\_depreciation\_rate})) \land \textit{cost\_interest\_rate}_\text{tech,cost}\mathord{>}\text{0})\!\!:\\
\qquad \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{tech,cost} \times ((1 + \textit{cost\_interest\_rate}_\text{tech,cost})^{\textit{lifetime}_\text{tech}})) }{ (((1 + \textit{cost\_interest\_rate}_\text{tech,cost})^{\textit{lifetime}_\text{tech}}) - 1) } \times (\sum\limits_{\text{carrier} \in \text{carriers}} ((\textbf{cost\_investment\_flow\_cap}_\text{node,tech,carrier,cost,investstep}\vee{}0)) + (\textbf{cost\_investment\_storage\_cap}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_source\_cap}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_area\_use}_\text{node,tech,cost,investstep}\vee{}0) + (\textbf{cost\_investment\_purchase}_\text{node,tech,cost,investstep}\vee{}0)) \times (1 + \textit{cost\_om\_annual\_investment\_fraction})) + \sum\limits_{\text{carrier} \in \text{carriers}} (\textit{cost\_om\_annual} \times \textbf{flow\_cap}_\text{node,tech,carrier,investstep}))\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- costs
- investsteps
where : cost_investment_flow_cap OR cost_investment_storage_cap OR cost_investment_source_cap
OR cost_investment_area_use OR cost_investment_purchase
equations :
- expression : "$annualisation_weight * (\n $depreciation_rate * (\n sum(default_if_empty(cost_investment_flow_cap,
0), over=carriers) +\n default_if_empty(cost_investment_storage_cap, 0) +\n\
\ default_if_empty(cost_investment_source_cap, 0) +\n default_if_empty(cost_investment_area_use,
0) +\n default_if_empty(cost_investment_purchase, 0)\n ) * (1 + cost_om_annual_investment_fraction)\n\
\ + sum(cost_om_annual * flow_cap, over=carriers)\n)\n"
sub_expressions :
annualisation_weight :
- expression : sum(timestep_resolution * timestep_weights, over=timesteps) / 8760
depreciation_rate :
- where : cost_depreciation_rate
expression : cost_depreciation_rate
- where : NOT cost_depreciation_rate AND cost_interest_rate=0
expression : 1 / lifetime
- where : NOT cost_depreciation_rate AND cost_interest_rate>0
expression : (cost_interest_rate * ((1 + cost_interest_rate) ** lifetime)) / (((1
+ cost_interest_rate) ** lifetime) - 1)
cost
The total annualised costs of a technology, including installation and operation costs.
Used in :
Unit : cost
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ cost }\negthickspace \in \negthickspace\text{ costs, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\text{if } (\exists (\textbf{cost\_investment}_\text{node,tech,cost,investstep}) \lor \exists (\textbf{cost\_var}_\text{node,tech,cost,timestep,investstep}))\!\!:\\[2em]
\quad \text{if } (\exists (\textbf{cost\_var}_\text{node,tech,cost,timestep,investstep}))\land{}(\exists (\textbf{cost\_investment}_\text{node,tech,cost,investstep}))\!\!:\\
\qquad \textbf{cost\_investment}_\text{node,tech,cost,investstep} + \sum\limits_{\text{timestep} \in \text{timesteps}} (\textbf{cost\_var}_\text{node,tech,cost,timestep,investstep})\\[2em]
\quad \text{if } (\exists (\textbf{cost\_var}_\text{node,tech,cost,timestep,investstep}))\land{}(\neg (\exists (\textbf{cost\_investment}_\text{node,tech,cost,investstep})))\!\!:\\
\qquad \sum\limits_{\text{timestep} \in \text{timesteps}} (\textbf{cost\_var}_\text{node,tech,cost,timestep,investstep})\\[2em]
\quad \text{if } (\neg (\exists (\textbf{cost\_var}_\text{node,tech,cost,timestep,investstep})))\land{}(\exists (\textbf{cost\_investment}_\text{node,tech,cost,investstep}))\!\!:\\
\qquad \textbf{cost\_investment}_\text{node,tech,cost,investstep}\\[2em]
\quad \text{if } (\neg (\exists (\textbf{cost\_var}_\text{node,tech,cost,timestep,investstep})))\land{}(\neg (\exists (\textbf{cost\_investment}_\text{node,tech,cost,investstep})))\!\!:\\
\qquad 0\\[2em]
\end{array}
\]
foreach :
- nodes
- techs
- costs
- investsteps
where : cost_investment OR cost_var
equations :
- expression : $cost_investment + $cost_var_sum
sub_expressions :
cost_investment :
- where : cost_investment
expression : cost_investment
- where : NOT cost_investment
expression : '0'
cost_var_sum :
- where : cost_var
expression : sum(cost_var, over=timesteps)
- where : NOT cost_var
expression : '0'
active : true
Decision Variables
flow_cap
A technology's flow capacity, also known as its nominal or nameplate capacity.
Used in :
Unit : power
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\quad \textit{flow\_cap\_min} \leq \textbf{flow\_cap}_\text{node,tech,carrier,investstep}\\
\quad \textbf{flow\_cap}_\text{node,tech,carrier,investstep} \leq \textit{flow\_cap\_max}_\text{node,tech}\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- investsteps
bounds :
min : flow_cap_min
max : flow_cap_max
link_flow_cap
A transmission technology's flow capacity, also known as its nominal or nameplate capacity.
Used in :
Unit : power
Default : 0
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.
Used in :
Unit : energy
Default : 0
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\exists (\textit{carrier\_out}_\text{node,tech,carrier}))\!\!:\\[2em]
\quad 0 \leq \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep}\\
\quad \textbf{flow\_out}_\text{node,tech,carrier,timestep,investstep} \leq inf\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : carrier_out
bounds :
min : 0
max : .inf
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.
Used in :
Unit : energy
Default : 0
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\exists (\textit{carrier\_in}_\text{node,tech,carrier}))\!\!:\\[2em]
\quad 0 \leq \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep}\\
\quad \textbf{flow\_in}_\text{node,tech,carrier,timestep,investstep} \leq inf\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : carrier_in
bounds :
min : 0
max : .inf
flow_export
The flow of a carrier exported outside the system boundaries by a technology per timestep.
Used in :
Unit : energy
Default : 0
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\exists (\textit{carrier\_export}))\!\!:\\[2em]
\quad 0 \leq \textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep}\\
\quad \textbf{flow\_export}_\text{node,tech,carrier,timestep,investstep} \leq inf\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : carrier_export
bounds :
min : 0
max : .inf
area_use
The area in space utilised directly (e.g., solar PV panels) or indirectly (e.g., biofuel crops) by a technology.
Used in :
Unit : area
Default : 0
source_use
The carrier flow consumed from outside the system boundaries by a supply technology.
Used in :
Unit : energy
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\textit{base\_tech}_\text{tech}\mathord{=}\text{supply})\!\!:\\[2em]
\quad 0 \leq \textbf{source\_use}_\text{node,tech,timestep,investstep}\\
\quad \textbf{source\_use}_\text{node,tech,timestep,investstep} \leq inf\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : base_tech=supply
bounds :
min : 0
max : .inf
source_cap
The upper limit on a flow that can be consumed from outside the system boundaries by a supply technology in each timestep.
Used in :
Unit : power
Default : 0
storage_cap
The upper limit on a carrier that can be stored by a technology in any timestep.
Used in :
Unit : energy
Default : 0
storage
The carrier stored by a storage technology in each timestep.
Used in :
Unit : energy
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\textit{include\_storage}_\text{tech}\mathord{=}\text{true} \lor \textit{base\_tech}_\text{tech}\mathord{=}\text{storage})\!\!:\\[2em]
\quad 0 \leq \textbf{storage}_\text{node,tech,timestep,investstep}\\
\quad \textbf{storage}_\text{node,tech,timestep,investstep} \leq inf\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : include_storage=True OR base_tech=storage
bounds :
min : 0
max : .inf
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.
Used in :
Unit : integer
Default : 0
operating_units
Integer number of a technology that is operating in each timestep, for any technology set to require integer capacity purchasing.
Used in :
Unit : integer
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{Z}\;\!\!:\\[2em]
\text{if } (\textit{integer\_dispatch}\mathord{=}\text{true} \land \textit{cap\_method}\mathord{=}\text{integer})\!\!:\\[2em]
\quad 0 \leq \textbf{operating\_units}_\text{node,tech,timestep,investstep}\\
\quad \textbf{operating\_units}_\text{node,tech,timestep,investstep} \leq inf\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : integer_dispatch=True AND cap_method=integer
domain : integer
bounds :
min : 0
max : .inf
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.
Used in :
Unit : power
Default : 0
Math YAML
\[
\begin{array}{l}
\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{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\textit{integer\_dispatch}\mathord{=}\text{true} \land \exists (\textit{flow\_cap\_max}_\text{node,tech}) \land \neg (\exists (\textit{flow\_cap\_per\_unit})))\!\!:\\[2em]
\quad 0 \leq \textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep}\\
\quad \textbf{available\_flow\_cap}_\text{node,tech,carrier,timestep,investstep} \leq inf\\
\end{array}
\]
foreach :
- nodes
- techs
- carriers
- timesteps
- investsteps
where : integer_dispatch=True AND flow_cap_max AND NOT flow_cap_per_unit
bounds :
min : 0
max : .inf
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.
Used in :
Unit : integer
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{Z}\;\!\!:\\[2em]
\text{if } (\textit{force\_async\_flow}\mathord{=}\text{true})\!\!:\\[2em]
\quad 0 \leq \textbf{async\_flow\_switch}_\text{node,tech,timestep,investstep}\\
\quad \textbf{async\_flow\_switch}_\text{node,tech,timestep,investstep} \leq 1\\
\end{array}
\]
foreach :
- nodes
- techs
- timesteps
- investsteps
where : force_async_flow=True
domain : integer
bounds :
min : 0
max : 1
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.
Used in :
Unit : energy
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\text{config.ensure\_feasibility}\mathord{=}\text{true})\!\!:\\[2em]
\quad 0 \leq \textbf{unmet\_demand}_\text{node,carrier,timestep,investstep}\\
\quad \textbf{unmet\_demand}_\text{node,carrier,timestep,investstep} \leq inf\\
\end{array}
\]
foreach :
- nodes
- carriers
- timesteps
- investsteps
where : config.ensure_feasibility=True
bounds :
min : 0
max : .inf
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).
Used in :
Unit : energy
Default : 0
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ timestep }\negthickspace \in \negthickspace\text{ timesteps, }
\text{ investstep }\negthickspace \in \negthickspace\text{ investsteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\text{config.ensure\_feasibility}\mathord{=}\text{true})\!\!:\\[2em]
\quad -inf \leq \textbf{unused\_supply}_\text{node,carrier,timestep,investstep}\\
\quad \textbf{unused\_supply}_\text{node,carrier,timestep,investstep} \leq 0\\
\end{array}
\]
foreach :
- nodes
- carriers
- timesteps
- investsteps
where : config.ensure_feasibility=True
bounds :
min : -.inf
max : 0
area_use_new
Additional area use commissioned in an investstep.
Used in :
Unit : area
flow_cap_new
Additional flow capacity commissioned in an investstep.
Used in :
Unit : power
Math YAML
\[
\begin{array}{l}
\forall{}
\text{ node }\negthickspace \in \negthickspace\text{ nodes, }
\text{ tech }\negthickspace \in \negthickspace\text{ techs, }
\text{ carrier }\negthickspace \in \negthickspace\text{ carriers, }
\text{ vintagestep }\negthickspace \in \negthickspace\text{ vintagesteps }
\!\!,\\
\forall\mathbb{R}\;\!\!:\\[2em]
\text{if } (\exists (\textbf{flow\_cap}_\text{node,tech,carrier,investstep}))\!\!:\\[2em]
\quad 0 \leq \textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep}\\
\quad \textbf{flow\_cap\_new}_\text{node,tech,carrier,vintagestep} \leq \textit{flow\_cap\_new\_max}_\text{tech,vintagestep}\\
\end{array}
\]
bounds :
max : flow_cap_new_max
min : 0
foreach :
- nodes
- techs
- carriers
- vintagesteps
where : flow_cap
source_cap_new
Additional source capacity commissioned in an investstep.
Used in :
Unit : power
storage_cap_new
Additional storage capacity commissioned in an investstep.
Used in :
Unit : energy
Parameters
objective_cost_weights
Weightings for cost classes to apply in the objective function.
Used in :
Default : 1
investstep_resolution
Used in :
Default : 1
bigM
BigM is a large value used to define certain optimisation problems. See https://en.wikipedia.org/wiki/Big_M_method for more information. This value should be larger than the largest values that any decision variables can take, but should not be too large (i.e., do not set it greater than 3 orders of magnitude above the numeric range of the model). If too large, numerical problems may arise in the optimisation.
Used in :
Default : 1000000000.0
available_initial_cap
Used in :
Default : 0
base_tech
Should be the name of one of the abstract base classes, from which some initial parameter defaults will be derived and with which certain base math will be triggered.
Used in :
carrier_out
Carrier(s) produced by this technology. Only transmission, conversion, storage, and supply technologies can define this parameter
Used in :
cost_flow_in
Cost per unit of flow_in in each timestep.
Used in :
Unit : \(\text{energy}^{-1}\) .
Default : 0
cost_flow_out
Cost per unit of flow_in in each timestep.
Used in :
Unit : \(\text{energy}^{-1}\) .
Default : 0
cost_interest_rate
Used when computing levelized costs and technology depreciation_rate (relative to lifetime).
Used in :
Unit : fraction
Default : 0
flow_cap_initial
Used in :
Default : 0
flow_cap_max
Limits flow_cap to a maximum.
Used in :
Unit : power.
Default : inf
flow_cap_max_systemwide
Limits the sum of flow_cap over all nodes in the model to a maximum. If cap_method=integer, this will be scaled by the number of integer units of a technology purchased.
Used in :
Unit : power or \(\frac{\text{power}}{\text{unit}}\) .
Default : inf
flow_out_eff
Conversion efficiency from the technology to sink/flow_out (tech dependent). Set as value between 1 (no loss) and 0 (all lost).
Used in :
Unit : fraction.
Default : 1.0
flow_ramping
limit maximum outflow / inflow / outflow - inflow (technology base class dependent) to a fraction of maximum capacity, which increases by that fraction at each timestep.
Used in :
Unit : \(\frac{\text{fraction}}{\text{hour}}\) .
Default : 1.0
lifetime
Must be defined if fixed capital costs are defined. A reasonable value for many technologies is around 20-25 years.
Used in :
Unit : years.
Default : inf
carrier_in
Carrier(s) consumed by this technology. Only transmission, conversion, storage, and demand technologies can define this parameter
Used in :
area_use_initial
Used in :
Default : 0
area_use_max
If set to a finite value, limits the upper bound of the area_use decision variable to this value.
Used in :
Unit : \(\text{area}^{2}\) .
Default : inf
flow_cap_per_storage_cap_max
ratio of maximum charge/discharge (kW) for a given storage capacity (kWh).
Used in :
Unit : \(\text{hour}^{-1}\)
Default : inf
flow_out_parasitic_eff
Additional losses as flow gets transferred from the plant to the carrier, e.g. due to plant parasitic consumption. Set as value between 1 (no loss) and 0 (all lost).
Used in :
Unit : fraction.
Default : 1.0
include_storage
When true, math will be triggered to allow discontinuous carrier inflow and outflows across timesteps.
Used in :
Default : False
source_cap_initial
Used in :
Default : 0
source_unit
Sets the unit of Source to either absolute (e.g. kWh), per_area (e.g. kWh/m2), or per_cap (e.g. kWh/kW). per_area uses the area_use decision variable to scale the source while per_cap uses the flow_cap decision variable.
Used in :
Default : absolute
storage_cap_initial
Used in :
Default : 0
storage_cap_max
Limit upper bound of storage_cap decision variable.
Used in :
Unit : energy.
Default : inf
storage_loss
Rate of storage loss per hour, used to calculate lost stored flow as (1 - storage_loss)^hours_per_timestep.
Used in :
Unit : \(\frac{\text{fraction}}{\text{hour}}\) .
Default : 0
flow_in_eff
Conversion efficiency from source/flow_in (tech dependent) into the technology. Set as value between 1 (no loss) and 0 (all lost).
Used in :
Unit : fraction.
Default : 1.0
available_vintages
Used in :
Default : 0
cost_flow_cap
Cost per unit of the decision variable flow_cap.
Used in :
Unit : \(\text{power}^{-1}\) .
Default : 0
cost_source_cap
Cost per unit source_cap.
Used in :
Unit : \(\text{power}^{-1}\) .
Default : 0
cost_storage_cap
Cost per unit storage_cap, i.e., the maximum available capacity of the storage technology's "reservoir".
Used in :
Unit : \(\text{energy}^{-1}\) .
Default : 0
distance
Used for ..._per_distance constraints. If not defined, it will be automatically derived from latitude/longitude of nodes in a link.
Used in :
Default : 1.0
sink_use_equals
Required amount of carrier removal from the system (e.g., electricity demand, transport distance). Unit dictated by source_unit.
Used in :
Default : nan
source_use_max
Maximum sink use to remove a carrier from the system (e.g., biofuel, coal, rainfall, wind flow). Unit dictated by source_unit.
Used in :
Default : inf
timestep_resolution
Used in :
timestep_weights
Used in :
available_area
Used in :
area_use_min
Limits the lower bound of the area_use decision variable to this value.
Used in :
Unit : \(\text{area}^{2}\) .
area_use_per_flow_cap
If set, forces area_use to follow flow_cap with the given numerical ratio (e.g. setting to 1.5 means that area_use == 1.5 * flow_cap).
Used in :
Unit : \(\frac{\text{area}^{2}}{\text{power}}\) .
cap_method
One of 'continuous' (LP model) or 'integer' (integer/binary unit capacity).
Used in :
cost_area_use
Cost per unit area_use.
Used in :
Unit : \(\text{area}^{-2}\) .
cost_depreciation_rate
Applied to "annualise" investment costs so they are comparable to variable costs. If not provided, this will be calculated using technology lifetime and cost_interest_rate.
Used in :
Unit : fraction.
cost_export
Cost per unit of flow_export in each timestep. Usually used in the negative sense, as a subsidy.
Used in :
Unit : \(\text{energy}^{-1}\) .
cost_flow_cap_per_distance
Cost per unit of the decision variable flow_cap and per unit distance of a transmission link. Applied to transmission links only.
Used in :
Unit : \((\text{power}\times\text{distance})^{-1}\)
cost_om_annual
Annual costs applied per unit flow_cap. These costs are not subject to being recalculated relative to technology lifetime, only scaled to reflect the fraction of one year that the model represents (e.g., 7 days ~= 0.02 of a year).
Used in :
Unit : \(\text{power}^{-1}\) .
cost_om_annual_investment_fraction
Add an additional cost to total investment costs (except cost_om_annual) that is a fraction of that total.
Used in :
Unit : fraction / total investment.
cost_purchase
Cost applied to the variable purchased_units. Requires the parameter cap_method to be integer.
Used in :
Unit : \(\text{purchased\_unit}^{-1}\)
cost_purchase_per_distance
Cost applied if the binary variable purchased is 1 or per unit of the integer variable units. Requires the parameter cap_method to be integer.
Used in :
Unit : \((\text{purchased\_units}\times\text{distance})^{-1}\)
cyclic_storage
If true, link storage levels in the last model timestep with the first model timestep. inter_cluster_storage custom math must be included if using time clustering and setting this to true. This must be set to false if using operate mode.
Used in :
Unit : boolean.
export_max
If carrier_export is defined, limit the allowed export of produced carrier for a technology.
Used in :
Unit : power.
flow_cap_min
Limits flow_cap to a minimum. NOTE: this will force flow_cap to a minimum value unless cap_method is set to integer. If cap_method=integer, this will be scaled by the number of integer units of a technology purchased.
Used in :
Unit : power or \(\frac{\text{power}}{\text{unit}}\) .
flow_cap_min_systemwide
Limits the sum of flow_cap over all nodes in the model to a minimum. NOTE: this will force the sum of flow_cap to a minimum value unless cap_method is set to integer.
Used in :
Unit : power.
flow_cap_new_max_rate
Used in :
flow_cap_per_storage_cap_min
ratio of minimum charge/discharge (kW) for a given storage capacity (kWh).
Used in :
Unit : \(\text{hour}^{-1}\)
flow_cap_per_unit
Set the capacity of each integer unit of a technology purchased, if cap_method is integer.
Used in :
Unit : \(\frac{\text{power}}{\text{unit}}\) .
flow_in_eff_per_distance
Total link efficiency will be calculated as \(\text{flow\_in\_eff}\times{}\text{flow\_in\_eff\_per\_distance}^\text{distance}\) . Set as value between 1 (no loss) and 0 (all lost).
Used in :
flow_out_eff_per_distance
Total link efficiency will be calculated as \(\text{flow\_out\_eff}\times{}\text{flow\_out\_eff\_per\_distance}^\text{distance}\) . Set as value between 1 (no loss) and 0 (all lost).
Used in :
flow_out_min_relative
Set to a value between 0 and 1 to force minimum flow_out as a fraction of the technology rated capacity. If non-zero and cap_method is continuous, this will force the technology to operate above its minimum value at every timestep.
Used in :
Unit : fraction.
force_async_flow
If True, non-zero flow_out and flow_in cannot both occur in the same timestep.
Used in :
integer_dispatch
When true, will limit per-timestep out/inflows relative to the number of units of a technology that are in operation.
Requires cap_method=integer.
Used in :
purchased_units_max_systemwide
sets the upper bound of the sum across all nodes of the decision variable units for a particular technology.
Used in :
Unit : integer.
purchased_units_min_systemwide
sets the lower bound of the sum across all nodes of the decision variable units for a particular technology.
Used in :
Unit : integer.
sink_unit
Sets the unit of Sink to either absolute x-unit: energy), per_area x-unit: energy/area), or per_cap x-unit: energy/power). per_area uses the area_use decision variable to scale the sink while per_cap uses the flow_cap decision variable.
Used in :
sink_use_max
Maximum sink use to remove a carrier from the system (e.g., electricity demand, transport distance). Unit dictated by source_unit.
Used in :
sink_use_min
Minimum sink use to remove a carrier from the system (e.g., electricity demand, transport distance). Unit dictated by source_unit.
Used in :
source_cap_equals_flow_cap
If true, the decision variables source_cap and flow_cap are forced to equal one another.
Used in :
source_eff
Conversion efficiency from the technology from source. Set as value between 1 (no loss) and 0 (all lost).
Used in :
Unit : fraction.
source_use_equals
Required amount of carrier removal from the system (e.g., biofuel, coal, rainfall, wind flow). Unit dictated by source_unit.
Used in :
source_use_min
Minimum source use to add a carrier from the system (e.g., biofuel, coal, rainfall, wind flow). Unit dictated by source_unit.
Used in :
storage_cap_min
Limit lower bound of storage_cap decision variable.
Used in :
Unit : energy.
storage_cap_per_unit
Set the storage capacity of each integer unit of a technology purchased.
Used in :
Unit : \(\frac{\text{energy}}{\text{unit}}\) .
storage_discharge_depth
Defines the minimum level of storage state of charge, as a fraction of total storage capacity.
Used in :
Unit : fraction.
storage_initial
Set stored flow in device at the first timestep, as a fraction of total storage capacity.
Used in :
Unit : fraction.