SDOM Formulation#
Storage Deployment Optimization Model (SDOM): a mixed-integer linear program that co-optimizes investment in renewable generation, balancing units, and storage technologies while dispatching all resources to meet electrical demand at minimum annualized system cost subject to a clean-energy target.
Sets#
Notation |
Index |
Description |
|---|---|---|
\(\mathcal{P}\) |
\(p\) |
PV plants |
\(\mathcal{W}\) |
\(w\) |
Wind plants |
\(\mathcal{K}\) |
\(k\) |
Balancing units (dispatchable) |
\(\mathcal{H}\) |
\(h\) |
Hours (time steps) |
\(\mathcal{B}\) |
\(b\) |
Hydro budget periods |
\(\mathcal{H}_b \subseteq \mathcal{H}\) |
\(h\) |
Hours belonging to budget period \(b\) |
\(\mathcal{J}\) |
\(j\) |
Storage technologies |
\(\mathcal{J}^{c} \subseteq \mathcal{J}\) |
\(j\) |
Coupled storage technologies |
Parameters#
Derived quantities#
The capital recovery factor annualizes a lump-sum investment over lifetime \(l\) at discount rate \(r\):
System#
Notation |
Description |
Units |
Domain |
|---|---|---|---|
\(d_h\) |
Electrical demand at hour \(h\) |
MW |
\(\mathbb{R}_+\) |
\(r\) |
Discount rate |
— |
\(\mathbb{R}_+\) |
\(\tau\) |
Minimum clean-energy generation share |
— |
\([0, 1]\) |
Fixed generation profiles#
Exogenous time series scaled by activation parameters \(\alpha\).
Notation |
Description |
Units |
Domain |
|---|---|---|---|
\(\rho_h\) |
Run-of-river hydro generation |
MW |
\(\mathbb{R}_+\) |
\(\nu_h\) |
Nuclear generation profile |
MW |
\(\mathbb{R}_+\) |
\(\omega_h\) |
Other renewable generation profile |
MW |
\(\mathbb{R}_+\) |
\(\alpha^{nuc}\) |
Nuclear activation scalar |
— |
\(\{0, 1\}\) |
\(\alpha^{hyd}\) |
Hydro activation scalar |
— |
\(\{0, 1\}\) |
\(\alpha^{oth}\) |
Other renewables activation scalar |
— |
\(\{0, 1\}\) |
Renewable investment#
Notation |
Description |
Units |
Domain |
|---|---|---|---|
\(\sigma_{ph}\) |
Solar capacity factor for plant \(p\) at hour \(h\) |
— |
\([0, 1]\) |
\(\zeta_{wh}\) |
Wind capacity factor for plant \(w\) at hour \(h\) |
— |
\([0, 1]\) |
\(\bar{p}^{pv}_p\) |
Max allowed PV capacity for plant \(p\) |
MW |
\(\mathbb{R}_+\) |
\(\bar{p}^{wind}_w\) |
Max allowed wind capacity for plant \(w\) |
MW |
\(\mathbb{R}_+\) |
\(\kappa^{pv}_p\) |
PV CAPEX |
$/MW |
\(\mathbb{R}_+\) |
\(\kappa^{wind}_w\) |
Wind CAPEX |
$/MW |
\(\mathbb{R}_+\) |
\(\kappa^{tc,pv}_p\) |
PV transmission capital cost |
$/MW |
\(\mathbb{R}_+\) |
\(\kappa^{tc,wind}_w\) |
Wind transmission capital cost |
$/MW |
\(\mathbb{R}_+\) |
\(\phi^{pv}_p\) |
PV fixed O&M |
$/MW-yr |
\(\mathbb{R}_+\) |
\(\phi^{wind}_w\) |
Wind fixed O&M |
$/MW-yr |
\(\mathbb{R}_+\) |
\(l^{vre}\) |
VRE lifetime (shared across all PV and wind) |
yr |
\(\mathbb{Z}_+\) |
Balancing units#
Notation |
Description |
Units |
Domain |
|---|---|---|---|
\(\underline{p}^{bal}_k\) |
Min balancing capacity |
MW |
\(\mathbb{R}_+\) |
\(\bar{p}^{bal}_k\) |
Max allowed balancing capacity |
MW |
\(\mathbb{R}_+\) |
\(\kappa^{bal}_k\) |
Balancing unit CAPEX |
$/MW |
\(\mathbb{R}_+\) |
\(\gamma_k\) |
Marginal fuel cost (fuel price \(\times\) heat rate) |
$/MWh |
\(\mathbb{R}_+\) |
\(\phi^{bal}_k\) |
Balancing fixed O&M |
$/MW-yr |
\(\mathbb{R}_+\) |
\(\psi^{bal}_k\) |
Balancing variable O&M |
$/MWh |
\(\mathbb{R}_+\) |
\(l^{bal}_k\) |
Balancing unit lifetime |
yr |
\(\mathbb{Z}_+\) |
Hydro#
Notation |
Description |
Units |
Domain |
|---|---|---|---|
\(\underline{g}^{hyd}_h\) |
Hourly hydro lower bound |
MW |
\(\mathbb{R}_+\) |
\(\overline{g}^{hyd}_h\) |
Hourly hydro upper bound |
MW |
\(\mathbb{R}_+\) |
\(\epsilon_b\) |
Energy budget for period \(b\) (from time series) |
MWh |
\(\mathbb{R}_+\) |
Trade#
Notation |
Description |
Units |
Domain |
|---|---|---|---|
\(\bar{\iota}_h\) |
Max import capacity at hour \(h\) |
MW |
\(\mathbb{R}_+\) |
\(\bar{\xi}_h\) |
Max export capacity at hour \(h\) |
MW |
\(\mathbb{R}_+\) |
\(c^{imp}_h\) |
Import price at hour \(h\) |
$/MWh |
\(\mathbb{R}_+\) |
\(c^{exp}_h\) |
Export price at hour \(h\) |
$/MWh |
\(\mathbb{R}_+\) |
Storage#
Notation |
Description |
Units |
Domain |
|---|---|---|---|
\(\kappa^{P}_j\) |
CAPEX power |
$/MW |
\(\mathbb{R}_+\) |
\(\kappa^{E}_j\) |
CAPEX energy |
$/MWh |
\(\mathbb{R}_+\) |
\(\eta_j\) |
Roundtrip efficiency (charge \(\times\) discharge) |
— |
\((0, 1]\) |
\(\underline{\delta}_j\) |
Min duration |
hr |
\(\mathbb{R}_+\) |
\(\overline{\delta}_j\) |
Max duration |
hr |
\(\mathbb{R}_+\) |
\(\bar{p}^{stor}_j\) |
Max installable power capacity |
MW |
\(\mathbb{R}_+\) |
\(\alpha_j\) |
Cost ratio: fraction of power cost on charge side |
— |
\([0, 1]\) |
\(\phi^{stor}_j\) |
Fixed O&M |
$/MW-yr |
\(\mathbb{R}_+\) |
\(\psi^{stor}_j\) |
Variable O&M (applied to discharge only) |
$/MWh |
\(\mathbb{R}_+\) |
\(l^{stor}_j\) |
Lifetime |
yr |
\(\mathbb{Z}_+\) |
\(\kappa^{cyc}_j\) |
Max lifetime cycles |
— |
\(\mathbb{R}_+\) |
Coupled vs decoupled storage. A coupled technology (e.g. Li-Ion battery, pumped hydro) uses shared equipment for charge and discharge, so the power ratings are forced equal: \(P^{ch}_j = P^{dis}_j\). A decoupled technology (e.g. CAES, hydrogen) has separate input and output equipment, so \(P^{ch}_j\) and \(P^{dis}_j\) can be independently sized.
The cost ratio \(\alpha_j\) distributes power-related costs (CAPEX, FOM) between the charge side (fraction \(\alpha_j\)) and the discharge side (fraction \(1 - \alpha_j\)). For coupled storage where \(P^{ch}_j = P^{dis}_j\), the split is immaterial.
Variables#
Renewable (investment and dispatch)#
Variable |
Description |
Units |
Domain |
|---|---|---|---|
\(F^{pv}_p\) |
Fraction of max PV capacity to build |
— |
\([0, 1]\) |
\(F^{wind}_w\) |
Fraction of max wind capacity to build |
— |
\([0, 1]\) |
\(G^{pv}_h\) |
Aggregate PV generation |
MW |
\(\mathbb{R}_+\) |
\(G^{wind}_h\) |
Aggregate wind generation |
MW |
\(\mathbb{R}_+\) |
\(C^{pv}_h\) |
PV curtailment |
MW |
\(\mathbb{R}_+\) |
\(C^{wind}_h\) |
Wind curtailment |
MW |
\(\mathbb{R}_+\) |
Balancing units (investment and dispatch)#
Variable |
Description |
Units |
Domain |
|---|---|---|---|
\(P^{bal}_k\) |
Installed balancing capacity |
MW |
\(\mathbb{R}_+\) |
\(G^{bal}_{kh}\) |
Balancing unit generation |
MW |
\(\mathbb{R}_+\) |
Storage (investment and operations)#
Both charge and discharge power capacity variables exist for all storage technologies.
Variable |
Description |
Units |
Domain |
|---|---|---|---|
\(P^{dis}_j\) |
Installed discharge power capacity |
MW |
\(\mathbb{R}_+\) |
\(P^{ch}_j\) |
Installed charge power capacity |
MW |
\(\mathbb{R}_+\) |
\(E_j\) |
Installed energy capacity |
MWh |
\(\mathbb{R}_+\) |
\(D^{ch}_{jh}\) |
Charge power |
MW |
\(\mathbb{R}_+\) |
\(D^{dis}_{jh}\) |
Discharge power |
MW |
\(\mathbb{R}_+\) |
\(S_{jh}\) |
State of charge |
MWh |
\(\mathbb{R}_+\) |
\(U_{jh}\) |
Charge indicator (\(1\) = charging) |
— |
\(\{0, 1\}\) |
Hydro#
Variable |
Description |
Units |
Domain |
|---|---|---|---|
\(G^{hyd}_h\) |
Dispatchable hydro generation |
MW |
\(\mathbb{R}_+\) |
Trade#
Variable |
Description |
Units |
Domain |
|---|---|---|---|
\(M_h\) |
Imports |
MW |
\(\mathbb{R}_+\) |
\(X_h\) |
Exports |
MW |
\(\mathbb{R}_+\) |
\(V_h\) |
Net-load sign indicator (\(1\) if net load \(> 0\)) |
— |
\(\{0, 1\}\) |
Objective Function#
PV cost#
Annualized CAPEX (including transmission) and FOM. VRE shares a single lifetime \(l^{vre}\):
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{P}\) |
Set |
PV plants |
\(p\) |
Index |
PV plant |
\(l^{vre}\) |
Parameter |
VRE lifetime (yr) |
\(\kappa^{pv}_p\) |
Parameter |
PV CAPEX ($/MW) |
\(\kappa^{tc,pv}_p\) |
Parameter |
PV transmission capital cost ($/MW) |
\(\phi^{pv}_p\) |
Parameter |
PV fixed O&M ($/MW-yr) |
\(\bar{p}^{pv}_p\) |
Parameter |
Max allowed PV capacity (MW) |
\(F^{pv}_p\) |
Variable |
Fraction of max PV capacity to build |
Wind cost#
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{W}\) |
Set |
Wind plants |
\(w\) |
Index |
Wind plant |
\(l^{vre}\) |
Parameter |
VRE lifetime (yr) |
\(\kappa^{wind}_w\) |
Parameter |
Wind CAPEX ($/MW) |
\(\kappa^{tc,wind}_w\) |
Parameter |
Wind transmission capital cost ($/MW) |
\(\phi^{wind}_w\) |
Parameter |
Wind fixed O&M ($/MW-yr) |
\(\bar{p}^{wind}_w\) |
Parameter |
Max allowed wind capacity (MW) |
\(F^{wind}_w\) |
Variable |
Fraction of max wind capacity to build |
Balancing unit cost#
Per-unit CRF based on individual lifetimes. Marginal cost includes fuel and VOM:
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{K}\) |
Set |
Balancing units (dispatchable) |
\(k\) |
Index |
Balancing unit |
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(h\) |
Index |
Hour |
\(l^{bal}_k\) |
Parameter |
Balancing unit lifetime (yr) |
\(\kappa^{bal}_k\) |
Parameter |
Balancing unit CAPEX ($/MW) |
\(\phi^{bal}_k\) |
Parameter |
Balancing fixed O&M ($/MW-yr) |
\(\gamma_k\) |
Parameter |
Marginal fuel cost ($/MWh) |
\(\psi^{bal}_k\) |
Parameter |
Balancing variable O&M ($/MWh) |
\(P^{bal}_k\) |
Variable |
Installed balancing capacity (MW) |
\(G^{bal}_{kh}\) |
Variable |
Balancing unit generation (MW) |
Storage cost#
The cost ratio \(\alpha_j\) distributes power CAPEX and FOM between the charge side (fraction \(\alpha_j\)) and the discharge side (fraction \(1 - \alpha_j\)). This applies uniformly to all storage technologies:
VOM is charged on discharge only.
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{J}\) |
Set |
Storage technologies |
\(j\) |
Index |
Storage technology |
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(h\) |
Index |
Hour |
\(l^{stor}_j\) |
Parameter |
Storage lifetime (yr) |
\(\kappa^{P}_j\) |
Parameter |
CAPEX power ($/MW) |
\(\kappa^{E}_j\) |
Parameter |
CAPEX energy ($/MWh) |
\(\alpha_j\) |
Parameter |
Cost ratio: fraction of power cost on charge side |
\(\phi^{stor}_j\) |
Parameter |
Storage fixed O&M ($/MW-yr) |
\(\psi^{stor}_j\) |
Parameter |
Storage variable O&M ($/MWh) |
\(P^{ch}_j\) |
Variable |
Installed charge power capacity (MW) |
\(P^{dis}_j\) |
Variable |
Installed discharge power capacity (MW) |
\(E_j\) |
Variable |
Installed energy capacity (MWh) |
\(D^{dis}_{jh}\) |
Variable |
Discharge power (MW) |
Trade cost#
Import cost minus export revenue:
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(h\) |
Index |
Hour |
\(c^{imp}_h\) |
Parameter |
Import price at hour \(h\) ($/MWh) |
\(c^{exp}_h\) |
Parameter |
Export price at hour \(h\) ($/MWh) |
\(M_h\) |
Variable |
Imports (MW) |
\(X_h\) |
Variable |
Exports (MW) |
Constraints#
System constraints#
Energy supply balance#
Curtailment does not appear in the energy balance. It is handled per-technology by the VRE balance constraints below.
Carbon-free generation target#
Total balancing-unit generation plus imports must not exceed \((1 - \tau)\) of adjusted demand (demand plus net storage loading). This ensures that both thermal generation and imported electricity count against the clean-energy target:
Note: Imports are treated as non-clean energy in this constraint. If imports are not modeled (i.e., the Imports formulation is set to “NotModel”), only thermal generation is constrained.
Symbols used in system constraints:
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(\mathcal{K}\) |
Set |
Balancing units (dispatchable) |
\(\mathcal{J}\) |
Set |
Storage technologies |
\(h\) |
Index |
Hour |
\(k\) |
Index |
Balancing unit |
\(j\) |
Index |
Storage technology |
\(d_h\) |
Parameter |
Electrical demand at hour \(h\) (MW) |
\(\alpha^{nuc}\) |
Parameter |
Nuclear activation scalar |
\(\alpha^{oth}\) |
Parameter |
Other renewables activation scalar |
\(\nu_h\) |
Parameter |
Nuclear generation profile (MW) |
\(\omega_h\) |
Parameter |
Other renewable generation profile (MW) |
\(\tau\) |
Parameter |
Minimum clean-energy generation share |
\(G^{pv}_h\) |
Variable |
Aggregate PV generation (MW) |
\(G^{wind}_h\) |
Variable |
Aggregate wind generation (MW) |
\(G^{bal}_{kh}\) |
Variable |
Balancing unit generation (MW) |
\(G^{hyd}_h\) |
Variable |
Dispatchable hydro generation (MW) |
\(D^{ch}_{jh}\) |
Variable |
Charge power (MW) |
\(D^{dis}_{jh}\) |
Variable |
Discharge power (MW) |
\(M_h\) |
Variable |
Imports (MW) |
\(X_h\) |
Variable |
Exports (MW) |
VRE balance constraints#
Generation plus curtailment equals total available resource. Per-technology equality:
PV balance#
Wind balance#
Symbols used in VRE balance constraints:
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(\mathcal{P}\) |
Set |
PV plants |
\(\mathcal{W}\) |
Set |
Wind plants |
\(h\) |
Index |
Hour |
\(p\) |
Index |
PV plant |
\(w\) |
Index |
Wind plant |
\(\sigma_{ph}\) |
Parameter |
Solar capacity factor for plant \(p\) at hour \(h\) |
\(\bar{p}^{pv}_p\) |
Parameter |
Max allowed PV capacity (MW) |
\(\zeta_{wh}\) |
Parameter |
Wind capacity factor for plant \(w\) at hour \(h\) |
\(\bar{p}^{wind}_w\) |
Parameter |
Max allowed wind capacity (MW) |
\(G^{pv}_h\) |
Variable |
Aggregate PV generation (MW) |
\(C^{pv}_h\) |
Variable |
PV curtailment (MW) |
\(F^{pv}_p\) |
Variable |
Fraction of max PV capacity to build |
\(G^{wind}_h\) |
Variable |
Aggregate wind generation (MW) |
\(C^{wind}_h\) |
Variable |
Wind curtailment (MW) |
\(F^{wind}_w\) |
Variable |
Fraction of max wind capacity to build |
Balancing unit constraints#
Dispatch limit#
Capacity bounds#
Symbols used in balancing unit constraints:
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{K}\) |
Set |
Balancing units (dispatchable) |
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(k\) |
Index |
Balancing unit |
\(h\) |
Index |
Hour |
\(\underline{p}^{bal}_k\) |
Parameter |
Min balancing capacity (MW) |
\(\bar{p}^{bal}_k\) |
Parameter |
Max allowed balancing capacity (MW) |
\(P^{bal}_k\) |
Variable |
Installed balancing capacity (MW) |
\(G^{bal}_{kh}\) |
Variable |
Balancing unit generation (MW) |
Storage constraints#
Coupled power equality#
For coupled technologies, charge and discharge power capacity must be equal:
Power capacity bounds#
Charge and discharge hourly limits#
Charge or discharge only#
A storage unit cannot simultaneously charge and discharge. Enforced with binary indicator \(U_{jh}\) using \(\bar{p}^{stor}_j\) as a tight big-\(\mathcal{M}\):
State-of-charge balance#
Cyclic boundary condition (SOC wraps around):
State-of-charge limits#
Duration limits#
The energy-to-power ratio must lie within the allowable duration window. Duration is defined relative to discharge power corrected for discharge efficiency:
Cycle limits#
Total discharge throughput is bounded by the annualized maximum number of full cycles (lifetime cycles divided by lifetime):
Symbols used in storage constraints:
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{J}\) |
Set |
Storage technologies |
\(\mathcal{J}^{c}\) |
Set |
Coupled storage technologies |
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(j\) |
Index |
Storage technology |
\(h\) |
Index |
Hour |
\(\bar{p}^{stor}_j\) |
Parameter |
Max installable power capacity (MW) |
\(\eta_j\) |
Parameter |
Roundtrip efficiency |
\(\underline{\delta}_j\) |
Parameter |
Min duration (hr) |
\(\overline{\delta}_j\) |
Parameter |
Max duration (hr) |
\(\kappa^{cyc}_j\) |
Parameter |
Max lifetime cycles |
\(l^{stor}_j\) |
Parameter |
Storage lifetime (yr) |
\(P^{ch}_j\) |
Variable |
Installed charge power capacity (MW) |
\(P^{dis}_j\) |
Variable |
Installed discharge power capacity (MW) |
\(E_j\) |
Variable |
Installed energy capacity (MWh) |
\(D^{ch}_{jh}\) |
Variable |
Charge power (MW) |
\(D^{dis}_{jh}\) |
Variable |
Discharge power (MW) |
\(S_{jh}\) |
Variable |
State of charge (MWh) |
\(U_{jh}\) |
Variable |
Charge indicator (\(1\) = charging) |
Hydro budget constraints#
Hourly bounds#
Energy budget (equality)#
Total dispatchable hydro generation within each budget period must equal the available energy budget:
Symbols used in hydro budget constraints:
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(\mathcal{B}\) |
Set |
Hydro budget periods |
\(\mathcal{H}_b\) |
Set |
Hours belonging to budget period \(b\) |
\(h\) |
Index |
Hour |
\(b\) |
Index |
Budget period |
\(\alpha^{hyd}\) |
Parameter |
Hydro activation scalar |
\(\underline{g}^{hyd}_h\) |
Parameter |
Hourly hydro lower bound (MW) |
\(\overline{g}^{hyd}_h\) |
Parameter |
Hourly hydro upper bound (MW) |
\(\epsilon_b\) |
Parameter |
Energy budget for period \(b\) (MWh) |
\(G^{hyd}_h\) |
Variable |
Dispatchable hydro generation (MW) |
Import and export constraints#
Capacity limits#
Net-load indicator#
Define the net load as demand minus all VRE availability, fixed clean generation, and dispatchable hydro:
A binary indicator \(V_h\) encodes whether the system is a net importer (\(\Lambda_h > 0\)) or net exporter (\(\Lambda_h \leq 0\)). An \(\varepsilon\) offset prevents numerical degeneracy at \(\Lambda_h = 0\):
Import allowed only when net load is positive#
Export allowed only when net load is negative#
Symbols used in import and export constraints:
Symbol |
Type |
Description |
|---|---|---|
\(\mathcal{H}\) |
Set |
Hours (time steps) |
\(h\) |
Index |
Hour |
\(d_h\) |
Parameter |
Electrical demand at hour \(h\) (MW) |
\(\bar{\iota}_h\) |
Parameter |
Max import capacity at hour \(h\) (MW) |
\(\bar{\xi}_h\) |
Parameter |
Max export capacity at hour \(h\) (MW) |
\(\alpha^{nuc}\) |
Parameter |
Nuclear activation scalar |
\(\alpha^{oth}\) |
Parameter |
Other renewables activation scalar |
\(\nu_h\) |
Parameter |
Nuclear generation profile (MW) |
\(\omega_h\) |
Parameter |
Other renewable generation profile (MW) |
\(\mathcal{M}\) |
Parameter |
Big-M constant |
\(\varepsilon\) |
Parameter |
Small offset to prevent numerical degeneracy |
\(\Lambda_h\) |
Derived |
Net load at hour \(h\) (MW) |
\(G^{pv}_h\) |
Variable |
Aggregate PV generation (MW) |
\(C^{pv}_h\) |
Variable |
PV curtailment (MW) |
\(G^{wind}_h\) |
Variable |
Aggregate wind generation (MW) |
\(C^{wind}_h\) |
Variable |
Wind curtailment (MW) |
\(G^{hyd}_h\) |
Variable |
Dispatchable hydro generation (MW) |
\(M_h\) |
Variable |
Imports (MW) |
\(X_h\) |
Variable |
Exports (MW) |
\(V_h\) |
Variable |
Net-load sign indicator (\(1\) if net load \(> 0\)) |