Model#

Sets#

  • \(T\): Ordered time steps.

  • \(Y\): Ordered years.

  • \(CO\): commodities.

  • \(CP\): conversion process.

  • \(CS\): conversion subprocess which is determined by the tuple \((cp\in CP, cin \in CO, cout \in CO)\). Every conversion process has at least one conversion subprocess.

  • \(SCS\): is a subset of \(CS\) that contains storage conversion subprocesses.

Parameters#

  • All parameters are non-negative unless specified otherwise, and names start with a lowercase letter.

  • Energy/Time is Power.

Global#

  • \(dt\): time step size. It shows how many hours each time step represents. Dimension: Time. Range: Positive.

  • \(w\): weight of each time step withim the whole year. It’s equal to \(8760/|T|\). Range: Positive. default = 1.

  • \(discount\_rate\): The discount rate is the interest rate used to calculate the present value of future cash flows from a project or investment. For example, at an interest rate of 5%, the value of €100 will increase to €105 in one year. Dimension: -. Range: Non-negative.

  • \(discount\_factor(Y)\): Discount factor for year \(y\) which is equal to \(discount\_factor(y)=(1+discount\_rate)^{y-Y[0]}\). Dimension: -. Range: Non-negative.

Cost#

  • \(opex\_cost\_energy(CS,Y)\): Operational cost per energy output of conversion subprocess \(cs\) in year \(y\). Dimension: Money/Energy. Range = Non-negative. default = 0.

  • \(opex\_cost\_power(CS,Y)\): Operational cost per active capacity of conversion subprocess \(cs\) in year \(y\). Dimension: Money/Power. Range = Non-negative. default = 0.

  • \(capex\_cost\_power(CS,Y)\): Capital cost per unit of new capacity of conversion subprocess \(cs\) in year \(y\). Dimension: Money/Power. Range = Non-negative. default = 0.

CO2#

  • \(spec\_co2(CS)\): Specific CO2 emission intensity per energy output of conversion subprocess \(cs\). Dimension: Mass/Energy. Range = Non-negative. default = 0.

  • \(annual\_co2\_limit(Y)\): Annual CO2 emission limit of the energy system in year \(y\). Dimension: Mass. Range = Non-negative.

  • \(co2\_price(Y)\): CO2 price for emission from the energy system in year \(y\). Dimension: Money/Mass. Range = Non-negative. default = 0.

Energy#

  • \(max\_eout(CS,Y)\): maximum energy output of conversion subprocess \(cs\) in year \(y\). Dimension: Energy. Range = Non-negative. default = \(\infty\).

  • \(min\_eout(CS,Y)\): minimum energy output of conversion subprocess \(cs\) in year \(y\). Dimension: Energy. Range = Non-negative. default = 0.

Capacity#

  • \(cap\_min(CS,Y)\): minimum allowed active capacity of the conversion subprocess \(cs\) at year \(y\). Dimension: Power. Range = Non-negative. default = 0.

  • \(cap\_max(CS,Y)\): maximum allowed active capacity of the conversion subprocess \(cs\) at year \(y\). Dimension: Power. Range = Non-negative. default = \(\infty\) .

  • \(cap\_res\_max(CS,Y)\): maximum residual capacity of the conversion subprocess \(cs\) at year \(y\). Dimension: Power. Range = Non-negative. default = 0.

  • \(cap\_res\_min(CS,Y)\): minimum residual capacity of the conversion subprocess \(cs\) at year \(y\). Dimension: Power. Range = Non-negative. default = 0.

Technology#

  • \(efficiency(CS)\): output efficiency of conversion subprocess \(cs\). Dimension: -. Range: Non-negative. default = 1.

  • \(technical\_lifetime(CS)\): Technical lifetime of conversion subprocess \(cs\). Dimension: Time. default: 100.

Availability#

  • \(availability\_profile(CS,T)\): Availability profile of the subprocess \(cs\) at time step \(t\). Range = [0,1]. default = 1. Dimension:-.

  • \(technical\_availability(CS)\): Technical Availability factor of the conversion subprocess \(cs\). Range = [0,1]. default = 1.

  • \(output\_profile(CS,T)\): Share of the annual energy output supplied of the conversion subprocess \(cs\) at time step \(t\) such that \(\sum_{t \in T}output\_profile[cs,t]=1 \quad \forall cs \in CS\). Dimension: -. Range: Non-negative.

Fractions of generation and consumption#

  • \(out\_frac\_min(CS,Y)\): minimum fraction of the output commodity(cout) generated by conversion subprocess \(cs\) in year \(y\). Dimension: -. Range: [0,1]. default = 0.

  • \(out\_frac\_max(CS,Y)\): maximum fraction of the output commodity(cout) generated by conversion subprocess \(cs\) in year \(y\). Dimension: -. Range= [0,1]. default = 1.

  • \(in\_frac\_min(CS,Y)\): minimum fraction of the input commodity(cin) consumed by conversion subprocess \(cs\) in year \(y\). Dimension: -. Range= [0,1]. default = 0.

  • \(in\_frac\_max(CS,Y)\): maximum fraction of the input commodity(cout) consumed by conversion subprocess \(cs\) in year \(y\). Dimension: -. Range= [0,1]. default = 1.

