Skip to main content

A Python package for NREL open-source SDOM (Storage Deployment Optimization Model)

Project description

Storage Deployment Optimization Model (SDOM)

Tests Documentation DOI PyPI Downloads

SDOM (Storage Deployment Optimization Model) is an open-source, high-resolution grid capacity-expansion framework developed by the National Lab of the Rockies (NLR). It’s purpose-built to optimize the deployment and operation of energy storage technologies, leveraging hourly temporal resolution and granular spatial representation of Variable Renewable Energy (VRE) sources such as solar and wind.

SDOM is particularly well-suited for figure out the required capacity to meet a carbon-free generation mix target by:

  • 📆 Evaluating long-duration and seasonal storage technologies
  • 🌦 Analyzing complementarity and synergies among diverse VRE resources
  • 📉 Assessing curtailment and operational strategies under various grid scenarios

Table of contents

How SDOM Works?

🔍 At its core, SDOM models the gap between electricity demand and fixed generation:

Inputs include time series data for:

  • Load profiles
  • Fixed generation (e.g., large hydropower, nuclear, and other must-run renewables)

Outputs include:

  • The optimal technology portfolio capacity (PV solar, wind, storage types, thermal capacity) to reliably meet demand.
  • Dispatch profiles for each technology, highlighting how resources are operated hour-by-hour.
  • Insights on operational metrics like VRE curtailment, storage cycling, and thermal usage.

An illustrative figure below shows the flow from inputs to optimization results, enabling exploration of storage needs under varying renewable integration levels.

Illustration about how SDOM works

Key Features

