Python-based framework for multi-objective optimization of renewable energy systems using NREL's System Advisor Model (SAM)
Project description
sammoo
SAMMOO: System Advisor Model Multi-Objective Optimization
Python-based Framework for Multi-Objective Optimization of Renewable Energy Systems using NREL's System Advisor Model (SAM)
Optimization of Solar Industrial Process Heat (SIPH) systems using Concentrated Solar Power (CSP) technologies through the NREL PySAM package (System Advisor Model). This project was developed in the context of my Master's Thesis in Research in Industrial Technologies at the Universidad Nacional de Educaciรณn a Distancia (UNED), Spain.
๐ Overview
This Python package integrates:
- System Advisor Model (SAM) via NREL PySAM for the simulation of parabolic trough systems.
- ParMOO for multi-objective optimization using surrogate models.
It allows you to:
- Run parametric studies on industrial CSP systems.
- Optimize system configurations with multiple economic and technical objectives.
- Analyze Pareto fronts and export results.
๐ฆ Features
- Modular simulation wrapper (
ConfigSelection) for different SAM configurations. - Integration with PySAM modules:
TroughPhysicalIph,LcoefcrDesign,CashloanHeat, etc. - Multi-objective optimization engine (
ParMOOSim) using ParMOO. - Automatic switching from sequential to batch acquisition.
- Exportable plots and CSV reports.
Thermal Load Profiles
๐ฅ ThermalLoadProfileLPG
The ThermalLoadProfileLPG class generates a realistic hourly thermal load profile from monthly LPG consumption (in tonnes), compatible with SAMโs โUser-defined thermal load profileโ input.
- Working schedule: Monday to Friday, 6:00โ19:00
- Outputs hourly thermal demand in kJ/h, kWh, and kW
- Includes:
- Yearly and weekly plotting
- CSV export
- Energy balance summary
Example usage:
from sammoo.profiles.thermal_load_lpg import ThermalLoadProfileLPG
monthly_data = {1: 5000, 2: 4000, ..., 12: 3000}
profile = ThermalLoadProfileLPG(monthly_data)
profile.plot_year()
profile.export_csv("thermal_profile.csv")
๐๏ธ Project Structure
sammoo/
โโโ sammoo/ # Core package
โ โโโ __init__.py
โ โโโ version.py
โ โโโ config_selection.py # ConfigSelection class
โ โโโ parmoo_simulation.py # ParMOOSim class
โ โโโ components/ # New components module (v0.2.0)
โ โ โโโ __init__.py
โ โ โโโ thermal_load_lpg.py # ThermalLoadProfileLPG class (enhanced)
โ โ โโโ weather_design_point.py # Weather-based DNI calculation helper
โ โ โโโ solar_loop_configuration.py # Solar field / loop setup helpers
โ โโโ resources/
โ โ โโโ solar_resource/
โ โ โ โโโ seville_spain.csv # Default weather CSV
โ โ โโโ collector_data/
โ โ โโโ iph_collectors_parameters.csv # Industrial Process Heat collectors database
โ โโโ templates/ # JSON SAM templates
โ โโโ __init__.py
โ โโโ iph_parabolic_commercial_owner/
โ โโโ __init__.py
โ โโโ *.json
โโโ examples/ # Example usage scripts
โ โโโ op1_single_objective_comparison.py
โ โโโ opt2_design_point_multiobj.py
โ โโโ opt3_multiobj_row_distance.py
โ โโโ opt4_startup_shutdown.py
โโโ README.md
โโโ CHANGELOG.md
โโโ pyproject.toml
โโโ MANIFEST.in
โโโ LICENSE
๐ Example Scripts
The examples/ folder contains several usage scenarios of the sammoo package:
opt1_single_objective_comparison.py: Compare optimal designs for different single-objective formulations (e.g., LCOE, Payback, LCS, NPV).opt2_design_point_multiobj.py: Multi-objective optimization at a fixed design point (e.g., SM and storage hours), optionally applying a thermal load profile.opt3_multiobj_row_distance.py: Multi-objective optimization of solar field row spacing (Row_Distance) using ParMOO.opt4_startup_shutdown.py: Optimization focusing on startup/shutdown temperatures and their impact on techno-economic performance.
๐ก Note: Example scripts (examples/) are not included in the PyPI installation.
If you want to explore the examples, please clone the GitHub repository.
๐ Quick Start
โ Option 1: Install from PyPI (recommended for users)
pip install sammoo
You can now use the package in Python:
from sammoo import ConfigSelection, ParMOOSim
๐ก Note: Example scripts (
examples/) are not included in the PyPI installation.
If you want to explore examples, clone the GitHub repository instead:
git clone https://github.com/ppadillaq/sammoo.git
cd sammoo
python examples/single_objective_comparison.py
๐ Option 2: Install from source (for development)
If you want to work with the source code:
git clone https://github.com/ppadillaq/sammoo.git
cd sammoo
pip install -e .
โถ๏ธ Run an example
python examples/opt1_single_objective_comparison.py
๐ Dependencies
- Python โฅ 3.10
- NREL PySAM
- ParMOO
- NumPy
- Matplotlib (for plotting)
Install them via:
pip install pysam parmoo numpy matplotlib
๐ Example Use Case
# Minimal example: multi-objective optimization with a thermal load profile
from sammoo import ConfigSelection, ParMOOSim
from sammoo.components import ThermalLoadProfileLPG
# 1) (Optional) Generate an hourly thermal load profile from monthly LPG consumption (kg)
monthly_kg = {1: 11000, 2: 9000, 3: 8000, 4: 9500, 5: 9200, 6: 9800,
7: 8600, 8: 8700, 9: 9000, 10: 9400, 11: 8800, 12: 9600}
profile = ThermalLoadProfileLPG(monthly_kg=monthly_kg) # uses default efficiency and PCI
# 2) Define the design space (use "continuous" / "integer")
design_vars = {
"specified_solar_multiple": ([1.0, 3.0], "continuous"),
"tshours": ([2, 8], "integer"),
}
# 3) Define objectives (minimize LCOE, maximize LCS)
selected_outputs = ["LCOE", "-LCS"]
# 4) Create the SAM configuration (optionally set collector/HTF)
cfg = ConfigSelection(
config="Commercial owner",
selected_outputs=selected_outputs,
design_variables=design_vars,
collector_name="Power Trough 250", # optional
htf_name="Therminol VP-1", # optional
verbose=0
)
# Apply the demand profile โ sets timestep_load_abs and sizes q_pb_design
profile.apply_to_config(cfg)
# 5) Run the optimization (increase search_budget and sim_max for better results)
opt = ParMOOSim(cfg, search_budget=20, auto_switch=True)
opt.solve_all(sim_max=50)
# 6) Display results
print(opt.get_results())
โ๏ธ Weather Data
The simulation requires a weather file (file_name) in CSV format. You can:
- โ
Provide your own via
user_weather_file="path/to/weather.csv" - ๐ Or let the framework use a built-in default (Tucson, AZ)
Your custom weather files must follow the TMY3 format used by SAM.
๐ Publications
The version 0.2.0 of this project was submitted as part of the following Master's Thesis:
- Pedro Padilla Quesada. Optimization of Solar Industrial Process Heat (SIPH) Systems with Parabolic Troughs using PySAM and Multi-objective Optimization. Masterโs Thesis in Research in Industrial Technologies, Universidad Nacional de Educaciรณn a Distancia (UNED), Spain, 2025.
Future versions may include broader support for other CSP technologies, reinforcement learning-based controllers, and integration with digital twin platforms.
๐ License
This project is licensed under the BSD 3-Clause License.
See the LICENSE file for full text.
๐ค Author
Pedro Padilla Quesada
MSc in Research in Industrial Technologies
UNED, Spain
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sammoo-0.2.0.tar.gz.
File metadata
- Download URL: sammoo-0.2.0.tar.gz
- Upload date:
- Size: 281.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e48e275988fe89a5581408be960e5031fcc4148f6e180bc5169f121171d6efde
|
|
| MD5 |
bc6064cc062d82f4d06de972ffe021dc
|
|
| BLAKE2b-256 |
2ca57f0b1f3e133a31f8e6c39078984b8a6250b70e64443df537c5bafe060e5f
|
File details
Details for the file sammoo-0.2.0-py3-none-any.whl.
File metadata
- Download URL: sammoo-0.2.0-py3-none-any.whl
- Upload date:
- Size: 292.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a56404b5991f2405299840edb3192b11ea394c54a4d5e1e1ccfc97487f45834
|
|
| MD5 |
249aeb2d145cc1d8e1d38f86ce0aa47c
|
|
| BLAKE2b-256 |
cf7bcf1585366a16b1ae6e24bd3703306f82726c3b76494f574304501ea821f5
|