Variables¶
All the variables that the optimization model requires to calculate an optimal solution will be listed and defined in this section. A variable is a numerical value that is determined during optimization. Variables can denote a single, independent value, or an array of values. Variables define the search space for optimization. Variables of this optimization model can be separated into sections by their area of use. These Sections are Cost, Commodity, Process, Transmission, Storage and demand side management.
Variable | Unit | Description |
---|---|---|
Cost Variables | ||
\(\zeta\) | € | Total System Cost |
\(\zeta_\text{inv}\) | € | Investment Costs |
\(\zeta_\text{fix}\) | € | Fix Costs |
\(\zeta_\text{var}\) | € | Variable Costs |
\(\zeta_\text{fuel}\) | € | Fuel Costs |
\(\zeta_\text{rev}\) | € | Revenue Costs |
\(\zeta_\text{pur}\) | € | Purchase Costs |
\(\zeta_\text{start}\) | € | Start Costs |
Commodity Variables | ||
\(\rho_{yvct}\) | MWh | Stock Commodity Source Term |
\(\varrho_{yvct}\) | MWh | Sell Commodity Source Term |
\(\psi_{yvct}\) | MWh | Buy Commodity Source Term |
Process Variables | ||
\(\kappa_{yvp}\) | MW | Total Process Capacity |
\(\hat{\kappa}_{yvp}\) | MW | New Process Capacity |
\(\beta_{yvp}\) | New Process Capacity Units | |
\(\tau_{yvpt}\) | MWh | Process Throughput |
\(\epsilon_{yvcpt}^\text{in}\) | MWh | Process Input Commodity Flow |
\(\epsilon_{yvcpt}^\text{out}\) | MWh | Process Output Commodity Flow |
\(\omicron_{yvpt}\) | Process On/Off Marker | |
\(\sigma_{yvpt}\) | Process Start-up Marker | |
Transmission Variables | ||
\(\kappa_{yaf}\) | MW | Total transmission Capacity |
\(\hat{\kappa}_{yaf}\) | MW | New Transmission Capacity |
\(\beta_{yaf}\) | New Transmission Capacity Units | |
\(\pi_{yaft}^\text{in}\) | MWh | Transmission Input Commodity Flow |
\(\pi_{yaft}^\text{out}\) | MWh | Transmission Output Commodity Flow |
DCPF Transmission Variables | ||
\(\theta_{yvt}\) | deg. | Voltage Angle |
\({\pi_{yaft}^{\text{in}}}^\prime\) | MW | Absolute Transmission Flow |
Storage Variables | ||
\(\kappa_{yvs}^\text{c}\) | MWh | Total Storage Size |
\(\hat{\kappa}_{yvs}^\text{c}\) | MWh | New Storage Size |
\(\beta_{yvs}^\text{c}\) | New Storage Size Units | |
\(\kappa_{yvs}^\text{p}\) | MW | Total Storage Power |
\(\hat{\kappa}_{yvs}^\text{p}\) | MW | New Storage Power |
\(\beta_{yvs}^\text{c}\) | New Storage Power Units | |
\(\epsilon_{yvst}^\text{in}\) | MWh | Storage Input Commodity Flow |
\(\epsilon_{yvst}^\text{out}\) | MWh | Storage Output Commodity Flow |
\(\epsilon_{yvst}^\text{con}\) | MWh | Storage Energy Content |
Demand Side Management Variables | ||
\(\delta_{yvct}^\text{up}\) | MWh | DSM Upshift |
\(\delta_{t,tt,yvc}^\text{down}\) | MWh | DSM Downshift |
Cost Variables¶
Total System Cost, \(\zeta\) : the variable \(\zeta\) represents
the total expense incurred in reaching the satisfaction of the given energy
demand in the entire modeling horizon. If only a fraction of a year is modeled
in each support timeframe, the costs are scaled to the annual expenditures. The
total cost is calculated by the sum total of all costs by
type(\(\zeta_r\), \(\forall r \in R\)) and defined as costs
by the
following code fragment:
m.costs = pyomo.Var(
m.cost_type,
within=pyomo.Reals,
doc='Costs by type (EUR/a)')
System costs are divided into the 7 cost types invest, fix, variable, fuel, purchase, sell and environmental. The separation of costs by type, facilitates business planning and provides calculation accuracy. These cost types are hardcoded, which means they are not considered to be fixed or changed by the user.
For more information on the definition of these variables see section Minimal optimization model and for their implementation see section Objective function.
Commodity Variables¶
Stock Commodity Source Term, \(\rho_{yvct}\), e_co_stock
, MWh : The
variable \(\rho_{yvct}\) represents the energy amount in [MWh] that is
being used by the system of commodity \(c\) from type stock
(\(\forall c \in C_\text{stock}\)) in support timeframe \(y\)
(\(\forall y \in Y\)) in a site \(v\) (\(\forall v \in V\)) at
timestep \(t\) (\(\forall t \in T_\text{m}\)). In script model.py
this variable is defined by the variable e_co_stock
and initialized by the
following code fragment:
m.e_co_stock = pyomo.Var(
m.tm, m.com_tuples,
within=pyomo.NonNegativeReals,
doc='Use of stock commodity source (MWh) at a given timestep')
Sell Commodity Source Term, \(\varrho_{yvct}\), e_co_sell
, MWh :
The variable \(\varrho_{yvct}\) represents the energy amount in [MWh] that
is being used by the system of commodity \(c\) from type sell
(\(\forall c \in C_\text{sell}\)) in support timeframe \(y\)
(\(\forall y \in Y\)) in a site \(v\) (\(\forall v \in V\)) at
timestep \(t\) (\(\forall t \in T_\text{m}\)). In script model.py
this variable is defined by the variable e_co_sell
and initialized by the
following code fragment:
m.e_co_sell = pyomo.Var(
m.tm, m.com_tuples,
within=pyomo.NonNegativeReals,
doc='Use of sell commodity source (MWh) at a given timestep')
Buy Commodity Source Term, \(\psi_{yvct}\), e_co_buy
, MWh : The
variable \(\psi_{yvct}\) represents the energy amount in [MWh] that is
being used by the system of commodity \(c\) from type buy
(\(\forall c \in C_\text{buy}\)) in support timeframe \(y\)
(\(\forall y \in Y\)) in a site \(v\) (\(\forall v \in V\)) at
timestep \(t\) (\(\forall t \in T_\text{m}\)). In script model.py
this variable is defined by the variable e_co_buy
and initialized by the
following code fragment:
m.e_co_buy = pyomo.Var(
m.tm, m.com_tuples,
within=pyomo.NonNegativeReals,
doc='Use of buy commodity source (MWh) at a given timestep')
Process Variables¶
Total Process Capacity, \(\kappa_{yvp}\), cap_pro
: The variable
\(\kappa_{yvp}\) represents the total potential throughput (capacity) of a
process tuple \(p_{yv}\)
(\(\forall p \in P, \forall v \in V\), forall y in Y`), that is required
in the energy system. The total process capacity includes both the already
installed process capacity and the additional new process capacity that needs
to be installed. Since the costs of the process technologies are mostly
directly proportional to the maximum possible output (and correspondingly to
the capacity) of processes, this variable acts as a scale factor of process
technologies. For further information see Process Capacity Rule. This variable
is expressed in the unit (MW).
In script model.py
this variable is defined by the model variable
cap_pro
and initialized by the following code fragment:
m.cap_pro = pyomo.Var(
m.pro_tuples,
within=pyomo.NonNegativeReals,
doc='Total process capacity (MW)')
New Process Capacity, \(\hat{\kappa}_{yvp}\), cap_pro_new
: The
variable \(\hat{\kappa}_{yvp}\) represents the capacity of a process tuple
\(p_{yv}\) (\(\forall p \in P, \forall v \in V\)) that needs to be
installed additionally to the energy system in support timeframe \(y\) in
site \(v\) in order to provide the optimal solution. This variable is
expressed in the unit MW. In script model.py
this variable is defined by
the model variable cap_pro_new
and initialized by the following code
fragment:
m.cap_pro_new = pyomo.Var(
m.pro_tuples,
within=pyomo.NonNegativeReals,
doc='New process capacity (MW)')
New Process Capacity Units, \(\beta_{yvp}\), pro_cap_unit
: The
variable \(\beta_{yvp}\) represents the number of capacity blocks of a
process tuple \(p_{yv}\) (\(\forall p \in P, \forall v \in V\)) that
needs to be installed additionally to the energy system in support timeframe
\(y\) in site \(v\) in order to provide the optimal solution. In
script model.py
this variable is defined by the model variable
cap_pro_new
and initialized by the following code fragment:
m.pro_cap_unit = pyomo.Var(
m.pro_tuples,
within=pyomo.NonNegativeIntegers,
doc='Number of newly installed capacity units')
Process Throughput, \(\tau_{yvpt}\), tau_pro
: The variable
\(\tau_{yvpt}\) represents the measure of (energetic) activity of a process
tuple \(p_{yv}\)
(\(\forall p \in P, \forall v \in V, \forall y \in Y\)) at a timestep
\(t\) (\(\forall t \in T_{m}\)). Based on the process throughput amount
in a given timestep of a process, flow amounts of the process’ input and output
commodities at that timestep can be calculated by scaling the process
throughput with corresponding process input and output ratios. For further
information see Process Input Ratio and Process Output Ratio. The
process throughput variable is expressed in the unit MWh. In script
model.py
this variable is defined by the model variable tau_pro
and
initialized by the following code fragment:
m.tau_pro = pyomo.Var(
m.tm, m.pro_tuples,
within=pyomo.NonNegativeReals,
doc='Activity (MWh) through process')
Process Input Commodity Flow, \(\epsilon_{yvcpt}^\text{in}\),
e_pro_in
: The variable \(\epsilon_{yvcpt}^\text{in}\) represents the
commodity input flow into a process tuple \(p_{yv}\)
(\(\forall p \in P, \forall v \in V, \forall y \in Y\)) caused by an input
commodity \(c\) (\(\forall c \in C\)) at a timestep \(t\)
(\(\forall t \in T_{m}\)). This variable is generally expressed in the unit
MWh. In script model.py
this variable is defined by the model variable
e_pro_in
and initialized by the following code fragment:
m.e_pro_in = pyomo.Var(
m.tm, m.pro_tuples, m.com,
within=pyomo.NonNegativeReals,
doc='Flow of commodity into process at a given timestep')
Process Output Commodity Flow, \(\epsilon_{yvcpt}^\text{out}\),
e_pro_out
: The variable \(\epsilon_{vcpt}^\text{out}\) represents the
commodity flow output out of a process tuple \(p_{yv}\)
(\(\forall p \in P, \forall v \in V, \forall y \in Y\)) caused by an output
commodity \(c\) (\(\forall c \in C\)) at a timestep \(t\)
(\(\forall t \in T_{m}\)). This variable is generally expressed in the unit
MWh (or tonnes e.g. for the environmental commodity ‘CO2’). In script
model.py
this variable is defined by the model variable e_pro_out
and
initialized by the following code fragment:
m.e_pro_out = pyomo.Var(
m.tm, m.pro_tuples, m.com,
within=pyomo.NonNegativeReals,
doc='Flow of commodity out of process at a given timestep')
Process On/Off Marker, \(\omicron_{yvpt}\), on_off
: The boolean
variable \(\omicron_{yvpt}\) marks whether process tuple \(p_{yv}\)
(\(\forall p \in P^\text{on/off}, \forall v \in V, \forall y \in Y\))
is on and producing (\(\omicron_{yvpt}\) is 1) or it is not
producing (\(\omicron_{yvpt}\) is 0) at a timestep \(t\). While not
producing, the process is either turned off or it started, without reaching the
minimum fraction \(\underline{P}_{yvp}\).
In the script AdvancedProcesses.py
, this variable is defined by the model
variable on_off
and initialized by the following code fragment:
m.on_off = pyomo.Var(
m.t, m.pro_on_off_tuples,
within=pyomo.Boolean,
doc='Turn on/off a process with minimum working load')
Process Start-up Marker, \(\sigma_{yvpt}\), start_ups
: The boolean
variable \(\sigma_{yvpt}\) marks whether process tuple \(p_{yv}\)
(\(\forall p \in P^\text{on/off}, \forall v \in V, \forall y \in Y\))
is starting (\(\sigma_{yvpt}\) becomes 1) or not (\(\sigma_{yvpt}\) is 0)
at a timestep \(t\). The process is considered to start when its output
e_pro_out
becomes greater than 0.
In the script AdvancedProcesses.py
, this variable is defined by the model
variable start_ups
and initialized by the following code fragment:
m.start_up = pyomo.Var(
m.tm, m.pro_start_up_tuples,
within=pyomo.Boolean,
doc='Start-up marker')
Transmission Variables¶
Total Transmission Capacity, \(\kappa_{yaf}\), cap_tra
: The
variable \(\kappa_{yaf}\) represents the total potential transfer power of
a transmission tuple \(f_{yca}\), where \(a\) represents the arc from
an origin site \(v_\text{out}\) to a destination site
\({v_\text{in}}\). The total transmission capacity includes both the
already installed transmission capacity and the additional new transmission
capacity that needs to be installed. This variable is expressed in the unit MW.
In script transmission.py
this variable is defined by the model variable
cap_tra
and initialized by the following code fragment:
m.cap_tra = pyomo.Var(
m.tra_tuples,
within=pyomo.NonNegativeReals,
doc='Total transmission capacity (MW)')
New Transmission Capacity, \(\hat{\kappa}_{yaf}\), cap_tra_new
: The
variable \(\hat{\kappa}_{yaf}\) represents the additional capacity, that
needs to be installed, of a transmission tuple \(f_{yca}\), where \(a\)
represents the arc from an origin site \(v_\text{out}\) to a destination
site \(v_\text{in}\). This variable is expressed in the unit MW.
In script transmission.py
this variable is defined by the model variable
cap_tra_new
and initialized by the following code fragment:
m.cap_tra_new = pyomo.Var(
m.tra_tuples,
within=pyomo.NonNegativeReals,
doc='New transmission capacity (MW)')
New Transmission Capacity Units, \(\beta_{yaf}\), tra_cap_unit
: The
variable \(\beta_{yaf}\) represents the number of additional capacity blocks
of a transmission tuple \(f_{yca}\) that need to be installed , where
\(a\) represents the arc from an origin site \(v_\text{out}\) to a
destination site \(v_\text{in}\). In script transmission.py
this variable
is defined by the model variable cap_tra_new
and initialized by the following
code fragment:
m.tra_cap_unit =pyomo.Var(
m.tra_block_tuples,
within=pyomo.NonNegativeIntegers,
doc='New transmission capacity blocks')
Transmission Input Commodity Flow, \(\pi_{yaft}^\text{in}\),
e_tra_in
: The variable \(\pi_{yaft}^\text{in}\) represents the
commodity flow input into a transmission tuple \(f_{yca}\) at a timestep
\(t\), where \(a\) represents the arc from an origin site
\(v_\text{out}\) to a destination site \(v_\text{in}\). This variable
is expressed in the unit MWh. In script urbs.py
this variable is defined by
the model variable e_tra_in
and initialized by the following code fragment:
m.e_tra_in = pyomo.Var(
m.tm, m.tra_tuples,
within=pyomo.NonNegativeReals,
doc='Commodity flow into transmission line (MWh) at a given timestep')
Transmission Output Commodity Flow, \(\pi_{yaft}^\text{out}\),
e_tra_out
: The variable \(\pi_{yaft}^\text{out}\) represents the
commodity flow output out of a transmission tuple \(f_{ca}\) at a timestep
\(t\), where \(a\) represents the arc from an origin site
\(v_\text{out}\) to a destination site \(v_\text{in}\). This variable
is expressed in the unit MWh. In script urbs.py
this variable is defined by
the model variable e_tra_out
and initialized by the following code
fragment:
m.e_tra_out = pyomo.Var(
m.tm, m.tra_tuples,
within=pyomo.NonNegativeReals,
doc='Power flow out of transmission line (MWh) at a given timestep')
DCPF Transmission Variables¶
If the DC Power Flow transmission modelling is activated, two new variables are introduced to the model.
Voltage Angle, \(\theta_{yvt}\), voltage_angle
: The variable \(\theta_{yvt}\) represents the voltage
angle of a site \(v\), which has a DCPF transmission line connection, at a timestep \(t\). This variable is
expressed in the unit degrees. In script urbs.py
this variable is defined by the model variable voltage_angle
and initialized by the following code
fragment:
m.voltage_angle = pyomo.Var(
m.tm, m.stf, m.sit,
within=pyomo.Reals,
doc='Voltage angle of a site')
Absolute Value of Transmission Commodity Flow, \({\pi_{yaft}^{\text{in}}}^\prime\), e_tra_abs
:
The variable \({\pi_{yaft}^{\text{in}}}^\prime\) represents the absolute value of the transmission commodity flow
on a DCPF transmission tuple \(f_{yca}\) at a timestep
\(t\), where \(a\) represents the arc from an origin site
\(v_\text{out}\) to a destination site \(v_\text{in}\). This variable
is expressed in the unit MWh. In script urbs.py
this variable is defined by
the model variable e_tra_abs
and initialized by the following code
fragment:
m.e_tra_abs = pyomo.Var(
m.tm, m.tra_tuples_dc,
within=pyomo.NonNegativeReals,
doc='Absolute power flow on transmission line (MW) per timestep')
Transmission Commodity Flow Domain Changes
:DC Power Flow transmission lines are represented by bidirectional single arcs instead of unidirectional symmetrical
arcs as in the default transmission model. Consequently the power flow is allowed to be both positive or negative for
DCPF transmission lines contrary to the transport transmission lines. For this reason, the domains of the variables
transmission input commodity flow \(\pi_{yaft}^\text{in}\) and transmission output commodity flow
\(\pi_{yaft}^\text{out}\) are defined with the e_tra_domain_rule()
function depending on the corresponding
transmission tuple set. These variables are defined by the model variables e_tra_in
and e_tra_out
and
intialized by the code
fragment:
m.e_tra_in = pyomo.Var(
m.tm, m.tra_tuples,
within=e_tra_domain_rule,
doc='Power flow into transmission line (MW) per timestep')
m.e_tra_out = pyomo.Var(
m.tm, m.tra_tuples,
within=e_tra_domain_rule,
doc='Power flow out of transmission line (MW) per timestep')
The function e_tra_domain_rule()
is given by the code
fragment:
def e_tra_domain_rule(m, tm, stf, sin, sout, tra, com):
# assigning e_tra_in and e_tra_out variable domains for transport and DCPF
if (stf, sin, sout, tra, com) in m.tra_tuples_dc:
return pyomo.Reals
elif (stf, sin, sout, tra, com) in m.tra_tuples_tp:
return pyomo.NonNegativeReals
Storage Variables¶
Total Storage Size, \(\kappa_{yvs}^\text{c}\), cap_sto_c
: The
variable \(\kappa_{yvs}^\text{c}\) represents the total load capacity of a
storage tuple \(s_{yvc}\). The total storage load capacity includes both the
already installed storage load capacity and the additional new storage load
capacity that needs to be installed. This variable is expressed in unit MWh. In
script model.py
this variable is defined by the model variable
cap_sto_c
and initialized by the following code fragment:
m.cap_sto_c = pyomo.Var(
m.sto_tuples,
within=pyomo.NonNegativeReals,
doc='Total storage size (MWh)')
New Storage Size, \(\hat{\kappa}_{yvs}^\text{c}\), cap_sto_c_new
:
The variable \(\hat{\kappa}_{yvs}^\text{c}\) represents the additional
storage load capacity of a storage tuple \(s_{vc}\) that needs to be
installed to the energy system in order to provide the optimal solution. This
variable is expressed in the unit MWh. In script model.py
this variable is
defined by the model variable cap_sto_c_new
and initialized by the
following code fragment:
m.cap_sto_c_new = pyomo.Var(
m.sto_tuples,
within=pyomo.NonNegativeReals,
doc='New storage size (MWh)')
New Storage Size Units, \(\beta_{yvs}^\text{c}\), sto_cap_c_unit
:
The variable \(\hat{\kappa}_{yvs}^\text{c}\) represents the number of
additional storage load capacity blocks of a storage tuple \(s_{vc}\) that
needs to be installed to the energy system in order to provide the optimal solution.
In script storage.py
this variable is defined by the model variable cap_sto_c_unit
and initialized by the following code fragment:
m.sto_cap_c_unit = pyomo.Var(
m.sto_block_c_tuples,
within=pyomo.NonNegativeIntegers,
doc='New storage size units')
Total Storage Power, \(\kappa_{yvs}^\text{p}\), cap_sto_p
: The
variable \(\kappa_{yvs}^\text{p}\) represents the total potential discharge
power of a storage tuple \(s_{vc}\). The total storage power includes both
the already installed storage power and the additional new storage power that
needs to be installed. This variable is expressed in the unit MW. In script
model.py
this variable is defined by the model variable cap_sto_p
and
initialized by the following code fragment:
m.cap_sto_p = pyomo.Var(
m.sto_tuples,
within=pyomo.NonNegativeReals,
doc='Total storage power (MW)')
New Storage Power, \(\hat{\kappa}_{yvs}^\text{p}\), cap_sto_p_new
:
The variable \(\hat{\kappa}_{yvs}^\text{p}\) represents the additional
potential discharge power of a storage tuple \(s_{vc}\) that needs to be
installed to the energy system in order to provide the optimal solution. This
variable is expressed in the unit MW. In script model.py
this variable is
defined by the model variable cap_sto_p_new
and initialized by the
following code fragment:
m.cap_sto_p_new = pyomo.Var(
m.sto_tuples,
within=pyomo.NonNegativeReals,
doc='New storage power (MW)')
New Storage Power Units, \(\beta_{yvs}^\text{c}\), sto_cap_p_unit
:
The variable \(\beta_{yvs}^\text{c}\) represents the number of additional
potential discharge power blocks of a storage tuple \(s_{vc}\) that needs
to be installed to the energy system in order to provide the optimal solution.
In the script storage.py
this variable is defined by the model variable
sto_cap_p_unit
and initialized by the following code fragment:
m.sto_cap_p_unit = pyomo.Var(
m.sto_block_p_tuples,
within=pyomo.NonNegativeIntegers,
doc='New storage power units')
Storage Input Commodity Flow, \(\epsilon_{yvst}^\text{in}\),
e_sto_in
: The variable \(\epsilon_{yvst}^\text{in}\) represents the
input commodity flow into a storage tuple \(s_{yvc}\) at a timestep
\(t\). Input commodity flow into a storage tuple can also be defined as the
charge of a storage tuple. This variable is expressed in the unit MWh. In
script model.py
this variable is defined by the model variable e_sto_in
and initialized by the following code fragment:
m.e_sto_in = pyomo.Var(
m.tm, m.sto_tuples,
within=pyomo.NonNegativeReals,
doc='Commodity flow into storage (MWh) at a given timestep')
Storage Output Commodity Flow, \(\epsilon_{yvst}^\text{out}\),
e_sto_out
: The variable \(\epsilon_{vst}^\text{out}\) represents the
output commodity flow out of a storage tuple \(s_{yvc}\) at a timestep
\(t\). Output commodity flow out of a storage tuple can also be defined as
the discharge of a storage tuple. This variable is expressed in the unit MWh.
In script model.py
this variable is defined by the model variable
e_sto_out
and initialized by the following code fragment:
m.e_sto_out = pyomo.Var(
m.tm, m.sto_tuples,
within=pyomo.NonNegativeReals,
doc='Commodity flow out of storage (MWh) at a given timestep')
Storage Energy Content, \(\epsilon_{yvst}^\text{con}\), e_sto_con
:
The variable \(\epsilon_{yvst}^\text{con}\) represents the energy amount
that is loaded in a storage tuple \(s_{vc}\) at a timestep \(t\). This
variable is expressed in the unit MWh. In script urbs.py
this variable is
defined by the model variable e_sto_out
and initialized by the following
code fragment:
m.e_sto_con = pyomo.Var(
m.t, m.sto_tuples,
within=pyomo.NonNegativeReals,
doc='Energy content of storage (MWh) at a given timestep')
Demand Side Management Variables¶
DSM Upshift, \(\delta_{yvct}^\text{up}\), dsm_up
, MWh: The variable
\(\delta_{yvct}^\text{up}\) represents the DSM upshift in time step
\(t\) in support timeframe \(y\) in site \(v\) for commodity
\(c\). It is only defined for all dsm_site_tuples
. The following code
fragment shows the definition of the variable:
m.dsm_up = pyomo.Var(
m.tm, m.dsm_site_tuples,
within=pyomo.NonNegativeReals,
doc='DSM upshift (MWh) of a demand commodity at a given timestap')
DSM Downshift, \(\delta_{t,tt,yvc}^\text{down}\), dsm_down
, MWh:
The variable \(\delta_{t,tt,yvc}^\text{down}\) represents the DSM downshift
in timestep \(tt\) caused by the upshift in time \(t\) in support
timeframe \(y\) in site \(v\) for commodity \(c\). The special
combinations of timesteps \(t\) and \(tt\) for each (support timeframe,
site, commodity) combination is created by the dsm_down_tuples
. The
definition of the variable is shown in the code fragment:
m.dsm_down = pyomo.Var(
m.dsm_down_tuples,
within=pyomo.NonNegativeReals,
doc='DSM downshift (MWh) of a demand commodity at a given timestep')