A Python package for optimizing SWMM (Storm Water Management Model) parameters through automated calibration techniques.
optswmm
provides tools for calibrating SWMM models by automatically adjusting model parameters to match observed data. The package supports various optimization algorithms and provides utilities for handling SWMM input/output operations.
- Parameter Calibration: Automated calibration of SWMM model parameters
- Multiple Optimization Algorithms: Support for differential evolution and other optimization techniques
- Flexible Parameter Types: Handle both distributed and non-distributed parameters
- Data Processing: Built-in utilities for processing SWMM timeseries data
- Configuration Management: Easy-to-use configuration system for optimization settings
- Clone the repository:
git clone https://github.com/everettsp/optswmm.git
cd optswmm
- Install in development mode:
pip install -e .
- numpy
- pandas
- matplotlib
- swmm-toolkit
- pyswmm
- swmmio
- scikit-learn
import optswmm
# Define calibration parameters
cal_params = optswmm.CalParams()
cal_params.add_param(
section="SUBCATCHMENTS",
attribute="Width",
element="S1",
bounds=(10, 100)
)
# Configure optimization
opt_config = optswmm.OptConfig(
model_file="model.inp",
optimization_method="differential_evolution"
)
# Run calibration
results = optswmm.calibrate(
model_file="model.inp",
cal_params=cal_params,
cal_targets=observed_data,
opt_config=opt_config
)
Classes for defining calibration parameters:
from optswmm import CalParam, CalParams
# Create individual parameter
param = CalParam(
section="SUBCATCHMENTS",
attribute="Width",
element="S1",
bounds=(10, 100),
relative=True
)
# Create parameter collection
params = CalParams()
params.add_param(param)
Configuration class for optimization settings:
from optswmm import OptConfig
config = OptConfig(
model_file="model.inp",
optimization_method="differential_evolution",
max_iterations=100,
population_size=50
)
Functions for working with SWMM models:
from optswmm import get_node_timeseries, run_swmm
# Get timeseries data
data = get_node_timeseries(
model_file="model.inp",
nodes=["J1", "J2"],
variable="Total_inflow"
)
# Run SWMM simulation
run_swmm(model_file="model.inp")
calibrate()
: Main calibration functionget_cal_params()
: Helper for creating calibration parametersrun_swmm()
: Execute SWMM simulationsummarize_runs()
: Analyze optimization results
get_node_timeseries()
: Extract node timeseries dataget_link_timeseries()
: Extract link timeseries dataget_subcatchment_timeseries()
: Extract subcatchment timeseries datanormalise()
/denormalise()
: Data normalization utilities
OptConfig
: Optimization configuration classCalParam
: Individual calibration parameterCalParams
: Collection of calibration parameters
import optswmm
# Define what to calibrate
cal_params = optswmm.CalParams()
cal_params.add_param(
section="SUBCATCHMENTS",
attribute="Width",
bounds=(10, 100)
)
# Load observed data
observed_data = pd.read_csv("observed.csv")
# Run calibration
results = optswmm.calibrate(
model_file="model.inp",
cal_params=cal_params,
cal_targets=observed_data
)
import optswmm
# Create optimization configuration
config = optswmm.OptConfig(
model_file="model.inp",
optimization_method="differential_evolution",
max_iterations=200,
population_size=100,
tolerance=1e-6
)
# Run with custom configuration
results = optswmm.calibrate(
model_file="model.inp",
cal_params=cal_params,
cal_targets=observed_data,
opt_config=config
)
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project is licensed under the MIT License.
Everett Snieder ([email protected])
- Initial release
- Basic calibration functionality
- Support for differential evolution optimization
- SWMM utilities for data extraction