For in_frac_min(CS,Y) and in_frac_max(CS,Y) see decentralized heating example.

For out_frac_min(CS,Y) and out_frac_max(CS,Y) see CHP example.

Storage#

  • \(c\_rate(CS)\): indicates the discharge and charging rate of the storage conversion subprocess \(cs\). 2C means that the full storage can be fully discharged in (1 hour)/2=30 minutes. Range: Positive. Dimension: Power.

  • \(efficiency\_charge(CS)\): Storage charging efficiency of conversion subprocess \(cs\). Dimension: -. Range = (0,1]. default = 1.

Variables#

All variables are non-negative and names start with a capital letter.

Costs#

  • \(TOTEX\): Total Expenditure. Dimension: Money.

  • \(CAPEX\): Capital Expenditure. Dimension: Money.

  • \(OPEX\): Operational Expenditure. Dimension: Money.

CO2#

  • \(Total\_annual\_co2\_emission(Y)\): Total Annual CO2 emission in year \(y\). Dimension: Mass.

Power#

  • \(Cap\_new(CS,Y)\): New Capacity of conversion subprocess \(cs\) installed at the beginning of year \(y\). Dimension: Power.

  • \(Cap\_active(CS,Y)\): Active Capacity of conversion subprocess \(cs\) in year \(y\). Dimension: Power.

  • \(Cap\_res(CS,Y)\): residual Capacity of conversion subprocess \(cs\) in year \(y\). Dimension: Power.

  • \(Pin(CS,Y,T)\): Power input of conversion subprocess \(cs\) at time step \(t\) in year \(y\). Dimension: Power.

  • \(Pout(CS,Y,T)\): Power output of conversion subprocess \(cs\) at time step \(t\) in year \(y\). Dimension: Power.

Energy#

  • \(Eouttot(CS,Y)\): Total energy output of the conversion subprocess \(cs\) in year \(y\). Dimension: Energy.

  • \(Eintot(CS,Y)\): Total energy input of the conversion subprocess \(cs\) in year \(y\). Dimension: Energy.

  • \(Eouttime(CS,Y,T)\): Total energy output of the conversion subprocess \(cs\) at time step \(t\) in year \(y\). Dimension: Energy.

  • \(Eintime(CS,Y,T)\): Total energy input of the conversion subprocess \(cs\) at time step \(t\) in year \(y\). Dimension: Energy.

  • \(Enetgen(CO,Y,T)\): Net energy generation of commodity \(co\) at time step \(t\) in year \(y\). Dimension: Energy.

  • \(Enetcons(CO,Y,T)\): Net energy consumption of commodity \(co\) at time step \(t\) in year \(y\). Dimension: Energy.

Storage#

  • \(E\_storage\_level(CS,Y,T)\):Storage Energy level of storage conversion subprocess \(cs\) at time step \(t\) in year \(y\). Dimension: Energy.

  • \(E\_storage\_level\_max(CS,Y)\): Maximum Energy stored in the storage conversion subprocess \(cs\) in year \(y\). Dimension: Energy.

Constraints#

Costs#

(1)#\[TOTEX = CAPEX + OPEX\]
(2)#\[CAPEX = \sum_{y \in Y} \left(co2\_price[y] * Total\_annual\_co2\_emission[y] + discount\_factor[y] * \sum_{cs \in CS} \left(Cap\_new[cs, y] * capex\_cost\_power[cs,y]\right)\right)\]

(2) capital cost consists of CO2 cost and capital investment.

(3)#\[OPEX = \sum_{cs\in CS}\sum_{i \in (1,\ldots,|Y|)} \left( Cap\_active[cs,Y[i]] * opex\_cost\_power[cs,Y[i]] + Eouttot[cs,Y[i]] * opex\_cost\_energy[cs,Y[i]] \right) * \left( Y[i+1]-Y[i]\quad \text{if} \quad i<|Y| \quad \text{else} \quad 1 \right)\]

(3) operational cost consists of cost per active unit of capacity and cost per unit of generation.

Power Balance#

(4)#\[\sum_{cs \in CS| cs.cin = co} Pin[cs, t , y] = \sum_{cs \in CS| cs.cout = co} Pout[cs, t , y] \quad \forall t\in T, \forall y\in Y, \forall co\in CO\setminus \{Dummy\}\]

(4) At time step \(t\) in year \(y\) the total output and input of the commodity \(co\) by all conversion processes should be equal.

CO2#

(5)#\[Total\_annual\_co2\_emission[y] = \sum_{cs \in CS} spec\_co2[cs] * Eouttot[cs,y] \quad \forall y \in Y\]

(5) total annual CO2 emission is equal to the sum of energy produced by each conversion subprocess multiplied by its specific CO2 emission.

(6)#\[Total\_annual\_co2\_emission[y] \leq annual\_co2\_limit[y] \quad \forall y \in Y\]

(6) The Annual CO2 emission is limited.

Power output#

(7)#\[Pout[cs,y,t] = Pin[cs,y,t] * efficiency[cs] \quad \forall y\in Y, \forall t\in T, \forall cs\in CS\]

