Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PR for 5.3.0 release #179

Draft
wants to merge 44 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
6bcd52c
Work in progress addressing #149
cbuahin Nov 1, 2023
81095bc
Addressing bug for mod. horton #59
cbuahin Dec 11, 2023
353f8fe
Addressing bug for mod. horton #59
cbuahin Dec 12, 2023
ee1b5ef
Enabling draining in isolated and surcharged storages #149
cbuahin Dec 21, 2023
f9fa0ed
Restore openmp for node updating
cbuahin Dec 21, 2023
059d342
Valid double comparison since sumdqdh is initialized to zero for dang…
cbuahin Dec 21, 2023
d93cb32
Make sure ellipse ratio is 1.56 to be consistent with GUI #144
cbuahin Jan 11, 2024
a621234
Leave users to prescribe rise and span #144
cbuahin Jan 11, 2024
4606020
Address zero depth outfall bug #154
cbuahin Jan 17, 2024
a6fa0d5
Bumping minor version number up
cbuahin Jan 17, 2024
57cf5fa
Addressing TotalDuration precision bug #152
cbuahin Jan 17, 2024
d67a757
Limiting cummulative infiltration to max #158
cbuahin Jan 18, 2024
a409713
Added support for saving multiple hotstart files at specified times #150
cbuahin Jan 24, 2024
e3309b6
Modified code to use global consts instead of locally defined values #70
cbuahin Jan 24, 2024
9cad38b
WIP addressing #162, #150
cbuahin Feb 15, 2024
91de2fd
WIP addressing #162, #150
cbuahin Feb 15, 2024
cd5120d
WIP addressing #162, #150
cbuahin Feb 15, 2024
5d933ae
WIP addressing #162, #150
cbuahin Feb 15, 2024
ea5e68a
WIP addressing #162, #150; Remove actions for bug_fixes branch
cbuahin Feb 15, 2024
e1f906e
WIP addressing #162, #150
cbuahin Feb 15, 2024
58e330b
Expand API to return error code and support unit testing #162
cbuahin Feb 16, 2024
66e9f61
WIP on expanding unit tests #162, #150; other minor refactoring
cbuahin Feb 20, 2024
1b4559e
WIP on expanding unit tests #162, #150; other minor refactoring
cbuahin Feb 20, 2024
71c79e3
WIP on expanding unit tests #162, #150; other minor refactoring
cbuahin Feb 20, 2024
89fd7dd
Work in progress #162, #163
cbuahin Feb 22, 2024
bbaf4fe
Addressing crashing for long comments in timeseries #165
cbuahin Mar 5, 2024
9d3bb8d
Add runoff from closed rain barrel to return flow #166
cbuahin Mar 15, 2024
25dd291
Add runoff from closed rain barrel to return flow #166
cbuahin Mar 15, 2024
1ed9c88
Work in progress #162
cbuahin Jun 13, 2024
133f788
WIP unit testing infrastructure #162
cbuahin Jun 13, 2024
7266536
Fix max depth reporting when average is turned on. #188
cbuahin Sep 12, 2024
73b057a
WIP; New cython bindings for expanded API; docs; unit tests #204, #16…
cbuahin Nov 20, 2024
9efa97a
WIP; New cython bindings for expanded API for unit and reg tests; doc…
cbuahin Nov 20, 2024
53f9909
Finalize output API; New cython bindings for expanded API; docs; unit…
cbuahin Nov 20, 2024
2a6acde
WIP finalizing core api; consolidating readme; #204, #162, #163, #184…
cbuahin Nov 22, 2024
2a6843e
Fix setter error in solver.pyx; consolidating readme; #204, #162, #16…
cbuahin Nov 22, 2024
5b87a2b
WIP API bindings for pollutants #204, #162, #163, #184, #180
cbuahin Dec 10, 2024
6c08f7e
WIP API and bindings unit testing #204, #162, #163, #184, #180
cbuahin Dec 11, 2024
11f2a60
WIP finalizing core api, unit testing, installation config; #204, #1…
cbuahin Dec 16, 2024
ef8f5b7
Installation config; #204, #162, #163, #184, #180
cbuahin Dec 18, 2024
8e3dca2
WIP API and bindings unit testing; cleaning up #204, #162, #163, #18…
cbuahin Dec 22, 2024
14e0a0a
WIP API and bindings unit testing; cleaning up #204, #162, #163, #18…
cbuahin Dec 22, 2024
0a78d5e
WIP API and bindings unit testing; cleaning up #204, #162, #163, #18…
cbuahin Dec 22, 2024
3369838
WIP API and bindings unit testing; cleaning up #204, #162, #163, #18…
cbuahin Dec 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .github/workflows/build-and-deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: Build for Release