⚙️

  • Accurate Representation of Storage Technologies Diversity: SDOM is strongly focused in providing a framework able to represent different storage technologies by:

    • Representation of short, long an seassonal storage technologies,
    • Including charging/discharging capacity decoupling,
    • Optimization of both energy and power capacity,
    • Full temporal cronology.
  • Temporal Resolution: Hourly simulations over a full year enable precise modeling of storage dynamics and renewable generation variability.

  • Spatial Resolution: Fine-grained representation of VRE sources (e.g., solar, wind) captures geographic diversity and enhances system fidelity.

  • Copper Plate Modeling: SDOM Model neglects transmission constraints to keep the model tractable from the computational standpoint. Future SDOM releases should include inter-regional transmission constraints.

  • Fixed Generation Profiles: Nuclear, hydropower, and other non-variable renewables (e.g., biomass, geothermal) are treated as fixed inputs using year-long time series data.

    • Currently its beeing developed a modeling approach to include a Hydro modeling considering Monthly energy budgets in order to be able to represent the hydro flexibility.
  • System Optimization Objective: Minimizes total system cost—including capital, fixed/variable O&M, and fuel costs—while satisfying user-defined carbon-free or renewable energy targets.

  • Modeling approach: Formulated as a Mixed-Integer Linear Programming (MILP) model to allow rigorous optimization of investment and capacity decisions.

  • Parametric & Sensitivity Analysis: Built-in ParametricStudy API to run multi-dimensional parameter sweeps in parallel — sweep GenMix_Target, technologies CAPEX costs, load growth factors, and more.

  • Platforms:

    • SDOM was originally developed in GAMS (https://github.com/NREL/SDOM).

    • In order offer a full open-source solution also was developed this python package. This version requires python 3.10+.

  • Solver Compatibility: Currently the SDOM python version has been tested using open-source CBC solver and HiGHS open-source solver through highspy module. In this repo the windows executable for cbc is provided. You will need to provide the path of cbc solver to run SDOM as illustrated in our script demonstration

Optimization Scope

📉 SDOM performs cost minimization across a 1-year operation window using a copper plate assumption—i.e., no internal transmission constraints—making it computationally efficient while capturing major cost drivers. Conventional generators are used as balancing resources, and storage technologies serve to meet carbon or renewable penetration goals.

Notes on Model Expansion

While SDOM currently supports a 1-year horizon, multiyear analyses could provide deeper insights into how interannual variability affects storage needs. Chronological, simulation-based approaches are better suited for this but present significant computational challenges—especially at hourly resolution. Extending SDOM to support multiyear optimization is left as future work.

Sample Results

The figures below show example outputs from a 3-dimensional parametric study (3 carbon-free targets × 2 storage CAPEX factors × 2 load scaling factors = 12 cases) run against the Data/no_exchange_run_of_river/ dataset included in this repository.

Installed capacity by technology across all cases

Capacity comparison

Total generation by technology across all cases

Generation comparison

VRE curtailment across all cases

Curtailment — absolute

Per-case capacity and generation mix (GenMix_Target = 1.0, base CAPEX, base load)

Capacity and generation donuts

Hourly dispatch heatmap — net load

Heatmap — net load

GETTING STARTED WITH SDOM

System Setup and Prerequisites

  • a. You'll need to install python
  • b. Also, You'll need an IDE (Integrated Development Environment), we recommend to install MS VS code
  • d. We alse recommend to install extensions such as:
    • edit CSV: To edit and interact with input csv files for SDOM directly in vs code.
    • vscode-pdf: to read and see pdf files directly in vscode.

Install SDOM

It is recommended to load the packages in a virtual enviroment.

We recommend to use uv, a Python manager for virtual environments and packages.

  • a. Install uv following the instructions at uv on PyPI.

  • b. Create a new virtual environment named .venv:

    uv venv .venv
    
      This command creates a Python virtual environment in the `.venv` directory.
    
  • c. Activate your virtual environment and install the SDOM package:

    uv pip install sdom
    
  • d. Install the python module according to your solver. We'll use here HiGHS open-source solver

    uv pip install highspy
    
  • e. Install the Logging package to be able to see sdom info, warning and error messages and log those:

    uv pip install logging
    
  • f. Verify your environment by listing installed packages:

    In your terminal or powershell run:

    uv pip list
    

    You should see output similar to:

    Package         Version
    --------------- -----------
    highspy         1.13.1
    matplotlib      3.10.1
    numpy           2.2.2
    pandas          2.2.3
    ply             3.11
    pyomo           6.10.0
    pytz            2025.2
    sdom            0.1.1
    six             1.17.0
    tzdata          2025.2
    

SDOM Input Files

For detailed information about SDOM input files, please refer to the SDOM Input Documentation.

SDOM simple script example

For an script about how to run SDOM, please refer to the SDOM simple script example.

PUBLICATIONS AND USE CASES OF SDOM

📄 For a comprehensive list of publications and use cases, please refer to the SDOM Publications Documentation.

CONTRIBUTING GUIDELINES

💻 Developers Guide

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sdom-0.2.1.tar.gz (126.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sdom-0.2.1-py3-none-any.whl (149.5 kB view details)

Uploaded Python 3

File details

Details for the file sdom-0.2.1.tar.gz.

File metadata

  • Download URL: sdom-0.2.1.tar.gz
  • Upload date:
  • Size: 126.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for sdom-0.2.1.tar.gz
Algorithm Hash digest
SHA256 f2605b69e39eca50a29e135b5b30c0af4f78e6acfc4638977c31e40fe9b9bfdf
MD5 b5da83eae609df7e72a39a8cbd165b7d
BLAKE2b-256 7b06d2edaaf8e460f44663fec6338e43784c7d0097f319dbde7cf129292eea6f

See more details on using hashes here.

File details

Details for the file sdom-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: sdom-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 149.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for sdom-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fb42a2eb05c868a9583010ff861787aa746c81f33cf4bf534781810b20e6dd21
MD5 493e523b833803a5114e8631d4d9a44c
BLAKE2b-256 b7e177d79597a5448f273066ecf4db1d10c2de5db08c10b1c11117c4faa05e48

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page