(7) the ratio of output to input is equal to efficiency for each converssion subprocess.

(8)#\[Pout[cs,y,t] \leq Cap\_active[cs,y] \quad \forall y\in Y, \forall t\in T, \forall cs\in CS\]

(8) The output is limited by the capacity of the conversion subprocess.

(9)#\[Pout[cs,y,t] \leq Cap\_active[cs,y] * technical\_availability[cs] \quad \forall y\in Y,\forall t\in T, \forall cs\in CS\]

(9) Energy generation is limited by the technical availability.

(10)#\[Pout[cs,y,t] \leq Cap\_active[cs,y] * availability\_profile[cs,t] \quad \forall y\in Y,\forall t\in T, \forall cs\in CS \setminus SCS\]

(10) The Generation of renewable energy is limited by the availability profile.

Power-Energy#

(11)#\[Eouttime[cs,y,t] = Pout[cs,y,t]*dt*w \quad \forall y\in Y,\forall t\in T, \forall cs\in CS\]

(11) The energy output of converssion subprocess \(cs\) at time step \(t\) in year \(y\).

(12)#\[Eintime[cs,y,t] = Pin[cs,y,t]*dt*w \quad \forall y\in Y,\forall t\in T, \forall cs\in CS\]

Fractions#

(13)#\[Eouttime[cs,t,y] \geq out\_frac\_min[cs,y] * Enetgen[cs.cout,y,t] \quad \forall y\in Y,\forall t\in T, \forall cs\in CS\]

(13)

(14)#\[Eouttime[cs,t,y] \leq out\_frac\_max[cs,y]*Enetgen[cs.cout,y,t] \quad \forall y\in Y,\forall t\in T, \forall cs\in CS\]
(15)#\[Eintime[cs,t,y] \geq in\_frac\_min[cs, y]*Enetcons[cs.cin,y,t] \quad \forall y\in Y, \forall t\in T, \forall cs\in CS\]
(16)#\[Eintime[cs,t,y] \leq in\_frac\_max[cs, y] * Enetcons[cs.cin,y,t] \quad \forall y\in Y,\forall t\in T, \forall cs\in CS\]

Capacity#

(17)#\[Cap\_res[cs, y] \leq cap\_res\_max[cs, y] \quad \forall y\in Y, \forall cs\in CS\]
(18)#\[Cap\_res[cs, y] \geq cap\_res\_min[cs, y] \quad \forall y\in Y, \forall cs\in CS\]
(19)#\[Cap\_active[cs, y] = Cap\_res[cs, y] + \sum_{yy\in Y|y-technical\_lifetime[cs] < yy \leq y} Cap\_new[cs, yy] \quad \forall y\in Y, \forall cs\in CS\]
(20)#\[Cap\_active[cs,y] \leq cap\_max[cs,y] \quad \forall y\in Y, \forall cs\in CS\]
(21)#\[Cap\_active[cs,y] \geq cap\_min[cs,y] \quad \forall y\in Y, \forall cs\in CS\]

Auxiliary Linking Variables#

(22)#\[Eouttot[cs,y] = \sum_{t \in T} Eouttime[cs,t,y] \quad \forall y\in Y, \forall cs\in CS\]
(23)#\[Eintot[cs, y] = \sum_{t \in T} Eintime[cs, t, y] \quad \forall y\in Y, \forall cs\in CS\]
(24)#\[Enetgen[co,t,y] = \sum_{cs\in CS|cs.cout=co} Eouttime[cs,t,y] \quad \forall y\in Y, \forall t\in T,\forall co\in CO\]
(25)#\[Enetcons[co,t,y] = \sum_{cs\in CS|cs.cin=co} Eintime[cs,t,y] \quad \forall y\in Y, \forall t\in T, \forall co\in CO\]

Generation#

(26)#\[Eouttot[cs,y] \leq max\_eout[cs,y] \quad \forall y\in Y, \forall cs\in CS\]
(27)#\[Eouttot[cs,y] \geq min\_eout[cs,y] \quad \forall y\in Y, \forall cs\in CS\]
(28)#\[Eouttime[cs,t,y] = output\_profile[cs,t] * Eouttot[cs,y] \quad \forall y\in Y, \forall t\in T,\forall cs\in CS\]

Storage#

(29)#\[E\_storage\_level[cs,t,y] \leq E\_storage\_level\_max[cs,y] \quad \forall y\in Y, \forall t\in T, \forall cs\in SCS\]
(30)#\[Pin[cs,t,y] \leq Cap\_active[cs, y] \quad \forall y\in Y, \forall t\in T, \forall cs\in SCS\]
(31)#\[E\_storage\_level[cs,t,y] = E\_storage\_level[cs, t-1, y] + efficiency\_charge[cs] * Pin[cs, t,y] * dt * w- (Pout[cs,t,y]*dt*w)/(efficiency[cs]) \quad \forall y\in Y, \forall t\in T, \forall cs\in SCS\]
(32)#\[E\_storage\_level\_max[cs, y] = Cap\_active[cs, y]/c\_rate[cs] \quad \forall y\in Y, \forall cs\in SCS\]