on:
push:
branches: [ master]
# pull_request:
# branches: [ master, develop, release ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
14 changes: 14 additions & 0 deletions .github/workflows/build-and-regression-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: Build and Regression Test

on:
push:
branches: [ master]
# pull_request:
# branches: [ master, develop, release ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
name: Build and Test
name: Build and Unit Test

on:
push:
branches: [ master, develop, release, lew-develop ]
pull_request:
branches: [ master, develop, release, lew-develop ]
branches: [ master]
# pull_request:
# branches: [ master, develop, release ]

env:
OMP_NUM_THREADS: 1
Expand Down Expand Up @@ -38,7 +38,7 @@ jobs:
env:
TOOL_CHAIN_PATH: \scripts\buildsystems\vcpkg.cmake
run: |
cmake -B.\build -DBUILD_TESTS=ON -DCMAKE_TOOLCHAIN_FILE=.\${{env.PACKAGE_NAME}}${{env.TOOL_CHAIN_PATH}} .
cmake -B .\build -DBUILD_TESTS=ON -DCMAKE_TOOLCHAIN_FILE=.\${{env.PACKAGE_NAME}}${{env.TOOL_CHAIN_PATH}} .
cmake --build .\build --config DEBUG

- name: Unit Test
Expand Down
32 changes: 0 additions & 32 deletions Build.md

This file was deleted.

6 changes: 3 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
cmake_minimum_required (VERSION 3.13)

if("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")
message(FATAL_ERROR "In-source builds are disabled.")
message(FATAL_ERROR "In-source builds are disabled.")
endif()


Expand All @@ -34,7 +34,7 @@ endif()


# Define install locations (will be prepended by install prefix)
set(TOOL_DIST "bin")
set(TOOL_DIST "bin")
set(INCLUDE_DIST "include")
set(LIBRARY_DIST "lib")
set(CONFIG_DIST "cmake")
Expand All @@ -51,7 +51,7 @@ add_subdirectory(src/solver)
add_subdirectory(src/run)

if(BUILD_TESTS)
enable_testing()
enable_testing()
add_subdirectory(tests)
endif()

Expand Down
159 changes: 149 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,160 @@
ORD Stormwater-Management-Model Solver
==================================

Stormwater Management Model (aka "SWMM") solver only
EPA ORD Stormwater Management Model (SWMM)
==========================================

Stormwater Management Model (SWMM) computational engine and output post-processing codebase

## Build Status
[![Build and Test](../../actions/workflows/build-and-test.yml/badge.svg)](../../actions/workflows/build-and-test.yml)

## Disclaimer
The United States Environmental Protection Agency (EPA) GitHub project code is provided on an "as is" basis and the user assumes responsibility for its use. EPA has relinquished control of the information and no longer has responsibility to protect the integrity, confidentiality, or availability of the information. Any reference to specific commercial products, processes, or services by service mark, trademark, manufacturer, or otherwise, does not constitute or imply their endorsement, recommendation or favoring by EPA. The EPA seal and logo shall not be used in any manner to imply endorsement of any commercial product or activity by EPA or the United States Government.

[![Build and Unit Testing](https://github.com/USEPA/Stormwater-Management-Model/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/USEPA/Stormwater-Management-Model/actions/workflows/build-and-test.yml)
[![Build and Regression Testing](https://github.com/USEPA/Stormwater-Management-Model/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/USEPA/Stormwater-Management-Model/actions/workflows/build-and-test.yml)
[![Deployment](https://github.com/USEPA/Stormwater-Management-Model/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/USEPA/Stormwater-Management-Model/actions/workflows/build-and-test.yml)
[![Documentation](https://github.com/USEPA/Stormwater-Management-Model/actions/workflows/build-and-test.yml/badge.svg?branch=docs)](https://github.com/USEPA/Stormwater-Management-Model/actions/workflows/build-and-test.yml)
[![PythonVersion](https://img.shields.io/pypi/pyversions/epaswmm.svg)](https://pypi.org/project/epaswmm)
[![PyPi](https://img.shields.io/pypi/v/epaswmm.svg)](https://pypi.org/project/epaswmm)

## Introduction
This is the official SWMM source code repository maintained by US EPA Office of Research and Development, Center For Environmental Solutions & Emergency Response, Water Infrastructure Division located in Cincinnati, Ohio.

SWMM is a dynamic hydrology-hydraulic water quality simulation model. It is used for single event or long-term (continuous) simulation of runoff quantity and quality from primarily urban areas. SWMM source code is written in the C Programming Language and released in the Public Domain.

## Build Instructions

The 'src' folder of this repository contains the C source code for
version of Storm Water Management Model's computational
engine. Consult the included 'Roadmap.txt' file for an overview of
the various code modules. The code can be compiled into both a shared
object library and a command line executable. Under Windows, the
library file (swmm5.dll) is used to power SWMM's graphical user
interface.

Also included is a python interface for the SWMM computational engine and output
post-processing application programming interfaces located in the python folder.

The 'CMakeLists.txt' file is a script used by CMake (https://cmake.org/)
to build the SWMM binaries. CMake is a cross-platform build tool
that generates platform native build systems for many compilers. To
check if the required version is installed on your system, enter from
a console window and check that the version is 3.5 or higher.

```bash
cmake --version
```

To build the SWMM engine library and its command line executable
using CMake and the Microsoft Visual Studio C compiler on Windows:

1. Open a console window and navigate to the directory where this
Readme file resides (which should have 'src' as a sub-directory
underneath it).

2. Issue the following command to create the directory for storing the built binaries:

```bash
mkdir build
cd build
```

3. Then enter the following CMake commands to build the binaries:

``` bash
cmake -G <compiler> .. -A <platform>
cmake --build . --config Release
```

where `<compiler>` is the name of the Visual Studio compiler being used
in double quotes (e.g., "Visual Studio 15 2017", "Visual Studio 16 2019",
or "Visual Studio 17 2022") and `<platform>` is Win32 for a 32-bit build
or x64 for a 64-bit build. The resulting engine DLL (swmm5.dll), command
line executable (runswmm.exe), and output processing libraries (swmm-output.dll)
will appear in the build\Release directory.

For other platforms, such as Linux or MacOS, Step 3 can be replaced with:

```bash
cmake ..
cmake --build .
```

The resulting shared object library (libswmm5.so or libswmm5.dylib) and
command line executable (runswmm) will appear in the build directory.

### Python Bindings (Experimental)

Experimental python bindings for the SWMM API are being developed to support regression and benchmark testing as well as other applications. _**These bindings are still under development and testing and has yet to be cleared through US EPA ORD's official quality assurance review process**_. The exprimental python bindings can be built and installed locally using the following command.

```bash
cd python
python -m pip install -r requirements.txt
python -m pip install .
```
Users may also build python wheels for installation or distribution. Once the python bindings
have been validated and cleared through EPA's quality assuracnce clearance process, they will be available for installation via package indexing repositories such as pypi.

Example usage of python bindings can be found below. More extensive documentation will be provided once cleared.

```python

from epaswmm import solver
from epaswmm.solver import Solver
from epaswmm.output import Output

with Solver(inp_file="input_file.inp") as swmm_solver:

# Open swmm file and initialize objects
swmm_solver.initialize()

# Set initialization parameters e.g., time step stride, start date, end date etc.
swmm_solver.time_stride = 600

for elapsed_time in swmm_solver:

# Get and set attributes per timestep
print(swmm_solver.current_datetime)

swmm_solver.set_value(
object_type=solver.SWMMObjects.RAIN_GAGE,
property_type=solver.SWMMRainGageProperties.GAGE_RAINFALL,
index=0,
value=3.6
)

swmm_output = Output(output_file='output_file.out')

# Dict[datetime, float]
link_timeseries = swmm_output.get_link_timeseries(
element_index=5,
attribute=output.LinkAttribute.FLOW_RATE,
)

```

## Unit and Regression Testing

Unit tests and regression tests have been developed for both the natively compiled SWMM computational engine and output toolkit as well as their respective python bindings. Unit tests for the natively compiled toolkits use the Boost 1.67.0 library and can be compiled by adding DBUILD_TESTS=ON flag during the cmake build phase as shown below:

```bash
ctest --test-dir . -DBUILD_TESTS=ON --config Debug --output-on-failure
```

Unit testing on the python bindings may be executed using the following command after installation.

```bash
cd python\tests
pytest .
```

Regression tests are executed using the python bindings using the pytest and pytest-regressions extension using the following commands.

```bash
cd ci
pytest --data-dir <path-to-regression-testing-files> --atol <absolute-tolerance> --rtol <relative-tolerance> --benchmark-compare --benchmark-json=PATH
```

## Find Out More
The source code distributed here is identical to the code found at the official [SWMM Website](https://www.epa.gov/water-research/storm-water-management-model-swmm).
The source code distributed here is identical to the code found at the official [SWMM website](https://www.epa.gov/water-research/storm-water-management-model-swmm).
The SWMM website also hosts the official manuals and installation binaries for the SWMM software.

A live web version of the SWMM documentation of the API and user manuals can be found on the [SWMM GitHub Pages website](https://usepa.github.io/Stormwater-Management-Model). Note that this is an experimental version that is still under development and has yet to go through EPA'S official quality assurance review process.

## Disclaimer
The United States Environmental Protection Agency (EPA) GitHub project code is provided on an "as is" basis and the user assumes responsibility for its use. EPA has relinquished control of the information and no longer has responsibility to protect the integrity, confidentiality, or availability of the information. Any reference to specific commercial products, processes, or services by service mark, trademark, manufacturer, or otherwise, does not constitute or imply their endorsement, recommendation or favoring by EPA. The EPA seal and logo shall not be used in any manner to imply endorsement of any commercial product or activity by EPA or the United States Government.

47 changes: 0 additions & 47 deletions Readme.txt

This file was deleted.

63 changes: 63 additions & 0 deletions ci/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# conftest.py
import pytest
import os

def pytest_addoption(parser):
parser.addoption(
"--data-dir", action="store", default=None, help="Directory to search for data files", required=True
)

parser.addoption(
"--atol", action="store", default=None, help="Absolute tolerance for floating point comparisons"
)

parser.addoption(
"--rtol", action="store", default=1.0e-8, help="Relative tolerance for floating point comparisons"
)

parser.addoption(
"--force-regen", action="store_true", default=1.0e-8, help="Force regeneration of the data files"
)

@pytest.fixture
def data_dir(request):
"""
Fixture to get the data directory
"""
return request.config.getoption("--data_dir")

@pytest.fixture
def atol(request):
"""
Fixture to get the absolute tolerance
"""
return request.config.getoption("--atol")

@pytest.fixture
def rtol(request):
"""
Fixture to get the relative tolerance
"""
return request.config.getoption("--rtol")

@pytest.fixture
def force_regen(request):
"""
Fixture to get the force-regen flag
"""
return request.config.getoption("--force_regen")

@pytest.fixture
def discovered_files(data_dir):
"""
Walk through data directory and discover all SWMM input files
"""
if data_dir is None:
return []
return [os.path.join(data_dir, f) for f in os.listdir(data_dir) if os.path.isfile(os.path.join(data_dir, f))]

def pytest_collection_modifyitems(items):
for item in items:
if item.originalname == 'test_compare_node_results' and 'input_file' in item.fixturenames:
input_file = item.callspec.params['input_file']
item._nodeid = f'{item.nodeid}_{os.path.basename(input_file)}'
Empty file added ci/download_benchmarks.py
Empty file.
Loading